=================================================================== RCS file: /cvs/mandoc/mandoc.c,v retrieving revision 1.112 retrieving revision 1.115 diff -u -p -r1.112 -r1.115 --- mandoc/mandoc.c 2018/12/16 00:17:02 1.112 +++ mandoc/mandoc.c 2019/05/21 08:04:21 1.115 @@ -1,4 +1,4 @@ -/* $Id: mandoc.c,v 1.112 2018/12/16 00:17:02 schwarze Exp $ */ +/* $Id: mandoc.c,v 1.115 2019/05/21 08:04:21 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze @@ -32,6 +32,7 @@ #include "mandoc.h" #include "roff.h" #include "libmandoc.h" +#include "roff_int.h" static int a2time(time_t *, const char *, const char *); static char *time2a(time_t); @@ -465,102 +466,6 @@ mandoc_escape(const char **end, const char **start, in 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) { @@ -636,10 +541,10 @@ mandoc_normdate(struct roff_man *man, char *in, int ln /* No date specified: use today's date. */ - if (in == NULL || *in == '\0' || strcmp(in, "$" "Mdocdate$") == 0) { + if (in == NULL || *in == '\0') mandoc_msg(MANDOCERR_DATE_MISSING, ln, pos, NULL); + if (in == NULL || *in == '\0' || strcmp(in, "$" "Mdocdate$") == 0) return time2a(time(NULL)); - } /* Valid mdoc(7) date format. */ @@ -659,7 +564,7 @@ mandoc_normdate(struct roff_man *man, char *in, int ln mandoc_msg(MANDOCERR_DATE_BAD, ln, pos, "%s", in); else if (t > time(NULL) + 86400) mandoc_msg(MANDOCERR_DATE_FUTURE, ln, pos, "%s", in); - else if (man->macroset == MACROSET_MDOC) + else if (man->meta.macroset == MACROSET_MDOC) mandoc_msg(MANDOCERR_DATE_LEGACY, ln, pos, "Dd %s", in); /* Use any non-mdoc(7) date verbatim. */