[BACK]Return to main.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / docbook2mdoc

File: [cvsweb.bsd.lv] / docbook2mdoc / main.c (download)

Revision 1.8, Sun Apr 28 17:10:06 2019 UTC (14 months, 1 week ago) by schwarze
Branch: MAIN
CVS Tags: VERSION_1_0_2
Changes since 1.7: +3 -1 lines

Start a reorg module, to edit and move around nodes between parsing
and formatting.  This helps because using queue macros is prone to
bugs, but inspecting the resulting trees with a C debugger is quite
hard.  Using -T tree is much easier.

/* $Id: main.c,v 1.8 2019/04/28 17:10:06 schwarze Exp $ */
/*
 * Copyright (c) 2014 Kristaps Dzonsons <kristaps@bsd.lv>
 * Copyright (c) 2019 Ingo Schwarze <schwarze@openbsd.org>
 *
 * 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 <getopt.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#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;
	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 = "<stdin>";
		fd = STDIN_FILENO;
	}

	/* Parse. */

	parser = parse_alloc(warn);
	tree = parse_file(parser, fd, fname);
	ptree_reorg(tree);
	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;
}