changeset 21605:60b840947a09

(sys_read): Clear carriage return flag. Report normal EOF when read fails if nothing in buffer. Only read more if more remaining. (check_windows_init_file): New function. (term_ntproc): Invoke check_windows_init_file.
author Geoff Voelker <voelker@cs.washington.edu>
date Fri, 17 Apr 1998 05:07:15 +0000
parents 104277bc1444
children 8f5ea092125c
files src/w32.c
diffstat 1 files changed, 69 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32.c	Fri Apr 17 05:06:37 1998 +0000
+++ b/src/w32.c	Fri Apr 17 05:07:15 1998 +0000
@@ -2456,6 +2456,7 @@
 	  *buffer++ = 0x0d;
 	  count--;
 	  nchars++;
+	  fd_info[fd].flags &= ~FILE_LAST_CR;
 	}
 
       /* presence of a child_process structure means we are operating in
@@ -2471,8 +2472,10 @@
 	    {
 	    case STATUS_READ_FAILED:
 	    case STATUS_READ_ERROR:
-	      /* report normal EOF */
-	      return 0;
+	      /* report normal EOF if nothing in buffer */
+	      if (nchars <= 0)
+		fd_info[fd].flags |= FILE_AT_EOF;
+	      return nchars;
 
 	    case STATUS_READ_READY:
 	    case STATUS_READ_IN_PROGRESS:
@@ -2501,8 +2504,9 @@
 	    {
 	      PeekNamedPipe ((HANDLE) _get_osfhandle (fd), NULL, 0, NULL, &waiting, NULL);
 	      to_read = min (waiting, (DWORD) count);
-      
-	      nchars += _read (fd, buffer, to_read);
+
+	      if (to_read > 0)
+		nchars += _read (fd, buffer, to_read);
 	    }
 #ifdef HAVE_SOCKETS
 	  else /* FILE_SOCKET */
@@ -2534,10 +2538,18 @@
 #endif
 	}
       else
-	nchars += _read (fd, buffer, count);
-
+	{
+	  int nread = _read (fd, buffer, count);
+	  if (nread >= 0)
+	    nchars += nread;
+	  else if (nchars == 0)
+	    nchars = nread;
+	}
+
+      if (nchars <= 0)
+	fd_info[fd].flags |= FILE_AT_EOF;
       /* Perform text mode translation if required.  */
-      if ((fd_info[fd].flags & FILE_BINARY) == 0)
+      else if ((fd_info[fd].flags & FILE_BINARY) == 0)
 	{
 	  nchars = crlf_to_lf (nchars, orig_buffer);
 	  /* If buffer contains only CR, return that.  To be absolutely
@@ -2549,8 +2561,6 @@
 	      fd_info[fd].flags |= FILE_LAST_CR;
 	      nchars--;
 	    }
-	  else
-	    fd_info[fd].flags &= ~FILE_LAST_CR;
 	}
     }
   else
@@ -2631,6 +2641,50 @@
   return nchars;
 }
 
+static void
+check_windows_init_file ()
+{
+  extern int noninteractive, inhibit_window_system;
+
+  /* A common indication that Emacs is not installed properly is when
+     it cannot find the Windows installation file.  If this file does
+     not exist in the expected place, tell the user.  */
+
+  if (!noninteractive && !inhibit_window_system) {
+    extern Lisp_Object Vwindow_system, Vload_path;
+    Lisp_Object init_file;
+    int fd;
+
+    init_file = build_string ("term/w32-win");
+    fd = openp (Vload_path, init_file, ".el:.elc", NULL, 0);
+    if (fd < 0) {
+      Lisp_Object load_path_print = Fprin1_to_string (Vload_path, Qnil);
+      char *init_file_name = XSTRING (init_file)->data;
+      char *load_path = XSTRING (load_path_print)->data;
+      char *buffer = alloca (1024);
+
+      sprintf (buffer, 
+	       "The Emacs Windows initialization file \"%s.el\" "
+	       "could not be found in your Emacs installation.  "
+	       "Emacs checked the following directories for this file:\n"
+	       "\n%s\n\n"
+	       "When Emacs cannot find this file, it usually means that it "
+	       "was not installed properly, or its distribution file was "
+	       "not unpacked properly.\nSee the README.W32 file in the "
+	       "top-level Emacs directory for more information.",
+	       init_file_name, load_path);
+      MessageBox (NULL,
+		  buffer,
+		  "Emacs Abort Dialog",
+		  MB_OK | MB_ICONEXCLAMATION | MB_TASKMODAL);
+      close (fd);
+
+      /* Use the low-level Emacs abort. */
+#undef abort
+      abort ();
+    }
+  }
+}
 
 void
 term_ntproc ()
@@ -2639,6 +2693,12 @@
   /* shutdown the socket interface if necessary */
   term_winsock ();
 #endif
+
+  /* Check whether we are shutting down because we cannot find the
+     Windows initialization file.  Do this during shutdown so that
+     Emacs is initialized as possible, and so that it is out of the 
+     critical startup path.  */
+  check_windows_init_file ();
 }
 
 void