Carefully let mandoc_getcontrol() handle libroff's detection of a macro
line. Note that we now properly ignore \.", which earlier would have
been pushed through macro detection. This required attention to all
entries of roff_parse().
This removes a TODO by schwarze@ to the effect that \. can be a control
character, which is now handled in mandoc_getcontrol().
Merge man_args() into man_macro.c, the only place where it's called, and
make its return value boolean (we don't care about QWORD). We can move
it into mdoc_macro.c because it's basically just a wrapper around
mandoc_getarg(). Then blow away man_argv.c, which is left empty.
First, make -man ARGS_EOLN et al. be an enum. Second, remove
ARGS_ERROR, as it is never returned by man_args(). Then clean up
invocations of man_args() to only check for ARGS_EOLN.
Make (e.g.) `SM' before `B' be only a warning. In reality, this refers
to ELINE macros ("next-line", but not unbreakable like the next-line
paragraph macros) followed by other macros. This addresses a report by
Christian Weisgerber, posted in the TODO by schwarze@, and aired on
discuss@ (22/03/2011) for whether a fix is warranted.
libmdoc.h and libman.h were including mdoc.h and man.h, respectively.
Don't have them do that (includes in header files = faugh), and have
individual files directly include these files.
Move mandoc_isdelim() back into libmdoc.h. This fixes an unreported
error where (1) -man pages were punctuating delimiters (e.g., `.B a ;')
and where (2) standalone punctuation in -mdoc or -man (e.g., ";" on its
own line) would also be punctuated. This introduces a small amount of
complexity of mdoc_{html,term}.c must manage their own spacing with
running print_word() or print_text(). The check for delimiting now
happens in mdoc_macro.c's dword().
Be a bit more specific on where we compile. Are there any ANSI-C
compilers where we don't compile? I'm pretty sure that mmap() is
non-standard (we'll fail, e.g., on mingw32).
Step 5: re-write Makefile and relax. This restructures the Makefile to
do actual dependency checking for headers and to build everything nicer
(www properly depends on mandoc, etc.).
Note that the ChangeLog isn't being built any more: if people are
interested, they can visit the source-changes mailing list archive.
Step 4: merge chars.h into out.h. The functions in this file are
necessary to all [real] front-ends, so stop pretending it's special.
While here, add some documentation to the variable types.
Step 3: consolidate manuals. The parse functions in mdoc.h, roff.h, and
man.h are now part of libmandoc.h, so remove these from their respective
manuals (they're no longer public-facing and we don't need a libmandoc.3
(yet?)). Before that, move the juicy data (parse tree syntax) into
new-born mandoc.3. Peck around in Makefile and index.sgml to reflect
reality.
Step 1 of restructuring: libmandoc.h. Move all compiler-set-specific
stuff into libmandoc.h, including old mdoc.h/man.h/roff.h functions now
used by read.c. The motivation behind this is to tighten the
relationship between the underlying compilers while keeping parse data
hidden from general callers (e.g., main.c).
While here, also move register values from mandoc.h into libmandoc.h as
noted by schwarze@. See above for explanation.
Let read.c worry about the currently-open file instead of having this
information duplicated in main.c. For the time being, remove evt_close
and evt_open, as the only known mparse interface (main.c) doesn't need
them.
Consolidate messages. Have all parse-time messages (in libmdoc,
libroff, etc., etc.) route into mandoc_msg() and mandoc_vmsg(), for the
time being in libmandoc.h. This requires struct mparse to be passed
into the allocation routines instead of mandocmsg and a void pointer.
Then, move some of the functionality of the old mmsg() into read.c's
mparse_mmsg() (check against wlevel and setting of file_status) and use
main.c's mmsg() as simply a printing tool.
Split the document parsing sequence out of main.c and into read.c,
putting the interface into mandoc.h. This effectively makes the
function of main.c be command-line handling, invoking the parser, and
sending its output to the output handler. The sequence of parsing
(pfile(), pdesc(), etc.) has changed very little but for clean-up of
some state variables (curp->fd, etc.).
Bumped internal version. There will be no formal release with this: it
precedes some major structural changes for easier roll-back in the case
of errors or whatnot.
Clean-up in libmdoc: fix last checks for mdoc_*msg return value, then
make mdoc_vmsg not return an int. libmdoc is now completely clean of
return-value checks from the message subsystem.
Clean-up in mdoc_argv.c: make CPP-defines into an enum, document, make
static arrays const, properly abort() for bogus switch cases, and be
obsessive about spacing and (void)-casting.
Move mdoc_isdelim() into mandoc.h as mandoc_isdelim(). This allows the
removal of manual delimiter checks in html.c and term.c. Finally, add
the escaped period as a closing delimiter, removing a TODO to this
effect.
Move mandoc_{realloc,malloc,calloc} out of libmandoc.h and into mandoc.h
so that everybody can use them. This follows the convention of
libXXXX.h being internal to a library and XXXX.h being the external
interface. Not only does this allow the removal of lots of redundant
NULL-checking code, it also sets the tone for adding new mandoc-global
routines.
Move check for closing punctuation into its own function. This will
later be modified to remove the need for iscdelim(), which will be used
to unify delimiter checks, which will then allow for the simple removal
of a TODO regarding escaped periods.
Instead of a series of hard-coded strcmps, make argv_a2arg() iterate
over an array of possible argument types, hooking in to mdoc_argnames[].
This knocks off bytes for the duplicated strings and cleans up code
readability.
Ingo Schwarze [Tue, 15 Mar 2011 03:03:54 +0000 (03:03 +0000)]
my $buf = "string"; return $string; is cool in Perl, but not in C;
found by Ulrich Spoerlein <uqs at freebsd> using the clang static analyzer;
"ok, but please document the numbers" kristaps@
Ingo Schwarze [Mon, 7 Mar 2011 01:58:24 +0000 (01:58 +0000)]
Do not leak information about the software used
into PostScript and PDF documents behind the user's back.
Joerg Sonnenberger pointed out that almost all software
creating PostScript and PDF documents does so, even on OpenBSD,
but that doesn't make the leakage much better in my book.
According to all standards i could find, this information is optional.
Issue originally reported by deraadt@; "commit!" kristaps@.
Ingo Schwarze [Mon, 7 Mar 2011 01:35:51 +0000 (01:35 +0000)]
Clean up date handling,
as a first step to get rid of the frequent petty warnings in this area:
- always store dates as strings, not as seconds since the Epoch
- for input, try the three most common formats everywhere
- for unrecognized format, just pass the date though verbatim
- when there is no date at all, still use the current date
Originally triggered by a one-line patch from Tim van der Molen,
<tbvdm at xs4all dot nl>, which is included here.
Feedback and OK on manual parts from jmc@.
"please check this in" kristaps@
Ingo Schwarze [Wed, 9 Feb 2011 22:53:20 +0000 (22:53 +0000)]
Clean up the COMPATIBILITY section;
heavily based on a patch from kristaps@ with some tweaks by me.
- Also talk about -Tps and -Tpdf.
- Use the same list style as in the other mandoc manuals.
- Replace a few macros by ones better suited.
- Some improvements of wording.
ok jmc@ kristaps@
Ingo Schwarze [Sun, 6 Feb 2011 22:33:38 +0000 (22:33 +0000)]
Some pre-handlers produce output, so reorder the code to set up
keep flags before they are called.
Without this bugfix, .Bk was ineffective in some cases.
"looks reasonable" kristaps@
Add initial libmdoc and libman top-most machinery for accepting TBL
directives. For now this will just ignore them (except for -Ttree,
which just notes that an EQN's been accepted).
Add initial EQN support to mandoc. This parses, then throws away, data
between EQ and EN roff blocks. EQN is different from TBL in that data
after .EQ is unilaterally considered an equation until an .EN. Thus,
there's no need to jump through hoops in having table spans and so on.
This is ONLY the parse code framework in libroff. EQN is not yet passed
into the backends.
If `Ns' is specified on its own line, it should be ignored. This is
shitty groff behaviour. Do the same, but raise a warning to this
effect. This from a TODO noted by schwarze@.
Ingo Schwarze [Sun, 30 Jan 2011 16:05:37 +0000 (16:05 +0000)]
Implement the \N'number' (numbered character) roff escape sequence.
Don't use it in new manuals, it is inherently non-portable, but we
need it for backward-compatibility with existing manuals, for example
in Xenocara driver pages.
ok kristaps@ jmc@ and tested by Matthieu Herrb (matthieu at openbsd dot org)
Ingo Schwarze [Tue, 25 Jan 2011 12:24:27 +0000 (12:24 +0000)]
Since tbl_data() can now produce multiple spans, let parsebuf()
generate man(7) or mdoc(7) nodes for all these spans,
not only for the last one.
Restores the horizontal lines in the cpu(4/hppa) tables.
ok kristaps@
Ingo Schwarze [Tue, 25 Jan 2011 12:16:22 +0000 (12:16 +0000)]
Do not skip data after horizontal lines in the layout.
Instead, let one line of input data add two new spans
to the tbl tree during one single call of tbl_data().
Note that this causes the horizontal line to get parsed
into the tbl tree, but not yet used in the output,
which will be fixed next.
Avoids data loss in cpu(4/hppa).
ok kristaps@
Ingo Schwarze [Tue, 25 Jan 2011 01:12:02 +0000 (01:12 +0000)]
Ignore .ns (no-space mode), .ps (change point size), .ta (tab control)
for now. All of these just cause a bit too much or too little
whitespace, but no serious formatting problems.
Triggered by reports from brad@.
Ingo Schwarze [Tue, 25 Jan 2011 00:40:14 +0000 (00:40 +0000)]
As noticed by deraadt@, it goes without saying that text files
on a UNIX system use UNIX conventions, and UNIX tools working
on them expect that.
ok jmc@