version 1.8, 2009/03/08 18:50:40 |
version 1.10, 2009/03/09 13:04:01 |
|
|
int dbg; /* Debug level. */ |
int dbg; /* Debug level. */ |
struct mdoc *mdoc; /* Active parser. */ |
struct mdoc *mdoc; /* Active parser. */ |
char *buf; /* Input buffer. */ |
char *buf; /* Input buffer. */ |
u_long bufsz; /* Input buffer size. */ |
size_t bufsz; /* Input buffer size. */ |
char *in; /* Input file name. */ |
char *in; /* Input file name. */ |
int fdin; /* Input file desc. */ |
int fdin; /* Input file desc. */ |
int pflags; /* Parse flags. */ |
int pflags; /* Parse flags. */ |
Line 190 mmain_mdoc(struct mmain *p) |
|
Line 190 mmain_mdoc(struct mmain *p) |
|
warn("%s", p->in); |
warn("%s", p->in); |
p->bufsz = BUFSIZ; |
p->bufsz = BUFSIZ; |
} else |
} else |
p->bufsz = MAX(st.st_blksize, BUFSIZ); |
p->bufsz = (size_t)MAX(st.st_blksize, BUFSIZ); |
|
|
p->buf = malloc(p->bufsz); |
p->buf = malloc(p->bufsz); |
if (NULL == p->buf) |
if (NULL == p->buf) |
|
|
optsopt(struct mmain *p, char *arg) |
optsopt(struct mmain *p, char *arg) |
{ |
{ |
char *v; |
char *v; |
char *toks[] = { "ign-scope", "ign-escape", NULL }; |
char *toks[] = { "ign-scope", "ign-escape", |
|
"ign-macro", NULL }; |
|
|
while (*arg) |
while (*arg) |
switch (getsubopt(&arg, toks, &v)) { |
switch (getsubopt(&arg, toks, &v)) { |
Line 227 optsopt(struct mmain *p, char *arg) |
|
Line 228 optsopt(struct mmain *p, char *arg) |
|
case (1): |
case (1): |
p->pflags |= MDOC_IGN_ESCAPE; |
p->pflags |= MDOC_IGN_ESCAPE; |
break; |
break; |
|
case (2): |
|
p->pflags |= MDOC_IGN_MACRO; |
|
break; |
default: |
default: |
/* FIXME: report? */ |
warnx("unknown -f argument"); |
return(0); |
return(0); |
} |
} |
|
|
Line 258 optswarn(struct mmain *p, char *arg) |
|
Line 262 optswarn(struct mmain *p, char *arg) |
|
p->warn |= MD_WARN_ERR; |
p->warn |= MD_WARN_ERR; |
break; |
break; |
default: |
default: |
/* FIXME: report? */ |
warnx("unknown -W argument"); |
return(0); |
return(0); |
} |
} |
|
|
|
|
parse(struct mmain *p) |
parse(struct mmain *p) |
{ |
{ |
ssize_t sz; |
ssize_t sz; |
int i, pos, len, lnn; |
int j, i, pos, len, lnn; |
char *line; |
char *ln; |
|
|
for (line = NULL, lnn = 1, len = pos = 0; ; ) { |
for (ln = NULL, lnn = 1, len = pos = 0; ; ) { |
if (-1 == (sz = read(p->fdin, p->buf, p->bufsz))) { |
if (-1 == (sz = read(p->fdin, p->buf, p->bufsz))) { |
warn("%s", p->in); |
warn("%s", p->in); |
return(0); |
return(0); |
Line 283 parse(struct mmain *p) |
|
Line 287 parse(struct mmain *p) |
|
for (i = 0; i < (int)sz; i++) { |
for (i = 0; i < (int)sz; i++) { |
if (pos >= len) { |
if (pos >= len) { |
len += MD_LINE_SZ; |
len += MD_LINE_SZ; |
line = realloc(line, len); |
ln = realloc(ln, (size_t)len); |
if (NULL == line) |
if (NULL == ln) |
err(1, "realloc"); |
err(1, "realloc"); |
} |
} |
|
|
if ('\n' != p->buf[i]) { |
if ('\n' != p->buf[i]) { |
line[pos++] = p->buf[i]; |
ln[pos++] = p->buf[i]; |
continue; |
continue; |
} |
} |
|
|
line[pos] = 0; |
/* Check for escaped newline. */ |
if ( ! mdoc_parseln(p->mdoc, lnn, line)) |
|
return(0); |
|
|
|
|
if (pos > 0 && '\\' == ln[pos - 1]) { |
|
for (j = pos - 1; j >= 0; j--) |
|
if ('\\' != ln[j]) |
|
break; |
|
|
|
if ( ! ((pos - j) % 2)) { |
|
pos--; |
|
lnn++; |
|
continue; |
|
} |
|
} |
|
|
|
ln[pos] = 0; |
|
if ( ! mdoc_parseln(p->mdoc, lnn, ln)) |
|
return(0); |
lnn++; |
lnn++; |
pos = 0; |
pos = 0; |
} |
} |
} |
} |
|
|
if (line) |
if (pos > 0) |
free(line); |
warnx("%s: file not eof-terminated", p->in); |
|
|
|
if (ln) |
|
free(ln); |
return(mdoc_endparse(p->mdoc)); |
return(mdoc_endparse(p->mdoc)); |
} |
} |
|
|