Index: mandoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.c,v retrieving revision 1.62 diff -u -p -r1.62 mandoc.c --- mandoc.c 3 Dec 2011 16:08:51 -0000 1.62 +++ mandoc.c 3 Jan 2012 12:18:51 -0000 @@ -209,9 +209,15 @@ mandoc_escape(const char **end, const ch break; /* - * These escapes are of the form \X'N', where 'X' is the trigger - * and 'N' resolves to a numerical expression. + * These escapes accept most characters as enclosure marks + * (except for those listed in the switch). + * The enclosed materials are numbers, so run them through the + * numerical subexpression calculator after we process. */ + case ('N'): + /* Special case: numerical representation of char. */ + gly = ESCAPE_NUMBERED; + /* FALLTHROUGH */ case ('B'): /* FALLTHROUGH */ case ('h'): @@ -221,7 +227,6 @@ mandoc_escape(const char **end, const ch case ('L'): /* FALLTHROUGH */ case ('l'): - gly = ESCAPE_NUMBERED; /* FALLTHROUGH */ case ('S'): /* FALLTHROUGH */ @@ -230,32 +235,62 @@ mandoc_escape(const char **end, const ch case ('w'): /* FALLTHROUGH */ case ('x'): - if (ESCAPE_ERROR == gly) + if (ESCAPE_NUMBERED != gly) gly = ESCAPE_IGNORE; - if ('\'' != cp[i++]) + numeric = term = cp[i++]; + switch (numeric) { + case('0'): + /* FALLTHROUGH */ + case('1'): + /* FALLTHROUGH */ + case('2'): + /* FALLTHROUGH */ + case('3'): + /* FALLTHROUGH */ + case('4'): + /* FALLTHROUGH */ + case('5'): + /* FALLTHROUGH */ + case('6'): + /* FALLTHROUGH */ + case('7'): + /* FALLTHROUGH */ + case('8'): + /* FALLTHROUGH */ + case('9'): + /* FALLTHROUGH */ + case('+'): + /* FALLTHROUGH */ + case('-'): + /* FALLTHROUGH */ + case('/'): + /* FALLTHROUGH */ + case('*'): + /* FALLTHROUGH */ + case('%'): + /* FALLTHROUGH */ + case('<'): + /* FALLTHROUGH */ + case('>'): + /* FALLTHROUGH */ + case('='): + /* FALLTHROUGH */ + case('&'): + /* FALLTHROUGH */ + case(':'): + /* FALLTHROUGH */ + case('('): + /* FALLTHROUGH */ + case(')'): + /* FALLTHROUGH */ + case('.'): return(ESCAPE_ERROR); - term = numeric = '\''; - break; - - /* - * Special handling for the numbered character escape. - * XXX Do any other escapes need similar handling? - */ - case ('N'): - if ('\0' == cp[i]) + default: + break; + } + if (isspace((unsigned char)numeric)) return(ESCAPE_ERROR); - *end = &cp[++i]; - if (isdigit((unsigned char)cp[i-1])) - return(ESCAPE_IGNORE); - while (isdigit((unsigned char)**end)) - (*end)++; - if (start) - *start = &cp[i]; - if (sz) - *sz = *end - &cp[i]; - if ('\0' != **end) - (*end)++; - return(ESCAPE_NUMBERED); + break; /* * Sizes get a special category of their own.