Annotation of docbook2mdoc/main.c, Revision 1.10
1.10 ! schwarze 1: /* $Id: main.c,v 1.9 2019/05/01 07:14:17 schwarze Exp $ */
1.1 schwarze 2: /*
3: * Copyright (c) 2014 Kristaps Dzonsons <kristaps@bsd.lv>
4: * Copyright (c) 2019 Ingo Schwarze <schwarze@openbsd.org>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18: #include <getopt.h>
1.9 schwarze 19: #include <libgen.h>
1.1 schwarze 20: #include <stdio.h>
21: #include <string.h>
22: #include <unistd.h>
23:
24: #include "node.h"
25: #include "parse.h"
1.8 schwarze 26: #include "reorg.h"
1.1 schwarze 27: #include "format.h"
28:
29: /*
30: * The steering function of the docbook2mdoc(1) program.
31: */
32:
1.6 schwarze 33: enum outt {
34: OUTT_MDOC = 0,
35: OUTT_TREE,
36: OUTT_LINT
37: };
38:
1.1 schwarze 39: int
40: main(int argc, char *argv[])
41: {
42: struct parse *parser;
43: struct ptree *tree;
44: const char *progname;
1.10 ! schwarze 45: const char *bname, *fname, *sec;
1.1 schwarze 46: int ch, fd, rc, warn;
1.6 schwarze 47: enum outt outtype;
1.1 schwarze 48:
49: if ((progname = strrchr(argv[0], '/')) == NULL)
50: progname = argv[0];
51: else
52: progname++;
53:
1.10 ! schwarze 54: sec = NULL;
1.1 schwarze 55: warn = 0;
1.6 schwarze 56: outtype = OUTT_MDOC;
1.10 ! schwarze 57: while ((ch = getopt(argc, argv, "s:T:W")) != -1) {
1.1 schwarze 58: switch (ch) {
1.10 ! schwarze 59: case 's':
! 60: sec = optarg;
! 61: break;
1.6 schwarze 62: case 'T':
63: if (strcmp(optarg, "mdoc") == 0)
64: outtype = OUTT_MDOC;
65: else if (strcmp(optarg, "tree") == 0)
66: outtype = OUTT_TREE;
67: else if (strcmp(optarg, "lint") == 0)
68: outtype = OUTT_LINT;
69: else {
70: fprintf(stderr, "%s: Bad argument\n",
71: optarg);
72: goto usage;
73: }
74: break;
1.1 schwarze 75: case 'W':
76: warn = 1;
77: break;
78: default:
79: goto usage;
80: }
81: }
82: argc -= optind;
83: argv += optind;
84:
85: /*
86: * Argument processing:
87: * Open file or use standard input.
88: */
89:
90: if (argc > 1) {
91: fprintf(stderr, "%s: Too many arguments\n", argv[1]);
92: goto usage;
1.4 schwarze 93: } else if (argc == 1) {
94: fname = argv[0];
95: fd = -1;
96: } else {
97: fname = "<stdin>";
98: fd = STDIN_FILENO;
99: }
1.1 schwarze 100:
1.4 schwarze 101: /* Parse. */
1.1 schwarze 102:
1.7 schwarze 103: parser = parse_alloc(warn);
1.4 schwarze 104: tree = parse_file(parser, fd, fname);
1.10 ! schwarze 105: ptree_reorg(tree, sec);
1.5 schwarze 106: rc = tree->flags & TREE_ERROR ? 3 : tree->flags & TREE_WARN ? 2 : 0;
1.1 schwarze 107:
1.4 schwarze 108: /* Format. */
1.1 schwarze 109:
1.6 schwarze 110: if (outtype != OUTT_LINT && tree->root != NULL) {
1.5 schwarze 111: if (rc > 2)
1.4 schwarze 112: fputc('\n', stderr);
1.9 schwarze 113: if (outtype == OUTT_MDOC) {
114: if (fd == -1 && (bname = basename(fname)) != NULL)
115: printf(".\\\" automatically generated "
116: "with %s %s\n", progname, bname);
1.6 schwarze 117: ptree_print_mdoc(tree);
1.9 schwarze 118: } else
1.6 schwarze 119: ptree_print_tree(tree);
1.5 schwarze 120: if (rc > 2)
1.4 schwarze 121: fputs("\nThe output may be incomplete, see the "
122: "parse error reported above.\n\n", stderr);
123: }
124: parse_free(parser);
1.1 schwarze 125: return rc;
126:
127: usage:
1.10 ! schwarze 128: fprintf(stderr, "usage: %s [-W] [-s section] "
! 129: "[-T mdoc | tree | lint] [input_filename]\n", progname);
1.5 schwarze 130: return 5;
1.1 schwarze 131: }
CVSweb