=================================================================== RCS file: /cvs/docbook2mdoc/main.c,v retrieving revision 1.2 retrieving revision 1.10 diff -u -p -r1.2 -r1.10 --- docbook2mdoc/main.c 2019/03/26 20:06:16 1.2 +++ docbook2mdoc/main.c 2019/05/01 09:02:25 1.10 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.2 2019/03/26 20:06:16 schwarze Exp $ */ +/* $Id: main.c,v 1.10 2019/05/01 09:02:25 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze @@ -15,37 +15,63 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include #include +#include #include #include #include #include "node.h" #include "parse.h" +#include "reorg.h" #include "format.h" /* * The steering function of the docbook2mdoc(1) program. */ +enum outt { + OUTT_MDOC = 0, + OUTT_TREE, + OUTT_LINT +}; + int main(int argc, char *argv[]) { struct parse *parser; struct ptree *tree; const char *progname; - const char *fname; + const char *bname, *fname, *sec; int ch, fd, rc, warn; + enum outt outtype; if ((progname = strrchr(argv[0], '/')) == NULL) progname = argv[0]; else progname++; + sec = NULL; warn = 0; - while ((ch = getopt(argc, argv, "W")) != -1) { + outtype = OUTT_MDOC; + while ((ch = getopt(argc, argv, "s:T:W")) != -1) { switch (ch) { + case 's': + sec = optarg; + break; + case 'T': + if (strcmp(optarg, "mdoc") == 0) + outtype = OUTT_MDOC; + else if (strcmp(optarg, "tree") == 0) + outtype = OUTT_TREE; + else if (strcmp(optarg, "lint") == 0) + outtype = OUTT_LINT; + else { + fprintf(stderr, "%s: Bad argument\n", + optarg); + goto usage; + } + break; case 'W': warn = 1; break; @@ -64,43 +90,42 @@ main(int argc, char *argv[]) if (argc > 1) { fprintf(stderr, "%s: Too many arguments\n", argv[1]); goto usage; - } else - fname = argc > 0 ? argv[0] : "-"; - - fd = strcmp(fname, "-") == 0 ? - STDIN_FILENO : open(fname, O_RDONLY, 0); - - if (fd == -1) { - perror(fname); - return 1; + } else if (argc == 1) { + fname = argv[0]; + fd = -1; + } else { + fname = ""; + fd = STDIN_FILENO; } - /* Parse and format. */ + /* Parse. */ - rc = 1; - if ((parser = parse_alloc(warn)) != NULL) { - if ((tree = parse_file(parser, fd, fname)) != NULL) { - if (tree->flags & TREE_FAIL) - fputc('\n', stderr); - else - rc = 0; - ptree_print(tree); - if (tree->flags & TREE_FAIL) - fputs("\nThe output is incomplete, see " - "the parse error reported above.\n\n", - stderr); - pnode_unlink(tree->root); - tree->root = NULL; - } - parse_free(parser); - } else - perror(NULL); + parser = parse_alloc(warn); + tree = parse_file(parser, fd, fname); + ptree_reorg(tree, sec); + rc = tree->flags & TREE_ERROR ? 3 : tree->flags & TREE_WARN ? 2 : 0; - if (fd != STDIN_FILENO) - close(fd); + /* Format. */ + + if (outtype != OUTT_LINT && tree->root != NULL) { + if (rc > 2) + fputc('\n', stderr); + if (outtype == OUTT_MDOC) { + if (fd == -1 && (bname = basename(fname)) != NULL) + printf(".\\\" automatically generated " + "with %s %s\n", progname, bname); + ptree_print_mdoc(tree); + } else + ptree_print_tree(tree); + if (rc > 2) + fputs("\nThe output may be incomplete, see the " + "parse error reported above.\n\n", stderr); + } + parse_free(parser); return rc; usage: - fprintf(stderr, "usage: %s [-W] [input_filename]\n", progname); - return 1; + fprintf(stderr, "usage: %s [-W] [-s section] " + "[-T mdoc | tree | lint] [input_filename]\n", progname); + return 5; }