=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.207 retrieving revision 1.208 diff -c -r1.207 -r1.208 *** src/usr.bin/mandoc/roff.c 2018/08/18 22:04:32 1.207 --- src/usr.bin/mandoc/roff.c 2018/08/19 17:43:39 1.208 *************** *** 1,4 **** ! /* $OpenBSD: roff.c,v 1.207 2018/08/18 22:04:32 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: roff.c,v 1.208 2018/08/19 17:43:39 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze *************** *** 2166,2174 **** static int roff_evalcond(struct roff *r, int ln, char *v, int *pos) { ! char *cp, *name; ! size_t sz; ! int deftype, number, savepos, istrue, wanttrue; if ('!' == v[*pos]) { wanttrue = 0; --- 2166,2175 ---- static int roff_evalcond(struct roff *r, int ln, char *v, int *pos) { ! const char *start, *end; ! char *cp, *name; ! size_t sz; ! int deftype, len, number, savepos, istrue, wanttrue; if ('!' == v[*pos]) { wanttrue = 0; *************** *** 2183,2194 **** case 'o': (*pos)++; return wanttrue; - case 'c': case 'e': case 't': case 'v': (*pos)++; return !wanttrue; case 'd': case 'r': cp = v + *pos + 1; --- 2184,2233 ---- case 'o': (*pos)++; return wanttrue; case 'e': case 't': case 'v': (*pos)++; return !wanttrue; + case 'c': + do { + (*pos)++; + } while (v[*pos] == ' '); + + /* + * Quirk for groff compatibility: + * The horizontal tab is neither available nor unavailable. + */ + + if (v[*pos] == '\t') { + (*pos)++; + return 0; + } + + /* Printable ASCII characters are available. */ + + if (v[*pos] != '\\') { + (*pos)++; + return wanttrue; + } + + end = v + ++*pos; + switch (mandoc_escape(&end, &start, &len)) { + case ESCAPE_SPECIAL: + istrue = mchars_spec2cp(start, len) != -1; + break; + case ESCAPE_UNICODE: + istrue = 1; + break; + case ESCAPE_NUMBERED: + istrue = mchars_num2char(start, len) != -1; + break; + default: + istrue = !wanttrue; + break; + } + *pos = end - v; + return istrue == wanttrue; case 'd': case 'r': cp = v + *pos + 1;