summaryrefslogtreecommitdiffstats
path: root/eqn.c
Commit message (Collapse)AuthorAgeFilesLines
* To prevent infinite recursion while expanding eqn(7) definitions,Ingo Schwarze2022-04-131-11/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | we must not reset the recursion counter when moving beyond the end of the *previous* expansion, but we may only do so when moving beyond the rightmost position reached by *any* expansion in the current equation. This matters because definitions can nest; consider: .EQ define inner "content" define outer "inner outer" outer .EN This endless loop was found by tb@ using afl(1). Incidentally, GNU eqn(1) also performs an infinite loop in this situation and then crashes when memory runs out, but that's not an excuse for nasty behaviour of mandoc(1). While here, consistently print the expanded content even when the expansion is finally truncated. While that is not likely to help end-users, it may help authors of eqn(7) code to understand what's going on. Besides, it sends a very clear signal that something is amiss, which was easy to miss in the past unless people enabled -W error or used -T lint.
* Skip whitespace before tokens, too.Ingo Schwarze2020-01-081-2/+10
| | | | Bug found by bentley@ with input like "delim $$ delim off".
* Cleanup, no functional change:Ingo Schwarze2018-12-141-2/+1
| | | | | | | | | | Now that message handling is properly encapsulated, remove struct mparse pointers from four structs (roff, roff_man, tbl_node, eqn_node) and from the argument lists of five functions (roff_alloc, roff_man_alloc, mandoc_getarg, tbl_alloc, eqn_alloc). Except for being passed to the main program as an opaque object, it now only occurs in read.c, as it should, and not across 15 files like in the past.
* Almost mechanical diff to remove the "struct mparse *" argumentIngo Schwarze2018-12-141-29/+29
| | | | | | | | from mandoc_msg(), where it is no longer used. While here, rename mandoc_vmsg() to mandoc_msg() and retire the old version: There is really no point in having another function merely to save "%s" in a few places. Minus 140 lines of code.
* Cleanup, no functional change:Ingo Schwarze2018-12-131-3/+13
| | | | | | No need to expose the eqn(7) syntax tree data structures everywhere. Move them to their own include file, "eqn.h". While here, delete the unused enum eqn_pilet.
* Cleanup, no functional change:Ingo Schwarze2018-12-131-2/+13
| | | | | | | | In libroff.h, nothing was left except the eqn(7) parser interface, which isn't really part of the roff(7) parser, so rename it to eqn_parse.h. While here, move struct eqn_def to eqn.c because that's the only file using it, and let eqn_box_free() and eqn_free() handle NULL.
* 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.
* print the right character for mathematical overbar; from bentley@Ingo Schwarze2017-07-151-1/+1
|
* always give commas their own <mo> element,Ingo Schwarze2017-07-141-1/+1
| | | | suggested by bentley@, improves e.g. glMultMatrix(3)
* 1. Eliminate struct eqn, instead use the existing membersIngo Schwarze2017-07-081-102/+54
| | | | | | of struct roff_node which is allocated for each equation anyway. 2. Do not keep a list of equation parsers, one parser is enough. Minus fifty lines of code, no functional change.
* simplify the eqn_box_makebinary() function by removing the trivial posIngo Schwarze2017-07-071-12/+10
| | | | parameter; also minus two lines of code; no functional change
* Fix operator precedence according to Brian W. Kernighan and LorindaIngo Schwarze2017-07-061-10/+19
| | | | | L. Cherry, "Typesetting Mathematics - User's Guide (Second Edition)", August 15, 1978, paragraph 23; swarm of bugs pointed out by bentley@.
* The EQN_LISTONE box type is pointless.Ingo Schwarze2017-07-051-7/+10
| | | | | | Simplify by just using EQN_LIST with expectargs = 1. Noticed while investigating a bug report from bentley@. No functional change.
* Skip whitespace at the beginning of eqn(7) nodes,Ingo Schwarze2017-06-291-1/+1
| | | | | | in particular ~ and ^ that misrendered; found by bentley@ in glCopyTexSubImage1D(3); also affected glAccum(3), glClipPlane(3), glDrawPixels(3), glEvalMesh(3), and others.
* Complete rewrite of the lexer in a single function with four operationIngo Schwarze2017-06-261-240/+160
| | | | | | | | | | | | | | | | | | | | modes instead of four functions, resulting in considerable simplification, fifty lines less of code, fifteen fewer automatic variables, and several bug fixes, for example: 1. The delim control statement consumes exactly two bytes of input, requires no whitespace after these two bytes, and does not treat quotes in any special way. 2. If the argument of left, right, gfont, gsize, or size is defined as an alias, only the first word of the value is used as the delimiter, font name, or font size. 3. If a back, fwd, down, or up keyword is followed by another keyword instead of the required number, GNU eqn does nothing useful, but typically errors out. So no need to have special handling (with an ugly goto!) for it in mandoc. Also getting rid of one pointless static buffer and twelve redundant calls to strlcpy(3).
* when splitting a composite word,Ingo Schwarze2017-06-261-7/+10
| | | | do not forget to close the inserted list box
* splitting a text box sometimes requires wrapping it in a listIngo Schwarze2017-06-231-1/+19
|
* Simplify font handling:Ingo Schwarze2017-06-231-36/+40
| | | | | | | | | | | | | | | 1. Inherit the font attribute from the parent box, such that iteration is no longer required to find the current font. 2. For well-known function name tokens, do not insert an EQN_LISTONE box into the AST; simply set the font attribute of the text box itself that contains the name. Also improve word splitting of unquoted strings in default font mode: 3. Split between numbers and punctuation because both will soon get different HTML markup. 4. Do not split between letters. With the newly ubiquitious font attributes, all formatters will be able to figure out what to do without putting each letter into a separate box.
* Fix font selection for text boxes in the terminal formatter.Ingo Schwarze2017-06-221-8/+22
| | | | | | | | Issue reported by bentley@. The AST data structure is powerful enough that all required information can easily be provided in the parser, and no change of the formatting code is needed.
* Outside explicit font context, give every letter its own box.Ingo Schwarze2017-06-211-14/+45
| | | | | The formatters need this to correctly select fonts. Missing feature reported by bentley@.
* quoted words are not parsed for defined keysIngo Schwarze2017-06-211-11/+10
|
* Recognize well-known functions names (the same that Heirloom recognizes,Ingo Schwarze2017-06-211-16/+37
| | | | | | which includes those recognized by groff) and wrap them in a roman box unless they already are in roman context. Missing feature reported by bentley@.
* KNF: remove parentheses from switch case labels; no binary changeIngo Schwarze2017-06-201-70/+70
|
* Improve detection of recursive eqn(7) "define" statements:Ingo Schwarze2017-03-111-2/+7
| | | | | | Do not only catch "define key 'key other stuff'", but also "define key 'other stuff key'". Fixing infinite loop found by tb@ with afl(1).
* The root of an .EQ tree is always EQN_ROOT, never EQN_LIST,Ingo Schwarze2016-01-081-1/+1
| | | | | | so delete a redundant NULL check that confused Coverity in CID 1257471; issue reported by wiz@, patch differs from what christos@ did in NetBSD. No functional change.
* Recursive "define" was not detected because "lim" was neverIngo Schwarze2016-01-071-0/+1
| | | | | incremented, causing infinite loops. Fixing CID 1288962. From christos@ via wiz@, both at NetBSD.
* modernize style: "return" is not a functionIngo Schwarze2015-10-061-20/+20
|
* in eqn, "prime" is equivalent to \(fm, and - is equivalent to \(mi;Ingo Schwarze2015-03-041-1/+3
| | | | patch from bentley@
* Clean up eqn(7) error handling:Ingo Schwarze2015-01-281-51/+72
| | | | | | | | * When "define" fails, do not drop the whole equation. * Free memory after "undef". * Use standard mandoc error types instead of rolling our own. * Delete obfuscating EQN_MSG() macro. * Add function prototypes while here.
* Fix a NULL pointer dereference reportedIngo Schwarze2014-10-251-1/+3
| | | | | by Theo Buehler <theo at math dot ethz dot ch> on tech at openbsd: Do not attempt to parse empty equations.
* Report arguments to .EQ as an error, and simplify the code:Ingo Schwarze2014-10-251-16/+1
| | | | | | | * drop trivial wrapper function roff_openeqn() * drop unused first arg of function eqn_alloc() * drop usused member "name" of struct eqn_node While here, sync to OpenBSD by killing some trailing blanks.
* Implement in-line equations, much needed by Xenocara manuals.Ingo Schwarze2014-10-161-0/+26
| | | | | | | | Put the steering into the roff parser rather than into the mdoc parser such that it works for all macro languages and on both text and macro lines. Line breaks and blank characters generated before and after in-line equations are not perfect yet, but let's do one thing at a time.
* bugfix: do not parse quoted strings for tokens; fixes glFrustum(3)Ingo Schwarze2014-10-121-0/+10
|
* Improve error handling in the eqn(7) parser.Ingo Schwarze2014-10-121-101/+83
| | | | | | | | | | | | | | | | | | | Get rid of the first fatal error, MANDOCERR_EQNSYNT. In eqn(7), there is no need to be bug-compatible with groff, so there is no need to abondon the whole equation in case of a syntax error. In particular: * Skip "back", "delim", "down", "fwd", "gfont", "gsize", "left", "right", "size", and "up" without arguments. * Skip "gsize" and "size" with a non-numeric argument. * Skip closing delimiters that are not open. * Skip "above" outside piles. * For diacritic marks and binary operators without a left operand, default to an empty box. * Let piles and matrices take one argument rather than insisting on a braced list. Let HTML output handle that, too. * When rewinding, if the root box is guaranteed to match the termination condition, no error handling is needed.
* Drop trailing whitespace, adjust a few indentations,Ingo Schwarze2014-10-101-21/+20
| | | | and update Copyright year while here; no code change.
* No need to assert() that a pointer is non-null right before dereferencing it.Ingo Schwarze2014-10-101-3/+0
| | | | The assert message contains no more information than the segfault.
* Ignore "delim" command.Kristaps Dzonsons2014-10-101-0/+1
| | | | This fixes run-time assertions regarding "tok".
* Re-write of eqn(7) parser and MathML output.Kristaps Dzonsons2014-10-101-611/+740
| | | | | | | | | | This adds parser-level support for the grammar described by the eqn second-edition technical paper, "Typesetting Mathematics — User's Guide" (Kernighan, Cherry). The reason for this re-write is the grouping rules, which were not possible given the existing implementation. The re-write has also considerably simplified the HTML (and, if it ever is completed, terminal) front-end.
* Parse from/to clauses in eqn.Kristaps Dzonsons2014-09-281-1/+6
|
* Add support for EQNPOS_SUBSUP and a doubly-linked eqn_box list.Kristaps Dzonsons2014-09-281-5/+23
|
* 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.
* Clean up messages related to plain text and to escape sequences.Ingo Schwarze2014-07-061-1/+1
| | | | | * Mention invalid escape sequences and string names, and fallbacks. * Hierarchical naming.
* Clean up messages regarding excess arguments:Ingo Schwarze2014-07-041-1/+2
| | | | | | * Downgrade ".Bf -emphasis Em" from FATAL to WARNING. * Mention the macros, the arguments, and the fallbacks. * Hierarchical naming.
* Audit malloc(3)/calloc(3)/realloc(3) usage.Ingo Schwarze2014-04-231-2/+2
| | | | | | | * Change eight reallocs to reallocarray to be safe from overflows. * Change one malloc to reallocarray to be safe from overflows. * Change one calloc to reallocarray, no zeroing needed. * Change the order of arguments of three callocs (aesthetical).
* make sure static buffers for snprintf(3) are large enoughIngo Schwarze2014-04-201-1/+1
| | | | and cast snprintf return value to (void) where they are
* KNF: case (FOO): -> case FOO:, remove /* LINTED */ and /* ARGSUSED */,Ingo Schwarze2014-04-201-33/+30
| | | | | remove trailing whitespace and blanks before tabs, improve some indenting; no functional change
* The files mandoc.c and mandoc.h contained both specialised low-levelIngo Schwarze2014-03-231-0/+1
| | | | | | | functions used for multiple languages (mdoc, man, roff), for example mandoc_escape(), mandoc_getarg(), mandoc_eos(), and generic auxiliary functions. Split the auxiliaries out into their own file and header. While here, do some #include cleanup.
* Implement the first steps of equation parsing from within libmdoc.Kristaps Dzonsons2011-07-251-4/+7
| | | | | | This consists of a shim around the text parser that calls out to libroff if equation components exist on the line. Right now this will do nothing, as the equation delimiter always returns nil.
* Note GNU extensions in eqn.7. Also add `col' and `pile', which areKristaps Dzonsons2011-07-231-0/+2
| | | | | mentioned briefly in the eqn User's Manual, but otherwise are unspecified.
* Add support for tdefine and ndefine. Consolidate some error messages. AddKristaps Dzonsons2011-07-231-23/+54
| | | | somem more version notes (getting there). Have the equation nanme be captured.