summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc/mdoc_term.c
AgeCommit message (Collapse)Author
2016-01-08Delete the redundant "nchild" member of struct roff_node, replacingIngo Schwarze
most uses by one, a few by two pointer checks, and only one by a tiny loop - not only making data smaller, but code shorter as well. This gets rid of an implicit invariant that confused both static analysis tools and human auditors. No functional change.
2015-10-12Use "-" rather than "\(hy" for the heads of .Bl -dash and -hyphen lists.Ingo Schwarze
In UTF-8 output, that renders as ASCII HYPHEN-MINUS (U+002D) rather than HYPHEN (U+2010), which looks better and matches groff. In ASCII output, it makes no difference. Suggested by naddy@.
2015-10-12To make the code more readable, delete 283 /* FALLTHROUGH */ commentsIngo Schwarze
that were right between two adjacent case statement. Keep only those 24 where the first case actually executes some code before falling through to the next case.
2015-10-06modernize style: "return" is not a function; ok cmp(1)Ingo Schwarze
2015-09-26/* NOTREACHED */ after abort() is silly, delete itIngo Schwarze
2015-09-21Trailing whitespace is significant when determining the width of a tagIngo Schwarze
in mdoc(7) .Bl -tag and man(7) .TP, but not in man(7) .IP. Quirk reported by Jan Stary <hans at stare dot cz> on ports@.
2015-09-14The .Dv macro actually forces normal font.Ingo Schwarze
2015-07-25Simplify and make tag_put() more efficient by integrating tag_get()Ingo Schwarze
into it and by only handling NUL-terminated strings. Minus 25 lines of code, no functional change.
2015-07-25implement tagging for .ErIngo Schwarze
2015-07-25basic tag support for function names; written at YYCIngo Schwarze
2015-07-25basic support for tag priorities; written at YYCIngo Schwarze
2015-07-17Initial, still somewhat experimental implementation to leverageIngo Schwarze
less(1) -T and :t ctags(1)-like functionality to jump to the definitions of various terms inside manual pages. To be polished in the tree, so bear with me and report issues. Technically, if less(1) is used as a pager, information is collected by the mdoc(7) terminal formatter, first stored using the ohash library, then ultimately written to a temporary file which is passed to less via -T. No change intended for other output formatters or when running without a pager. Based on an idea from Kristaps using feedback from many, in particular phessler@ nicm@ millert@ halex@ doug@ kspillner@ deraadt@.
2015-04-18Delete the wrapper functions mdoc_meta(), man_meta(), mdoc_node(),Ingo Schwarze
man_node() from the mandoc(3) semi-public interface and the internal wrapper functions print_mdoc() and print_man() from the HTML formatters. Minus 60 lines of code, no functional change.
2015-04-18Replace the structs mdoc and man by a unified struct roff_man.Ingo Schwarze
Almost completely mechanical, no functional change. Written on the train from Exeter to London returning from p2k15.
2015-04-04Rounding rules for horizontal scaling widths are more complicated.Ingo Schwarze
There is a first rounding to basic units on the input side. After that, rounding rules differ between requests and macros. Requests round to the nearest possible character position. Macros round to the next character position to the left. Implement that by changing the return value of term_hspan() to basic units and leaving the second scaling and rounding stage to the formatters instead of doing it in the terminal handler. Improves for example argtable2(3).
2015-04-02Third step towards parser unification:Ingo Schwarze
Replace struct mdoc_meta and struct man_meta by a unified struct roff_meta. Written of the train from London to Exeter on the way to p2k15.
2015-04-02Second step towards parser unification:Ingo Schwarze
Replace struct mdoc_node and struct man_node by a unified struct roff_node. To be able to use the tok member for both mdoc(7) and man(7) without defining all the macros in roff.h, sacrifice a tiny bit of type safety and make tok an int rather than an enum. Almost mechanical, no functional change. Written on the Eurostar from Bruxelles to London on the way to p2k15.
2015-04-02First step towards parser unification:Ingo Schwarze
Replace enum mdoc_type and enum man_type by a unified enum roff_type. Almost mechanical, no functional change. Written on the ICE train from Frankfurt to Bruxelles on the way to p2k15.
2015-03-09Fix vertical spacing at the beginning of tables.Ingo Schwarze
man(7) always prints a blank line, mdoc(7) doesn't. Problem in mdoc(7) reported by kristaps@. mdoc(7) part of the patch tested by kristaps@.
2015-03-09In mdoc(7), don't mistreat negative .sp arguments as large positive ones.Ingo Schwarze
Instead, use the same logic as for man(7).
2015-02-17Render \(lq and \(rq as '"' in -Tascii mode but leave the renderingIngo Schwarze
of .Do/.Dc, .Dq, .Lb, and .St untouched. Reduces groff-mandoc differences in base by about 7%. Reminded of the issue by naddy@.
2015-02-12Delete the mdoc_node.pending pointer and the function calculatingIngo Schwarze
it, make_pending(), which was the most difficult function of the whole mdoc(7) parser. After almost five years of maintaining this hellhole, i just noticed the pointer isn't needed after all. Blocks are always rewound in the reverse order they were opened; that even holds for broken blocks. Consequently, it is sufficient to just mark broken blogs with the flag MDOC_BROKEN and breaking blocks with the flag MDOC_ENDED. When rewinding, instead of iterating the pending pointers, just iterate from each broken block to its parents, rewinding all that are MDOC_ENDED and stopping after processing the first ancestor that it not MDOC_BROKEN. For ENDBODY markers, use the mdoc_node.body pointer in place of the former mdoc_node.pending. This also fixes an assertion failure found by jsg@ with afl, test case #467 (Bo Bl It Bd Bc It), where (surprise surprise) the pending pointer got corrupted. Improved functionality, minus one function, minus one struct field, minus 50 lines of code.
2015-02-11do not access a NULL pointer if an .Eo block lacks a tail;Ingo Schwarze
found by jsg@ with afl, test case #16
2015-02-05fix handling of empty .An macrosIngo Schwarze
2015-02-05Simplify by deleting the "lastline" member of struct mdoc_node.Ingo Schwarze
Minus one struct member, minus 17 lines of code, no functional change.
2015-02-01fix .Eo/.Ec spacingIngo Schwarze
2015-01-31Use relative offsets instead of absolute pointers for the terminalIngo Schwarze
font stack. The latter fail after the stack is grown with realloc(). Fixing an assertion failure found by jsg@ with afl some time ago (test case number 51).
2015-01-30Have pity on the poor stack.Ingo Schwarze
Replace tail recursion by iteration when walking the syntax trees. No functional change.
2015-01-23Let .Aq/.Ao/.Ac print "<>" instead of the normal "\(la\(ra"Ingo Schwarze
when the only child is .Mt, not when the preceding node is .An, to improve robustness. Triggered by a question from Svyatoslav Mishyn <juef at openmailbox dot org> (Crux Linux).
2014-12-24Support negative indentations for mdoc(7) displays and lists.Ingo Schwarze
Not exactly recommended for use, rather for groff compatibility. While here, introduce similar SHRT_MAX limits as in man(7), fixing a few cases of infinite output found by jsg@ with afl.
2014-12-23support negative horizontal widths in man(7);Ingo Schwarze
minus twenty lines of code in spite of enhanced functionality
2014-12-23some scaling unit fixes:Ingo Schwarze
- .sp with an invalid argument is .sp 1v, not .sp 0v - in man(1), trailing garbage doesn't make scaling units invalid
2014-12-02Fix the implementation and documentation of \c (continue text input line).Ingo Schwarze
In particular, make it work in no-fill mode, too. Reminded by Carsten dot Kunze at arcor dot de (Heirloom roff).
2014-11-30Multiple fixes with respect to .Pf:Ingo Schwarze
* The first argument of .Pf is not parsed. * Normal delimiter handling does not apply to the first argument of .Pf. * Warn if nothing follows a prefix (inspired by groff_mdoc(7)). * In that case, do not suppress spacing.
2014-11-28mop up and #ifdef turd deraadt@ stepped intoIngo Schwarze
2014-11-28Be more careful about meta->name. For weird input, it can be NULL.Ingo Schwarze
Fixing a NULL access jsg@ found with afl.
2014-11-27Multiple fixes with respect to .Eo:Ingo Schwarze
1. Correctly parse stray .Ec without preceding .Eo, avoiding an assertion violation found by jsg@ with afl. 2. Correctly parse .Ec arguments when breaking another block. 3. Correct spacing around closing delimiter when breaking another block. 4. Sync some related formatting control from -Tascii to -Thtml.
2014-11-27Fix the obsolete .Db (toggle debug mode) macro to ignore its argumentsIngo Schwarze
and not trigger an assertion when there is more than one argument; the latter found by jsg@ with afl.
2014-11-25Do not access a NULL pointer when a section has no body,Ingo Schwarze
which can for example happen for .Sh Xo .Sh without .Xc. Crash found by jsg@ with afl.
2014-11-21We repeatedly observed assertion crashes in the low-level terminalIngo Schwarze
output handler because the high level terminal formatters could be tricked into setting the left margin further to the right than the right margin. Today, jsg@ found more of these with afl. Change the internal interface between both levels, aiming for simplicity and robustness of the code. Treat both margins as *independent* settings: Now, termp.offset is the requested left margin, and termp.rmargin is the available space. Let the lower level cope with that case of insufficient space. Obviously, high level code that does centering or flush right still has to do careful checks, so i did a full audit of margin settings in the terminal formatters. Fixes crashes caused by excessively long title or date strings in the man(7) footer, operating system or date strings in the mdoc(7) footer, volume strings in the man(7) or mdoc(7) header, and a few cases related to some non-prologue macros.
2014-11-19Let .Ao and .Aq render as "<>" after .An and as "\(la\(ra" elsewhere,Ingo Schwarze
just like groff; minibug noticed by bentley@.
2014-11-17Multiple fixes with respect to in-line macros:Ingo Schwarze
* .No selects the default font; relevant e.g. in .Bf blocks * no need to force empty .Li elements * closing delimiters as leading macro arguments do not suppress space * opening delimiters at the end of a macro line do not suppress space * correctly handle delimiter spacing in -Tman As a side effect, these fixes let mandoc warn about empty .No macros as requested by bentley@.
2014-11-10add required vertical spacing before lists that beginIngo Schwarze
at the beginning of the first item of an enclosing list right at the beginning of a new section or subsection; minibug reported by Steffen Nurpmeso <sdaoden at yandex dot com>
2014-10-30Major bugsquashing with respect to -offset and -width:Ingo Schwarze
1. Support specifying the .Bd and .Bl -offset as a macro default width; while here, simplify the code handling the same for .Bl -width. 2. Correct handling of .Bl -offset arguments: unlike .Bd -offset, the arguments "left", "indent", and "indent-two" have no special meaning. 3. Fix the scaling of string length -offset and -width arguments in -Thtml. Triggered by an incomplete documentation patch from bentley@.
2014-10-28Make the character table available to libroff so it can check theIngo Schwarze
validity of character escape names and warn about unknown ones. This requires mchars_spec2cp() to report unknown names again. Fortunately, that doesn't require changing the calling code because according to groff, invalid character escapes should not produce output anyway, and now that we warn about them, that's fine.
2014-10-20correct the spacing after in-line equationsIngo Schwarze
that start at the beginning of an input line but end before the end of an input line
2014-10-20correct spacing *after* inline equations (much simpler than expected)Ingo Schwarze
2014-10-20correct spacing before inline equationsIngo Schwarze
2014-10-13Properly scale string length measurements for PostScript and PDF output;Ingo Schwarze
this doesn't change anything for ASCII and UTF-8. Problem reported by bentley@.
2014-09-17simplify handling of .An -[no]split for terminal output:Ingo Schwarze
delete one static function, one flag #define, and 25 lines of code; no functional change