=================================================================== RCS file: /cvs/mandoc/mandoc.c,v retrieving revision 1.111 retrieving revision 1.113 diff -u -p -r1.111 -r1.113 --- mandoc/mandoc.c 2018/12/15 19:30:26 1.111 +++ mandoc/mandoc.c 2018/12/18 22:00:02 1.113 @@ -1,4 +1,4 @@ -/* $Id: mandoc.c,v 1.111 2018/12/15 19:30:26 schwarze Exp $ */ +/* $Id: mandoc.c,v 1.113 2018/12/18 22:00:02 schwarze Exp $ */ /* * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons * Copyright (c) 2011-2015, 2017, 2018 Ingo Schwarze @@ -38,6 +38,59 @@ static char *time2a(time_t); enum mandoc_esc +mandoc_font(const char *cp, int sz) +{ + switch (sz) { + case 0: + return ESCAPE_FONTPREV; + case 1: + switch (cp[0]) { + case 'B': + case '3': + return ESCAPE_FONTBOLD; + case 'I': + case '2': + return ESCAPE_FONTITALIC; + case 'P': + return ESCAPE_FONTPREV; + case 'R': + case '1': + return ESCAPE_FONTROMAN; + case '4': + return ESCAPE_FONTBI; + default: + return ESCAPE_ERROR; + } + case 2: + switch (cp[0]) { + case 'B': + switch (cp[1]) { + case 'I': + return ESCAPE_FONTBI; + default: + return ESCAPE_ERROR; + } + case 'C': + switch (cp[1]) { + case 'B': + return ESCAPE_FONTBOLD; + case 'I': + return ESCAPE_FONTITALIC; + case 'R': + case 'W': + return ESCAPE_FONTCW; + default: + return ESCAPE_ERROR; + } + default: + return ESCAPE_ERROR; + } + default: + return ESCAPE_ERROR; + } +} + +enum mandoc_esc mandoc_escape(const char **end, const char **start, int *sz) { const char *local_start; @@ -367,47 +420,7 @@ mandoc_escape(const char **end, const char **start, in switch (gly) { case ESCAPE_FONT: - if (*sz == 2) { - if (**start == 'C') { - if ((*start)[1] == 'W' || - (*start)[1] == 'R') { - gly = ESCAPE_FONTCW; - break; - } - /* - * Treat other constant-width font modes - * just like regular font modes. - */ - (*start)++; - (*sz)--; - } else { - if ((*start)[0] == 'B' && (*start)[1] == 'I') - gly = ESCAPE_FONTBI; - break; - } - } else if (*sz != 1) { - if (*sz == 0) - gly = ESCAPE_FONTPREV; - break; - } - - switch (**start) { - case '3': - case 'B': - gly = ESCAPE_FONTBOLD; - break; - case '2': - case 'I': - gly = ESCAPE_FONTITALIC; - break; - case 'P': - gly = ESCAPE_FONTPREV; - break; - case '1': - case 'R': - gly = ESCAPE_FONTROMAN; - break; - } + gly = mandoc_font(*start, *sz); break; case ESCAPE_SPECIAL: if (**start == 'c') { @@ -450,102 +463,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