=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.27 retrieving revision 1.28 diff -c -r1.27 -r1.28 *** src/usr.bin/mandoc/roff.c 2011/01/04 22:28:17 1.27 --- src/usr.bin/mandoc/roff.c 2011/01/10 23:53:32 1.28 *************** *** 1,4 **** ! /* $Id: roff.c,v 1.27 2011/01/04 22:28:17 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze --- 1,4 ---- ! /* $Id: roff.c,v 1.28 2011/01/10 23:53:32 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze *************** *** 130,135 **** --- 130,136 ---- static enum rofferr roff_ds(ROFF_ARGS); static enum roffrule roff_evalcond(const char *, int *); static void roff_freestr(struct roff *); + static char *roff_getname(struct roff *, char **, int, int); static const char *roff_getstrn(const struct roff *, const char *, size_t); static enum rofferr roff_line_ignore(ROFF_ARGS); *************** *** 1052,1078 **** * will have `bar " ' as its value. */ ! name = *bufp + pos; if ('\0' == *name) return(ROFF_IGN); ! string = name; ! /* Read until end of name. */ ! while (*string && ' ' != *string) string++; - /* Nil-terminate name. */ - if (*string) - *(string++) = '\0'; - - /* Read past spaces. */ - while (*string && ' ' == *string) - string++; - - /* Read passed initial double-quote. */ - if (*string && '"' == *string) - string++; - /* The rest is the value. */ roff_setstr(r, name, string, 0); return(ROFF_IGN); --- 1053,1067 ---- * will have `bar " ' as its value. */ ! string = *bufp + pos; ! name = roff_getname(r, &string, ln, pos); if ('\0' == *name) return(ROFF_IGN); ! /* Read past initial double-quote. */ ! if ('"' == *string) string++; /* The rest is the value. */ roff_setstr(r, name, string, 0); return(ROFF_IGN); *************** *** 1083,1113 **** static enum rofferr roff_nr(ROFF_ARGS) { ! const char *key, *val; struct reg *rg; ! key = &(*bufp)[pos]; rg = r->regs->regs; - /* Parse register request. */ - while ((*bufp)[pos] && ' ' != (*bufp)[pos]) - pos++; - - /* - * Set our nil terminator. Because this line is going to be - * ignored anyway, we can munge it as we please. - */ - if ((*bufp)[pos]) - (*bufp)[pos++] = '\0'; - - /* Skip whitespace to register token. */ - while ((*bufp)[pos] && ' ' == (*bufp)[pos]) - pos++; - - val = &(*bufp)[pos]; - - /* Process register token. */ - if (0 == strcmp(key, "nS")) { rg[(int)REG_nS].set = 1; if ( ! roff_parse_nat(val, &rg[(int)REG_nS].v.u)) --- 1072,1085 ---- static enum rofferr roff_nr(ROFF_ARGS) { ! const char *key; ! char *val; struct reg *rg; ! val = *bufp + pos; ! key = roff_getname(r, &val, ln, pos); rg = r->regs->regs; if (0 == strcmp(key, "nS")) { rg[(int)REG_nS].set = 1; if ( ! roff_parse_nat(val, &rg[(int)REG_nS].v.u)) *************** *** 1245,1250 **** --- 1217,1257 ---- return(*szp > 1 && '\n' == (*bufp)[(int)*szp - 2] ? ROFF_REPARSE : ROFF_APPEND); } + + + static char * + roff_getname(struct roff *r, char **cpp, int ln, int pos) + { + char *name, *cp; + + name = *cpp; + if ('\0' == *name) + return(name); + + /* Read until end of name. */ + for (cp = name; '\0' != *cp && ' ' != *cp; cp++) { + if ('\\' != *cp) + continue; + cp++; + if ('\\' == *cp) + continue; + (*r->msg)(MANDOCERR_NAMESC, r->data, ln, pos, NULL); + *cp = '\0'; + name = cp; + } + + /* Nil-terminate name. */ + if ('\0' != *cp) + *(cp++) = '\0'; + + /* Read past spaces. */ + while (' ' == *cp) + cp++; + + *cpp = cp; + return(name); + } + /* * Store *string into the user-defined string called *name.