summaryrefslogtreecommitdiffstats
path: root/tbl_term.c
Commit message (Collapse)AuthorAgeFilesLines
* When calculating the with of spanned columns, which for example mattersIngo Schwarze2022-04-081-2/+5
| | | | | | | | for centering text spanning multiple tbl(7) columns, correctly account for the spacing between columns instead of wrongly assuming the default spacing of 3n. Patch from Simon Branch <simonmbranch at gmail dot com>.
* Support two-character font names (BI, CW, CR, CB, CI)Ingo Schwarze2021-08-101-5/+19
| | | | | | | | | | | | | | | | | | | | | | | | in the tbl(7) layout font modifier. Get rid of the TBL_CELL_BOLD and TBL_CELL_ITALIC flags and use the usual ESCAPE_FONT* enum mandoc_esc members from mandoc.h instead, which simplifies and unifies some code. While here, also support CB and CI in roff(7) \f escape sequences and in roff(7) .ft requests for all output modes. Using those is certainly not recommended because portability is limited even with groff, but supporting them makes some existing third-party manual pages look better, in particular in HTML output mode. Bug-compatible with groff as far as i'm aware, except that i consider font names starting with the '\n' (ASCII 0x0a line feed) character so insane that i decided to not support them. Missing feature reported by nabijaczleweli dot xyz in https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=992002. I used none of the code from the initial patch submitted by nabijaczleweli, but some of their ideas. Final patch tested by them, too.
* The GNU tbl(1) program contained in the groff package internallyIngo Schwarze2020-10-251-11/+0
| | | | | | | | | | | | | | | | | | uses roff(7) tabulator settings to implement tables, and it used to leak the changed tabulator settings from tables to the subsequent roff(7) code. In mandoc/tbl_term.c rev. 1.54 (June 17, 2017), code was added to be bug-compatible with groff. In commit d0e03cf6 (Oct 20, 2020), GNU tbl(1) changed behaviour to save the tabulator settings before starting a table and restore them afterwards. Adjust mandoc for compatibility. Since mandoc implements tables without using roff(7) tabulator settings, saving and restoring tabulator settings is not needed in mandoc. Simply deleting the code that changed tabulator settings by reverting tbl_term.c rev. 1.54 is sufficient in mandoc. Also adjust the desired output of the regression tests to match the new behaviour of both groff and mandoc.
* Fix a logic error:Ingo Schwarze2020-01-111-13/+12
| | | | | | | | | | | | | When both the first and the third column are spans, do not use the number of columns of the span starting in column two for the span starting in column zero. With afl, Jan Schreiber <jes at posteo dot de> found cases where this caused NULL pointer accesses because too many layout cells were consumed. While here, make the code more similar at the three places that iterate over data cells.
* delete trailing whitespace and space-tab sequences; no code change;Ingo Schwarze2019-07-011-1/+1
| | | | | patch from Michal Nowak <mnowak at startmail dot com> who found these with git pbchk in the illumos tree
* Do not access a NULL pointer if a table contains a horizontal lineIngo Schwarze2019-06-111-4/+10
| | | | | | next to a table line having fewer columns than the table as a whole. Bug found by Stephen Gregoratto <dev at sgregoratto dot me> with aerc-config(5).
* fix a NULL pointer access on empty tbl(7) data cellsIngo Schwarze2019-03-181-2/+4
| | | | that bentley@ found in syncthing-bep(7)
* When drawing a horizontal line in tbl(7) UTF-8 output, it is notIngo Schwarze2019-03-161-12/+17
| | | | | | | | | | | | | sufficient to look at two data rows, but up to three are needed: the one above to identify vertical lines branching off upward, the row itself (in case the line is in a data row rather than a layout line) to figure out the horizontal line style, and the row below to identify vertical lines branching off downward. As an example, bentley@ reported from the mpv(1) manual page that in a tbl(7) having a vertical line in the middle and a horizontal line in the bottom data row, the vertical line extended below the bottom horizontal line.
* The horizontal line in a data cell containing only "_" or "="Ingo Schwarze2019-02-091-47/+44
| | | | | connects to the horizontally adjacent vertical line or cell; fixing a bug reported by bentley@.
* Fix tbl(7) centering in mdoc(7) documents.Ingo Schwarze2019-01-311-3/+7
| | | | | | | | | | Since resetting of offsets works quite differently in the mdoc(7) and man(7) formatters, the tbl(7) formatter needs to save the global offset on entry and restore it on exit. The additional indentation needed for table centering has to be added to its own offset variable and applied to each line of the table, rather than only to the first. Bug found by bentley@ in emulators/fceux(6).
* Cleanup, no functional change:Ingo Schwarze2018-12-121-0/+1
| | | | | No need to expose the tbl(7) syntax tree data structures everywhere. Move them to their own include file, "tbl.h", and improve comments.
* Do not draw horizontal lines through vertical spansIngo Schwarze2018-11-291-4/+18
| | | | | which are requested in the data section rather than in the layout. Mini-feature found in misc/pfm(1).
* Now that it is better understood how borders work,Ingo Schwarze2018-11-291-71/+105
| | | | | | | | | | | rewrite tbl_hrule() in a simpler way. Fix several bugs in the process. No more special flags, just use the existing TBL_OPT_* from mandoc.h. Reduce the number of tracked rows from three to two, which is more logical: one above the line and one below is sufficient to figure out crossings. No more magic quirks, all conditions are readily comprehensible now. Add comments.
* additional check needed after the previous (box drawing) patchIngo Schwarze2018-11-281-4/+7
|
* In -T utf8 output mode, render tbl(7) borders with the UnicodeIngo Schwarze2018-11-281-150/+317
| | | | | | | | | | | | | box drawing characters, U+2500 to U+257F. Originally suggested by bentley@ four years ago, reminded this summer by Pali Rohar. Binary and decimal arithmetics are boring, so let's use some ternary arithmetics for a change. That said, some other aspects are too complicated for my liking, so this could use some polishing in the future.
* In tbl(7) -T html output,Ingo Schwarze2018-11-251-17/+17
| | | | | | | | | | span cells horizontally and vertically as requested by the layout. Does not handle spans requested in the data section yet. To be able to do this, record the number of rows spanned in the first data cell (struct tbl_dat) of a vertical span. Missing feature reported by Pali dot Rohar at gmail dot com.
* Do alignment of non-numeric strings in numeric cells the same wayIngo Schwarze2018-08-191-25/+50
| | | | | | as groff, and also honour the explicit alignment indicator "\&". This required an almost complete rewrite of both the measurement function and the formatter function for numeric cells.
* do not print horizontal lines inside vertical spansIngo Schwarze2018-08-191-6/+20
|
* Do not allocate a column for decimal points if all numbers are integers.Ingo Schwarze2018-08-181-6/+4
|
* Ignore explicitly specified negative column widths rather thanIngo Schwarze2017-07-311-1/+4
| | | | | wrapping around to huge numbers and risking memory exhaustion; fixes Debian ps(1). Bug reported by Dr. Markus Waldeck.
* Correctly handle horizontal spans at the beginning of rows,Ingo Schwarze2017-07-081-8/+9
| | | | | | | | fixing an assertion failure found by jsg@ with afl(1). While here, also drop printing of whitespace in tbl_data() which makes no difference because column positioning code in term_tbl() already takes care of that.
* Implement spacing of columns as defined in the table layout;Ingo Schwarze2017-06-271-20/+27
| | | | | this is for example used by lftp(1) and, ironically, misused by our very own tbl(7) manual...
* tables leak tab settings to subsequent textIngo Schwarze2017-06-171-0/+11
|
* Multiple tbl(7) improvements:Ingo Schwarze2017-06-161-62/+175
| | | | | | | | | | | | * Do not discard data that lacks a matching layout cell but remains within the number of columns of the table as a whole. * Do not insert dummy data rows for any layout row starting with a horizontal line, but only for layout rows that would discard all the data on a matching non-empty data row. * Print horizontal lines specified in the layout even if there is no matching data cell. * Improve the logic for extending vertical lines to adjacent rows, for choosing cross marks versus line segments, and some related details.
* improve rounding rules for scaling unitsIngo Schwarze2017-06-141-1/+1
| | | | in horizontal orientation in the terminal formatter
* fix the interaction of the allbox option with spanned cells in the layoutIngo Schwarze2017-06-131-16/+31
|
* Two minor fixes for the "allbox" modifier:Ingo Schwarze2017-06-121-2/+5
| | | | | | 1. It does not reduce explicit "||" in the layout to "|". 2. It does not cause three horizontal lines at the end of a table, even if the table ends with an explicit "_" data line.
* implement the tbl(7) "allbox" option;Ingo Schwarze2017-06-121-1/+7
| | | | used for example by curs_getch(3) and GLwDrawingArea(3)
* fix column width calculation for text block cellsIngo Schwarze2017-06-121-1/+1
|
* Implement automatic line breakingIngo Schwarze2017-06-121-56/+156
| | | | | inside individual table cells that contain text blocks. This cures overlong lines in various Xenocara manuals.
* Implement w layout specifier (minimum column width).Ingo Schwarze2017-06-081-2/+8
| | | | | Improve width calculation of text blocks. Reduces the groff/mandoc diff in Base+Xenocara by about 800 lines.
* Prepare the terminal driver for filling multiple columns in parallel,Ingo Schwarze2017-06-071-6/+6
| | | | | | first step: split column data out of the terminal state struct into a new column state struct and use an array of such column state structs. No functional change.
* Implement the roff(7) .mc (right margin character) request.Ingo Schwarze2017-06-041-17/+8
| | | | | | The Tcl/Tk manual pages use this extensively. Delete the TERM_MAXMARGIN hack, it breaks .mc inside .nf; instead, implement a proper TERMP_BRNEVER flag.
* To make the code more readable, delete 283 /* FALLTHROUGH */ commentsIngo Schwarze2015-10-121-5/+0
| | | | | | 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.
* modernize style: "return" is not a functionIngo Schwarze2015-10-061-2/+2
|
* /* NOTREACHED */ after abort() is silly, delete itIngo Schwarze2015-09-261-1/+0
|
* Fix vertical spacing at the beginning of tables.Ingo Schwarze2015-03-061-3/+0
| | | | | | 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@.
* Flush the line preceding a table before clearing the right margin,Ingo Schwarze2015-03-061-2/+3
| | | | | such that that line isn't output with unlimited width. Problem reported and fix OK by kristaps@.
* Use relative offsets instead of absolute pointers for the terminalIngo Schwarze2015-01-311-2/+2
| | | | | | 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).
* Delete the redundant tbl span flags, just inspect the actual dataIngo Schwarze2015-01-301-2/+2
| | | | | | | | where needed, which is less fragile. This fixes a subtle NULL pointer access to tp->tbl.cols: Due to a bug in the man(7) parser, the first span of a table can end up in a .TP head, in which case tblcalc() was never called. Found by jsg@ with afl.
* Abolish struct tbl_head and replace it by an "int col" member inIngo Schwarze2015-01-301-20/+15
| | | | struct tbl_cell. No functional change, minus 40 lines of code.
* Auditing the tbl(7) code for more NULL pointer accesses, i came outIngo Schwarze2015-01-301-4/+2
| | | | | empty-handed; so this is just KNF and some code simplifications, no functional change.
* implement the tbl(7) "center" layout optionIngo Schwarze2015-01-281-2/+18
|
* Multiple parser and formatter fixes for line drawing in tbl(7).Ingo Schwarze2015-01-271-123/+96
| | | | | | | | | | | | * Allow mixing vertical line bars with the layout options of the preceding layout cell. * Correctly combine box options with layout lines. * Correctly print vertical lines in data rows, with the right spacing. * Correctly print cross markers and left and right ends of horizontal lines even if vertical lines differ above and below. * Avoid the bogus error message "no table data cells" when a table data section starts with a horizontal line. No increase in code size.
* Prevent unsigned integer underflow when a number is too wideIngo Schwarze2014-12-241-3/+7
| | | | | for a table cell with an "nz" layout specification, causing essentially infinite output as found by jsg@ with afl.
* even if a table has zero columns, do not segfault in the formatter;Ingo Schwarze2014-10-141-1/+1
| | | | bug reported by bentley@
* Rudimentary implementation of the e, x, and z table layout modifiersIngo Schwarze2014-10-141-1/+1
| | | | | | | to equalize, maximize, and ignore the width of columns. Does not yet take vertical rulers into account, and does not do line breaks within table cells. Considerably improves the lftp(1) manual; issue noticed by sthen@.
* implement font modifiers in table layoutsIngo Schwarze2014-10-131-2/+18
|
* Get rid of HAVE_CONFIG_H, it is always defined; idea from libnbcompat.Ingo Schwarze2014-08-101-2/+2
| | | | | | Include <sys/types.h> where needed, it does not belong in config.h. Remove <stdio.h> from config.h; if it is missing somewhere, it should be added, but i cannot find a *.c file where it is missing.
* KNF: case (FOO): -> case FOO:, remove /* LINTED */ and /* ARGSUSED */,Ingo Schwarze2014-04-201-32/+32
| | | | | remove trailing whitespace and blanks before tabs, improve some indenting; no functional change