=================================================================== RCS file: /cvs/mandoc/demandoc.c,v retrieving revision 1.1 retrieving revision 1.4 diff -u -p -r1.1 -r1.4 --- mandoc/demandoc.c 2011/09/01 10:46:28 1.1 +++ mandoc/demandoc.c 2011/09/01 20:55:50 1.4 @@ -1,4 +1,4 @@ -/* $Id: demandoc.c,v 1.1 2011/09/01 10:46:28 kristaps Exp $ */ +/* $Id: demandoc.c,v 1.4 2011/09/01 20:55:50 kristaps Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * @@ -19,20 +19,22 @@ #endif #include +#include #include #include #include #include +#include #include "man.h" #include "mdoc.h" #include "mandoc.h" -static void pline(int, int *, int *); -static void pman(const struct man_node *, int *, int *); -static void pmandoc(struct mparse *, int, const char *); -static void pmdoc(const struct mdoc_node *, int *, int *); -static void pstring(const char *, int, int *); +static void pline(int, int *, int *, int); +static void pman(const struct man_node *, int *, int *, int); +static void pmandoc(struct mparse *, int, const char *, int); +static void pmdoc(const struct mdoc_node *, int *, int *, int); +static void pstring(const char *, int, int *, int); static void usage(void); static const char *progname; @@ -41,9 +43,8 @@ int main(int argc, char *argv[]) { struct mparse *mp; - int ch, i; + int ch, i, list; extern int optind; - extern char *optarg; progname = strrchr(argv[0], '/'); if (progname == NULL) @@ -52,9 +53,21 @@ main(int argc, char *argv[]) ++progname; mp = NULL; + list = 0; - while (-1 != (ch = getopt(argc, argv, ""))) + while (-1 != (ch = getopt(argc, argv, "ikm:pw"))) switch (ch) { + case ('i'): + /* FALLTHROUGH */ + case ('k'): + /* FALLTHROUGH */ + case ('m'): + /* FALLTHROUGH */ + case ('p'): + break; + case ('w'): + list = 1; + break; default: usage(); return((int)MANDOCLEVEL_BADARG); @@ -67,26 +80,26 @@ main(int argc, char *argv[]) assert(mp); if (0 == argc) - pmandoc(mp, STDIN_FILENO, ""); + pmandoc(mp, STDIN_FILENO, "", list); for (i = 0; i < argc; i++) { mparse_reset(mp); - pmandoc(mp, -1, argv[i]); + pmandoc(mp, -1, argv[i], list); } mparse_free(mp); - return(MANDOCLEVEL_OK); + return((int)MANDOCLEVEL_OK); } static void usage(void) { - fprintf(stderr, "usage: %s [files...]\n", progname); + fprintf(stderr, "usage: %s [-w] [files...]\n", progname); } static void -pmandoc(struct mparse *mp, int fd, const char *fn) +pmandoc(struct mparse *mp, int fd, const char *fn, int list) { struct mdoc *mdoc; struct man *man; @@ -102,9 +115,9 @@ pmandoc(struct mparse *mp, int fd, const char *fn) col = 0; if (mdoc) - pmdoc(mdoc_node(mdoc), &line, &col); + pmdoc(mdoc_node(mdoc), &line, &col, list); else if (man) - pman(man_node(man), &line, &col); + pman(man_node(man), &line, &col, list); else return; @@ -115,7 +128,7 @@ pmandoc(struct mparse *mp, int fd, const char *fn) * Strip the escapes out of a string, emitting the results. */ static void -pstring(const char *p, int col, int *colp) +pstring(const char *p, int col, int *colp, int list) { enum mandoc_esc esc; @@ -124,57 +137,54 @@ pstring(const char *p, int col, int *colp) (*colp)++; } - while ('\0' != *p) { + while ('\0' != *p) if ('\\' == *p) { p++; esc = mandoc_escape(&p, NULL, NULL); if (ESCAPE_ERROR == esc) - return; + break; } else { - putchar(*p++); + putchar((unsigned char )*p++); (*colp)++; } - } } -/* - * Emit lines until we're in sync with our input. - */ static void -pline(int line, int *linep, int *col) +pline(int line, int *linep, int *col, int list) { while (*linep < line) { putchar('\n'); (*linep)++; } + *col = 0; } static void -pmdoc(const struct mdoc_node *p, int *line, int *col) +pmdoc(const struct mdoc_node *p, int *line, int *col, int list) { for ( ; p; p = p->next) { if (MDOC_LINE & p->flags) - pline(p->line, line, col); + pline(p->line, line, col, list); if (MDOC_TEXT == p->type) - pstring(p->string, p->pos, col); + pstring(p->string, p->pos, col, list); if (p->child) - pmdoc(p->child, line, col); + pmdoc(p->child, line, col, list); } } static void -pman(const struct man_node *p, int *line, int *col) +pman(const struct man_node *p, int *line, int *col, int list) { for ( ; p; p = p->next) { if (MAN_LINE & p->flags) - pline(p->line, line, col); + pline(p->line, line, col, list); if (MAN_TEXT == p->type) - pstring(p->string, p->pos, col); + pstring(p->string, p->pos, col, list); if (p->child) - pman(p->child, line, col); + pman(p->child, line, col, list); } }