corrections for echoing the last command when "!!" is given,
[unix-history] / usr / src / contrib / ed / q.c
index 0b14234..af2f8ca 100644 (file)
@@ -9,69 +9,86 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)q.c        5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)q.c        5.6 (Berkeley) %G%";
 #endif /* not lint */
 
 #endif /* not lint */
 
+#include <sys/types.h>
+
+#include <regex.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef DBI
+#include <db.h>
+#endif
+
 #include "ed.h"
 #include "ed.h"
+#include "extern.h"
 
 /*
  * End this editting session and exit with saving the buffer. If no
  * write has occurred since the last buffer modification a warning
  * is given once ('Q' over-rides the warning).
  */
 
 /*
  * End this editting session and exit with saving the buffer. If no
  * write has occurred since the last buffer modification a warning
  * is given once ('Q' over-rides the warning).
  */
-
 void
 q(inputt, errnum)
 void
 q(inputt, errnum)
-
-FILE *inputt;
-int *errnum;
-
+       FILE *inputt;
+       int *errnum;
 {
 {
-  int l_which; /* which is it? 'q' or 'Q' */
-  register int l_ss=ss;
+       register int l_ss = ss;
+       int l_which;                    /* Which is it? 'q' or 'Q'. */
 
 
-  l_which = ss;
+       sigspecial = 1; /* yes, 1, because we want to ensure it's on */
+       sigspecial2 = 0;
 
 
-  while (1)
-     {
-       l_ss = getc(inputt);
-       if ((l_ss != ' ') && (l_ss != '\n') && (l_ss != EOF))
-         {
-           *errnum = -1;
-           strcpy(help_msg, "illegal command option");
-           return;
-         }
-       if ((l_ss == '\n') || (l_ss == EOF))
-         break;
-     }
+       l_which = ss;
+       if (ss != -1) {
+               for (;;) {
+                       l_ss = getc(inputt);
+                       if ((l_ss != ' ') && (l_ss != '\n') && (l_ss != EOF)) {
+                               *errnum = -1;
+                               strcpy(help_msg, "illegal command option");
+                               return;
+                       }
+                       if ((l_ss == '\n') || (l_ss == EOF))
+                               break;
+               }
 
 
-  ungetc(l_ss, inputt);
-  /* note: 'Q' will bypass this if stmt., which warns of no save */
-  if ((change_flag == 1L) && (l_which == 'q'))
-    {
-      change_flag = 0L;
-      strcpy(help_msg, "buffer changes not saved");
-      *errnum = -1;
-      ss = l_ss;
-      return;
-    }
+               ungetc(l_ss, inputt);
+       }
+       /* Note: 'Q' will bypass this if stmt., which warns of no save. */
+       if ((change_flag == 1L) && ((l_which == 'q') || (l_which == -1)) ) {
+               change_flag = 0L;
+               strcpy(help_msg, "buffer changes not saved");
+               *errnum = -1;
+               ss = l_ss;
+               if (l_which == EOF)
+                       ungetc('\n', inputt);
+               return;
+       }
+       /* Do cleanup; should it be even bothered?? */
+       Start = top;
+       End = bottom;
+       Start_default = End_default = 0;
 
 
-  /* do cleanup; should it be even bothered?? */
-  start = top;
-  End = bottom;
-  start_default = End_default = 0;
-  d(inputt, errnum); /* we don't care about the returned errnum val anymore */
-  u_clr_stk();
-  free(text);
-  free(filename_current); 
+       /* We don't care about the returned errnum val anymore. */
+       if (l_which == EOF)
+               ungetc('\n', inputt);
+       d(inputt, errnum);
+       u_clr_stk();
+       free(text);
+       free(filename_current);
 #ifdef STDIO
 #ifdef STDIO
-
-  fclose(fhtmp);
-  unlink(template);
+       fclose(fhtmp);
 #endif
 #ifdef DBI
 #endif
 #ifdef DBI
-  (dbhtmp->close)(dbhtmp); /* overhead as the cache is flushed */
-  unlink(template);
+       (dbhtmp->close) (dbhtmp);       /* Overhead as the cache is flushed. */
+#endif
+#ifndef MEMORY
+       unlink(template);
 #endif
 #endif
-  exit(0);
-} /* end-q */
+       exit(exit_code);
+}