]> git.pond.sub.org Git - empserver/commitdiff
(parse): Support 127 arguments instead of 100, to match
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 13 Jun 2005 09:33:54 +0000 (09:33 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Mon, 13 Jun 2005 09:33:54 +0000 (09:33 +0000)
player->argp[].  Assign complete argument vector.  This should make
buffer overruns blatantly obvious.

(parse): Don't bother checking SPACE argument, just crash.  It is
extremely unlikely that such a programming error wouldn't be
discovered by even them most superficial testing.

include/prototypes.h
src/lib/gen/parse.c

index 112b11d03438469ff0f56c1ba2211f66bb335e40..20fc486ce7f83052bfba3c98920c1f287131053e 100644 (file)
@@ -386,8 +386,7 @@ extern int min(int, int);
 #endif
 extern s_char *effadv(int);
 extern int onearg(s_char *, s_char *);
-extern int parse(register s_char *, s_char **, s_char **, s_char *,
-                s_char **);
+extern int parse(char *, char **, char **, char *, char **);
 extern int ldround(double, int);
 extern int roundintby(int, int);
 extern int scthash(register int, register int, int);
index 814a2b7f865ad582c397fab5acde08adf8e5398e..d9551613d0a95a2722bcddc630dc5541fb6b54e1 100644 (file)
  *     
  */
 
-/*
- * parse empire command line, chop into argp
- * If values argpp and spacep passed, parse will use them.
- * otherwise, parse will use static space and global argp.
- * parse assumes that argpp is a char *buf[16], and that spacep
- * points to a buf of at least 256 bytes.
- */
-
 #include <ctype.h>
 #include "misc.h"
 #include "gen.h"
 
+/*
+ * Parse user command in BUF.
+ * BUF is user text.
+ * Set ARG[0] to point to the command name.
+ * Set ARG[1..N] to point to arguments, where N is the number of
+ * arguments.  Set ARG[N+1..127] to NULL.
+ * If *CONDP is not null, recognize conditional argument syntax, and
+ * set *CONDP to the conditional argument if present, else NULL.
+ * Command name and arguments are copied into SPACE[], whose size must
+ * be at least strlen(BUF) + 1.
+ * If *REDIR is not null, recognize the redirection syntax, and set
+ * *REDIR to redirection string if present, else NULL.  The
+ * redirection string is user text.
+ * Return number of slots used in ARG[], or -1 on error.
+ */
 int
-parse(register s_char *buf, s_char **argpp, s_char **condp, s_char *space,
-      s_char **redir)
+parse(char *buf, char **arg, char **condp, char *space, char **redir)
 {
-    register s_char *bp2;
-    register s_char *bp1 = space;
-    register s_char **arg = argpp;
+    char *bp2;
+    char *bp1 = space;
     int fs;
     int quoted;
     int argnum;
 
-    if (space == 0)
-       return -1;
     if (redir)
        *redir = 0;
-    if (condp != 0)
-       *condp = 0;
-    for (argnum = 0; *buf && argnum < 100;) {
+    if (condp != NULL)
+       *condp = NULL;
+    for (argnum = 0; *buf && argnum < 127;) {
        while (isspace(*buf))
            buf++;
        if (!*buf)
@@ -86,15 +89,14 @@ parse(register s_char *buf, s_char **argpp, s_char **condp, s_char *space,
            }
        }
        *bp1++ = 0;
-       if (*bp2 == '?' && condp != 0) {
+       if (*bp2 == '?' && condp != NULL) {
            *condp = bp2 + 1;
        } else {
            arg[argnum] = bp2;
            argnum++;
        }
     }
-    arg[argnum] = 0;
-    for (fs = argnum + 1; fs < 16; fs++)
-       arg[fs] = 0;
+    for (fs = argnum; fs < 128; fs++)
+       arg[fs] = NULL;
     return argnum;
 }