=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.84 retrieving revision 1.85 diff -c -r1.84 -r1.85 *** src/usr.bin/mandoc/roff.c 2014/06/29 21:19:34 1.84 --- src/usr.bin/mandoc/roff.c 2014/06/29 22:12:54 1.85 *************** *** 1,4 **** ! /* $Id: roff.c,v 1.84 2014/06/29 21:19:34 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze --- 1,4 ---- ! /* $Id: roff.c,v 1.85 2014/06/29 22:12:54 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze *************** *** 183,189 **** static void roff_free1(struct roff *); static void roff_freereg(struct roffreg *); static void roff_freestr(struct roffkv *); ! static char *roff_getname(struct roff *, char **, int, int); static int roff_getnum(const char *, int *, int *); static int roff_getop(const char *, int *, char *); static int roff_getregn(const struct roff *, --- 183,189 ---- static void roff_free1(struct roff *); static void roff_freereg(struct roffreg *); static void roff_freestr(struct roffkv *); ! static size_t roff_getname(struct roff *, char **, int, int); static int roff_getnum(const char *, int *, int *); static int roff_getop(const char *, int *, char *); static int roff_getregn(const struct roff *, *************** *** 1314,1342 **** static enum rofferr roff_ds(ROFF_ARGS) { ! char *name, *string; /* ! * A symbol is named by the first word following the macro ! * invocation up to a space. Its value is anything after the ! * name's trailing whitespace and optional double-quote. Thus, ! * ! * [.ds foo "bar " ] ! * ! * 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, ROFF_as == tok); return(ROFF_IGN); } --- 1314,1344 ---- static enum rofferr roff_ds(ROFF_ARGS) { ! char *string; ! const char *name; ! size_t namesz; /* ! * The first word is the name of the string. ! * If it is empty or terminated by an escape sequence, ! * abort the `ds' request without defining anything. */ ! name = string = *bufp + pos; if ('\0' == *name) return(ROFF_IGN); ! namesz = roff_getname(r, &string, ln, pos); ! if ('\\' == name[namesz]) ! return(ROFF_IGN); ! ! /* Read past the initial double-quote, if any. */ if ('"' == *string) string++; /* The rest is the value. */ ! roff_setstrn(&r->strtab, name, namesz, string, strlen(string), ! ROFF_as == tok); return(ROFF_IGN); } *************** *** 1650,1663 **** static enum rofferr roff_nr(ROFF_ARGS) { ! const char *key; ! char *val; int iv; char sign; ! val = *bufp + pos; ! key = roff_getname(r, &val, ln, pos); sign = *val; if ('+' == sign || '-' == sign) val++; --- 1652,1671 ---- static enum rofferr roff_nr(ROFF_ARGS) { ! char *key, *val; ! size_t keysz; int iv; char sign; ! key = val = *bufp + pos; ! if ('\0' == *key) ! return(ROFF_IGN); + keysz = roff_getname(r, &val, ln, pos); + if ('\\' == key[keysz]) + return(ROFF_IGN); + key[keysz] = '\0'; + sign = *val; if ('+' == sign || '-' == sign) val++; *************** *** 1672,1682 **** roff_rr(ROFF_ARGS) { struct roffreg *reg, **prev; ! const char *name; ! char *cp; ! cp = *bufp + pos; ! name = roff_getname(r, &cp, ln, pos); prev = &r->regtab; while (1) { --- 1680,1693 ---- roff_rr(ROFF_ARGS) { struct roffreg *reg, **prev; ! char *name, *cp; ! size_t namesz; ! name = cp = *bufp + pos; ! if ('\0' == *name) ! return(ROFF_IGN); ! namesz = roff_getname(r, &cp, ln, pos); ! name[namesz] = '\0'; prev = &r->regtab; while (1) { *************** *** 1698,1709 **** { const char *name; char *cp; cp = *bufp + pos; while ('\0' != *cp) { ! name = roff_getname(r, &cp, ln, (int)(cp - *bufp)); ! if ('\0' != *name) ! roff_setstr(r, name, NULL, 0); } return(ROFF_IGN); } --- 1709,1723 ---- { const char *name; char *cp; + size_t namesz; cp = *bufp + pos; while ('\0' != *cp) { ! name = cp; ! namesz = roff_getname(r, &cp, ln, (int)(cp - *bufp)); ! roff_setstrn(&r->strtab, name, namesz, NULL, 0, 0); ! if ('\\' == name[namesz]) ! break; } return(ROFF_IGN); } *************** *** 2003,2039 **** 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; mandoc_msg(MANDOCERR_NAMESC, r->parse, 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); } /* --- 2017,2055 ---- ROFF_REPARSE : ROFF_APPEND); } ! static size_t roff_getname(struct roff *r, char **cpp, int ln, int pos) { char *name, *cp; + size_t namesz; name = *cpp; if ('\0' == *name) ! return(0); ! /* Read until end of name and terminate it with NUL. */ ! for (cp = name; 1; cp++) { ! if ('\0' == *cp || ' ' == *cp) { ! namesz = cp - name; ! break; ! } if ('\\' != *cp) continue; cp++; if ('\\' == *cp) continue; + namesz = cp - name - 1; mandoc_msg(MANDOCERR_NAMESC, r->parse, ln, pos, NULL); ! mandoc_escape((const char **)&cp, NULL, NULL); ! break; } /* Read past spaces. */ while (' ' == *cp) cp++; *cpp = cp; ! return(namesz); } /*