version 1.47, 2010/05/15 04:47:38 |
version 1.51, 2010/05/31 10:28:04 |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <string.h> |
#include <string.h> |
|
|
|
#include "mandoc.h" |
#include "libmdoc.h" |
#include "libmdoc.h" |
#include "libmandoc.h" |
#include "libmandoc.h" |
|
|
Line 209 static int mdoc_argflags[MDOC_MAX] = { |
|
Line 210 static int mdoc_argflags[MDOC_MAX] = { |
|
0, /* br */ |
0, /* br */ |
0, /* sp */ |
0, /* sp */ |
0, /* %U */ |
0, /* %U */ |
|
0, /* Ta */ |
}; |
}; |
|
|
|
|
|
|
mdoc_args(struct mdoc *m, int line, int *pos, |
mdoc_args(struct mdoc *m, int line, int *pos, |
char *buf, enum mdoct tok, char **v) |
char *buf, enum mdoct tok, char **v) |
{ |
{ |
int fl, c, i; |
int fl; |
struct mdoc_node *n; |
struct mdoc_node *n; |
|
|
fl = mdoc_argflags[tok]; |
fl = mdoc_argflags[tok]; |
Line 346 mdoc_args(struct mdoc *m, int line, int *pos, |
|
Line 348 mdoc_args(struct mdoc *m, int line, int *pos, |
|
if (MDOC_It != tok) |
if (MDOC_It != tok) |
return(args(m, line, pos, buf, fl, v)); |
return(args(m, line, pos, buf, fl, v)); |
|
|
/* |
/* |
* The `It' macro is a special case, as it acquires parameters from its |
* We know that we're in an `It', so it's reasonable to expect |
* parent `Bl' context, specifically, we're concerned with -column. |
* us to be sitting in a `Bl'. Someday this may not be the case |
|
* (if we allow random `It's sitting out there), so provide a |
|
* safe fall-back into the default behaviour. |
*/ |
*/ |
|
|
for (n = m->last; n; n = n->parent) |
for (n = m->last; n; n = n->parent) |
if (MDOC_BLOCK == n->type && MDOC_Bl == n->tok) |
if (MDOC_Bl == n->tok) |
break; |
break; |
|
|
assert(n); |
if (n && LIST_column == n->data.list) { |
c = (int)(n->args ? n->args->argc : 0); |
|
assert(c > 0); |
|
|
|
/* LINTED */ |
|
for (i = 0; i < c; i++) { |
|
if (MDOC_Column != n->args->argv[i].arg) |
|
continue; |
|
fl |= ARGS_TABSEP; |
fl |= ARGS_TABSEP; |
fl &= ~ARGS_DELIM; |
fl &= ~ARGS_DELIM; |
break; |
|
} |
} |
|
|
return(args(m, line, pos, buf, fl, v)); |
return(args(m, line, pos, buf, fl, v)); |
Line 407 args(struct mdoc *m, int line, int *pos, |
|
Line 403 args(struct mdoc *m, int line, int *pos, |
|
* is unterminated. |
* is unterminated. |
*/ |
*/ |
if (MDOC_PHRASELIT & m->flags) |
if (MDOC_PHRASELIT & m->flags) |
if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) |
if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
m->flags &= ~MDOC_PHRASELIT; |
m->flags &= ~MDOC_PHRASELIT; |
Line 421 args(struct mdoc *m, int line, int *pos, |
|
Line 417 args(struct mdoc *m, int line, int *pos, |
|
* we ONLY care about closing delimiters. |
* we ONLY care about closing delimiters. |
*/ |
*/ |
|
|
if ((fl & ARGS_DELIM) && mdoc_iscdelim(buf[*pos]) > 1) { |
if ((fl & ARGS_DELIM) && DELIM_CLOSE == mdoc_iscdelim(buf[*pos])) { |
for (i = *pos; buf[i]; ) { |
for (i = *pos; buf[i]; ) { |
if (mdoc_iscdelim(buf[i]) < 2) |
enum mdelim d = mdoc_iscdelim(buf[i]); |
|
if (DELIM_NONE == d || DELIM_OPEN == d) |
break; |
break; |
i++; |
i++; |
if ('\0' == buf[i] || ' ' != buf[i]) |
if ('\0' == buf[i] || ' ' != buf[i]) |
Line 439 args(struct mdoc *m, int line, int *pos, |
|
Line 436 args(struct mdoc *m, int line, int *pos, |
|
return(ARGS_PUNCT); |
return(ARGS_PUNCT); |
if (ARGS_NOWARN & fl) |
if (ARGS_NOWARN & fl) |
return(ARGS_PUNCT); |
return(ARGS_PUNCT); |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
return(ARGS_PUNCT); |
return(ARGS_PUNCT); |
} |
} |
Line 466 args(struct mdoc *m, int line, int *pos, |
|
Line 463 args(struct mdoc *m, int line, int *pos, |
|
break; |
break; |
if (pp > *v && ' ' != *(pp - 1)) |
if (pp > *v && ' ' != *(pp - 1)) |
continue; |
continue; |
if (' ' == *(pp + 2) || 0 == *(pp + 2)) |
if (' ' == *(pp + 2) || '\0' == *(pp + 2)) |
break; |
break; |
} |
} |
|
|
Line 494 args(struct mdoc *m, int line, int *pos, |
|
Line 491 args(struct mdoc *m, int line, int *pos, |
|
|
|
/* Whitespace check for eoln case... */ |
/* Whitespace check for eoln case... */ |
if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl)) |
if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
*pos += (int)(p - *v); |
*pos += (int)(p - *v); |
Line 539 args(struct mdoc *m, int line, int *pos, |
|
Line 536 args(struct mdoc *m, int line, int *pos, |
|
if ('\0' == buf[*pos]) { |
if ('\0' == buf[*pos]) { |
if (ARGS_NOWARN & fl || MDOC_PPHRASE & m->flags) |
if (ARGS_NOWARN & fl || MDOC_PPHRASE & m->flags) |
return(ARGS_QWORD); |
return(ARGS_QWORD); |
if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) |
if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
return(ARGS_QWORD); |
return(ARGS_QWORD); |
} |
} |
Line 554 args(struct mdoc *m, int line, int *pos, |
|
Line 551 args(struct mdoc *m, int line, int *pos, |
|
(*pos)++; |
(*pos)++; |
|
|
if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) |
if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
return(ARGS_QWORD); |
return(ARGS_QWORD); |
Line 578 args(struct mdoc *m, int line, int *pos, |
|
Line 575 args(struct mdoc *m, int line, int *pos, |
|
(*pos)++; |
(*pos)++; |
|
|
if ('\0' == buf[*pos] && ! (ARGS_NOWARN & fl)) |
if ('\0' == buf[*pos] && ! (ARGS_NOWARN & fl)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
return(ARGS_WORD); |
return(ARGS_WORD); |
Line 750 argv_single(struct mdoc *m, int line, |
|
Line 747 argv_single(struct mdoc *m, int line, |
|
ppos = *pos; |
ppos = *pos; |
|
|
ac = args(m, line, pos, buf, 0, &p); |
ac = args(m, line, pos, buf, 0, &p); |
if (ARGS_ERROR == ac) |
if (ARGS_EOLN == ac) { |
|
mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTARGVCOUNT); |
return(0); |
return(0); |
if (ARGS_EOLN == ac) |
} else if (ARGS_ERROR == ac) |
return(mdoc_perr(m, line, ppos, EARGVAL)); |
return(0); |
|
|
v->sz = 1; |
v->sz = 1; |
v->value = mandoc_malloc(sizeof(char *)); |
v->value = mandoc_malloc(sizeof(char *)); |