* mandoc: As a first step towards making roff_res() callable from
@ 2018-12-18 22:00 schwarze
0 siblings, 0 replies; only message in thread
From: schwarze @ 2018-12-18 22:00 UTC (permalink / raw)
To: source
Log Message:
-----------
As a first step towards making roff_res() callable from mandoc_getarg(),
move the function mandoc_getarg() from mandoc.c to roff.c. It was
misplaced in mandoc.c in the first place; that file is intended for
utilities needed both by parsers and by formatters, while reading
macro arguments in copy mode is purely a task of the roff(7) parser.
Needed as a preliminary for an upcoming bugfix.
No code change.
Modified Files:
--------------
mandoc:
mandoc.c
roff.c
Revision Data
-------------
Index: roff.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/roff.c,v
retrieving revision 1.352
retrieving revision 1.353
diff -Lroff.c -Lroff.c -u -p -r1.352 -r1.353
--- roff.c
+++ roff.c
@@ -1547,6 +1547,103 @@ roff_res(struct roff *r, struct buf *buf
}
/*
+ * Parse a quoted or unquoted roff-style request or macro argument.
+ * Return a pointer to the parsed argument, which is either the original
+ * pointer or advanced by one byte in case the argument is quoted.
+ * NUL-terminate the argument in place.
+ * Collapse pairs of quotes inside quoted arguments.
+ * Advance the argument pointer to the next argument,
+ * or to the NUL byte terminating the argument line.
+ */
+char *
+mandoc_getarg(char **cpp, int ln, int *pos)
+{
+ char *start, *cp;
+ int quoted, pairs, white;
+
+ /* Quoting can only start with a new word. */
+ start = *cpp;
+ quoted = 0;
+ if ('"' == *start) {
+ quoted = 1;
+ start++;
+ }
+
+ pairs = 0;
+ white = 0;
+ for (cp = start; '\0' != *cp; cp++) {
+
+ /*
+ * Move the following text left
+ * after quoted quotes and after "\\" and "\t".
+ */
+ if (pairs)
+ cp[-pairs] = cp[0];
+
+ if ('\\' == cp[0]) {
+ /*
+ * In copy mode, translate double to single
+ * backslashes and backslash-t to literal tabs.
+ */
+ switch (cp[1]) {
+ case 'a':
+ case 't':
+ cp[0] = '\t';
+ /* FALLTHROUGH */
+ case '\\':
+ pairs++;
+ cp++;
+ break;
+ case ' ':
+ /* Skip escaped blanks. */
+ if (0 == quoted)
+ cp++;
+ break;
+ default:
+ break;
+ }
+ } else if (0 == quoted) {
+ if (' ' == cp[0]) {
+ /* Unescaped blanks end unquoted args. */
+ white = 1;
+ break;
+ }
+ } else if ('"' == cp[0]) {
+ if ('"' == cp[1]) {
+ /* Quoted quotes collapse. */
+ pairs++;
+ cp++;
+ } else {
+ /* Unquoted quotes end quoted args. */
+ quoted = 2;
+ break;
+ }
+ }
+ }
+
+ /* Quoted argument without a closing quote. */
+ if (1 == quoted)
+ mandoc_msg(MANDOCERR_ARG_QUOTE, ln, *pos, NULL);
+
+ /* NUL-terminate this argument and move to the next one. */
+ if (pairs)
+ cp[-pairs] = '\0';
+ if ('\0' != *cp) {
+ *cp++ = '\0';
+ while (' ' == *cp)
+ cp++;
+ }
+ *pos += (int)(cp - start) + (quoted ? 1 : 0);
+ *cpp = cp;
+
+ if ('\0' == *cp && (white || ' ' == cp[-1]))
+ mandoc_msg(MANDOCERR_SPACE_EOL, ln, *pos, NULL);
+
+ return start;
+}
+
+
+/*
* Process text streams.
*/
static int
Index: mandoc.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/mandoc.c,v
retrieving revision 1.112
retrieving revision 1.113
diff -Lmandoc.c -Lmandoc.c -u -p -r1.112 -r1.113
--- mandoc.c
+++ mandoc.c
@@ -465,102 +465,6 @@ mandoc_escape(const char **end, const ch
return gly;
}
-/*
- * Parse a quoted or unquoted roff-style request or macro argument.
- * Return a pointer to the parsed argument, which is either the original
- * pointer or advanced by one byte in case the argument is quoted.
- * NUL-terminate the argument in place.
- * Collapse pairs of quotes inside quoted arguments.
- * Advance the argument pointer to the next argument,
- * or to the NUL byte terminating the argument line.
- */
-char *
-mandoc_getarg(char **cpp, int ln, int *pos)
-{
- char *start, *cp;
- int quoted, pairs, white;
-
- /* Quoting can only start with a new word. */
- start = *cpp;
- quoted = 0;
- if ('"' == *start) {
- quoted = 1;
- start++;
- }
-
- pairs = 0;
- white = 0;
- for (cp = start; '\0' != *cp; cp++) {
-
- /*
- * Move the following text left
- * after quoted quotes and after "\\" and "\t".
- */
- if (pairs)
- cp[-pairs] = cp[0];
-
- if ('\\' == cp[0]) {
- /*
- * In copy mode, translate double to single
- * backslashes and backslash-t to literal tabs.
- */
- switch (cp[1]) {
- case 'a':
- case 't':
- cp[0] = '\t';
- /* FALLTHROUGH */
- case '\\':
- pairs++;
- cp++;
- break;
- case ' ':
- /* Skip escaped blanks. */
- if (0 == quoted)
- cp++;
- break;
- default:
- break;
- }
- } else if (0 == quoted) {
- if (' ' == cp[0]) {
- /* Unescaped blanks end unquoted args. */
- white = 1;
- break;
- }
- } else if ('"' == cp[0]) {
- if ('"' == cp[1]) {
- /* Quoted quotes collapse. */
- pairs++;
- cp++;
- } else {
- /* Unquoted quotes end quoted args. */
- quoted = 2;
- break;
- }
- }
- }
-
- /* Quoted argument without a closing quote. */
- if (1 == quoted)
- mandoc_msg(MANDOCERR_ARG_QUOTE, ln, *pos, NULL);
-
- /* NUL-terminate this argument and move to the next one. */
- if (pairs)
- cp[-pairs] = '\0';
- if ('\0' != *cp) {
- *cp++ = '\0';
- while (' ' == *cp)
- cp++;
- }
- *pos += (int)(cp - start) + (quoted ? 1 : 0);
- *cpp = cp;
-
- if ('\0' == *cp && (white || ' ' == cp[-1]))
- mandoc_msg(MANDOCERR_SPACE_EOL, ln, *pos, NULL);
-
- return start;
-}
-
static int
a2time(time_t *t, const char *fmt, const char *p)
{
--
To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2018-12-18 22:00 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-18 22:00 mandoc: As a first step towards making roff_res() callable from 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).