source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* 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).