=================================================================== RCS file: /cvs/docbook2mdoc/parse.c,v retrieving revision 1.5 retrieving revision 1.7 diff -u -p -r1.5 -r1.7 --- docbook2mdoc/parse.c 2019/03/28 12:21:10 1.5 +++ docbook2mdoc/parse.c 2019/03/28 20:41:33 1.7 @@ -1,4 +1,4 @@ -/* $Id: parse.c,v 1.5 2019/03/28 12:21:10 schwarze Exp $ */ +/* $Id: parse.c,v 1.7 2019/03/28 20:41:33 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -17,6 +17,7 @@ */ #include #include +#include #include #include #include @@ -72,6 +73,7 @@ static const struct element elements[] = { { "colspec", NODE_COLSPEC }, { "command", NODE_COMMAND }, { "constant", NODE_CONSTANT }, + { "contrib", NODE_CONTRIB }, { "copyright", NODE_COPYRIGHT }, { "date", NODE_DATE }, { "editor", NODE_EDITOR }, @@ -81,7 +83,7 @@ static const struct element elements[] = { { "envar", NODE_ENVAR }, { "fieldsynopsis", NODE_FIELDSYNOPSIS }, { "filename", NODE_FILENAME }, - { "firstname", NODE_IGNORE }, + { "firstname", NODE_PERSONNAME }, { "firstterm", NODE_FIRSTTERM }, { "footnote", NODE_FOOTNOTE }, { "funcdef", NODE_FUNCDEF }, @@ -121,7 +123,7 @@ static const struct element elements[] = { { "option", NODE_OPTION }, { "orderedlist", NODE_ORDEREDLIST }, { "orgname", NODE_ORGNAME }, - { "othername", NODE_IGNORE }, + { "othername", NODE_PERSONNAME }, { "para", NODE_PARA }, { "paramdef", NODE_PARAMDEF }, { "parameter", NODE_PARAMETER }, @@ -163,7 +165,7 @@ static const struct element elements[] = { { "spanspec", NODE_SPANSPEC }, { "structname", NODE_STRUCTNAME }, { "subtitle", NODE_SUBTITLE }, - { "surname", NODE_IGNORE }, + { "surname", NODE_PERSONNAME }, { "synopsis", NODE_SYNOPSIS }, { "table", NODE_TABLE }, { "tbody", NODE_TBODY }, @@ -187,6 +189,34 @@ static const struct element elements[] = { { NULL, NODE_IGNORE } }; +static void +error_msg(struct parse *p, const char *fmt, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d:%d: ", p->fname, p->line, p->col); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); + p->tree->flags |= TREE_FAIL; +} + +static void +warn_msg(struct parse *p, const char *fmt, ...) +{ + va_list ap; + + if (p->warn == 0) + return; + + fprintf(stderr, "%s:%d:%d: warning: ", p->fname, p->line, p->col); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); +} + /* * Process a string of characters. * If a text node is already open, append to it. @@ -201,9 +231,7 @@ xml_char(struct parse *ps, const char *p, int sz) return; if (ps->cur == NULL) { - fprintf(stderr, "%s:%d:%d: discarding text before docum" - "ent: %.*s\n", ps->fname, ps->line, ps->col, sz, p); - ps->tree->flags |= TREE_FAIL; + error_msg(ps, "discarding text before document: %.*s", sz, p); return; } @@ -221,10 +249,8 @@ xml_char(struct parse *ps, const char *p, int sz) } if (ps->tree->flags & TREE_CLOSED && - ps->cur->parent == ps->tree->root && ps->warn) - fprintf(stderr, "%s:%d:%d: warning: " - "text after end of document: %.*s\n", - ps->fname, ps->line, ps->col, sz, p); + ps->cur->parent == ps->tree->root) + warn_msg(ps, "text after end of document: %.*s", sz, p); /* Append to the current text node. */ @@ -280,19 +306,14 @@ xml_elem_start(struct parse *ps, const char *name) if (strcmp(elem->name, name) == 0) break; - if (elem->name == NULL) { - fprintf(stderr, "%s:%d:%d: unknown element <%s>\n", - ps->fname, ps->line, ps->col, name); - ps->tree->flags |= TREE_FAIL; - } + if (elem->name == NULL) + error_msg(ps, "unknown element <%s>", name); + ps->ncur = elem->node; switch (ps->ncur) { case NODE_DELETE_WARN: - if (ps->warn) - fprintf(stderr, "%s:%d:%d: warning: " - "skipping element <%s>\n", - ps->fname, ps->line, ps->col, name); + warn_msg(ps, "skipping element <%s>", name); /* FALLTHROUGH */ case NODE_DELETE: ps->del = 1; @@ -306,11 +327,8 @@ xml_elem_start(struct parse *ps, const char *name) break; } - if (ps->tree->flags & TREE_CLOSED && - ps->cur->parent == NULL && ps->warn) - fprintf(stderr, "%s:%d:%d: warning: " - "element after end of document: %s\n", - ps->fname, ps->line, ps->col, name); + if (ps->tree->flags & TREE_CLOSED && ps->cur->parent == NULL) + warn_msg(ps, "element after end of document: <%s>", name); if ((dat = calloc(1, sizeof(*dat))) == NULL) { perror(NULL); @@ -338,10 +356,6 @@ xml_attrkey(struct parse *ps, const char *name) if (ps->del > 0 || *name == '\0') return; if ((key = attrkey_parse(name)) == ATTRKEY__MAX) { - if (ps->warn) - fprintf(stderr, "%s:%d:%d: warning: " - "unknown attribute \"%s\"\n", - ps->fname, ps->line, ps->col, name); ps->attr = 0; return; } @@ -415,10 +429,7 @@ xml_elem_end(struct parse *ps, const char *name) break; default: if (ps->cur == NULL || node != ps->cur->node) { - if (ps->warn) - fprintf(stderr, "%s:%d:%d: warning: " - "element not open: \n", - ps->fname, ps->line, ps->col, name); + warn_msg(ps, "element not open: ", name); break; } @@ -677,8 +688,7 @@ parse_file(struct parse *p, int fd, const char *fname) pnode_trim(p->cur); p->cur = p->cur->parent; } - if ((p->tree->flags & TREE_CLOSED) == 0 && p->warn) - fprintf(stderr, "%s:%d:%d: warning: document not closed\n", - p->fname, p->line, p->col); + if ((p->tree->flags & TREE_CLOSED) == 0) + warn_msg(p, "document not closed"); return p->tree; }