diff options
Diffstat (limited to 'usr.bin/mandoc/main.c')
-rw-r--r-- | usr.bin/mandoc/main.c | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/usr.bin/mandoc/main.c b/usr.bin/mandoc/main.c index d534f636a2a..d1a7497d04a 100644 --- a/usr.bin/mandoc/main.c +++ b/usr.bin/mandoc/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.4 2009/06/18 22:16:56 schwarze Exp $ */ +/* $Id: main.c,v 1.5 2009/06/18 23:34:53 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se> * @@ -312,7 +312,7 @@ fdesc(struct buf *blk, struct buf *ln, struct curparse *curp) size_t sz; ssize_t ssz; struct stat st; - int j, i, pos, lnn; + int j, i, pos, lnn, comment; struct man *man; struct mdoc *mdoc; @@ -342,7 +342,7 @@ fdesc(struct buf *blk, struct buf *ln, struct curparse *curp) /* Fill buf with file blocksize. */ - for (lnn = 0, pos = 0; ; ) { + for (lnn = pos = comment = 0; ; ) { if (-1 == (ssz = read(curp->fd, blk->buf, sz))) { warn("%s", curp->file); return(0); @@ -362,17 +362,34 @@ fdesc(struct buf *blk, struct buf *ln, struct curparse *curp) } if ('\n' != blk->buf[i]) { + if (comment) + continue; ln->buf[pos++] = blk->buf[i]; + + /* Handle in-line `\"' comments. */ + + if (1 == pos || '\"' != ln->buf[pos - 1]) + continue; + + for (j = pos - 2; j >= 0; j--) + if ('\\' != ln->buf[j]) + break; + + if ( ! ((pos - 2 - j) % 2)) + continue; + + comment = 1; + pos -= 2; continue; - } + } - /* Check for CPP-escaped newline. */ + /* Handle escaped `\\n' newlines. */ - if (pos > 0 && '\\' == ln->buf[pos - 1]) { + if (pos > 0 && 0 == comment && + '\\' == ln->buf[pos - 1]) { for (j = pos - 1; j >= 0; j--) if ('\\' != ln->buf[j]) break; - if ( ! ((pos - j) % 2)) { pos--; lnn++; @@ -382,19 +399,16 @@ fdesc(struct buf *blk, struct buf *ln, struct curparse *curp) ln->buf[pos] = 0; lnn++; - - /* - * If no manual parser has been assigned, then - * try to assign one in pset(), which may do - * nothing at all. After this, parse the manual - * line accordingly. - */ + + /* If unset, assign parser in pset(). */ if ( ! (man || mdoc) && ! pset(ln->buf, pos, curp, &man, &mdoc)) return(0); - pos = 0; + pos = comment = 0; + + /* Pass down into parsers. */ if (man && ! man_parseln(man, lnn, ln->buf)) return(0); @@ -403,7 +417,7 @@ fdesc(struct buf *blk, struct buf *ln, struct curparse *curp) } } - /* Note that a parser may not have been assigned, yet. */ + /* NOTE a parser may not have been assigned, yet. */ if ( ! (man || mdoc)) { warnx("%s: not a manual", curp->file); @@ -415,12 +429,7 @@ fdesc(struct buf *blk, struct buf *ln, struct curparse *curp) if (man && ! man_endparse(man)) return(0); - /* - * If an output device hasn't been allocated, see if we should - * do so now. Note that not all outtypes have functions, so - * this switch statement may be superfluous, but it's - * low-overhead enough not to matter very much. - */ + /* If unset, allocate output dev now (if applicable). */ if ( ! (curp->outman && curp->outmdoc)) { switch (curp->outtype) { @@ -456,17 +465,23 @@ static int pset(const char *buf, int pos, struct curparse *curp, struct man **man, struct mdoc **mdoc) { + int i; /* * Try to intuit which kind of manual parser should be used. If * passed in by command-line (-man, -mdoc), then use that * explicitly. If passed as -mandoc, then try to guess from the - * line: either skip comments, use -mdoc when finding `.Dt', or + * line: either skip dot-lines, use -mdoc when finding `.Dt', or * default to -man, which is more lenient. */ - if (pos >= 3 && 0 == memcmp(buf, ".\\\"", 3)) - return(1); + if (buf[0] == '.') { + for (i = 1; buf[i]; i++) + if (' ' != buf[i] && '\t' != buf[i]) + break; + if (0 == buf[i]) + return(1); + } switch (curp->inttype) { case (INTT_MDOC): |