=================================================================== RCS file: /cvs/mandoc/Attic/mmain.c,v retrieving revision 1.6 retrieving revision 1.10 diff -u -p -r1.6 -r1.10 --- mandoc/Attic/mmain.c 2009/03/08 11:41:22 1.6 +++ mandoc/Attic/mmain.c 2009/03/09 13:04:01 1.10 @@ -1,4 +1,4 @@ - /* $Id: mmain.c,v 1.6 2009/03/08 11:41:22 kristaps Exp $ */ + /* $Id: mmain.c,v 1.10 2009/03/09 13:04:01 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -30,7 +30,7 @@ #include "mmain.h" -#define MD_LINE_SZ (256) /* Max input line size. */ +#define MD_LINE_SZ (256) /* Input line step-size. */ struct mmain { int warn; /* Warning flags. */ @@ -41,7 +41,7 @@ struct mmain { int dbg; /* Debug level. */ struct mdoc *mdoc; /* Active parser. */ char *buf; /* Input buffer. */ - u_long bufsz; /* Input buffer size. */ + size_t bufsz; /* Input buffer size. */ char *in; /* Input file name. */ int fdin; /* Input file desc. */ int pflags; /* Parse flags. */ @@ -71,7 +71,7 @@ void mmain_usage(const char *help) { - warnx("usage: %s %s%s[-v] [-Wwarn...] [infile]", __progname, + warnx("usage: %s %s%s[-v] [-foption...] [-Wwarn...] [infile]", __progname, help ? help : "", help ? " " : ""); } @@ -190,7 +190,7 @@ mmain_mdoc(struct mmain *p) warn("%s", p->in); p->bufsz = BUFSIZ; } else - p->bufsz = MAX(st.st_blksize, BUFSIZ); + p->bufsz = (size_t)MAX(st.st_blksize, BUFSIZ); p->buf = malloc(p->bufsz); if (NULL == p->buf) @@ -198,7 +198,7 @@ mmain_mdoc(struct mmain *p) /* Allocate the parser. */ - p->mdoc = mdoc_alloc(p, &cb); + p->mdoc = mdoc_alloc(p, p->pflags, &cb); /* Parse the input file. */ @@ -217,14 +217,22 @@ static int optsopt(struct mmain *p, char *arg) { char *v; - char *toks[] = { "ignore-scope", NULL }; + char *toks[] = { "ign-scope", "ign-escape", + "ign-macro", NULL }; while (*arg) switch (getsubopt(&arg, toks, &v)) { case (0): p->pflags |= MDOC_IGN_SCOPE; break; + case (1): + p->pflags |= MDOC_IGN_ESCAPE; + break; + case (2): + p->pflags |= MDOC_IGN_MACRO; + break; default: + warnx("unknown -f argument"); return(0); } @@ -254,6 +262,7 @@ optswarn(struct mmain *p, char *arg) p->warn |= MD_WARN_ERR; break; default: + warnx("unknown -W argument"); return(0); } @@ -264,47 +273,57 @@ optswarn(struct mmain *p, char *arg) static int parse(struct mmain *p) { - ssize_t sz, i; - size_t pos; - char line[MD_LINE_SZ]; - int lnn; + ssize_t sz; + int j, i, pos, len, lnn; + char *ln; - /* - * This is a little more complicated than fgets. TODO: have - * some benchmarks that show it's faster (note that I want to - * check many, many manuals simultaneously, so speed is - * important). Fill a buffer (sized to the block size) with a - * single read, then parse \n-terminated lines into a line - * buffer, which is passed to the parser. Hard-code the line - * buffer to a particular size -- a reasonable assumption. - */ - - for (lnn = 1, pos = 0; ; ) { + for (ln = NULL, lnn = 1, len = pos = 0; ; ) { if (-1 == (sz = read(p->fdin, p->buf, p->bufsz))) { warn("%s", p->in); return(0); } else if (0 == sz) break; - for (i = 0; i < sz; i++) { + for (i = 0; i < (int)sz; i++) { + if (pos >= len) { + len += MD_LINE_SZ; + ln = realloc(ln, (size_t)len); + if (NULL == ln) + err(1, "realloc"); + } + if ('\n' != p->buf[i]) { - if (pos < sizeof(line)) { - line[(int)pos++] = p->buf[(int)i]; + ln[pos++] = p->buf[i]; + continue; + } + + /* Check for escaped newline. */ + + if (pos > 0 && '\\' == ln[pos - 1]) { + for (j = pos - 1; j >= 0; j--) + if ('\\' != ln[j]) + break; + + if ( ! ((pos - j) % 2)) { + pos--; + lnn++; continue; } - warnx("%s: line %d too long", p->in, lnn); - return(0); } - - line[(int)pos] = 0; - if ( ! mdoc_parseln(p->mdoc, lnn, line)) - return(0); + ln[pos] = 0; + if ( ! mdoc_parseln(p->mdoc, lnn, ln)) + return(0); lnn++; pos = 0; } } + if (pos > 0) + warnx("%s: file not eof-terminated", p->in); + + if (ln) + free(ln); return(mdoc_endparse(p->mdoc)); }