/* $Id: main.c,v 1.6 2019/04/12 19:14:50 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2019 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * 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 "node.h" #include "parse.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; int ch, fd, rc, warn; enum outt outtype; if ((progname = strrchr(argv[0], '/')) == NULL) progname = argv[0]; else progname++; warn = 0; outtype = OUTT_MDOC; while ((ch = getopt(argc, argv, "T:W")) != -1) { switch (ch) { 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; default: goto usage; } } argc -= optind; argv += optind; /* * Argument processing: * Open file or use standard input. */ if (argc > 1) { fprintf(stderr, "%s: Too many arguments\n", argv[1]); goto usage; } else if (argc == 1) { fname = argv[0]; fd = -1; } else { fname = ""; fd = STDIN_FILENO; } /* Parse. */ if ((parser = parse_alloc(warn)) == NULL) { perror(NULL); return 6; } tree = parse_file(parser, fd, fname); rc = tree->flags & TREE_ERROR ? 3 : tree->flags & TREE_WARN ? 2 : 0; /* Format. */ if (outtype != OUTT_LINT && tree->root != NULL) { if (rc > 2) fputc('\n', stderr); if (outtype == OUTT_MDOC) 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] [-T mdoc | tree | lint] " "[input_filename]\n", progname); return 5; }