=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.182 retrieving revision 1.183 diff -c -r1.182 -r1.183 *** src/usr.bin/mandoc/roff.c 2017/06/14 14:01:34 1.182 --- src/usr.bin/mandoc/roff.c 2017/06/14 19:39:05 1.183 *************** *** 1,4 **** ! /* $OpenBSD: roff.c,v 1.182 2017/06/14 14:01:34 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: roff.c,v 1.183 2017/06/14 19:39:05 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze *************** *** 144,149 **** --- 144,150 ---- static void roffnode_pop(struct roff *); static void roffnode_push(struct roff *, enum roff_tok, const char *, int, int); + static enum rofferr roff_als(ROFF_ARGS); static enum rofferr roff_block(ROFF_ARGS); static enum rofferr roff_block_text(ROFF_ARGS); static enum rofferr roff_block_sub(ROFF_ARGS); *************** *** 341,347 **** { roff_line_ignore, NULL, NULL, 0 }, /* ad */ { roff_line_ignore, NULL, NULL, 0 }, /* af */ { roff_unsupp, NULL, NULL, 0 }, /* aln */ ! { roff_unsupp, NULL, NULL, 0 }, /* als */ { roff_block, roff_block_text, roff_block_sub, 0 }, /* am */ { roff_block, roff_block_text, roff_block_sub, 0 }, /* am1 */ { roff_block, roff_block_text, roff_block_sub, 0 }, /* ami */ --- 342,348 ---- { roff_line_ignore, NULL, NULL, 0 }, /* ad */ { roff_line_ignore, NULL, NULL, 0 }, /* af */ { roff_unsupp, NULL, NULL, 0 }, /* aln */ ! { roff_als, NULL, NULL, 0 }, /* als */ { roff_block, roff_block_text, roff_block_sub, 0 }, /* am */ { roff_block, roff_block_text, roff_block_sub, 0 }, /* am1 */ { roff_block, roff_block_text, roff_block_sub, 0 }, /* ami */ *************** *** 1777,1784 **** * appended from roff_block_text() in multiline mode. */ ! if (tok == ROFF_de || tok == ROFF_dei) roff_setstrn(&r->strtab, name, namesz, "", 0, 0); if (*cp == '\0') return ROFF_IGN; --- 1778,1787 ---- * appended from roff_block_text() in multiline mode. */ ! if (tok == ROFF_de || tok == ROFF_dei) { roff_setstrn(&r->strtab, name, namesz, "", 0, 0); + roff_setstrn(&r->rentab, name, namesz, NULL, 0, 0); + } if (*cp == '\0') return ROFF_IGN; *************** *** 2247,2252 **** --- 2250,2256 ---- /* The rest is the value. */ roff_setstrn(&r->strtab, name, namesz, string, strlen(string), ROFF_as == tok); + roff_setstrn(&r->rentab, name, namesz, NULL, 0, 0); return ROFF_IGN; } *************** *** 2658,2663 **** --- 2662,2668 ---- name = cp; namesz = roff_getname(r, &cp, ln, (int)(cp - buf->buf)); roff_setstrn(&r->strtab, name, namesz, NULL, 0, 0); + roff_setstrn(&r->rentab, name, namesz, NULL, 0, 0); if (name[namesz] == '\\') break; } *************** *** 2956,2961 **** --- 2961,2992 ---- } static enum rofferr + roff_als(ROFF_ARGS) + { + char *oldn, *newn, *end, *value; + size_t oldsz, newsz, valsz; + + newn = oldn = buf->buf + pos; + if (*newn == '\0') + return ROFF_IGN; + + newsz = roff_getname(r, &oldn, ln, pos); + if (newn[newsz] == '\\' || *oldn == '\0') + return ROFF_IGN; + + end = oldn; + oldsz = roff_getname(r, &end, ln, oldn - buf->buf); + if (oldsz == 0) + return ROFF_IGN; + + valsz = mandoc_asprintf(&value, ".%.*s \\$*\n", (int)oldsz, oldn); + roff_setstrn(&r->strtab, newn, newsz, value, valsz, 0); + roff_setstrn(&r->rentab, newn, newsz, NULL, 0, 0); + free(value); + return ROFF_IGN; + } + + static enum rofferr roff_br(ROFF_ARGS) { if (r->man->flags & (MAN_BLINE | MAN_ELINE)) *************** *** 3160,3166 **** static enum rofferr roff_userdef(ROFF_ARGS) { ! const char *arg[9], *ap; char *cp, *n1, *n2; int expand_count, i, ib, ie; size_t asz, rsz; --- 3191,3197 ---- static enum rofferr roff_userdef(ROFF_ARGS) { ! const char *arg[16], *ap; char *cp, *n1, *n2; int expand_count, i, ib, ie; size_t asz, rsz; *************** *** 3172,3178 **** r->argc = 0; cp = buf->buf + pos; ! for (i = 0; i < 9; i++) { if (*cp == '\0') arg[i] = ""; else { --- 3203,3209 ---- r->argc = 0; cp = buf->buf + pos; ! for (i = 0; i < 16; i++) { if (*cp == '\0') arg[i] = ""; else {