Module Name:    src
Committed By:   wiz
Date:           Tue Dec 17 09:28:10 UTC 2013

Modified Files:
        src/external/bsd/mdocml/dist: mdoc_argv.c

Log Message:
Fix handling of nested double quotes.

>From Ingo Schwarze <schwa...@usta.de> based on patch by enami@
in PR 48438.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/external/bsd/mdocml/dist/mdoc_argv.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/mdocml/dist/mdoc_argv.c
diff -u src/external/bsd/mdocml/dist/mdoc_argv.c:1.4 src/external/bsd/mdocml/dist/mdoc_argv.c:1.5
--- src/external/bsd/mdocml/dist/mdoc_argv.c:1.4	Wed Apr  3 14:50:26 2013
+++ src/external/bsd/mdocml/dist/mdoc_argv.c	Tue Dec 17 09:28:10 2013
@@ -453,6 +453,7 @@ args(struct mdoc *m, int line, int *pos,
 		char *buf, enum argsflag fl, char **v)
 {
 	char		*p, *pp;
+	int		 pairs;
 	enum margserr	 rc;
 
 	if ('\0' == buf[*pos]) {
@@ -546,6 +547,8 @@ args(struct mdoc *m, int line, int *pos,
 	/* 
 	 * Process a quoted literal.  A quote begins with a double-quote
 	 * and ends with a double-quote NOT preceded by a double-quote.
+	 * Null-terminate the literal in place.
+	 * Collapse pairs of quotes inside quoted literals.
 	 * Whitespace is NOT involved in literal termination.
 	 */
 
@@ -556,13 +559,22 @@ args(struct mdoc *m, int line, int *pos,
 		if (MDOC_PPHRASE & m->flags)
 			m->flags |= MDOC_PHRASELIT;
 
+		pairs = 0;
 		for ( ; buf[*pos]; (*pos)++) {
+			/* Move following text left after quoted quotes. */
+			if (pairs)
+				buf[*pos - pairs] = buf[*pos];
 			if ('\"' != buf[*pos])
 				continue;
+			/* Unquoted quotes end quoted args. */
 			if ('\"' != buf[*pos + 1])
 				break;
+			/* Quoted quotes collapse. */
+			pairs++;
 			(*pos)++;
 		}
+		if (pairs)
+			buf[*pos - pairs] = '\0';
 
 		if ('\0' == buf[*pos]) {
 			if (MDOC_PPHRASE & m->flags)

Reply via email to