]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_argv.c
"Groff allows the initial macro on a line to be delimited by a space of
[mandoc.git] / mdoc_argv.c
index ccc6ed103712514398ebe2b132592fa9fbb581b7..453d1146905f37c84f7bc9fef8a3936c19a32104 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: mdoc_argv.c,v 1.51 2010/05/31 10:28:04 kristaps Exp $ */
+/*     $Id: mdoc_argv.c,v 1.58 2010/07/21 09:36:41 kristaps Exp $ */
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
+ * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -45,7 +45,7 @@
 
 #define        MULTI_STEP       5
 
-static int              argv_a2arg(enum mdoct, const char *);
+static enum mdocargt    argv_a2arg(enum mdoct, const char *);
 static enum margserr    args(struct mdoc *, int, int *, 
                                char *, int, char **);
 static int              argv(struct mdoc *, int, 
@@ -227,7 +227,7 @@ mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
        struct mdoc_argv tmp;
        struct mdoc_arg  *arg;
 
-       if (0 == buf[*pos])
+       if ('\0' == buf[*pos])
                return(ARGV_EOLN);
 
        assert(' ' != buf[*pos]);
@@ -248,10 +248,10 @@ mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
 
        /* XXX - save zeroed byte, if not an argument. */
 
-       sv = 0;
+       sv = '\0';
        if (buf[*pos]) {
                sv = buf[*pos];
-               buf[(*pos)++] = 0;
+               buf[(*pos)++] = '\0';
        }
 
        (void)memset(&tmp, 0, sizeof(struct mdoc_argv));
@@ -313,9 +313,11 @@ mdoc_argv_free(struct mdoc_arg *p)
 void
 mdoc_argn_free(struct mdoc_arg *p, int iarg)
 {
-       struct mdoc_argv *arg = &p->argv[iarg];
+       struct mdoc_argv *arg;
        int               j;
 
+       arg = &p->argv[iarg];
+
        if (arg->sz && arg->value) {
                for (j = (int)arg->sz - 1; j >= 0; j--) 
                        free(arg->value[j]);
@@ -359,7 +361,8 @@ mdoc_args(struct mdoc *m, int line, int *pos,
                if (MDOC_Bl == n->tok)
                        break;
 
-       if (n && LIST_column == n->data.list) {
+       assert(n->data.Bl);
+       if (n && LIST_column == n->data.Bl->type) {
                fl |= ARGS_TABSEP;
                fl &= ~ARGS_DELIM;
        }
@@ -372,9 +375,10 @@ static enum margserr
 args(struct mdoc *m, int line, int *pos, 
                char *buf, int fl, char **v)
 {
-       int               i;
-       char             *p, *pp;
-       enum margserr     rc;
+       int              i;
+       char            *p, *pp;
+       enum margserr    rc;
+       enum mdelim      d;
 
        /*
         * Parse out the terms (like `val' in `.Xx -arg val' or simply
@@ -391,7 +395,6 @@ args(struct mdoc *m, int line, int *pos,
         *   phrases like in `Bl -column'.
         */
 
-       assert(*pos);
        assert(' ' != buf[*pos]);
 
        if ('\0' == buf[*pos]) {
@@ -419,7 +422,7 @@ args(struct mdoc *m, int line, int *pos,
 
        if ((fl & ARGS_DELIM) && DELIM_CLOSE == mdoc_iscdelim(buf[*pos])) {
                for (i = *pos; buf[i]; ) {
-                       enum mdelim d = mdoc_iscdelim(buf[i]);
+                       d = mdoc_iscdelim(buf[i]);
                        if (DELIM_NONE == d || DELIM_OPEN == d)
                                break;
                        i++;
@@ -432,7 +435,7 @@ args(struct mdoc *m, int line, int *pos,
 
                if ('\0' == buf[i]) {
                        *v = &buf[*pos];
-                       if (' ' != buf[i - 1])
+                       if (i && ' ' != buf[i - 1])
                                return(ARGS_PUNCT);
                        if (ARGS_NOWARN & fl)
                                return(ARGS_PUNCT);
@@ -490,7 +493,7 @@ args(struct mdoc *m, int line, int *pos,
                }
 
                /* Whitespace check for eoln case... */
-               if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl))
+               if ('\0' == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl))
                        if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
                                return(ARGS_ERROR);
 
@@ -563,7 +566,7 @@ args(struct mdoc *m, int line, int *pos,
         */
 
        for ( ; buf[*pos]; (*pos)++)
-               if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
+               if (*pos && ' ' == buf[*pos] && '\\' != buf[*pos - 1])
                        break;
 
        if ('\0' == buf[*pos])
@@ -582,7 +585,7 @@ args(struct mdoc *m, int line, int *pos,
 }
 
 
-static int
+static enum mdocargt
 argv_a2arg(enum mdoct tok, const char *p)
 {