diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2013-12-15 23:56:42 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2013-12-15 23:56:42 +0000 |
commit | d811213134b49a83e1f9097dd5774cd3bfe43d86 (patch) | |
tree | e6a0ab26ae838805b4ac2630f402b10512026ba5 | |
parent | d04190b8d7eafcfaf5acd72959c929b04dc335e2 (diff) | |
download | mandoc-d811213134b49a83e1f9097dd5774cd3bfe43d86.tar.gz |
In quoted macro arguments, double quotes can be quoted by doubling them.
For a long time, we handle this in roff(7) and man(7) macros.
Now add correct handling for the mdoc(7) case, too.
Closely based on a patch by Tsugutomo dot ENAMI at jp dot sony dot com,
see http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=48438
received via Thomas Klausner (wiz@), slightly tweaked by me.
-rw-r--r-- | TODO | 5 | ||||
-rw-r--r-- | mdoc_argv.c | 12 |
2 files changed, 12 insertions, 5 deletions
@@ -203,11 +203,6 @@ None known. - a column list with blank `Ta' cells triggers a spurrious start-with-whitespace printing of a newline -- double quotes inside double quotes are escaped by doubling them - implement this in mdoc(7), too - so far, we only have it in roff(7) and man(7) - reminded by millert@ Thu, 09 Dec 2010 17:29:52 -0500 - - In .Bl -column, .It Em Authentication<tab>Key Length ought to render "Key Length" with emphasis, too, diff --git a/mdoc_argv.c b/mdoc_argv.c index 55ecdc4a..d191858e 100644 --- a/mdoc_argv.c +++ b/mdoc_argv.c @@ -447,6 +447,7 @@ args(struct mdoc *mdoc, int line, int *pos, char *buf, enum argsflag fl, char **v) { char *p, *pp; + int pairs; enum margserr rc; if ('\0' == buf[*pos]) { @@ -540,6 +541,8 @@ args(struct mdoc *mdoc, 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. */ @@ -550,13 +553,22 @@ args(struct mdoc *mdoc, int line, int *pos, if (MDOC_PPHRASE & mdoc->flags) mdoc->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 & mdoc->flags) |