Add -s option.
authorEric S. Raymond <esr@thyrsus.com>
Mon, 12 Jun 2017 20:51:35 +0000 (16:51 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 12 Jun 2017 20:51:35 +0000 (16:51 -0400)
Re-enables pasting multiline sequences to the > prompt (for making checkfiles).

advent.adoc
advent.h
main.c
misc.c

index 44aa07c357045c8c9436fbac291ca17fa7be788f..c1075e61fd7ba08eba8e8701bc5a7fa8c5e3e1a6 100644 (file)
@@ -37,7 +37,9 @@ There have been no gameplay changes.
 
 -l:: Log commands to specified file.
 
--o:: Old-style.  Restores original interface, no prompt or command history.
+-s:: Suppress Emacs-like line editing and command history.
+
+-o:: Old-style.  Restores original interface, no prompt or line editing.
 
 == BUGS ==
 
index 6e3c56b2649e56116499195569e656f123380e89..e75a1cd09f428f0868cbfd60f3fa1ee82fecbb23 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -80,7 +80,7 @@ extern char rawbuf[LINESIZE], INLINE[LINESIZE+1];
 extern const char ascii_to_advent[];
 extern const char advent_to_ascii[];
 extern FILE *logfp;
-extern bool oldstyle;
+extern bool oldstyle, editline, prompt;
 extern lcg_state lcgstate;
 
 /* b is not needed for POSIX but harmless */
@@ -174,6 +174,7 @@ enum speechpart {unknown, intransitive, transitive};
 
 /* Phase codes for action returns. 
  * These were at one time FORTRAN line numbers.
+ * The values don't matter, but perturb their order at your peril.
  */
 #define GO_TERMINATE   2
 #define GO_MOVE                8
@@ -181,12 +182,14 @@ enum speechpart {unknown, intransitive, transitive};
 #define GO_CLEAROBJ    2012
 #define GO_CHECKHINT   2600
 #define GO_CHECKFOO    2607
+#define GO_CLOSEJUMP   2610
 #define GO_DIRECTION   2620
 #define GO_LOOKUP      2630
 #define GO_WORD2       2800
+#define GO_SPECIALS    1900
 #define GO_UNKNOWN     8000
-#define GO_DWARFWAKE   19000
 #define GO_ACTION      40000
+#define GO_DWARFWAKE   19000
 
 /* hack to ignore GCC Unused Result */
 #define IGNORE(r) do{if (r){}}while(0)
diff --git a/main.c b/main.c
index 920bea0f4d9daae78ab29eca420e247468e2e5d9..a74aa6b2b44ca76b811910f1ecaca8e029b82bb6 100644 (file)
--- a/main.c
+++ b/main.c
@@ -5,12 +5,13 @@
  * is a result of running the original Fortran IV source through a
  * home-brew Fortran-to-C converter.)
  *
- * Now that the code has been restructured into idiomatic C, the following
- * is more appropriate:
+ * Now that the code has been restructured into something much closer
+ * to idiomatic C, the following is more appropriate:
  *
- * ESR apologizes for the remaing gotos (now confined to two functions in this
- * file - they used to be *everywhere*), and the offensive globals.  Applying
- * the Structured Program Theorem can be hard.
+ * ESR apologizes for the remaing gotos (now confined to two functions
+ * in this file - there used to be hundreds of them, *everywhere*),
+ * and the offensive globals.  Applying the Structured Program Theorem
+ * can be hard.
  */
 #include <stdlib.h>
 #include <stdio.h>
@@ -43,6 +44,8 @@ long WD1, WD1X, WD2, WD2X;
 
 FILE  *logfp;
 bool oldstyle = false;
+bool editline = true;
+bool prompt = true;
 lcg_state lcgstate;
 
 extern void initialise();
@@ -77,9 +80,9 @@ int main(int argc, char *argv[])
        
 /*  Options. */
 
-    while ((ch = getopt(argc, argv, "l:o")) != EOF) {
+    while ((ch = getopt(argc, argv, "l:os")) != EOF) {
        switch (ch) {
-case 'l':
+       case 'l':
            logfp = fopen(optarg, "w");
            if (logfp == NULL)
                fprintf(stderr,
@@ -89,6 +92,10 @@ case 'l':
            break;
        case 'o':
            oldstyle = true;
+           editline = prompt = false;
+           break;
+       case 's':
+           editline = false;
            break;
        }
     }
diff --git a/misc.c b/misc.c
index dde006340525739807e6e4c8f9362ce02083726c..e6f17abbddcc236ae726dc91e15d938c51a9ec38 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -630,14 +630,14 @@ bool MAPLIN(FILE *fp)
      *  and is not changed thereafter unless the routines on this page choose
      *  to do so. */
 
-    if (!oldstyle && !isatty(1))
+    if (prompt)
        fputs("> ", stdout);
     do {
-       if (oldstyle) {
+       if (!editline) {
            IGNORE(fgets(rawbuf,sizeof(rawbuf)-1,fp));
            eof = (feof(fp));
        } else {
-           char *cp = linenoise("> ");
+           char *cp = linenoise(prompt ? "> ": "");
            eof = (cp == NULL);
            if (!eof) {
                strncpy(rawbuf, cp, sizeof(rawbuf)-1);