summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/mandoc/main.c')
-rw-r--r--usr.bin/mandoc/main.c65
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):