diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-03-19 16:17:27 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-03-19 16:17:27 +0000 |
commit | 997138b8cf242533eca235e5bae8af08384ce7c6 (patch) | |
tree | 27472ff6f104175625e91676dea1606e49c33cbf | |
parent | 8ee53c583c595b24d97899cd5886383c71b8ae13 (diff) | |
download | mandoc-997138b8cf242533eca235e5bae8af08384ce7c6.tar.gz |
Split mdocterm.c -> main.c terminal.c.
Abstracted output with -T selector (default ascii).
Name change: mdocterm -> mandoc.
Re-imported tree with -Ttree.
-rw-r--r-- | Makefile | 76 | ||||
-rw-r--r-- | main.c | 452 | ||||
-rw-r--r-- | mandoc.1 (renamed from mdocterm.1) | 103 | ||||
-rw-r--r-- | mdoclint.1 | 156 | ||||
-rw-r--r-- | mdoclint.c | 51 | ||||
-rw-r--r-- | mdoctree.1 | 162 | ||||
-rw-r--r-- | term.h | 7 | ||||
-rw-r--r-- | terminal.c (renamed from mdocterm.c) | 460 | ||||
-rw-r--r-- | tree.c (renamed from mdoctree.c) | 54 |
9 files changed, 634 insertions, 887 deletions
@@ -16,29 +16,34 @@ VFLAGS = -DVERSION=\"$(VERSION)\" CFLAGS += -W -Wall -Wstrict-prototypes -Wno-unused-parameter -g LINTFLAGS += $(VFLAGS) CFLAGS += $(VFLAGS) + LIBLNS = macro.ln mdoc.ln hash.ln strings.ln xstd.ln argv.ln \ validate.ln action.ln lib.ln att.ln arch.ln vol.ln \ msec.ln st.ln LIBOBJS = macro.o mdoc.o hash.o strings.o xstd.o argv.o validate.o \ action.o lib.o att.o arch.o vol.o msec.o st.o -TERMLNS = mdocterm.ln term.ln ascii.ln -TERMOBJS = mdocterm.o term.o ascii.o -LLNS = llib-llibmdoc.ln llib-lmdocterm.ln -LNS = $(TERMLNS) $(LIBLNS) +LIBSRCS = macro.c mdoc.c hash.c strings.c xstd.c argv.c validate.c \ + action.c lib.c att.c arch.c vol.c msec.c st.c + +MAINLNS = main.ln term.ln ascii.ln terminal.ln tree.ln +MAINOBJS = main.o term.o ascii.o terminal.o tree.o +MAINSRCS = main.c term.c ascii.c terminal.c tree.c + +LLNS = llib-llibmdoc.ln llib-lmandoc.ln +LNS = $(MAINLNS) $(LIBLNS) LIBS = libmdoc.a -OBJS = $(LIBOBJS) $(TERMOBJS) -SRCS = macro.c mdoc.c hash.c strings.c xstd.c argv.c validate.c \ - action.c term.c mdocterm.c lib.c att.c arch.c vol.c \ - msec.c st.c ascii.c +OBJS = $(LIBOBJS) $(MAINOBJS) +SRCS = $(LIBSRCS) $(MAINSRCS) DATAS = arch.in att.in lib.in msec.in st.in vol.in ascii.in HEADS = mdoc.h private.h term.h SGMLS = index.sgml HTMLS = index.html STATICS = style.css external.png -TARGZS = mdocml-$(VERSION).tar.gz mdocml-oport-$(VERSION).tar.gz \ +TARGZS = mdocml-$(VERSION).tar.gz \ + mdocml-oport-$(VERSION).tar.gz \ mdocml-nport-$(VERSION).tar.gz -MANS = mdocterm.1 mdoc.3 mdoc.7 -BINS = mdocterm +MANS = mandoc.1 mdoc.3 mdoc.7 +BINS = mandoc CLEAN = $(BINS) $(LNS) $(LLNS) $(LIBS) $(OBJS) $(HTMLS) $(TARGZS) INSTALL = $(SRCS) $(HEADS) Makefile DESCR $(MANS) $(SGMLS) \ $(STATICS) Makefile.netbsd Makefile.openbsd $(DATAS) @@ -70,25 +75,16 @@ installwww: www install: mkdir -p $(BINDIR) - mkdir -p $(INCLUDEDIR) - mkdir -p $(LIBDIR)/lib mkdir -p $(MANDIR)/man1 - mkdir -p $(MANDIR)/man3 mkdir -p $(MANDIR)/man7 - $(INSTALL_PROGRAM) mdocterm $(BINDIR) - $(INSTALL_MAN) mdocterm.1 $(MANDIR)/man1 - $(INSTALL_MAN) mdoc.3 $(MANDIR)/man3 + $(INSTALL_PROGRAM) mandoc $(BINDIR) + $(INSTALL_MAN) mandoc.1 $(MANDIR)/man1 $(INSTALL_MAN) mdoc.7 $(MANDIR)/man7 - $(INSTALL_LIB) libmdoc.a $(LIBDIR) - $(INSTALL_DATA) mdoc.h $(INCLUDEDIR) uninstall: - rm -f $(BINDIR)/mdocterm - rm -f $(MANDIR)/man1/mdocterm.1 - rm -f $(MANDIR)/man3/mdoc.3 + rm -f $(BINDIR)/mandoc + rm -f $(MANDIR)/man1/mandoc.1 rm -f $(MANDIR)/man7/mdoc.7 - rm -f $(LIBDIR)/libmdoc.a - rm -f $(INCLUDEDIR)/mdoc.h lib.ln: lib.c lib.in private.h lib.o: lib.c lib.in private.h @@ -126,8 +122,11 @@ hash.o: hash.c private.h mdoc.ln: mdoc.c private.h mdoc.o: mdoc.c private.h -mdocterm.ln: mdocterm.c -mdocterm.o: mdocterm.c +main.ln: main.c mdoc.h +main.o: main.c mdoc.h + +terminal.ln: terminal.c term.h +terminal.o: terminal.c term.h xstd.ln: xstd.c private.h xstd.o: xstd.c private.h @@ -154,11 +153,9 @@ mdocml-nport-$(VERSION).tar.gz: mdocml-$(VERSION).tar.gz Makefile.netbsd DESCR sha1 mdocml-$(VERSION).tar.gz >> .dist/mdocml/distinfo install -m 0644 DESCR .dist/mdocml/ echo @comment $$NetBSD$$ > .dist/mdocml/PLIST - echo bin/mdocterm >> .dist/mdocml/PLIST - echo lib/libmdoc.a >> .dist/mdocml/PLIST - echo include/mdoc.h >> .dist/mdocml/PLIST - echo man/man1/mdocterm.1 >> .dist/mdocml/PLIST - echo man/man3/mdoc.3 >> .dist/mdocml/PLIST + echo bin/mandoc >> .dist/mdocml/PLIST + echo man/man1/mandoc.1 >> .dist/mdocml/PLIST + echo man/man7/mdoc.7 >> .dist/mdocml/PLIST ( cd .dist/ && tar zcf ../$@ mdocml/ ) rm -rf .dist/ @@ -171,11 +168,9 @@ mdocml-oport-$(VERSION).tar.gz: mdocml-$(VERSION).tar.gz Makefile.openbsd DESCR sha1 mdocml-$(VERSION).tar.gz >> .dist/mdocml/distinfo install -m 0644 DESCR .dist/mdocml/pkg/DESCR echo @comment $$OpenBSD$$ > .dist/mdocml/pkg/PLIST - echo bin/mdocterm >> .dist/mdocml/pkg/PLIST - echo lib/libmdoc.a >> .dist/mdocml/pkg/PLIST - echo include/mdoc.h >> .dist/mdocml/pkg/PLIST - echo @man man/man1/mdocterm.1 >> .dist/mdocml/pkg/PLIST - echo @man man/man3/mdoc.3 >> .dist/mdocml/pkg/PLIST + echo bin/mandoc >> .dist/mdocml/pkg/PLIST + echo @man man/man1/mandoc.1 >> .dist/mdocml/pkg/PLIST + echo @man man/man7/mdoc.7 >> .dist/mdocml/pkg/PLIST ( cd .dist/ && tar zcf ../$@ mdocml/ ) rm -rf .dist/ @@ -188,16 +183,15 @@ mdocml-$(VERSION).tar.gz: $(INSTALL) llib-llibmdoc.ln: $(LIBLNS) $(LINT) $(LINTFLAGS) -Clibmdoc $(LIBLNS) -llib-lmdocterm.ln: $(TERMLNS) llib-llibmdoc.ln - $(LINT) $(LINTFLAGS) -Cmdocterm $(TERMLNS) llib-llibmdoc.ln +llib-lmandoc.ln: $(MAINLNS) llib-llibmdoc.ln + $(LINT) $(LINTFLAGS) -Cmandoc $(MAINLNS) llib-llibmdoc.ln libmdoc.a: $(LIBOBJS) $(AR) rs $@ $(LIBOBJS) -mdocterm: $(TERMOBJS) libmdoc.a - $(CC) $(CFLAGS) -o $@ $(TERMOBJS) libmdoc.a +mandoc: $(MAINOBJS) libmdoc.a + $(CC) $(CFLAGS) -o $@ $(MAINOBJS) libmdoc.a .sgml.html: validate $< sed -e "s!@VERSION@!$(VERSION)!" -e "s!@VDATE@!$(VDATE)!" $< > $@ - @@ -0,0 +1,452 @@ +/* $Id$ */ +/* + * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@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 AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR 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 <sys/stat.h> + +#include <assert.h> +#include <err.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "mdoc.h" + +#define WARN_WALL 0x03 /* All-warnings mask. */ +#define WARN_WCOMPAT (1 << 0) /* Compatibility warnings. */ +#define WARN_WSYNTAX (1 << 1) /* Syntax warnings. */ +#define WARN_WERR (1 << 2) /* Warnings->errors. */ + +enum outt { + OUTT_ASCII, + OUTT_LATIN1, + OUTT_UTF8, + OUTT_TREE, + OUTT_LINT +}; + +typedef int (*out_run)(void *, const struct mdoc *); +typedef void (*out_free)(void *); + +extern char *__progname; + +extern void *ascii_alloc(void); +extern void *latin1_alloc(void); +extern void *utf8_alloc(void); +extern int terminal_run(void *, const struct mdoc *); +extern int tree_run(void *, const struct mdoc *); +extern void terminal_free(void *); + +__dead static void version(void); +__dead static void usage(void); +static int foptions(int *, char *); +static int toptions(enum outt *, char *); +static int woptions(int *, char *); +static int merr(void *, int, int, const char *); +static int mwarn(void *, int, int, + enum mdoc_warn, const char *); +static int file(char **, size_t *, char **, size_t *, + const char *, struct mdoc *); +static int fdesc(char **, size_t *, char **, size_t *, + const char *, int, struct mdoc *); + + +int +main(int argc, char *argv[]) +{ + int c, rc, fflags, wflags; + struct mdoc_cb cb; + struct mdoc *mdoc; + char *buf, *line; + size_t bufsz, linesz; + void *outdata; + enum outt outtype; + out_run outrun; + out_free outfree; + + fflags = wflags = 0; + outtype = OUTT_ASCII; + + /* LINTED */ + while (-1 != (c = getopt(argc, argv, "f:VW:T:"))) + switch (c) { + case ('f'): + if ( ! foptions(&fflags, optarg)) + return(0); + break; + case ('T'): + if ( ! toptions(&outtype, optarg)) + return(0); + break; + case ('W'): + if ( ! woptions(&wflags, optarg)) + return(0); + break; + case ('V'): + version(); + /* NOTREACHED */ + default: + usage(); + /* NOTREACHED */ + } + + argc -= optind; + argv += optind; + + /* + * Allocate the appropriate front-end. Note that utf8, ascii + * and latin1 all resolve to the terminal front-end with + * different encodings (see terminal.c). Not all frontends have + * cleanup or alloc routines. + */ + + switch (outtype) { + case (OUTT_LATIN1): + outdata = latin1_alloc(); + outrun = terminal_run; + outfree = terminal_free; + break; + case (OUTT_UTF8): + outdata = utf8_alloc(); + outrun = terminal_run; + outfree = terminal_free; + break; + case (OUTT_TREE): + outdata = NULL; + outrun = tree_run; + outfree = NULL; + break; + case (OUTT_LINT): + outdata = NULL; + outrun = NULL; + outfree = NULL; + break; + default: + outdata = ascii_alloc(); + outrun = terminal_run; + outfree = terminal_free; + break; + } + + /* + * All callbacks route into here, where we print them onto the + * screen. XXX - for now, no path for debugging messages. + */ + + cb.mdoc_msg = NULL; + cb.mdoc_err = merr; + cb.mdoc_warn = mwarn; + + buf = line = NULL; + bufsz = linesz = 0; + + mdoc = mdoc_alloc(&wflags, fflags, &cb); + + while (*argv) { + if ( ! file(&line, &linesz, &buf, &bufsz, *argv, mdoc)) + break; + if (outrun && ! (*outrun)(outdata, mdoc)) + break; + + /* Reset the parser for another file. */ + mdoc_reset(mdoc); + argv++; + } + + rc = NULL == *argv; + + if (buf) + free(buf); + if (line) + free(line); + if (outfree) + (*outfree)(outdata); + + mdoc_free(mdoc); + + return(rc ? EXIT_SUCCESS : EXIT_FAILURE); +} + + +__dead static void +version(void) +{ + + (void)printf("%s %s\n", __progname, VERSION); + exit(0); + /* NOTREACHED */ +} + + +__dead static void +usage(void) +{ + + (void)fprintf(stderr, "usage: %s\n", __progname); + exit(1); + /* NOTREACHED */ +} + + +static int +file(char **ln, size_t *lnsz, char **buf, size_t *bufsz, + const char *file, struct mdoc *mdoc) +{ + int fd, c; + + if (-1 == (fd = open(file, O_RDONLY, 0))) { + warn("%s", file); + return(0); + } + + c = fdesc(ln, lnsz, buf, bufsz, file, fd, mdoc); + + if (-1 == close(fd)) + warn("%s", file); + + return(c); +} + + +static int +fdesc(char **lnp, size_t *lnsz, char **bufp, size_t *bufsz, + const char *f, int fd, struct mdoc *mdoc) +{ + size_t sz; + ssize_t ssz; + struct stat st; + int j, i, pos, lnn; + char *ln, *buf; + + buf = *bufp; + ln = *lnp; + + /* + * Two buffers: ln and buf. buf is the input buffer, optimised + * for each file's block size. ln is a line buffer. Both + * growable, hence passed in by ptr-ptr. + */ + + if (-1 == fstat(fd, &st)) { + warnx("%s", f); + sz = BUFSIZ; + } else + sz = (unsigned)BUFSIZ > st.st_blksize ? + (size_t)BUFSIZ : st.st_blksize; + + if (sz > *bufsz) { + if (NULL == (buf = realloc(buf, sz))) + err(1, "realloc"); + *bufp = buf; + *bufsz = sz; + } + + /* + * Fill buf with file blocksize and parse newlines into ln. + */ + + for (lnn = 1, pos = 0; ; ) { + if (-1 == (ssz = read(fd, buf, sz))) { + warn("%s", f); + return(0); + } else if (0 == ssz) + break; + + for (i = 0; i < (int)ssz; i++) { + if (pos >= (int)*lnsz) { + *lnsz += 256; /* Step-size. */ + ln = realloc(ln, *lnsz); + if (NULL == ln) + err(1, "realloc"); + *lnp = ln; + } + + if ('\n' != buf[i]) { + ln[pos++] = buf[i]; + continue; + } + + /* Check for CPP-escaped newline. */ + + if (pos > 0 && '\\' == ln[pos - 1]) { + for (j = pos - 1; j >= 0; j--) + if ('\\' != ln[j]) + break; + + if ( ! ((pos - j) % 2)) { + pos--; + lnn++; + continue; + } + } + + ln[pos] = 0; + if ( ! mdoc_parseln(mdoc, lnn, ln)) + return(0); + lnn++; + pos = 0; + } + } + + return(mdoc_endparse(mdoc)); +} + + +static int +toptions(enum outt *tflags, char *arg) +{ + + if (0 == strcmp(arg, "ascii")) + *tflags = OUTT_ASCII; + else if (0 == strcmp(arg, "latin1")) + *tflags = OUTT_LATIN1; + else if (0 == strcmp(arg, "utf8")) + *tflags = OUTT_UTF8; + else if (0 == strcmp(arg, "lint")) + *tflags = OUTT_LINT; + else if (0 == strcmp(arg, "tree")) + *tflags = OUTT_TREE; + else { + warnx("bad argument: -T%s", arg); + return(0); + } + + return(1); +} + + +/* + * Parse out the options for [-fopt...] setting compiler options. These + * can be comma-delimited or called again. + */ +static int +foptions(int *fflags, char *arg) +{ + char *v; + char *toks[4]; + + toks[0] = "ign-scope"; + toks[1] = "ign-escape"; + toks[2] = "ign-macro"; + toks[3] = NULL; + + while (*arg) + switch (getsubopt(&arg, toks, &v)) { + case (0): + *fflags |= MDOC_IGN_SCOPE; + break; + case (1): + *fflags |= MDOC_IGN_ESCAPE; + break; + case (2): + *fflags |= MDOC_IGN_MACRO; + break; + default: + warnx("bad argument: -f%s", arg); + return(0); + } + + return(1); +} + + +/* + * Parse out the options for [-Werr...], which sets warning modes. + * These can be comma-delimited or called again. + */ +static int +woptions(int *wflags, char *arg) +{ + char *v; + char *toks[5]; + + toks[0] = "all"; + toks[1] = "compat"; + toks[2] = "syntax"; + toks[3] = "error"; + toks[4] = NULL; + + while (*arg) + switch (getsubopt(&arg, toks, &v)) { + case (0): + *wflags |= WARN_WALL; + break; + case (1): + *wflags |= WARN_WCOMPAT; + break; + case (2): + *wflags |= WARN_WSYNTAX; + break; + case (3): + *wflags |= WARN_WERR; + break; + default: + warnx("bad argument: -W%s", arg); + return(0); + } + + return(1); +} + + +static int +merr(void *arg, int line, int col, const char *msg) +{ + + warnx("error: %s (line %d, column %d)", msg, line, col); + return(0); +} + + +static int +mwarn(void *arg, int line, int col, + enum mdoc_warn type, const char *msg) +{ + int flags; + char *wtype; + + flags = *(int *)arg; + wtype = NULL; + + switch (type) { + case (WARN_COMPAT): + wtype = "compat"; + if (flags & WARN_WCOMPAT) + break; + return(1); + case (WARN_SYNTAX): + wtype = "syntax"; + if (flags & WARN_WSYNTAX) + break; + return(1); + } + + assert(wtype); + warnx("%s warning: %s (line %d, column %d)", + wtype, msg, line, col); + + if ( ! (flags & WARN_WERR)) + return(1); + + warnx("%s: considering warnings as errors", + __progname); + return(0); +} + + @@ -17,18 +17,19 @@ .\" PERFORMANCE OF THIS SOFTWARE. .\" .Dd $Mdocdate$ -.Dt mdocterm 1 +.Dt mandoc 1 .Os .\" SECTION .Sh NAME -.Nm mdocterm -.Nd mdoc macro compiler +.Nm mandoc +.Nd format and display BSD manuals .\" SECTION .Sh SYNOPSIS -.Nm mdocterm +.Nm mandoc .Op Fl V .Op Fl f Ns Ar option... .Op Fl W Ns Ar err... +.Op Fl T Ns Ar output .Op Ar infile... .\" SECTION .Sh DESCRIPTION @@ -36,17 +37,23 @@ The .Nm utility formats a BSD .Dq mdoc -manual page for display on the terminal. The arguments are as follows: +manual page for display. The arguments are as follows: .Bl -tag -width XXXXXXXXXXXX .\" ITEM -.It Fl V -Print version and exit. -.\" ITEM .It Fl f Ns Ar option... Override default compiler behaviour. See .Sx Compiler Options for details. .\" ITEM +.It Fl T +Output format. See +.Sx Output Formats +for available formats. Defaults to +.Fl T Ns Ar ascii . +.\" ITEM +.It Fl V +Print version and exit. +.\" ITEM .It Fl W Ns Ar err... Print warning messages. May be set to .Fl W Ns Ar all @@ -69,33 +76,36 @@ If unspecified, reads from stdin. .El .\" PARAGRAPH .Pp -The -.Nm -utility is a formatting front-end for -.Xr mdoc 3 , -which parses the -.Dq mdoc -input, documented at -.Xr mdoc 7 -and -.Xr mdoc.samples 7 , -into an abstract syntax tree. -.\" PARAGRAPH -.Pp By default, .Nm -reads from stdin and prints nroff -.Qq backspace -terminal-encoded output to stdout, at this time to a fixed column with -of 78 characters. +reads from stdin and prints 78-column backspace-encoded output to stdout +as if +.Fl T Ns Ar ascii +were provided. .\" PARAGRAPH .Pp -.Ex -std mdocterm +.Ex -std mandoc +.\" SUB-SECTION +.Ss Output Formats +The +.Nm +utility accepts the following +.Fl T +arguments: +.Bl -tag -width XXXXXXXXXXXX -offset XXXX +.It Ar ascii +Produce 7-bit ASCII output, backspace-encoded for bold and underline +styles. This is the default. +.It Ar tree +Produce an indented parse tree. +.It Ar lint +Parse only: produce no output. +.El .\" SUB-SECTION .Ss Compiler Options Default compiler behaviour may be overriden with the .Fl f -flag. The available options are as follows: +flag. .Bl -tag -width XXXXXXXXXXXX -offset XXXX .It Fl f Ns Ar ign-scope When rewinding the scope of a block macro, forces the compiler to ignore @@ -114,37 +124,15 @@ flag, multiple options may be grouped and delimited with a comma. Using .Fl f Ns Ar ign-scope,ign-escape , for example, will try to ignore scope and character-escape errors. -.\" SUB-SECTION -.Ss Character Escapes -The -.Nm -utility correctly renders all -.Sx Special Characters -in -.Xr mdoc 7 -in 7-bit ASCII. -.Pp -In the general sense, -.Nm -will make a -.Pq best-effort -to render complex characters; however, if a manual is using considerable -special characters, some meaning may be lost in translation. .\" SECTION .Sh EXAMPLES -To display this manual page: -.\" PARAGRAPH -.Pp -.D1 % mdocterm \-Wall,error mdocterm.1 +To page this manual page on the terminal: .\" PARAGRAPH .Pp -To pipe a manual page to the pager: -.Pp -.D1 % mdocterm mdocterm.1 | less +.D1 % mandoc \-Wall,error mandoc.1 2>&1 | less .\" SECTION .Sh SEE ALSO -.Xr mdoc 7 , -.Xr mdoc 3 +.Xr mdoc 7 .\" .Sh AUTHORS The @@ -153,11 +141,6 @@ utility was written by .An Kristaps Dzonsons Aq kristaps@openbsd.org . .\" SECTION .Sh CAVEATS -See -.Xr mdoc 3 -for a list of bugs, caveats, and incomplete macros regarding the -document parse. -.Pp The .Nm utility doesn't yet know how to display the following: @@ -174,9 +157,13 @@ displays only accept text contents. .It The .Sq \&Xo/Xc -pair isn't supported (and never will be). +pair isn't supported. .It The .Sq \&Sm macro has no effect, yet. .El +.Pp +Other macros still aren't supported by virtue of nobody complaining +about their absence. Please report any omissions: this is a work in +progress. diff --git a/mdoclint.1 b/mdoclint.1 deleted file mode 100644 index 9bd7c3d6..00000000 --- a/mdoclint.1 +++ /dev/null @@ -1,156 +0,0 @@ -.\" $Id$ -.\" -.\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@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 AUTHOR DISCLAIMS ALL -.\" WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -.\" WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -.\" AUTHOR 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. -.\" -.Dd $Mdocdate$ -.Dt mdoclint 1 -.Os -.\" SECTION -.Sh NAME -.Nm mdoclint -.Nd mdoc macro compiler -.\" SECTION -.Sh SYNOPSIS -.Nm mdoclint -.Op Fl vV -.Op Fl f Ns Ar options... -.Op Fl W Ns Ar err... -.Op Ar infile... -.\" SECTION -.Sh DESCRIPTION -The -.Nm -utility parses a BSD -.Dq mdoc -manual pages and validates its syntax tree. The arguments are as -follows: -.Bl -tag -width XXXXXXXXXXXX -offset XXXX -.\" ITEM -.It Fl v -Print verbose parsing output. -.\" ITEM -.It Fl V -Print version and exit. -.\" ITEM -.It Fl f Ns Ar option... -Override default compiler behaviour. See -.Sx Compiler Options -for details. -.\" ITEM -.It Fl W Ns Ar err... -Print warning messages. May be set to -.Fl W Ns Ar all -for all warnings, -.Ar compat -for groff/troff-compatibility warnings, or -.Ar syntax -for syntax warnings. If -.Fl W Ns Ar error -is specified, warnings are considered errors and cause utility -termination. Multiple -.Fl W -arguments may be comma-separated, such as -.Fl W Ns Ar error,all . -.\" ITEM -.It Ar infile -Read input from -.Ar infile , -which may be -.Dq \- -for stdin. If multiple -.Ar infile -arguments are specified, each is processed and the system will exit on -the first failure. -.El -.\" PARAGRAPH -.Pp -The -.Nm -utility is a front-end for -.Xr mdoc 3 , -which parses the -.Dq mdoc -input, documented at -.Xr mdoc 7 -and -.Xr mdoc.samples 7 , -into an abstract syntax tree. By default, it reads from stdin. -.\" PARAGRAPH -.Pp -.Ex -std mdoclint -.\" SUB-SECTION -.Ss Compiler Options -Default compiler behaviour may be overriden with the -.Fl f -flag. The available options are as follows: -.Bl -tag -width XXXXXXXXXXXX -offset XXXX -.It Fl f Ns Ar ign-scope -When rewinding the scope of a block macro, forces the compiler to ignore -scope violations. This can seriously mangle the resulting tree. -.It Fl f Ns Ar ign-escape -Ignore invalid escape sequences. -.It Fl f Ns Ar ign-macro -Ignore unknown macros at the start of input lines. -.El -.\" PARAGRAPH -.Pp -As with the -.Fl W -flag, multiple -.Fl f -options may be grouped and delimited with a comma. Using -.Fl f Ns Ar ign-scope,ign-escape , -for example, will try to ignore scope and character-escape errors. -.\" SUB-SECTION -.Ss Input Encoding -The -.Nm -utility expects its input to be 7-bit ASCII as defined in -.Xr ascii 7 . -The only non-graphing characters accepted are spaces, -.Sq \ , -and tabs, -.Sq \et . -Tabs are only accepted in literal block-displays and as column -delimiters. -.Pp -Only Unix-style newlines (\en) are accepted; if the newline is escaped, -the line is concatenated with the next. -.\" SECTION -.Sh EXAMPLES -To validate this manual page: -.\" PARAGRAPH -.Pp -.D1 % mdoclint \-Wall,error mdoclint.1 -.\" SECTION -.Sh SEE ALSO -.Xr mdocterm 1 , -.Xr mdoctree 1 , -.Xr mdoc.samples 7 , -.Xr mdoc 7 , -.Xr mdoc 3 -.\" -.Sh AUTHORS -The -.Nm -utility was written by -.An Kristaps Dzonsons Aq kristaps@openbsd.org . -.\" SECTION -.Sh CAVEATS -See -.Xr mdoc 3 -for a list of bugs, caveats, and incomplete macros. diff --git a/mdoclint.c b/mdoclint.c deleted file mode 100644 index 526df42d..00000000 --- a/mdoclint.c +++ /dev/null @@ -1,51 +0,0 @@ -/* $Id$ */ -/* - * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@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 AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR 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 <assert.h> -#include <err.h> -#include <getopt.h> -#include <stdio.h> -#include <stdlib.h> - -#include "mmain.h" - -int -main(int argc, char *argv[]) -{ - struct mmain *p; - int c; - - p = mmain_alloc(); - - c = mmain_getopt(p, argc, argv, NULL, - "[infile...]", NULL, NULL, NULL); - - argv += c; - if (0 == (argc -= c)) - mmain_exit(p, NULL != mmain_mdoc(p, "-")); - - while (c-- > 0) { - if (NULL == mmain_mdoc(p, *argv++)) - mmain_exit(p, 1); - mmain_reset(p); - } - - mmain_exit(p, 0); - /* NOTREACHED */ -} - diff --git a/mdoctree.1 b/mdoctree.1 deleted file mode 100644 index 631ff5da..00000000 --- a/mdoctree.1 +++ /dev/null @@ -1,162 +0,0 @@ -.\" $Id$ -.\" -.\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@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 AUTHOR DISCLAIMS ALL -.\" WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -.\" WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -.\" AUTHOR 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. -.\" -.Dd $Mdocdate$ -.Dt mdoctree 1 -.Os -.\" SECTION -.Sh NAME -.Nm mdoctree -.Nd mdoc macro compiler -.\" SECTION -.Sh SYNOPSIS -.Nm mdoctree -.Op Fl vV -.Op Fl f Ns Ar options... -.Op Fl W Ns Ar err... -.Op Ar infile -.\" SECTION -.Sh DESCRIPTION -The -.Nm -utility parses a BSD -.Dq mdoc -manual pages and prints its syntax tree. It's commonly used to see the -syntax tree of a document when building new -.Xr mdoc 3 -utilities. The arguments are as follows: -.Bl -tag -width XXXXXXXXXXXX -.\" ITEM -.It Fl v -Print verbose parsing output. -.\" ITEM -.It Fl V -Print version and exit. -.\" ITEM -.It Fl f Ns Ar option... -Override default compiler behaviour. See -.Sx Compiler Options -for details. -.\" ITEM -.It Fl W Ns Ar err... -Print warning messages. May be set to -.Fl W Ns Ar all -for all warnings, -.Ar compat -for groff/troff-compatibility warnings, or -.Ar syntax -for syntax warnings. If -.Fl W Ns Ar error -is specified, warnings are considered errors and cause utility -termination. Multiple -.Fl W -arguments may be comma-separated, such as -.Fl W Ns Ar error,all . -.\" ITEM -.It Ar infile -Read input from -.Ar infile , -which may be -.Dq \- -for stdin. -.El -.\" PARAGRAPH -.Pp -The -.Nm -utility is a formatting front-end for -.Xr mdoc 3 , -which parses the -.Dq mdoc -input, documented at -.Xr mdoc 7 -and -.Xr mdoc.samples 7 , -into an abstract syntax tree. By default, it reads from stdin and -prints the syntax tree to stdout. -.\" PARAGRAPH -.Pp -.Ex -std mdoctree -.\" SUB-SECTION -.Ss Compiler Options -Default compiler behaviour may be overriden with the -.Fl f -flag. The available options are as follows: -.Bl -tag -width XXXXXXXXXXXX -offset XXXX -.It Fl f Ns Ar ign-scope -When rewinding the scope of a block macro, forces the compiler to ignore -scope violations. This can seriously mangle the resulting tree. -.It Fl f Ns Ar ign-escape -Ignore invalid escape sequences. -.It Fl f Ns Ar ign-macro -Ignore unknown macros at the start of input lines. -.El -.\" PARAGRAPH -.Pp -As with the -.Fl W -flag, multiple -.Fl f -options may be grouped and delimited with a comma. Using -.Fl f Ns Ar ign-scope,ign-escape , -for example, will try to ignore scope and character-escape errors. -.\" SUB-SECTION -.Ss Input Encoding -The -.Nm -utility expects its input to be 7-bit ASCII as defined in -.Xr ascii 7 . -The only non-graphing characters accepted are spaces, -.Sq \ , -and tabs, -.Sq \et . -Tabs are only accepted in literal block-displays and as column -delimiters. -.Pp -Only Unix-style newlines (\en) are accepted; if the newline is escaped, -the line is concatenated with the next. -.\" SUB-SECTION -.Ss Character Escapes -Since -.Nm -doesn't format its output, character escapes are displayed as passed -into the compiler. -.\" SECTION -.Sh EXAMPLES -To validate this manual page: -.\" PARAGRAPH -.Pp -.D1 % mdoctree \-Wall,error mdoctree.1 -.\" SECTION -.Sh SEE ALSO -.Xr mdocterm 1 , -.Xr mdoclint 1 , -.Xr mdoc.samples 7 , -.Xr mdoc 7 , -.Xr mdoc 3 -.\" -.Sh AUTHORS -The -.Nm -utility was written by -.An Kristaps Dzonsons Aq kristaps@openbsd.org . -.\" SECTION -.Sh CAVEATS -See -.Xr mdoc 3 -for a list of bugs, caveats, and incomplete macros. @@ -27,6 +27,12 @@ __BEGIN_DECLS +enum termenc { + TERMENC_ASCII, + TERMENC_LATIN1, + TERMENC_UTF8 +}; + struct termp { size_t rmargin; /* Current right margin. */ size_t maxrmargin; /* Max right margin. */ @@ -45,6 +51,7 @@ struct termp { #define TERMP_BOLD (1 << 8) /* Styles... */ #define TERMP_UNDER (1 << 9) char *buf; /* Output buffer. */ + enum termenc enc; /* Type of encoding. */ void *symtab; /* Encoded-symbol table. */ }; @@ -16,365 +16,108 @@ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ -#include <sys/types.h> -#include <sys/stat.h> - #include <assert.h> #include <err.h> -#include <fcntl.h> -#include <getopt.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> #include "term.h" -#define WARN_WALL 0x03 /* All-warnings mask. */ -#define WARN_WCOMPAT (1 << 0) /* Compatibility warnings. */ -#define WARN_WSYNTAX (1 << 1) /* Syntax warnings. */ -#define WARN_WERR (1 << 2) /* Warnings->errors. */ - -enum termt { - TERMT_ASCII, - TERMT_LINT, - TERMT_TREE -}; - -extern char *__progname; - -__dead static void version(void); -__dead static void usage(void); -#if 0 -__dead static void punt(struct cmdargs *, char **); -#endif -static int foptions(int *, char *); -static int toptions(enum termt *, char *); -static int woptions(int *, char *); -static int merr(void *, int, int, const char *); -static int mwarn(void *, int, int, - enum mdoc_warn, const char *); -static void body(struct termp *, struct termpair *, +static struct termp *termp_alloc(enum termenc); +static void termp_free(struct termp *); +static void termp_body(struct termp *, struct termpair *, const struct mdoc_meta *, const struct mdoc_node *); -static void header(struct termp *, +static void termp_head(struct termp *, const struct mdoc_meta *); -static void footer(struct termp *, +static void termp_foot(struct termp *, const struct mdoc_meta *); -static int file(char **, size_t *, char **, size_t *, - const char *, struct mdoc *); -static int fdesc(char **, size_t *, char **, size_t *, - const char *, int, struct mdoc *); -static void pword(struct termp *, const char *, int); -static void pescape(struct termp *, +static void termp_pword(struct termp *, const char *, int); +static void termp_pescape(struct termp *, const char *, int *, int); -static void nescape(struct termp *, +static void termp_nescape(struct termp *, const char *, size_t); -static void chara(struct termp *, char); -static void stringa(struct termp *, +static void termp_chara(struct termp *, char); +static void termp_stringa(struct termp *, const char *, size_t); -static void sanity(const struct mdoc_node *); +static void sanity(const struct mdoc_node *); /* XXX */ -int -main(int argc, char *argv[]) +void * +latin1_alloc(void) { - struct termp termp; - int c, fflags, wflags; - struct mdoc_cb cb; - struct mdoc *mdoc; - char *buf, *line; - size_t bufsz, linesz; - enum termt termt; - - bzero(&termp, sizeof(struct termp)); - bzero(&cb, sizeof(struct mdoc_cb)); - - termt = TERMT_ASCII; - fflags = wflags = 0; - - /* LINTED */ - while (-1 != (c = getopt(argc, argv, "f:VW:T:"))) - switch (c) { - case ('f'): - if ( ! foptions(&fflags, optarg)) - return(0); - break; - case ('T'): - if ( ! toptions(&termt, optarg)) - return(0); - break; - case ('W'): - if ( ! woptions(&wflags, optarg)) - return(0); - break; - case ('V'): - version(); - /* NOTREACHED */ - default: - usage(); - /* NOTREACHED */ - } - - argc -= optind; - argv += optind; - - termp.maxrmargin = 78; /* FIXME */ - - cb.mdoc_err = merr; - cb.mdoc_warn = mwarn; - - /* Line and block buffers persist between parses. */ - buf = line = NULL; - bufsz = linesz = 0; - - /* Overall mdoc persists between parses. */ - - mdoc = mdoc_alloc(&wflags, fflags, &cb); - - while (*argv) { - if ( ! file(&line, &linesz, &buf, &bufsz, *argv, mdoc)) - break; - - switch (termt) { - case (TERMT_ASCII): - if (NULL == termp.symtab) - termp.symtab = ascii2htab(); - header(&termp, mdoc_meta(mdoc)); - body(&termp, NULL, mdoc_meta(mdoc), - mdoc_node(mdoc)); - footer(&termp, mdoc_meta(mdoc)); - break; - default: - break; - } - - mdoc_reset(mdoc); - argv++; - } - - if (buf) - free(buf); - if (line) - free(line); - if (termp.buf) - free(termp.buf); - if (termp.symtab) - asciifree(termp.symtab); - - mdoc_free(mdoc); - - return(0); + return(termp_alloc(TERMENC_LATIN1)); } -__dead static void -version(void) +void * +utf8_alloc(void) { - (void)printf("%s %s\n", __progname, VERSION); - exit(0); - /* NOTREACHED */ + return(termp_alloc(TERMENC_UTF8)); } -__dead static void -usage(void) +void * +ascii_alloc(void) { - (void)fprintf(stderr, "usage: %s\n", __progname); - exit(1); - /* NOTREACHED */ + return(termp_alloc(TERMENC_ASCII)); } -static int -file(char **ln, size_t *lnsz, char **buf, size_t *bufsz, - const char *file, struct mdoc *mdoc) +int +terminal_run(void *arg, const struct mdoc *mdoc) { - int fd, c; + struct termp *p; - if (-1 == (fd = open(file, O_RDONLY, 0))) { - warn("%s", file); - return(0); - } + p = (struct termp *)arg; - c = fdesc(ln, lnsz, buf, bufsz, file, fd, mdoc); + if (NULL == p->symtab) + p->symtab = ascii2htab(); - if (-1 == close(fd)) - warn("%s", file); + termp_head(p, mdoc_meta(mdoc)); + termp_body(p, NULL, mdoc_meta(mdoc), mdoc_node(mdoc)); + termp_foot(p, mdoc_meta(mdoc)); - return(c); + return(1); } -static int -fdesc(char **lnp, size_t *lnsz, char **bufp, size_t *bufsz, - const char *f, int fd, struct mdoc *mdoc) +void +terminal_free(void *arg) { - size_t sz; - ssize_t ssz; - struct stat st; - int j, i, pos, lnn; - char *ln, *buf; - - buf = *bufp; - ln = *lnp; - - /* - * Two buffers: ln and buf. buf is the input buffer, optimised - * for each file's block size. ln is a line buffer. Both - * growable, hence passed in by ptr-ptr. - */ - - if (-1 == fstat(fd, &st)) { - warnx("%s", f); - sz = BUFSIZ; - } else - sz = (unsigned)BUFSIZ > st.st_blksize ? - (size_t)BUFSIZ : st.st_blksize; - - if (sz > *bufsz) { - if (NULL == (buf = realloc(buf, sz))) - err(1, "realloc"); - *bufp = buf; - *bufsz = sz; - } - - /* - * Fill buf with file blocksize and parse newlines into ln. - */ - - for (lnn = 1, pos = 0; ; ) { - if (-1 == (ssz = read(fd, buf, sz))) { - warn("%s", f); - return(0); - } else if (0 == ssz) - break; - - for (i = 0; i < (int)ssz; i++) { - if (pos >= (int)*lnsz) { - *lnsz += 256; /* Step-size. */ - ln = realloc(ln, *lnsz); - if (NULL == ln) - err(1, "realloc"); - *lnp = ln; - } - if ('\n' != buf[i]) { - ln[pos++] = buf[i]; - continue; - } - - /* Check for CPP-escaped newline. */ - - if (pos > 0 && '\\' == ln[pos - 1]) { - for (j = pos - 1; j >= 0; j--) - if ('\\' != ln[j]) - break; - - if ( ! ((pos - j) % 2)) { - pos--; - lnn++; - continue; - } - } - - ln[pos] = 0; - if ( ! mdoc_parseln(mdoc, lnn, ln)) - return(0); - lnn++; - pos = 0; - } - } - - return(mdoc_endparse(mdoc)); + termp_free((struct termp *)arg); } -static int -toptions(enum termt *tflags, char *arg) +static void +termp_free(struct termp *p) { - if (0 == strcmp(arg, "ascii")) - *tflags = TERMT_ASCII; - else if (0 == strcmp(arg, "lint")) - *tflags = TERMT_LINT; - else if (0 == strcmp(arg, "tree")) - *tflags = TERMT_TREE; - else { - warnx("bad argument: -T%s", arg); - return(0); - } + if (p->buf) + free(p->buf); + if (TERMENC_ASCII == p->enc && p->symtab) + asciifree(p->symtab); - return(1); + free(p); } -/* - * Parse out the options for [-fopt...] setting compiler options. These - * can be comma-delimited or called again. - */ -static int -foptions(int *fflags, char *arg) +static struct termp * +termp_alloc(enum termenc enc) { - char *v; - char *toks[] = { "ign-scope", "ign-escape", - "ign-macro", NULL }; - - while (*arg) - switch (getsubopt(&arg, toks, &v)) { - case (0): - *fflags |= MDOC_IGN_SCOPE; - break; - case (1): - *fflags |= MDOC_IGN_ESCAPE; - break; - case (2): - *fflags |= MDOC_IGN_MACRO; - break; - default: - warnx("bad argument: -f%s", arg); - return(0); - } - - return(1); -} - + struct termp *p; -/* - * Parse out the options for [-Werr...], which sets warning modes. - * These can be comma-delimited or called again. XXX - should this be - * using -w like troff? - */ -static int -woptions(int *wflags, char *arg) -{ - char *v; - char *toks[] = { "all", "compat", - "syntax", "error", NULL }; - - while (*arg) - switch (getsubopt(&arg, toks, &v)) { - case (0): - *wflags |= WARN_WALL; - break; - case (1): - *wflags |= WARN_WCOMPAT; - break; - case (2): - *wflags |= WARN_WSYNTAX; - break; - case (3): - *wflags |= WARN_WERR; - break; - default: - warnx("bad argument: -W%s", arg); - return(0); - } - - return(1); + if (NULL == (p = malloc(sizeof(struct termp)))) + err(1, "malloc"); + bzero(p, sizeof(struct termp)); + p->maxrmargin = 78; + p->enc = enc; + return(p); } @@ -586,7 +329,7 @@ word(struct termp *p, const char *word) int i, j, len; if (p->flags & TERMP_LITERAL) { - pword(p, word, (int)strlen(word)); + termp_pword(p, word, (int)strlen(word)); return; } @@ -615,12 +358,12 @@ word(struct termp *p, const char *word) if (0 == j) continue; assert(i >= j); - pword(p, &word[i - j], j); + termp_pword(p, &word[i - j], j); j = 0; } if (j > 0) { assert(i >= j); - pword(p, &word[i - j], j); + termp_pword(p, &word[i - j], j); } } @@ -632,7 +375,7 @@ word(struct termp *p, const char *word) * prefix and postfix invocations. */ static void -body(struct termp *p, struct termpair *ppair, +termp_body(struct termp *p, struct termpair *ppair, const struct mdoc_meta *meta, const struct mdoc_node *node) { @@ -665,7 +408,7 @@ body(struct termp *p, struct termpair *ppair, p->flags |= pair.flag; if (dochild && node->child) - body(p, &pair, meta, node->child); + termp_body(p, &pair, meta, node->child); if (TERMPAIR_FLAG & pair.type) p->flags &= ~pair.flag; @@ -679,12 +422,12 @@ body(struct termp *p, struct termpair *ppair, /* Siblings. */ if (node->next) - body(p, ppair, meta, node->next); + termp_body(p, ppair, meta, node->next); } static void -footer(struct termp *p, const struct mdoc_meta *meta) +termp_foot(struct termp *p, const struct mdoc_meta *meta) { struct tm *tm; char *buf, *os; @@ -735,7 +478,7 @@ footer(struct termp *p, const struct mdoc_meta *meta) static void -header(struct termp *p, const struct mdoc_meta *meta) +termp_head(struct termp *p, const struct mdoc_meta *meta) { char *buf, *title; @@ -809,14 +552,14 @@ header(struct termp *p, const struct mdoc_meta *meta) * output buffer by way of the symbol table. */ static void -nescape(struct termp *p, const char *word, size_t len) +termp_nescape(struct termp *p, const char *word, size_t len) { const char *rhs; size_t sz; if (NULL == (rhs = a2ascii(p->symtab, word, len, &sz))) return; - stringa(p, rhs, sz); + termp_stringa(p, rhs, sz); } @@ -826,7 +569,7 @@ nescape(struct termp *p, const char *word, size_t len) * the escape sequence (we assert upon badly-formed escape sequences). */ static void -pescape(struct termp *p, const char *word, int *i, int len) +termp_pescape(struct termp *p, const char *word, int *i, int len) { int j; @@ -838,7 +581,7 @@ pescape(struct termp *p, const char *word, int *i, int len) if (*i + 1 >= len) return; - nescape(p, &word[*i], 2); + termp_nescape(p, &word[*i], 2); (*i)++; return; @@ -853,18 +596,18 @@ pescape(struct termp *p, const char *word, int *i, int len) if (*i + 1 >= len) return; - nescape(p, &word[*i], 2); + termp_nescape(p, &word[*i], 2); (*i)++; return; case ('['): break; default: - nescape(p, &word[*i], 1); + termp_nescape(p, &word[*i], 1); return; } } else if ('[' != word[*i]) { - nescape(p, &word[*i], 1); + termp_nescape(p, &word[*i], 1); return; } @@ -875,7 +618,7 @@ pescape(struct termp *p, const char *word, int *i, int len) if (0 == word[*i]) return; - nescape(p, &word[*i - j], (size_t)j); + termp_nescape(p, &word[*i - j], (size_t)j); } @@ -885,13 +628,13 @@ pescape(struct termp *p, const char *word, int *i, int len) * handles word styling. */ static void -pword(struct termp *p, const char *word, int len) +termp_pword(struct termp *p, const char *word, int len) { int i; if ( ! (TERMP_NOSPACE & p->flags) && ! (TERMP_LITERAL & p->flags)) - chara(p, ' '); + termp_chara(p, ' '); if ( ! (p->flags & TERMP_NONOSPACE)) p->flags &= ~TERMP_NOSPACE; @@ -903,33 +646,33 @@ pword(struct termp *p, const char *word, int len) for (i = 0; i < len; i++) { if ('\\' == word[i]) { - pescape(p, word, &i, len); + termp_pescape(p, word, &i, len); continue; } if (TERMP_STYLE & p->flags) { if (TERMP_BOLD & p->flags) { - chara(p, word[i]); - chara(p, 8); + termp_chara(p, word[i]); + termp_chara(p, 8); } if (TERMP_UNDER & p->flags) { - chara(p, '_'); - chara(p, 8); + termp_chara(p, '_'); + termp_chara(p, 8); } } - chara(p, word[i]); + termp_chara(p, word[i]); } } /* - * Like chara() but for arbitrary-length buffers. Resize the buffer by - * a factor of two (if the buffer is less than that) or the buffer's - * size. + * Like termp_chara() but for arbitrary-length buffers. Resize the + * buffer by a factor of two (if the buffer is less than that) or the + * buffer's size. */ static void -stringa(struct termp *p, const char *c, size_t sz) +termp_stringa(struct termp *p, const char *c, size_t sz) { size_t s; @@ -958,7 +701,7 @@ stringa(struct termp *p, const char *c, size_t sz) * size. */ static void -chara(struct termp *p, char c) +termp_chara(struct termp *p, char c) { size_t s; @@ -1083,50 +826,3 @@ sanity(const struct mdoc_node *n) break; } } - - -static int -merr(void *arg, int line, int col, const char *msg) -{ - - warnx("error: %s (line %d, column %d)", msg, line, col); - return(0); -} - - -static int -mwarn(void *arg, int line, int col, - enum mdoc_warn type, const char *msg) -{ - int flags; - char *wtype; - - flags = *(int *)arg; - wtype = NULL; - - switch (type) { - case (WARN_COMPAT): - wtype = "compat"; - if (flags & WARN_WCOMPAT) - break; - return(1); - case (WARN_SYNTAX): - wtype = "syntax"; - if (flags & WARN_WSYNTAX) - break; - return(1); - } - - assert(wtype); - warnx("%s warning: %s (line %d, column %d)", - wtype, msg, line, col); - - if ( ! (flags & WARN_WERR)) - return(1); - - warnx("%s: considering warnings as errors", - __progname); - return(0); -} - - @@ -18,46 +18,25 @@ */ #include <assert.h> #include <err.h> -#include <getopt.h> #include <stdio.h> #include <stdlib.h> -#include "mmain.h" +#include "mdoc.h" -#define xprintf (void)printf +static void tree_body(const struct mdoc_node *, int); -static void doprint(const struct mdoc_node *, int); int -main(int argc, char *argv[]) +tree_run(void *arg, const struct mdoc *mdoc) { - struct mmain *p; - const struct mdoc *mdoc; - int c; - char *in; - p = mmain_alloc(); - - c = mmain_getopt(p, argc, argv, NULL, - "[infile]", NULL, NULL, NULL); - - argv += c; - if ((argc -= c) > 0) - in = *argv++; - else - in = "-"; - - if (NULL == (mdoc = mmain_mdoc(p, in))) - mmain_exit(p, 1); - - doprint(mdoc_node(mdoc), 0); - mmain_exit(p, 0); - /* NOTREACHED */ + tree_body(mdoc_node(mdoc), 0); + return(1); } static void -doprint(const struct mdoc_node *n, int indent) +tree_body(const struct mdoc_node *n, int indent) { const char *p, *t; int i, j; @@ -132,26 +111,27 @@ doprint(const struct mdoc_node *n, int indent) } for (i = 0; i < indent; i++) - xprintf(" "); - xprintf("%s (%s)", p, t); + (void)printf(" "); + (void)printf("%s (%s)", p, t); for (i = 0; i < (int)argc; i++) { - xprintf(" -%s", mdoc_argnames[argv[i].arg]); + (void)printf(" -%s", mdoc_argnames[argv[i].arg]); if (argv[i].sz > 0) - xprintf(" ["); + (void)printf(" ["); for (j = 0; j < (int)argv[i].sz; j++) - xprintf(" [%s]", argv[i].value[j]); + (void)printf(" [%s]", argv[i].value[j]); if (argv[i].sz > 0) - xprintf(" ]"); + (void)printf(" ]"); } for (i = 0; i < (int)sz; i++) - xprintf(" [%s]", params[i]); + (void)printf(" [%s]", params[i]); - xprintf(" %d:%d\n", n->line, n->pos); + (void)printf(" %d:%d\n", n->line, n->pos); if (n->child) - doprint(n->child, indent + 1); + tree_body(n->child, indent + 1); if (n->next) - doprint(n->next, indent); + tree_body(n->next, indent); } + |