version 1.165, 2017/05/16 19:06:30 |
version 1.182, 2017/06/25 17:43:45 |
|
|
const char *file; /* filename of current input file */ |
const char *file; /* filename of current input file */ |
struct buf *primary; /* buffer currently being parsed */ |
struct buf *primary; /* buffer currently being parsed */ |
struct buf *secondary; /* preprocessed copy of input */ |
struct buf *secondary; /* preprocessed copy of input */ |
const char *defos; /* default operating system */ |
const char *os_s; /* default operating system */ |
mandocmsg mmsg; /* warning/error message handler */ |
mandocmsg mmsg; /* warning/error message handler */ |
enum mandoclevel file_status; /* status of current parse */ |
enum mandoclevel file_status; /* status of current parse */ |
enum mandoclevel wlevel; /* ignore messages below this */ |
enum mandocerr mmin; /* ignore messages below this */ |
int options; /* parser options */ |
int options; /* parser options */ |
int gzip; /* current input file is gzipped */ |
int gzip; /* current input file is gzipped */ |
int filenc; /* encoding of the current file */ |
int filenc; /* encoding of the current file */ |
Line 86 static const enum mandocerr mandoclimits[MANDOCLEVEL_M |
|
Line 86 static const enum mandocerr mandoclimits[MANDOCLEVEL_M |
|
static const char * const mandocerrs[MANDOCERR_MAX] = { |
static const char * const mandocerrs[MANDOCERR_MAX] = { |
"ok", |
"ok", |
|
|
|
"base system convention", |
|
|
|
"Mdocdate found", |
|
"Mdocdate missing", |
|
"unknown architecture", |
|
"operating system explicitly specified", |
|
"RCS id missing", |
|
|
"generic style suggestion", |
"generic style suggestion", |
|
|
|
"legacy man(7) date format", |
|
"duplicate RCS id", |
|
"typo in section name", |
|
"useless macro", |
|
"consider using OS macro", |
|
"errnos out of order", |
|
"duplicate errno", |
|
"description line ends with a full stop", |
|
"no blank before trailing delimiter", |
|
"function name without markup", |
|
|
"generic warning", |
"generic warning", |
|
|
/* related to the prologue */ |
/* related to the prologue */ |
Line 134 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 154 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"fill mode already enabled, skipping", |
"fill mode already enabled, skipping", |
"fill mode already disabled, skipping", |
"fill mode already disabled, skipping", |
"line scope broken", |
"line scope broken", |
|
"skipping blank line in line scope", |
|
|
/* related to missing macro arguments */ |
/* related to missing macro arguments */ |
"skipping empty request", |
"skipping empty request", |
Line 169 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 190 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"unknown AT&T UNIX version", |
"unknown AT&T UNIX version", |
"comma in function argument", |
"comma in function argument", |
"parenthesis in function name", |
"parenthesis in function name", |
|
"unknown library name", |
"invalid content in Rs block", |
"invalid content in Rs block", |
"invalid Boolean argument", |
"invalid Boolean argument", |
"unknown font, skipping request", |
"unknown font, skipping request", |
Line 221 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 243 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
"NOT IMPLEMENTED: Bd -file", |
"NOT IMPLEMENTED: Bd -file", |
"skipping display without arguments", |
"skipping display without arguments", |
"missing list type, using -item", |
"missing list type, using -item", |
|
"argument is not numeric, using 1", |
"missing manual name, using \"\"", |
"missing manual name, using \"\"", |
"uname(3) system call failed, using UNKNOWN", |
"uname(3) system call failed, using UNKNOWN", |
"unknown standard specifier", |
"unknown standard specifier", |
Line 320 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
Line 343 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
const char *save_file; |
const char *save_file; |
char *cp; |
char *cp; |
size_t pos; /* byte number in the ln buffer */ |
size_t pos; /* byte number in the ln buffer */ |
size_t j; /* auxiliary byte number in the blk buffer */ |
|
enum rofferr rr; |
enum rofferr rr; |
int of; |
int of; |
int lnn; /* line number in the real file */ |
int lnn; /* line number in the real file */ |
Line 402 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
Line 424 mparse_buf_r(struct mparse *curp, struct buf blk, size |
|
continue; |
continue; |
} |
} |
|
|
/* Trailing backslash = a plain char. */ |
|
|
|
if (blk.buf[i] != '\\' || i + 1 == blk.sz) { |
|
ln.buf[pos++] = blk.buf[i++]; |
|
continue; |
|
} |
|
|
|
/* |
|
* Found escape and at least one other character. |
|
* When it's a newline character, skip it. |
|
* When there is a carriage return in between, |
|
* skip that one as well. |
|
*/ |
|
|
|
if ('\r' == blk.buf[i + 1] && i + 2 < blk.sz && |
|
'\n' == blk.buf[i + 2]) |
|
++i; |
|
if ('\n' == blk.buf[i + 1]) { |
|
i += 2; |
|
++lnn; |
|
continue; |
|
} |
|
|
|
if ('"' == blk.buf[i + 1] || '#' == blk.buf[i + 1]) { |
|
j = i; |
|
i += 2; |
|
/* Comment, skip to end of line */ |
|
for (; i < blk.sz; ++i) { |
|
if (blk.buf[i] != '\n') |
|
continue; |
|
if (blk.buf[i - 1] == ' ' || |
|
blk.buf[i - 1] == '\t') |
|
mandoc_msg( |
|
MANDOCERR_SPACE_EOL, |
|
curp, curp->line, |
|
pos + i-1 - j, NULL); |
|
++i; |
|
++lnn; |
|
break; |
|
} |
|
|
|
/* Backout trailing whitespaces */ |
|
for (; pos > 0; --pos) { |
|
if (ln.buf[pos - 1] != ' ') |
|
break; |
|
if (pos > 2 && ln.buf[pos - 2] == '\\') |
|
break; |
|
} |
|
break; |
|
} |
|
|
|
/* Catch escaped bogus characters. */ |
|
|
|
c = (unsigned char) blk.buf[i+1]; |
|
|
|
if ( ! (isascii(c) && |
|
(isgraph(c) || isblank(c)))) { |
|
mandoc_vmsg(MANDOCERR_CHAR_BAD, curp, |
|
curp->line, pos, "0x%x", c); |
|
i += 2; |
|
ln.buf[pos++] = '?'; |
|
continue; |
|
} |
|
|
|
/* Some other escape sequence, copy & cont. */ |
|
|
|
ln.buf[pos++] = blk.buf[i++]; |
ln.buf[pos++] = blk.buf[i++]; |
ln.buf[pos++] = blk.buf[i++]; |
|
} |
} |
|
|
if (pos >= ln.sz) |
if (pos + 1 >= ln.sz) |
resize_buf(&ln, 256); |
resize_buf(&ln, 256); |
|
|
|
if (i == blk.sz || blk.buf[i] == '\0') |
|
ln.buf[pos++] = '\n'; |
ln.buf[pos] = '\0'; |
ln.buf[pos] = '\0'; |
|
|
/* |
/* |
Line 804 mparse_open(struct mparse *curp, const char *file) |
|
Line 761 mparse_open(struct mparse *curp, const char *file) |
|
} |
} |
|
|
struct mparse * |
struct mparse * |
mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg, |
mparse_alloc(int options, enum mandocerr mmin, mandocmsg mmsg, |
const char *defos) |
enum mandoc_os os_e, const char *os_s) |
{ |
{ |
struct mparse *curp; |
struct mparse *curp; |
|
|
curp = mandoc_calloc(1, sizeof(struct mparse)); |
curp = mandoc_calloc(1, sizeof(struct mparse)); |
|
|
curp->options = options; |
curp->options = options; |
curp->wlevel = wlevel; |
curp->mmin = mmin; |
curp->mmsg = mmsg; |
curp->mmsg = mmsg; |
curp->defos = defos; |
curp->os_s = os_s; |
|
|
curp->roff = roff_alloc(curp, options); |
curp->roff = roff_alloc(curp, options); |
curp->man = roff_man_alloc( curp->roff, curp, curp->defos, |
curp->man = roff_man_alloc(curp->roff, curp, curp->os_s, |
curp->options & MPARSE_QUICK ? 1 : 0); |
curp->options & MPARSE_QUICK ? 1 : 0); |
if (curp->options & MPARSE_MDOC) { |
if (curp->options & MPARSE_MDOC) { |
curp->man->macroset = MACROSET_MDOC; |
curp->man->macroset = MACROSET_MDOC; |
Line 829 mparse_alloc(int options, enum mandoclevel wlevel, man |
|
Line 786 mparse_alloc(int options, enum mandoclevel wlevel, man |
|
curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX); |
curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX); |
} |
} |
curp->man->first->tok = TOKEN_NONE; |
curp->man->first->tok = TOKEN_NONE; |
|
curp->man->meta.os_e = os_e; |
return curp; |
return curp; |
} |
} |
|
|
Line 904 mandoc_msg(enum mandocerr er, struct mparse *m, |
|
Line 862 mandoc_msg(enum mandocerr er, struct mparse *m, |
|
{ |
{ |
enum mandoclevel level; |
enum mandoclevel level; |
|
|
|
if (er < m->mmin && er != MANDOCERR_FILE) |
|
return; |
|
|
level = MANDOCLEVEL_UNSUPP; |
level = MANDOCLEVEL_UNSUPP; |
while (er < mandoclimits[level]) |
while (er < mandoclimits[level]) |
level--; |
level--; |
|
|
if (level < m->wlevel && er != MANDOCERR_FILE) |
|
return; |
|
|
|
if (m->mmsg) |
if (m->mmsg) |
(*m->mmsg)(er, level, m->file, ln, col, msg); |
(*m->mmsg)(er, level, m->file, ln, col, msg); |