source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Escape sequences terminate high-level macro names, and when
@ 2014-11-19  3:08 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-11-19  3:08 UTC (permalink / raw)
  To: source

Log Message:
-----------
Escape sequences terminate high-level macro names, and when doing so,
they are ignored, just in the same way as for request names 
and for low-level macro names.
This also cures a warning in the pod2man(1) preamble.

Modified Files:
--------------
    mdocml:
        man.c
        mdoc.c

Revision Data
-------------
Index: man.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man.c,v
retrieving revision 1.142
retrieving revision 1.143
diff -Lman.c -Lman.c -u -p -r1.142 -r1.143
--- man.c
+++ man.c
@@ -483,35 +483,50 @@ man_ptext(struct man *man, int line, cha
 static int
 man_pmacro(struct man *man, int ln, char *buf, int offs)
 {
-	char		 mac[5];
 	struct man_node	*n;
+	const char	*cp;
 	enum mant	 tok;
 	int		 i, ppos;
 	int		 bline;
+	char		 mac[5];
 
 	ppos = offs;
 
 	/*
 	 * Copy the first word into a nil-terminated buffer.
-	 * Stop copying when a tab, space, or eoln is encountered.
+	 * Stop when a space, tab, escape, or eoln is encountered.
 	 */
 
 	i = 0;
-	while (i < 4 && '\0' != buf[offs] && ' ' != buf[offs] &&
-	    '\t' != buf[offs])
+	while (i < 4 && strchr(" \t\\", buf[offs]) == NULL)
 		mac[i++] = buf[offs++];
 
 	mac[i] = '\0';
 
 	tok = (i > 0 && i < 4) ? man_hash_find(mac) : MAN_MAX;
 
-	if (MAN_MAX == tok) {
+	if (tok == MAN_MAX) {
 		mandoc_msg(MANDOCERR_MACRO, man->parse,
 		    ln, ppos, buf + ppos - 1);
 		return(1);
 	}
 
-	/* The macro is sane.  Jump to the next word. */
+	/* Skip a leading escape sequence or tab. */
+
+	switch (buf[offs]) {
+	case '\\':
+		cp = buf + offs + 1;
+		mandoc_escape(&cp, NULL, NULL);
+		offs = cp - buf;
+		break;
+	case '\t':
+		offs++;
+		break;
+	default:
+		break;
+	}
+
+	/* Jump to the next non-whitespace word. */
 
 	while (buf[offs] && ' ' == buf[offs])
 		offs++;
Index: mdoc.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.c,v
retrieving revision 1.228
retrieving revision 1.229
diff -Lmdoc.c -Lmdoc.c -u -p -r1.228 -r1.229
--- mdoc.c
+++ mdoc.c
@@ -734,37 +734,47 @@ mdoc_ptext(struct mdoc *mdoc, int line, 
 static int
 mdoc_pmacro(struct mdoc *mdoc, int ln, char *buf, int offs)
 {
+	struct mdoc_node *n;
+	const char	 *cp;
 	enum mdoct	  tok;
 	int		  i, sv;
 	char		  mac[5];
-	struct mdoc_node *n;
 
 	sv = offs;
 
 	/*
 	 * Copy the first word into a nil-terminated buffer.
-	 * Stop copying when a tab, space, or eoln is encountered.
+	 * Stop when a space, tab, escape, or eoln is encountered.
 	 */
 
 	i = 0;
-	while (i < 4 && '\0' != buf[offs] && ' ' != buf[offs] &&
-	    '\t' != buf[offs])
+	while (i < 4 && strchr(" \t\\", buf[offs]) == NULL)
 		mac[i++] = buf[offs++];
 
 	mac[i] = '\0';
 
 	tok = (i > 1 && i < 4) ? mdoc_hash_find(mac) : MDOC_MAX;
 
-	if (MDOC_MAX == tok) {
+	if (tok == MDOC_MAX) {
 		mandoc_msg(MANDOCERR_MACRO, mdoc->parse,
 		    ln, sv, buf + sv - 1);
 		return(1);
 	}
 
-	/* Disregard the first trailing tab, if applicable. */
+	/* Skip a leading escape sequence or tab. */
 
-	if ('\t' == buf[offs])
+	switch (buf[offs]) {
+	case '\\':
+		cp = buf + offs + 1;
+		mandoc_escape(&cp, NULL, NULL);
+		offs = cp - buf;
+		break;
+	case '\t':
 		offs++;
+		break;
+	default:
+		break;
+	}
 
 	/* Jump to the next non-whitespace word. */
 
--
 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:[~2014-11-19  3:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-19  3:08 mdocml: Escape sequences terminate high-level macro names, and when schwarze

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).