/* * Allocate a word and check whether it's punctuation or not. * Punctuation consists of those tokens found in mdoc_isdelim(). */ static void dword(struct roff_man *mdoc, int line, int col, const char *p, enum mdelim d, int may_append) { if (d == DELIM_MAX) d = mdoc_isdelim(p); if (may_append && ! (mdoc->flags & (MDOC_SYNOPSIS | MDOC_KEEP | MDOC_SMOFF)) && d == DELIM_NONE && mdoc->last->type == ROFFT_TEXT && mdoc_isdelim(mdoc->last->string) == DELIM_NONE) { roff_word_append(mdoc, p); return; } roff_word_alloc(mdoc, line, col, p); /* * If the word consists of a bare delimiter, * flag the new node accordingly, * unless doing so was vetoed by the invoking macro. * Always clear the veto, it is only valid for one word. */ if (d == DELIM_OPEN) mdoc->last->flags |= MDOC_DELIMO; else if (d == DELIM_CLOSE && ! (mdoc->flags & MDOC_NODELIMC) && mdoc->last->parent->tok != MDOC_Fd) mdoc->last->flags |= MDOC_DELIMC; mdoc->flags &= ~MDOC_NODELIMC; }
void in_line_eoln(MACRO_PROT_ARGS) { int la; char *p; struct roff_node *n; roff_elem_alloc(man, line, ppos, tok); n = man->last; for (;;) { if (buf[*pos] != '\0' && (tok == MAN_br || tok == MAN_fi || tok == MAN_nf)) { mandoc_vmsg(MANDOCERR_ARG_SKIP, man->parse, line, *pos, "%s %s", man_macronames[tok], buf + *pos); break; } if (buf[*pos] != '\0' && man->last != n && (tok == MAN_PD || tok == MAN_ft || tok == MAN_sp)) { mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse, line, *pos, "%s ... %s", man_macronames[tok], buf + *pos); break; } la = *pos; if ( ! man_args(man, line, pos, buf, &p)) break; if (man_macros[tok].flags & MAN_JOIN && man->last->type == ROFFT_TEXT) roff_word_append(man, p); else roff_word_alloc(man, line, la, p); } /* * Append MAN_EOS in case the last snipped argument * ends with a dot, e.g. `.IR syslog (3).' */ if (n != man->last && mandoc_eos(man->last->string, strlen(man->last->string))) man->last->flags |= MAN_EOS; /* * If no arguments are specified and this is MAN_SCOPED (i.e., * next-line scoped), then set our mode to indicate that we're * waiting for terms to load into our context. */ if (n == man->last && man_macros[tok].flags & MAN_SCOPED) { assert( ! (man_macros[tok].flags & MAN_NSCOPED)); man->flags |= MAN_ELINE; return; } assert(man->last->type != ROFFT_ROOT); man->next = ROFF_NEXT_SIBLING; /* Rewind our element scope. */ for ( ; man->last; man->last = man->last->parent) { man_state(man, man->last); if (man->last == n) break; } }