source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* texi2mdoc: Have @math and @verb correctly escape arguments, add
@ 2015-02-23 14:36 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2015-02-23 14:36 UTC (permalink / raw)
  To: source

Log Message:
-----------
Have @math and @verb correctly escape arguments, add @cartouche, fix 
accent marks.

Modified Files:
--------------
    texi2mdoc:
        extern.h
        main.c
        util.c

Revision Data
-------------
Index: extern.h
===================================================================
RCS file: /home/cvs/mdocml/texi2mdoc/extern.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -Lextern.h -Lextern.h -u -p -r1.8 -r1.9
--- extern.h
+++ extern.h
@@ -39,6 +39,8 @@ enum	texicmd {
 	TEXICMD_BANG,
 	TEXICMD_BULLET,
 	TEXICMD_BYE,
+	TEXICMD_CARTOUCHE,
+	TEXICMD_CEDILLA,
 	TEXICMD_CENTER,
 	TEXICMD_CHAPTER,
 	TEXICMD_CINDEX,
@@ -66,6 +68,8 @@ enum	texicmd {
 	TEXICMD_DEFTYPEFNX,
 	TEXICMD_DEFTYPEFUN,
 	TEXICMD_DEFTYPEFUNX,
+	TEXICMD_DEFTYPEMETHOD,
+	TEXICMD_DEFTYPEMETHODX,
 	TEXICMD_DEFTYPEVAR,
 	TEXICMD_DEFTYPEVARX,
 	TEXICMD_DEFTYPEVR,
@@ -86,6 +90,7 @@ enum	texicmd {
 	TEXICMD_EMAIL,
 	TEXICMD_EMPH,
 	TEXICMD_END,
+	TEXICMD_ENDDOTS,
 	TEXICMD_ENUMERATE,
 	TEXICMD_ENV,
 	TEXICMD_EQUIV,
@@ -125,7 +130,7 @@ enum	texicmd {
 	TEXICMD_IMAGE,
 	TEXICMD_INCLUDE,
 	TEXICMD_INDENTBLOCK,
-	TEXICMD_USER_INDEX,
+	TEXICMD_INFOREF,
 	TEXICMD_INSERTCOPYING,
 	TEXICMD_ITEM,
 	TEXICMD_ITEMIZE,
@@ -168,6 +173,7 @@ enum	texicmd {
 	TEXICMD_SETTITLE,
 	TEXICMD_SHORTCONTENTS,
 	TEXICMD_SLANTED,
+	TEXICMD_SLASH,
 	TEXICMD_SP,
 	TEXICMD_SPACE,
 	TEXICMD_SMALLBOOK,
@@ -205,6 +211,7 @@ enum	texicmd {
 	TEXICMD_UNNUMBEREDSUBSUBSEC,
 	TEXICMD_UREF,
 	TEXICMD_URL,
+	TEXICMD_USER_INDEX,
 	TEXICMD_VALUE,
 	TEXICMD_VAR,
 	TEXICMD_VERB,
@@ -336,6 +343,7 @@ void	teximacro(struct texi *, const char
 void	teximacroclose(struct texi *);
 void	teximacroopen(struct texi *, const char *);
 void 	texipunctuate(struct texi *, const char *, size_t, size_t *);
+void	texiputbuf(struct texi *p, const char *, size_t, size_t);
 void	texiputchar(struct texi *p, char);
 void	texiputchars(struct texi *, const char *);
 void	texivspace(struct texi *);
Index: util.c
===================================================================
RCS file: /home/cvs/mdocml/texi2mdoc/util.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -Lutil.c -Lutil.c -u -p -r1.8 -r1.9
--- util.c
+++ util.c
@@ -193,6 +193,21 @@ texiputchars(struct texi *p, const char 
 }
 
 /*
+ * This puts all characters onto the output stream but makes sure to
+ * escape mdoc(7) slashes.
+ */
+void
+texiputbuf(struct texi *p, const char *buf, size_t start, size_t end)
+{
+
+	for ( ; start < end; start++) {
+		texiputchar(p, buf[start]);
+		if ('\\' == buf[start])
+			texiputchar(p, 'e');
+	}
+}
+
+/*
  * Close an mdoc(7) macro opened with teximacroopen().
  * If there are no more macros on the line, prints a newline.
  */
Index: main.c
===================================================================
RCS file: /home/cvs/mdocml/texi2mdoc/main.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -Lmain.c -Lmain.c -u -p -r1.33 -r1.34
--- main.c
+++ main.c
@@ -95,6 +95,8 @@ static	const struct texitok __texitoks[T
 	{ dosymbol, "!", 1 }, /* TEXICMD_BANG */
 	{ dosymbol, "bullet", 6 }, /* TEXICMD_BULLET */
 	{ dobye, "bye", 3 }, /* TEXICMD_BYE */
+	{ doblock, "cartouche", 9 }, /* TEXICMD_CARTOUCHE */
+	{ doaccent, ",", 1 }, /* TEXICMD_CEDILLA */
 	{ doignline, "center", 6 }, /* TEXICMD_CENTER */
 	{ dosection, "chapter", 7 }, /* TEXICMD_CHAPTER */
 	{ doignline, "cindex", 6 }, /* TEXICMD_CINDEX */
@@ -122,6 +124,8 @@ static	const struct texitok __texitoks[T
 	{ dodefn, "deftypefnx", 10 }, /* TEXICMD_DEFTYPEFNX */
 	{ dodefn, "deftypefun", 10 }, /* TEXICMD_DEFTYPEFUN */
 	{ dodefn, "deftypefunx", 11 }, /* TEXICMD_DEFTYPEFUNX */
+	{ dodefn, "deftypemethod", 13 }, /* TEXICMD_DEFTYPEMETHOD */
+	{ dodefn, "deftypemethodx", 14 }, /* TEXICMD_DEFTYPEMETHODX */
 	{ dodefn, "deftypevar", 10 }, /* TEXICMD_DEFTYPEVAR */
 	{ dodefn, "deftypevarx", 11 }, /* TEXICMD_DEFTYPEVARX */
 	{ dodefn, "deftypevr", 9 }, /* TEXICMD_DEFTYPEVR */
@@ -142,6 +146,7 @@ static	const struct texitok __texitoks[T
 	{ dolink, "email", 5 }, /* TEXICMD_EMAIL */
 	{ doinline, "emph", 4 }, /* TEXICMD_EMPH */
 	{ NULL, "end", 3 }, /* TEXICMD_END */
+	{ dosymbol, "enddots", 7 }, /* TEXICMD_ENDDOTS */
 	{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */
 	{ doinline, "env", 3 }, /* TEXICMD_ENV */
 	{ dosymbol, "equiv", 5 }, /* TEXICMD_EQUIV */
@@ -181,7 +186,7 @@ static	const struct texitok __texitoks[T
 	{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */
 	{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */
 	{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */
-	{ doignline, "", 0 }, /* TEXICMD_USER_INDEX */
+	{ dolink, "inforef", 7 }, /* TEXICMD_INDENTBLOCK */
 	{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */
 	{ doitem, "item", 4 }, /* TEXICMD_ITEM */
 	{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */
@@ -224,6 +229,7 @@ static	const struct texitok __texitoks[T
 	{ dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */
 	{ doignline, "shortcontents", 13 }, /* TEXICMD_SHORTCONTENTS */
 	{ doinline, "slanted", 7 }, /* TEXICMD_SLANTED */
+	{ dosymbol, "/", 1 }, /* TEXICMD_SLASH */
 	{ dosp, "sp", 2 }, /* TEXICMD_SP */
 	{ dosymbol, " ", 1 }, /* TEXICMD_SPACE */
 	{ doignline, "smallbook", 9 }, /* TEXICMD_SMALLBOOK */
@@ -261,6 +267,7 @@ static	const struct texitok __texitoks[T
 	{ dosubsubsection, "unnumberedsubsubsec", 19 }, /* TEXICMD_UNNUMBEREDSUBSUBSEC */
 	{ dolink, "uref", 4 }, /* TEXICMD_UREF */
 	{ dolink, "url", 3 }, /* TEXICMD_URL */
+	{ doignline, "", 0 }, /* TEXICMD_USER_INDEX */
 	{ dovalue, "value", 5 }, /* TEXICMD_VALUE */
 	{ doinline, "var", 3 }, /* TEXICMD_VAR */
 	{ doverb, "verb", 4 }, /* TEXICMD_VERB */
@@ -319,6 +326,7 @@ dodefn(struct texi *p, enum texicmd cmd,
 	case (TEXICMD_DEFTP):
 	case (TEXICMD_DEFTYPEFN):
 	case (TEXICMD_DEFTYPEFUN):
+	case (TEXICMD_DEFTYPEMETHOD):
 	case (TEXICMD_DEFTYPEVAR):
 	case (TEXICMD_DEFTYPEVR):
 	case (TEXICMD_DEFUN):
@@ -341,6 +349,10 @@ dodefn(struct texi *p, enum texicmd cmd,
 		texivspace(p);
 
 	switch (cmd) {
+	case (TEXICMD_DEFTYPEMETHOD):
+	case (TEXICMD_DEFTYPEMETHODX):
+		texiputchars(p, "Method");
+		break;
 	case (TEXICMD_DEFMAC):
 	case (TEXICMD_DEFMACX):
 		texiputchars(p, "Macro");
@@ -389,6 +401,8 @@ dodefn(struct texi *p, enum texicmd cmd,
 	case (TEXICMD_DEFTYPEFUNX):
 	case (TEXICMD_DEFTYPEFN):
 	case (TEXICMD_DEFTYPEFNX):
+	case (TEXICMD_DEFTYPEMETHOD):
+	case (TEXICMD_DEFTYPEMETHODX):
 		teximacroopen(p, "Ft");
 		parselinearg(p, buf, sz, pos);
 		teximacroclose(p);
@@ -591,6 +605,7 @@ doverb(struct texi *p, enum texicmd cmd,
 	const char *buf, size_t sz, size_t *pos)
 {
 	char	 delim;
+	size_t	 start;
 
 	while (*pos < sz && isws(buf[*pos]))
 		advance(p, buf, pos);
@@ -606,15 +621,17 @@ doverb(struct texi *p, enum texicmd cmd,
 	if (p->seenws && p->outcol && 0 == p->literal)
 		texiputchar(p, ' ');
 	p->seenws = 0;
+	start = *pos;
 	/* Read until we see the delimiter then end-brace. */
 	while (*pos < sz - 1) {
 		if (buf[*pos] == delim && buf[*pos + 1] == '}') 
 			break;
-		texiputchar(p, buf[*pos]);
 		advance(p, buf, pos);
 	}
 	if (*pos == sz - 1)
 		return;
+	texiputbuf(p, buf, start, *pos);
+
 	/* Make sure we read after the end-brace. */
 	assert(delim == buf[*pos]);
 	advance(p, buf, pos);
@@ -867,8 +884,28 @@ doaccent(struct texi *p, enum texicmd cm
 
 	if (*pos == sz)
 		return;
-	advance(p, buf, pos);
+	if (p->seenws && p->outcol && 0 == p->literal)
+		texiputchar(p, ' ');
+	p->seenws = 0;
 	switch (cmd) {
+	case (TEXICMD_CEDILLA):
+		/* Strange rules... */
+		while (*pos < sz && isws(buf[*pos]))
+			advance(p, buf, pos);
+		if (*pos == sz || '{' != buf[*pos])
+			return;
+		advance(p, buf, pos);
+		switch (buf[*pos]) {
+		case ('c'): case ('C'):
+			texiputchars(p, "\\(,");
+			texiputchar(p, buf[*pos]);
+			break;
+		default:
+			texiputchar(p, buf[*pos]);
+			break;
+		}
+		advance(p, buf, pos);
+		break;
 	case (TEXICMD_ACUTE):
 		switch (buf[*pos]) {
 		case ('a'): case ('A'):
@@ -895,6 +932,7 @@ doaccent(struct texi *p, enum texicmd cm
 			break;
 		default:
 			texiputchar(p, buf[*pos]);
+			break;
 		}
 		break;
 	case (TEXICMD_GRAVE):
@@ -921,6 +959,7 @@ doaccent(struct texi *p, enum texicmd cm
 			break;
 		default:
 			texiputchar(p, buf[*pos]);
+			break;
 		}
 		break;
 	case (TEXICMD_UMLAUT):
@@ -936,11 +975,13 @@ doaccent(struct texi *p, enum texicmd cm
 			break;
 		default:
 			texiputchar(p, buf[*pos]);
+			break;
 		}
 		break;
 	default:
 		abort();
 	}
+	advance(p, buf, pos);
 }
 
 static void
@@ -973,6 +1014,7 @@ dosymbol(struct texi *p, enum texicmd cm
 		texiputchars(p, "\\(co");
 		break;
 	case (TEXICMD_DOTS):
+	case (TEXICMD_ENDDOTS):
 		texiputchars(p, "...");
 		break;
 	case (TEXICMD_EQUIV):
@@ -999,6 +1041,9 @@ dosymbol(struct texi *p, enum texicmd cm
 	case (TEXICMD_RESULT):
 		texiputchars(p, "\\(rA");
 		break;
+	case (TEXICMD_SLASH):
+		texiputchar(p, '/');
+		break;
 	case (TEXICMD_SQUIGGLE_LEFT):
 		texiputchars(p, "{");
 		break;
@@ -1033,7 +1078,7 @@ static void
 domath(struct texi *p, enum texicmd cmd, 
 	const char *buf, size_t sz, size_t *pos)
 {
-	size_t	 nest;
+	size_t	 nest, start;
 
 	/*
 	 * Math handling is different from everything else.
@@ -1049,18 +1094,18 @@ domath(struct texi *p, enum texicmd cmd,
 	if (p->seenws && p->outcol && 0 == p->literal)
 		texiputchar(p, ' ');
 	p->seenws = 0;
-	for (nest = 1; *pos < sz && nest > 0; ) {
+	for (nest = 1, start = *pos; *pos < sz && nest > 0; ) {
 		if ('{' == buf[*pos])
 			nest++;
 		else if ('}' == buf[*pos])
 			if (0 == --nest)
 				continue;
-		texiputchar(p, buf[*pos]);
 		advance(p, buf, pos);
 	}
 	if (*pos == sz)
 		return;
 	assert('}' == buf[*pos]);
+	texiputbuf(p, buf, start, *pos);
 	advance(p, buf, pos);
 }
 
@@ -1156,6 +1201,10 @@ dolink(struct texi *p, enum texicmd cmd,
 		texiputchars(p, "see Section");
 		teximacroopen(p, "Qq");
 		break;
+	case (TEXICMD_INFOREF):
+		texiputchars(p, "See Info file node");
+		teximacroopen(p, "Qq");
+		break;
 	default:
 		abort();
 	}
@@ -1233,11 +1282,13 @@ dosubsection(struct texi *p, enum texicm
 		texierr(p, "\"%s\" in a literal scope!?", sects[sec]);
 
 	/* We don't have a subsubsection, so make one up. */
-	texivspace(p);
+	if (sec > 1)
+		texivspace(p);
 	teximacroopen(p, sects[sec]);
 	parseeoln(p, buf, sz, pos);
 	teximacroclose(p);
-	texivspace(p);
+	if (sec > 1)
+		texivspace(p);
 }
 
 static void
--
 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-02-23 14:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-23 14:36 texi2mdoc: Have @math and @verb correctly escape arguments, add 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).