File: [cvsweb.bsd.lv] / docbook2mdoc / main.c (download)
Revision 1.3, Thu Mar 28 12:21:10 2019 UTC (5 years, 1 month ago) by schwarze
Branch: MAIN
Changes since 1.2: +3 -3 lines
The expat library aborts parsing as soon as it encounters invalid
input, and the basic design of the library practically precludes
fixing it. However, whether the input is well-formed XML or not
is totally irrelevant, and in fact, i have seen real-world documents
from X.org that expat rejects as not well-formed. Kristaps reports
the same from OpenGL.
We really want to parse *ANYTHING* whatsoever without ever throwing
a fatal error - after all, the point is to convert legacy documents
to a better format, and nitpicking about the syntax merely alienates
users (including myself).
Consequently, ditch expat and write a parser from scratch, optimized
for robustness on invalid input.
Oh, and by the way, it only requires 200 lines of code,
compared to 15,000 lines in expat - an economy of 98.5%
at the sime time as being much more useful in practice.
|
/* $Id: main.c,v 1.3 2019/03/28 12:21:10 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 <fcntl.h>
#include <getopt.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "node.h"
#include "parse.h"
#include "format.h"
/*
* The steering function of the docbook2mdoc(1) program.
*/
int
main(int argc, char *argv[])
{
struct parse *parser;
struct ptree *tree;
const char *progname;
const char *fname;
int ch, fd, rc, warn;
if ((progname = strrchr(argv[0], '/')) == NULL)
progname = argv[0];
else
progname++;
warn = 0;
while ((ch = getopt(argc, argv, "W")) != -1) {
switch (ch) {
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
fname = argc > 0 ? argv[0] : "-";
fd = strcmp(fname, "-") == 0 ?
STDIN_FILENO : open(fname, O_RDONLY, 0);
if (fd == -1) {
perror(fname);
return 1;
}
/* Parse and format. */
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 may be incomplete, see"
" the parse error reported above.\n\n",
stderr);
pnode_unlink(tree->root);
tree->root = NULL;
}
parse_free(parser);
} else
perror(NULL);
if (fd != STDIN_FILENO)
close(fd);
return rc;
usage:
fprintf(stderr, "usage: %s [-W] [input_filename]\n", progname);
return 1;
}