* texi2mdoc: Protect against macros being inadvertently invoked on a macro
@ 2015-03-07 11:53 kristaps
0 siblings, 0 replies; only message in thread
From: kristaps @ 2015-03-07 11:53 UTC (permalink / raw)
To: source
Log Message:
-----------
Protect against macros being inadvertently invoked on a macro line. For
this I use the table of macros from mdocml's mdoc.c and simply scan the
list in the proper circumstances.
Modified Files:
--------------
texi2mdoc:
util.c
Revision Data
-------------
Index: util.c
===================================================================
RCS file: /home/cvs/mdocml/texi2mdoc/util.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -Lutil.c -Lutil.c -u -p -r1.28 -r1.29
--- util.c
+++ util.c
@@ -31,6 +31,44 @@
#include "extern.h"
/*
+ * Table of macros.
+ * These ABSOLUTELY MUST BE 2 or three characters long.
+ */
+static const char *const mdocs[] = {
+ "Ap", "Dd", "Dt", "Os",
+ "Sh", "Ss", "Pp", "D1",
+ "Dl", "Bd", "Ed", "Bl",
+ "El", "It", "Ad", "An",
+ "Ar", "Cd", "Cm", "Dv",
+ "Er", "Ev", "Ex", "Fa",
+ "Fd", "Fl", "Fn", "Ft",
+ "Ic", "In", "Li", "Nd",
+ "Nm", "Op", "Ot", "Pa",
+ "Rv", "St", "Va", "Vt",
+ "Xr", "%A", "%B", "%D",
+ "%I", "%J", "%N", "%O",
+ "%P", "%R", "%T", "%V",
+ "Ac", "Ao", "Aq", "At",
+ "Bc", "Bf", "Bo", "Bq",
+ "Bsx", "Bx", "Db", "Dc",
+ "Do", "Dq", "Ec", "Ef",
+ "Em", "Eo", "Fx", "Ms",
+ "No", "Ns", "Nx", "Ox",
+ "Pc", "Pf", "Po", "Pq",
+ "Qc", "Ql", "Qo", "Qq",
+ "Re", "Rs", "Sc", "So",
+ "Sq", "Sm", "Sx", "Sy",
+ "Tn", "Ux", "Xc", "Xo",
+ "Fo", "Fc", "Oo", "Oc",
+ "Bk", "Ek", "Bt", "Hf",
+ "Fr", "Ud", "Lb", "Lp",
+ "Lk", "Mt", "Brq", "Bro",
+ "Brc", "%C", "Es", "En",
+ "Dx", "%Q", "br", "sp",
+ "%U", "Ta", "ll", NULL,
+ };
+
+/*
* Unmap the top-most file in the stack of files currently opened (that
* is, nested calls to parsefile()).
*/
@@ -561,6 +599,8 @@ texiexecmacro(struct texi *p, struct tex
static void
parseword(struct texi *p, size_t *pos, char extra)
{
+ size_t i, end, len;
+ int c;
/*
* If a prior word had a terminating double-newline, then begin
@@ -587,6 +627,46 @@ parseword(struct texi *p, size_t *pos, c
texiputchar(p, ' ');
p->seenws = 0;
+
+ /*
+ * If we're in a macro line, we might want to print text that
+ * happens to be the same as an mdoc(7) macro.
+ * Obviously, we need to escape these words.
+ */
+ if (p->outmacro) {
+ end = *pos;
+ /* Read ahead to get the word length. */
+ while (end < BUFSZ(p) && ! ismspace(BUF(p)[end])) {
+ switch ((c = BUF(p)[end])) {
+ case ('@'):
+ case ('}'):
+ case ('{'):
+ break;
+ default:
+ if ('\0' != extra && extra == c)
+ break;
+ end++;
+ continue;
+ }
+ break;
+ }
+ len = end - *pos;
+ /* See if we have a match. */
+ for (i = 0; NULL != mdocs[i]; i++) {
+ /* All macros are 2 or three letters. */
+ if (len < 2 || len > 3)
+ continue;
+ /* Check the macro word length. */
+ if ('\0' == mdocs[i][2] && 2 != len)
+ continue;
+ else if ('\0' == mdocs[i][3] && 3 != len)
+ continue;
+ if (strncmp(mdocs[i], &BUF(p)[*pos], len))
+ continue;
+ texiputchars(p, "\\&");
+ break;
+ }
+ }
while (*pos < BUFSZ(p) && ! ismspace(BUF(p)[*pos])) {
switch (BUF(p)[*pos]) {
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2015-03-07 11:53 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-07 11:53 texi2mdoc: Protect against macros being inadvertently invoked on a macro kristaps
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).