diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-06-29 23:26:00 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-06-29 23:26:00 +0000 |
commit | e59fc50ac6ce1ed11120dc6ff53e5f2427965c3f (patch) | |
tree | 477a58f01794db83c690e003b4554f8b614eb4e3 | |
parent | 59a6679ae8adcc5a1dbaefa32d2e23c0872b4c3f (diff) | |
download | mandoc-e59fc50ac6ce1ed11120dc6ff53e5f2427965c3f.tar.gz |
Use the freshly improved roff_getname() function
for the main roff request parsing routine, roff_parse().
In request or macro invocations, escape sequences now terminate the
request or macro name; what follows is treated as arguments. Besides,
the names of user-defined macros can now contain backslashes (eek!).
-rw-r--r-- | roff.c | 31 |
1 files changed, 15 insertions, 16 deletions
@@ -200,7 +200,8 @@ static enum rofferr roff_line_ignore(ROFF_ARGS); static enum rofferr roff_nr(ROFF_ARGS); static void roff_openeqn(struct roff *, const char *, int, int, const char *); -static enum rofft roff_parse(struct roff *, const char *, int *); +static enum rofft roff_parse(struct roff *, char *, int *, + int, int); static enum rofferr roff_parsetext(char **, size_t *, int, int *); static enum rofferr roff_res(struct roff *, char **, size_t *, int, int); @@ -764,7 +765,7 @@ roff_parseln(struct roff *r, int ln, char **bufp, * the compilers handle it. */ - if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos))) + if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos, ln, ppos))) return(ROFF_CONT); assert(roffs[t].proc); @@ -797,28 +798,26 @@ roff_endparse(struct roff *r) * form of ".foo xxx" in the usual way. */ static enum rofft -roff_parse(struct roff *r, const char *buf, int *pos) +roff_parse(struct roff *r, char *buf, int *pos, int ln, int ppos) { + char *cp; const char *mac; size_t maclen; enum rofft t; - if ('\0' == buf[*pos] || '"' == buf[*pos] || - '\t' == buf[*pos] || ' ' == buf[*pos]) - return(ROFF_MAX); + cp = buf + *pos; - /* We stop the macro parse at an escape, tab, space, or nil. */ + if ('\0' == *cp || '"' == *cp || '\t' == *cp || ' ' == *cp) + return(ROFF_MAX); - mac = buf + *pos; - maclen = strcspn(mac, " \\\t\0"); + mac = cp; + maclen = roff_getname(r, &cp, ln, ppos); t = (r->current_string = roff_getstrn(r, mac, maclen)) ? ROFF_USERDEF : roffhash_find(mac, maclen); - *pos += (int)maclen; - - while (buf[*pos] && ' ' == buf[*pos]) - (*pos)++; + if (ROFF_MAX != t) + *pos = cp - buf; return(t); } @@ -996,7 +995,7 @@ roff_block_sub(ROFF_ARGS) i++; pos = i; - if (ROFF_MAX != roff_parse(r, *bufp, &pos)) + if (ROFF_MAX != roff_parse(r, *bufp, &pos, ln, ppos)) return(ROFF_RERUN); return(ROFF_IGN); } @@ -1007,7 +1006,7 @@ roff_block_sub(ROFF_ARGS) * pulling it out of the hashtable. */ - t = roff_parse(r, *bufp, &pos); + t = roff_parse(r, *bufp, &pos, ln, ppos); /* * Macros other than block-end are only significant @@ -1042,7 +1041,7 @@ roff_cond_sub(ROFF_ARGS) rr = r->last->rule; roffnode_cleanscope(r); - t = roff_parse(r, *bufp, &pos); + t = roff_parse(r, *bufp, &pos, ln, ppos); /* * Fully handle known macros when they are structurally |