Lines Matching refs:r
348 #define ROFF_ARGS struct roff *r, /* parse ctx */ \
394 static int roff_evalcond(struct roff *r, int,
791 roffnode_pop(struct roff *r)
795 assert(r->last);
796 p = r->last;
798 r->last = r->last->parent;
809 roffnode_push(struct roff *r, enum rofft tok, const char *name,
818 p->parent = r->last;
823 r->last = p;
827 roff_free1(struct roff *r)
833 while (NULL != (tbl = r->first_tbl)) {
834 r->first_tbl = tbl->next;
837 r->first_tbl = r->last_tbl = r->tbl = NULL;
839 while (NULL != (e = r->first_eqn)) {
840 r->first_eqn = e->next;
843 r->first_eqn = r->last_eqn = r->eqn = NULL;
845 while (r->last)
846 roffnode_pop(r);
848 free (r->rstack);
849 r->rstack = NULL;
850 r->rstacksz = 0;
851 r->rstackpos = -1;
853 roff_freereg(r->regtab);
854 r->regtab = NULL;
856 roff_freestr(r->strtab);
857 roff_freestr(r->xmbtab);
858 r->strtab = r->xmbtab = NULL;
860 if (r->xtab)
862 free(r->xtab[i].p);
863 free(r->xtab);
864 r->xtab = NULL;
868 roff_reset(struct roff *r)
871 roff_free1(r);
872 r->format = r->options & (MPARSE_MDOC | MPARSE_MAN);
873 r->control = 0;
877 roff_free(struct roff *r)
880 roff_free1(r);
881 free(r);
887 struct roff *r;
889 r = mandoc_calloc(1, sizeof(struct roff));
890 r->parse = parse;
891 r->mchars = mchars;
892 r->options = options;
893 r->format = options & (MPARSE_MDOC | MPARSE_MAN);
894 r->rstackpos = -1;
898 return(r);
907 roff_res(struct roff *r, struct buf *buf, int ln, int pos)
966 mchars_spec2cp(r->mchars, stnam, inaml) < 0))
968 r->parse, ln, (int)(stesc - buf->buf),
974 mandoc_msg(MANDOCERR_ROFFLOOP, r->parse,
1015 mandoc_msg(MANDOCERR_ESC_BAD, r->parse,
1051 res = roff_getstrn(r, stnam, naml);
1056 roff_evalnum(r, ln, stnam, &npos,
1064 roff_getregn(r, stnam, naml));
1077 r->parse, ln, (int)(stesc - buf->buf),
1081 mandoc_msg(MANDOCERR_ROFFLOOP, r->parse,
1159 roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs)
1172 if (r->tbl == NULL &&
1173 r->last_eqn != NULL && r->last_eqn->delim &&
1174 (r->eqn == NULL || r->eqn_inline)) {
1175 e = roff_eqndelim(r, buf, pos);
1183 e = roff_res(r, buf, ln, pos);
1188 ctl = roff_getcontrol(r, buf->buf, &pos);
1198 if (r->last != NULL && ! ctl) {
1199 t = r->last->tok;
1201 e = (*roffs[t].text)(r, t, buf, ln, pos, pos, offs);
1206 if (r->eqn != NULL)
1207 return(eqn_read(&r->eqn, ln, buf->buf, ppos, offs));
1208 if (r->tbl != NULL && ( ! ctl || buf->buf[pos] == '\0'))
1209 return(tbl_read(r->tbl, ln, buf->buf, ppos));
1216 mandoc_msg(MANDOCERR_COMMENT_BAD, r->parse,
1228 if (r->last) {
1229 t = r->last->tok;
1231 return((*roffs[t].sub)(r, t, buf, ln, ppos, pos, offs));
1237 t = roff_parse(r, buf->buf, &pos, ln, ppos);
1241 if (r->tbl != NULL && (t == ROFF_MAX || t == ROFF_TS)) {
1242 mandoc_msg(MANDOCERR_TBLMACRO, r->parse,
1250 return(tbl_read(r->tbl, ln, buf->buf, pos));
1264 return((*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs));
1268 roff_endparse(struct roff *r)
1271 if (r->last)
1272 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
1273 r->last->line, r->last->col,
1274 roffs[r->last->tok].name);
1276 if (r->eqn) {
1277 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
1278 r->eqn->eqn.ln, r->eqn->eqn.pos, "EQ");
1279 eqn_end(&r->eqn);
1282 if (r->tbl) {
1283 mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
1284 r->tbl->line, r->tbl->pos, "TS");
1285 tbl_end(&r->tbl);
1294 roff_parse(struct roff *r, char *buf, int *pos, int ln, int ppos)
1307 maclen = roff_getname(r, &cp, ln, ppos);
1309 t = (r->current_string = roff_getstrn(r, mac, maclen))
1327 if (r->last == NULL) {
1328 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
1333 switch (r->last->tok) {
1347 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
1353 mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos,
1356 roffnode_pop(r);
1357 roffnode_cleanscope(r);
1363 roffnode_cleanscope(struct roff *r)
1366 while (r->last) {
1367 if (--r->last->endspan != 0)
1369 roffnode_pop(r);
1374 roff_ccond(struct roff *r, int ln, int ppos)
1377 if (NULL == r->last) {
1378 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
1383 switch (r->last->tok) {
1391 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
1396 if (r->last->endspan > -1) {
1397 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
1402 roffnode_pop(r);
1403 roffnode_cleanscope(r);
1433 namesz = roff_getname(r, &cp, ln, ppos);
1440 if ((name = roff_getstrn(r, iname, namesz)) == NULL) {
1442 r->parse, ln, (int)(iname - buf->buf),
1451 mandoc_msg(MANDOCERR_REQ_EMPTY, r->parse,
1456 roffnode_push(r, tok, name, ln, ppos);
1465 roff_setstrn(&r->strtab, name, namesz, "", 0, 0);
1473 namesz = roff_getname(r, &cp, ln, ppos);
1478 if ((name = roff_getstrn(r, iname, namesz)) == NULL) {
1480 r->parse, ln, (int)(iname - buf->buf),
1489 r->last->end = mandoc_strndup(name, namesz);
1492 mandoc_vmsg(MANDOCERR_ARG_EXCESS, r->parse,
1513 if (r->last->end) {
1514 for (i = pos, j = 0; r->last->end[j]; j++, i++)
1515 if (buf->buf[i] != r->last->end[j])
1518 if (r->last->end[j] == '\0' &&
1522 roffnode_pop(r);
1523 roffnode_cleanscope(r);
1529 if (roff_parse(r, buf->buf, &pos, ln, ppos) !=
1541 t = roff_parse(r, buf->buf, &pos, ln, ppos);
1545 roff_setstr(r, r->last->name, buf->buf + ppos, 2);
1550 return((*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs));
1558 roff_setstr(r, r->last->name, buf->buf + pos, 2);
1570 rr = r->last->rule;
1571 roffnode_cleanscope(r);
1572 t = roff_parse(r, buf->buf, &pos, ln, ppos);
1582 return((*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs));
1599 roff_ccond(r, ln, ep - buf->buf - 1);
1613 rr = r->last->rule;
1614 roffnode_cleanscope(r);
1620 roff_ccond(r, ln, ep - buf->buf - 1);
1750 roff_evalcond(struct roff *r, int ln, const char *v, int *pos)
1774 case 'r':
1786 if (roff_evalnum(r, ln, v, pos, &number, ROFFNUM_SCALE))
1805 mandoc_msg(MANDOCERR_REQ_INSEC, r->parse,
1814 mandoc_msg(MANDOCERR_REQ_UNSUPP, r->parse,
1823 roffnode_push(r, tok, NULL, ln, ppos);
1833 r->last->rule = tok == ROFF_el ?
1834 (r->rstackpos < 0 ? 0 : r->rstack[r->rstackpos--]) :
1835 roff_evalcond(r, ln, buf->buf, &pos);
1843 if (r->rstackpos + 1 == r->rstacksz) {
1844 r->rstacksz += 16;
1845 r->rstack = mandoc_reallocarray(r->rstack,
1846 r->rstacksz, sizeof(int));
1848 r->rstack[++r->rstackpos] = !r->last->rule;
1853 if (r->last->parent && !r->last->parent->rule)
1854 r->last->rule = 0;
1863 r->last->endspan = 2;
1873 r->last->endspan = -1;
1885 mandoc_msg(MANDOCERR_COND_EMPTY, r->parse,
1888 r->last->endspan = 1;
1919 namesz = roff_getname(r, &string, ln, pos);
1928 roff_setstrn(&r->strtab, name, namesz, string, strlen(string),
2008 roff_evalpar(struct roff *r, int ln,
2016 if ( ! roff_evalnum(r, ln, v, pos, res, flags | ROFFNUM_WHITE))
2038 roff_evalnum(struct roff *r, int ln, const char *v,
2053 if ( ! roff_evalpar(r, ln, v, pos, res, flags))
2068 if ( ! roff_evalpar(r, ln, v, pos, &operand2, flags))
2091 r->parse, ln, *pos, v);
2100 r->parse, ln, *pos, v);
2146 roff_setreg(struct roff *r, const char *name, int val, char sign)
2151 reg = r->regtab;
2162 reg->next = r->regtab;
2163 r->regtab = reg;
2203 roff_getreg(const struct roff *r, const char *name)
2214 for (reg = r->regtab; reg; reg = reg->next)
2222 roff_getregn(const struct roff *r, const char *name, size_t len)
2233 for (reg = r->regtab; reg; reg = reg->next)
2266 keysz = roff_getname(r, &val, ln, pos);
2275 if (roff_evalnum(r, ln, val, NULL, &iv, ROFFNUM_SCALE))
2276 roff_setreg(r, key, iv, sign);
2291 namesz = roff_getname(r, &cp, ln, pos);
2294 prev = &r->regtab;
2319 namesz = roff_getname(r, &cp, ln, (int)(cp - buf->buf));
2320 roff_setstrn(&r->strtab, name, namesz, NULL, 0, 0);
2334 if ( ! roff_evalnum(r, ln, buf->buf, &pos, &iv, 0)) {
2335 mandoc_msg(MANDOCERR_IT_NONUM, r->parse,
2361 if ((r->options & (MPARSE_MDOC | MPARSE_QUICK)) == 0)
2363 roff_setstr(r, *cp, NULL, 0);
2365 if (r->format == 0)
2366 r->format = MPARSE_MDOC;
2376 if ((r->options & MPARSE_QUICK) == 0)
2378 roff_setstr(r, *cp, NULL, 0);
2380 if (r->format == 0)
2381 r->format = MPARSE_MAN;
2390 if (NULL == r->tbl)
2391 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
2393 else if ( ! tbl_end(&r->tbl)) {
2406 if (NULL == r->tbl)
2407 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
2410 tbl_restart(ppos, ln, r->tbl);
2419 roff_eqndelim(struct roff *r, struct buf *buf, int pos)
2432 cp2 = strchr(cp1, r->eqn == NULL ?
2433 r->last_eqn->odelim : r->last_eqn->cdelim);
2443 if (r->eqn == NULL)
2453 if (r->eqn == NULL) {
2464 if (r->eqn != NULL)
2477 r->eqn_inline = r->eqn == NULL;
2486 assert(r->eqn == NULL);
2487 e = eqn_alloc(ppos, ln, r->parse);
2489 if (r->last_eqn) {
2490 r->last_eqn->next = e;
2491 e->delim = r->last_eqn->delim;
2492 e->odelim = r->last_eqn->odelim;
2493 e->cdelim = r->last_eqn->cdelim;
2495 r->first_eqn = r->last_eqn = e;
2497 r->eqn = r->last_eqn = e;
2500 mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos,
2510 mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, ln, ppos, "EN");
2519 if (r->tbl) {
2520 mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse,
2522 tbl_end(&r->tbl);
2525 tbl = tbl_alloc(ppos, ln, r->parse);
2527 if (r->last_tbl)
2528 r->last_tbl->next = tbl;
2530 r->first_tbl = r->last_tbl = tbl;
2532 r->tbl = r->last_tbl = tbl;
2551 if (*p == '\0' || (r->control = *p++) == '.')
2552 r->control = 0;
2555 mandoc_vmsg(MANDOCERR_ARG_EXCESS, r->parse,
2571 mandoc_msg(MANDOCERR_REQ_EMPTY, r->parse, ln, ppos, "tr");
2582 mandoc_msg(MANDOCERR_ESC_BAD, r->parse,
2593 mandoc_msg(MANDOCERR_ESC_BAD, r->parse,
2599 mandoc_vmsg(MANDOCERR_TR_ODD, r->parse,
2606 roff_setstrn(&r->xmbtab, first, fsz,
2611 if (r->xtab == NULL)
2612 r->xtab = mandoc_calloc(128,
2615 free(r->xtab[(int)*first].p);
2616 r->xtab[(int)*first].p = mandoc_strndup(second, ssz);
2617 r->xtab[(int)*first].sz = ssz;
2629 mandoc_vmsg(MANDOCERR_SO, r->parse, ln, ppos, "so %s", name);
2639 mandoc_vmsg(MANDOCERR_SO_PATH, r->parse, ln, ppos,
2669 mandoc_getarg(r->parse, &cp, ln, &pos);
2675 buf->sz = strlen(r->current_string) + 1;
2677 memcpy(n1, r->current_string, buf->sz);
2764 roff_getname(struct roff *r, char **cpp, int ln, int pos)
2787 mandoc_vmsg(MANDOCERR_NAMESC, r->parse, ln, pos,
2803 * To clear an existing entry, call with (*r, *name, NULL, 0).
2809 roff_setstr(struct roff *r, const char *name, const char *string,
2813 roff_setstrn(&r->strtab, name, strlen(name), string,
2818 roff_setstrn(struct roffkv **r, const char *name, size_t namesz,
2827 n = *r;
2840 n->next = *r;
2841 *r = n;
2890 roff_getstrn(const struct roff *r, const char *name, size_t len)
2895 for (n = r->strtab; n; n = n->next)
2909 roff_freestr(struct roffkv *r)
2913 for (n = r; n; n = nn) {
2922 roff_span(const struct roff *r)
2925 return(r->tbl ? tbl_span(r->tbl) : NULL);
2929 roff_eqn(const struct roff *r)
2932 return(r->last_eqn ? &r->last_eqn->eqn : NULL);
2941 roff_strdup(const struct roff *r, const char *p)
2949 if (NULL == r->xmbtab && NULL == r->xtab)
2966 if ('\\' != *p && r->xtab && r->xtab[(int)*p].p) {
2967 sz = r->xtab[(int)*p].sz;
2969 memcpy(res + ssz, r->xtab[(int)*p].p, sz);
2980 for (cp = r->xmbtab; cp; cp = cp->next)
3028 roff_getformat(const struct roff *r)
3031 return(r->format);
3045 roff_getcontrol(const struct roff *r, const char *cp, int *ppos)
3051 if (0 != r->control && cp[pos] == r->control)
3053 else if (0 != r->control)