diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | action.c | 20 | ||||
-rw-r--r-- | main.c | 104 | ||||
-rw-r--r-- | strings.c | 2 |
4 files changed, 76 insertions, 52 deletions
@@ -9,7 +9,7 @@ INSTALL_DATA = install -m 0444 INSTALL_LIB = install -m 0644 INSTALL_MAN = $(INSTALL_DATA) -VERSION = 1.6.3 +VERSION = 1.6.4 VDATE = 20 March 2009 VFLAGS = -DVERSION=\"$(VERSION)\" @@ -57,8 +57,8 @@ static int post_ar(POST_ARGS); static int post_bl(POST_ARGS); static int post_bl_width(POST_ARGS); static int post_bl_tagwidth(POST_ARGS); -static int post_bd(POST_ARGS); static int post_dd(POST_ARGS); +static int post_display(POST_ARGS); static int post_dt(POST_ARGS); static int post_nm(POST_ARGS); static int post_os(POST_ARGS); @@ -67,6 +67,7 @@ static int post_sh(POST_ARGS); static int post_std(POST_ARGS); static int pre_bd(PRE_ARGS); +static int pre_dl(PRE_ARGS); #define merr(m, t) perr((m), (m)->last->line, (m)->last->pos, (t)) #define mwarn(m, t) pwarn((m), (m)->last->line, (m)->last->pos, (t)) @@ -80,8 +81,8 @@ const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ss */ { NULL, NULL }, /* Pp */ { NULL, NULL }, /* D1 */ - { NULL, NULL }, /* Dl */ - { pre_bd, post_bd }, /* Bd */ + { pre_dl, post_display }, /* Dl */ + { pre_bd, post_display }, /* Bd */ { NULL, NULL }, /* Ed */ { NULL, post_bl }, /* Bl */ { NULL, NULL }, /* El */ @@ -686,6 +687,17 @@ post_prol(POST_ARGS) static int +pre_dl(PRE_ARGS) +{ + + if (MDOC_BODY != n->type) + return(1); + m->flags |= MDOC_LITERAL; + return(1); +} + + +static int pre_bd(PRE_ARGS) { int i; @@ -714,7 +726,7 @@ pre_bd(PRE_ARGS) static int -post_bd(POST_ARGS) +post_display(POST_ARGS) { if (MDOC_BODY == m->last->type) @@ -35,10 +35,19 @@ extern int getsubopt(char **, char * const *, char **); # endif #endif +struct buf { + char *buf; + size_t sz; +}; + +struct curparse { + const char *file; + int wflags; #define WARN_WALL 0x03 /* All-warnings mask. */ #define WARN_WCOMPAT (1 << 0) /* Compatibility warnings. */ #define WARN_WSYNTAX (1 << 1) /* Syntax warnings. */ #define WARN_WERR (1 << 2) /* Warnings->errors. */ +}; enum outt { OUTT_ASCII, @@ -68,9 +77,9 @@ static int woptions(int *, char *); static int merr(void *, int, int, const char *); static int mwarn(void *, int, int, enum mdoc_warn, const char *); -static int file(char **, size_t *, char **, size_t *, +static int file(struct buf *, struct buf *, const char *, struct mdoc *); -static int fdesc(char **, size_t *, char **, size_t *, +static int fdesc(struct buf *, struct buf *, const char *, int, struct mdoc *); @@ -80,16 +89,18 @@ main(int argc, char *argv[]) int c, rc, fflags, wflags; struct mdoc_cb cb; struct mdoc *mdoc; - char *buf, *line; - size_t bufsz, linesz; void *outdata; enum outt outtype; + struct buf ln, blk; out_run outrun; out_free outfree; + struct curparse curp; fflags = wflags = 0; outtype = OUTT_ASCII; + bzero(&curp, sizeof(struct curparse)); + /* LINTED */ while (-1 != (c = getopt(argc, argv, "f:VW:T:"))) switch (c) { @@ -102,7 +113,7 @@ main(int argc, char *argv[]) return(0); break; case ('W'): - if ( ! woptions(&wflags, optarg)) + if ( ! woptions(&curp.wflags, optarg)) return(0); break; case ('V'): @@ -160,18 +171,18 @@ main(int argc, char *argv[]) cb.mdoc_err = merr; cb.mdoc_warn = mwarn; - buf = line = NULL; - bufsz = linesz = 0; + bzero(&ln, sizeof(struct buf)); + bzero(&blk, sizeof(struct buf)); - mdoc = mdoc_alloc(&wflags, fflags, &cb); + mdoc = mdoc_alloc(&curp, fflags, &cb); /* * Loop around available files. */ if (NULL == *argv) { - c = fdesc(&line, &linesz, &buf, &bufsz, - "stdin", STDIN_FILENO, mdoc); + curp.file = "<stdin>"; + c = fdesc(&blk, &ln, "stdin", STDIN_FILENO, mdoc); rc = 0; if (c && NULL == outrun) rc = 1; @@ -179,8 +190,8 @@ main(int argc, char *argv[]) rc = 1; } else { while (*argv) { - c = file(&line, &linesz, &buf, - &bufsz, *argv, mdoc); + curp.file = *argv; + c = file(&blk, &ln, *argv, mdoc); if ( ! c) break; if (outrun && ! (*outrun)(outdata, mdoc)) @@ -192,10 +203,10 @@ main(int argc, char *argv[]) rc = NULL == *argv; } - if (buf) - free(buf); - if (line) - free(line); + if (blk.buf) + free(blk.buf); + if (ln.buf) + free(ln.buf); if (outfree) (*outfree)(outdata); @@ -226,7 +237,7 @@ usage(void) static int -file(char **ln, size_t *lnsz, char **buf, size_t *bufsz, +file(struct buf *blk, struct buf *ln, const char *file, struct mdoc *mdoc) { int fd, c; @@ -236,7 +247,7 @@ file(char **ln, size_t *lnsz, char **buf, size_t *bufsz, return(0); } - c = fdesc(ln, lnsz, buf, bufsz, file, fd, mdoc); + c = fdesc(blk, ln, file, fd, mdoc); if (-1 == close(fd)) warn("%s", file); @@ -246,17 +257,13 @@ file(char **ln, size_t *lnsz, char **buf, size_t *bufsz, static int -fdesc(char **lnp, size_t *lnsz, char **bufp, size_t *bufsz, +fdesc(struct buf *blk, struct buf *ln, const char *f, int fd, struct mdoc *mdoc) { size_t sz; ssize_t ssz; struct stat st; int j, i, pos, lnn; - char *ln, *buf; - - buf = *bufp; - ln = *lnp; /* * Two buffers: ln and buf. buf is the input buffer, optimised @@ -271,11 +278,11 @@ fdesc(char **lnp, size_t *lnsz, char **bufp, size_t *bufsz, sz = (unsigned)BUFSIZ > st.st_blksize ? (size_t)BUFSIZ : st.st_blksize; - if (sz > *bufsz) { - if (NULL == (buf = realloc(buf, sz))) + if (sz > blk->sz) { + blk->buf = realloc(blk->buf, sz); + if (NULL == blk->buf) err(1, "realloc"); - *bufp = buf; - *bufsz = sz; + blk->sz = sz; } /* @@ -283,31 +290,30 @@ fdesc(char **lnp, size_t *lnsz, char **bufp, size_t *bufsz, */ for (lnn = 1, pos = 0; ; ) { - if (-1 == (ssz = read(fd, buf, sz))) { + if (-1 == (ssz = read(fd, blk->buf, sz))) { warn("%s", f); return(0); } else if (0 == ssz) break; for (i = 0; i < (int)ssz; i++) { - if (pos >= (int)*lnsz) { - *lnsz += 256; /* Step-size. */ - ln = realloc(ln, *lnsz); - if (NULL == ln) + if (pos >= (int)ln->sz) { + ln->sz += 256; /* Step-size. */ + ln->buf = realloc(ln->buf, ln->sz); + if (NULL == ln->buf) err(1, "realloc"); - *lnp = ln; } - if ('\n' != buf[i]) { - ln[pos++] = buf[i]; + if ('\n' != blk->buf[i]) { + ln->buf[pos++] = blk->buf[i]; continue; } /* Check for CPP-escaped newline. */ - if (pos > 0 && '\\' == ln[pos - 1]) { + if (pos > 0 && '\\' == ln->buf[pos - 1]) { for (j = pos - 1; j >= 0; j--) - if ('\\' != ln[j]) + if ('\\' != ln->buf[j]) break; if ( ! ((pos - j) % 2)) { @@ -317,8 +323,8 @@ fdesc(char **lnp, size_t *lnsz, char **bufp, size_t *bufsz, } } - ln[pos] = 0; - if ( ! mdoc_parseln(mdoc, lnn, ln)) + ln->buf[pos] = 0; + if ( ! mdoc_parseln(mdoc, lnn, ln->buf)) return(0); lnn++; pos = 0; @@ -430,8 +436,12 @@ woptions(int *wflags, char *arg) static int merr(void *arg, int line, int col, const char *msg) { + struct curparse *curp; + + curp = (struct curparse *)arg; - warnx("error: %s (line %d, column %d)", msg, line, col); + warnx("%s:%d: error: %s (column %d)", + curp->file, line, msg, col); return(0); } @@ -440,30 +450,30 @@ static int mwarn(void *arg, int line, int col, enum mdoc_warn type, const char *msg) { - int flags; + struct curparse *curp; char *wtype; - flags = *(int *)arg; + curp = (struct curparse *)arg; wtype = NULL; switch (type) { case (WARN_COMPAT): wtype = "compat"; - if (flags & WARN_WCOMPAT) + if (curp->wflags & WARN_WCOMPAT) break; return(1); case (WARN_SYNTAX): wtype = "syntax"; - if (flags & WARN_WSYNTAX) + if (curp->wflags & WARN_WSYNTAX) break; return(1); } assert(wtype); - warnx("%s warning: %s (line %d, column %d)", - wtype, msg, line, col); + warnx("%s:%d: %s warning: %s (column %d)", + curp->file, line, wtype, msg, col); - if ( ! (flags & WARN_WERR)) + if ( ! (curp->wflags & WARN_WERR)) return(1); warnx("%s: considering warnings as errors", @@ -95,6 +95,8 @@ mdoc_isescape(const char *p) /* FALLTHROUGH */ case ('.'): /* FALLTHROUGH */ + case (':'): + /* FALLTHROUGH */ case ('e'): return(2); case ('*'): |