=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.51 retrieving revision 1.59 diff -u -p -r1.51 -r1.59 --- mandoc/mdoc_argv.c 2010/05/31 10:28:04 1.51 +++ mandoc/mdoc_argv.c 2010/09/13 12:21:34 1.59 @@ -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.59 2010/09/13 12:21:34 kristaps Exp $ */ /* - * Copyright (c) 2008, 2009 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * * 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, @@ -95,7 +95,7 @@ static int mdoc_argflags[MDOC_MAX] = { 0, /* Os */ 0, /* Sh */ 0, /* Ss */ - ARGS_DELIM, /* Pp */ + 0, /* Pp */ ARGS_DELIM, /* D1 */ ARGS_DELIM, /* Dl */ 0, /* Bd */ @@ -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) {