/* ARGSUSED */ static int pre_RS(DECL_ARGS) { const struct man_node *nn; int ival; switch (n->type) { case (MAN_BLOCK): term_newln(p); return(1); case (MAN_HEAD): return(0); default: break; } if (NULL == (nn = n->parent->head->child)) { mt->offset = mt->lmargin + term_len(p, INDENT); p->offset = mt->offset; return(1); } if ((ival = a2width(p, nn->string)) < 0) return(1); mt->offset = term_len(p, INDENT) + (size_t)ival; p->offset = mt->offset; return(1); }
/* ARGSUSED */ static int pre_SS(DECL_ARGS) { switch (n->type) { case (MAN_BLOCK): mt->lmargin = term_len(p, INDENT); mt->offset = term_len(p, INDENT); /* If following a prior empty `SS', no vspace. */ if (n->prev && MAN_SS == n->prev->tok) if (NULL == n->prev->body->child) break; if (NULL == n->prev) break; term_vspace(p); break; case (MAN_HEAD): term_fontrepl(p, TERMFONT_BOLD); p->offset = term_len(p, HALFINDENT); break; case (MAN_BODY): p->offset = mt->offset; break; default: break; } return(1); }
/* ARGSUSED */ static int pre_SH(DECL_ARGS) { switch (n->type) { case (MAN_BLOCK): mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); /* If following a prior empty `SH', no vspace. */ if (n->prev && MAN_SH == n->prev->tok) if (NULL == n->prev->body->child) break; /* If the first macro, no vspae. */ if (NULL == n->prev) break; term_vspace(p); break; case (MAN_HEAD): term_fontrepl(p, TERMFONT_BOLD); p->offset = 0; break; case (MAN_BODY): p->offset = mt->offset; break; default: break; } return(1); }
static int pre_SS(DECL_ARGS) { int i; switch (n->type) { case MAN_BLOCK: mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); /* If following a prior empty `SS', no vspace. */ if (n->prev && MAN_SS == n->prev->tok) if (NULL == n->prev->body->child) break; if (NULL == n->prev) break; for (i = 0; i < mt->pardist; i++) term_vspace(p); break; case MAN_HEAD: term_fontrepl(p, TERMFONT_BOLD); p->offset = term_len(p, 3); break; case MAN_BODY: p->offset = mt->offset; break; default: break; } return(1); }
static int termp_nm_pre(DECL_ARGS) { const char *cp; if (n->type == ROFFT_BLOCK) { p->flags |= TERMP_PREKEEP; return 1; } if (n->type == ROFFT_BODY) { if (NULL == n->child) return 0; p->flags |= TERMP_NOSPACE; cp = NULL; if (n->prev->child != NULL) cp = n->prev->child->string; if (cp == NULL) cp = meta->name; if (cp == NULL) p->offset += term_len(p, 6); else p->offset += term_len(p, 1) + term_strlen(p, cp); return 1; } if (NULL == n->child && NULL == meta->name) return 0; if (n->type == ROFFT_HEAD) synopsis_pre(p, n->parent); if (n->type == ROFFT_HEAD && NULL != n->next && NULL != n->next->child) { p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_BRIND; p->trailspace = 1; p->rmargin = p->offset + term_len(p, 1); if (NULL == n->child) { p->rmargin += term_strlen(p, meta->name); } else if (n->child->type == ROFFT_TEXT) { p->rmargin += term_strlen(p, n->child->string); if (n->child->next) p->flags |= TERMP_HANG; } else { p->rmargin += term_len(p, 5); p->flags |= TERMP_HANG; } } term_fontpush(p, TERMFONT_BOLD); if (NULL == n->child) term_word(p, meta->name); return 1; }
/* ARGSUSED */ static int termp_nm_pre(DECL_ARGS) { if (MDOC_BLOCK == n->type) { p->flags |= TERMP_PREKEEP; return(1); } if (MDOC_BODY == n->type) { if (NULL == n->child) return(0); p->flags |= TERMP_NOSPACE; p->offset += term_len(p, 1) + (NULL == n->prev->child ? term_strlen(p, meta->name) : MDOC_TEXT == n->prev->child->type ? term_strlen(p, n->prev->child->string) : term_len(p, 5)); return(1); } if (NULL == n->child && NULL == meta->name) return(0); if (MDOC_HEAD == n->type) synopsis_pre(p, n->parent); if (MDOC_HEAD == n->type && n->next->child) { p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; p->trailspace = 1; p->rmargin = p->offset + term_len(p, 1); if (NULL == n->child) { p->rmargin += term_strlen(p, meta->name); } else if (MDOC_TEXT == n->child->type) { p->rmargin += term_strlen(p, n->child->string); if (n->child->next) p->flags |= TERMP_HANG; } else { p->rmargin += term_len(p, 5); p->flags |= TERMP_HANG; } } term_fontpush(p, TERMFONT_BOLD); if (NULL == n->child) term_word(p, meta->name); return(1); }
static int termp_sh_pre(DECL_ARGS) { switch (n->type) { case MDOC_BLOCK: /* * Vertical space before sections, except * when the previous section was empty. */ if (n->prev == NULL || MDOC_Sh != n->prev->tok || (n->prev->body != NULL && n->prev->body->child != NULL)) term_vspace(p); break; case MDOC_HEAD: term_fontpush(p, TERMFONT_BOLD); break; case MDOC_BODY: p->offset = term_len(p, p->defindent); if (SEC_AUTHORS == n->sec) p->flags &= ~(TERMP_SPLIT|TERMP_NOSPLIT); break; default: break; } return(1); }
void terminal_mdoc(void *arg, const struct mdoc *mdoc) { const struct mdoc_node *n; const struct mdoc_meta *m; struct termp *p; p = (struct termp *)arg; p->overstep = 0; p->maxrmargin = p->defrmargin; p->tabwidth = term_len(p, 5); if (NULL == p->symtab) switch (p->enc) { case (TERMENC_ASCII): p->symtab = chars_init(CHARS_ASCII); break; default: abort(); /* NOTREACHED */ } n = mdoc_node(mdoc); m = mdoc_meta(mdoc); term_begin(p, print_mdoc_head, print_mdoc_foot, m); if (n->child) print_mdoc_nodelist(p, NULL, m, n->child); term_end(p); }
static int pre_RS(DECL_ARGS) { struct roffsu su; switch (n->type) { case MAN_BLOCK: term_newln(p); return(1); case MAN_HEAD: return(0); default: break; } n = n->parent->head; n->aux = SHRT_MAX + 1; if (n->child != NULL && a2roffsu(n->child->string, &su, SCALE_EN)) n->aux = term_hspan(p, &su); if (n->aux < 0 && (size_t)(-n->aux) > mt->offset) n->aux = -mt->offset; else if (n->aux > SHRT_MAX) n->aux = term_len(p, p->defindent); mt->offset += n->aux; p->offset = mt->offset; p->rmargin = p->maxrmargin; if (++mt->lmarginsz < MAXMARGINS) mt->lmargincur = mt->lmarginsz; mt->lmargin[mt->lmargincur] = mt->lmargin[mt->lmargincur - 1]; return(1); }
static int pre_IP(DECL_ARGS) { struct roffsu su; const struct roff_node *nn; int len, savelit; switch (n->type) { case ROFFT_BODY: p->flags |= TERMP_NOSPACE; break; case ROFFT_HEAD: p->flags |= TERMP_NOBREAK; p->trailspace = 1; break; case ROFFT_BLOCK: print_bvspace(p, n, mt->pardist); /* FALLTHROUGH */ default: return 1; } /* Calculate the offset from the optional second argument. */ if ((nn = n->parent->head->child) != NULL && (nn = nn->next) != NULL && a2roffsu(nn->string, &su, SCALE_EN)) { len = term_hspan(p, &su) / 24; if (len < 0 && (size_t)(-len) > mt->offset) len = -mt->offset; else if (len > SHRT_MAX) len = term_len(p, p->defindent); mt->lmargin[mt->lmargincur] = len; } else len = mt->lmargin[mt->lmargincur]; switch (n->type) { case ROFFT_HEAD: p->offset = mt->offset; p->rmargin = mt->offset + len; savelit = MANT_LITERAL & mt->fl; mt->fl &= ~MANT_LITERAL; if (n->child) print_man_node(p, mt, n->child, meta); if (savelit) mt->fl |= MANT_LITERAL; return 0; case ROFFT_BODY: p->offset = mt->offset + len; p->rmargin = p->maxrmargin; break; default: break; } return 1; }
/* ARGSUSED */ static int termp_fn_pre(DECL_ARGS) { size_t rmargin = 0; int pretty; pretty = MDOC_SYNPRETTY & n->flags; synopsis_pre(p, n); if (NULL == (n = n->child)) return(0); if (pretty) { rmargin = p->rmargin; p->rmargin = p->offset + term_len(p, 4); p->flags |= TERMP_NOBREAK | TERMP_HANG; } assert(MDOC_TEXT == n->type); term_fontpush(p, TERMFONT_BOLD); term_word(p, n->string); term_fontpop(p); if (pretty) { term_flushln(p); p->flags &= ~(TERMP_NOBREAK | TERMP_HANG); p->offset = p->rmargin; p->rmargin = rmargin; } p->flags |= TERMP_NOSPACE; term_word(p, "("); p->flags |= TERMP_NOSPACE; for (n = n->next; n; n = n->next) { assert(MDOC_TEXT == n->type); term_fontpush(p, TERMFONT_UNDER); if (pretty) p->flags |= TERMP_NBRWORD; term_word(p, n->string); term_fontpop(p); if (n->next) { p->flags |= TERMP_NOSPACE; term_word(p, ","); } } p->flags |= TERMP_NOSPACE; term_word(p, ")"); if (pretty) { p->flags |= TERMP_NOSPACE; term_word(p, ";"); term_flushln(p); } return(0); }
static void tbl_literal(struct termp *tp, const struct tbl_dat *dp, const struct roffcol *col) { size_t len, padl, padr; assert(dp->string); len = term_strlen(tp, dp->string); padr = col->width > len ? col->width - len : 0; padl = 0; switch (dp->layout->pos) { case (TBL_CELL_LONG): padl = term_len(tp, 1); padr = padr > padl ? padr - padl : 0; break; case (TBL_CELL_CENTRE): if (2 > padr) break; padl = padr / 2; padr -= padl; break; case (TBL_CELL_RIGHT): padl = padr; padr = 0; break; default: break; } tbl_char(tp, ASCII_NBRSP, padl); term_word(tp, dp->string); tbl_char(tp, ASCII_NBRSP, padr); }
/* ARGSUSED */ static void post_RS(DECL_ARGS) { int ival; size_t sz; switch (n->type) { case (MAN_BLOCK): return; case (MAN_HEAD): return; default: term_newln(p); break; } sz = term_len(p, p->defindent); if (NULL != (n = n->parent->head->child)) if ((ival = a2width(p, n->string)) >= 0) sz = (size_t)ival; mt->offset = mt->offset < sz ? 0 : mt->offset - sz; p->offset = mt->offset; if (--mt->lmarginsz < MAXMARGINS) mt->lmargincur = mt->lmarginsz; }
/* ARGSUSED */ static int termp_sh_pre(DECL_ARGS) { /* No vspace between consecutive `Sh' calls. */ switch (n->type) { case (MDOC_BLOCK): if (n->prev && MDOC_Sh == n->prev->tok) if (NULL == n->prev->body->child) break; term_vspace(p); break; case (MDOC_HEAD): term_fontpush(p, TERMFONT_BOLD); break; case (MDOC_BODY): p->offset = term_len(p, p->defindent); if (SEC_AUTHORS == n->sec) p->flags &= ~(TERMP_SPLIT|TERMP_NOSPLIT); break; default: break; } return(1); }
/* ARGSUSED */ static int pre_RS(DECL_ARGS) { int ival; size_t sz; switch (n->type) { case (MAN_BLOCK): term_newln(p); return(1); case (MAN_HEAD): return(0); default: break; } sz = term_len(p, p->defindent); if (NULL != (n = n->parent->head->child)) if ((ival = a2width(p, n->string)) >= 0) sz = (size_t)ival; mt->offset += sz; p->rmargin = p->maxrmargin; p->offset = mt->offset < p->rmargin ? mt->offset : p->rmargin; if (++mt->lmarginsz < MAXMARGINS) mt->lmargincur = mt->lmarginsz; mt->lmargin[mt->lmargincur] = mt->lmargin[mt->lmargincur - 1]; return(1); }
/* ARGSUSED */ static void post_RS(DECL_ARGS) { switch (n->type) { case (MAN_BLOCK): mt->offset = mt->lmargin = term_len(p, INDENT); break; case (MAN_HEAD): break; default: term_newln(p); p->offset = term_len(p, INDENT); break; } }
void terminal_mdoc(void *arg, const struct mdoc *mdoc) { const struct mdoc_node *n; const struct mdoc_meta *meta; struct termp *p; p = (struct termp *)arg; if (0 == p->defindent) p->defindent = 5; p->overstep = 0; p->maxrmargin = p->defrmargin; p->tabwidth = term_len(p, 5); if (NULL == p->symtab) p->symtab = mchars_alloc(); n = mdoc_node(mdoc); meta = mdoc_meta(mdoc); term_begin(p, print_mdoc_head, print_mdoc_foot, meta); if (n->child) print_mdoc_nodelist(p, NULL, meta, n->child); term_end(p); }
void terminal_man(void *arg, const struct man *man) { struct termp *p; const struct man_meta *meta; struct man_node *n; struct mtermp mt; p = (struct termp *)arg; p->overstep = 0; p->rmargin = p->maxrmargin = p->defrmargin; p->tabwidth = term_len(p, 5); n = man_node(man)->child; meta = man_meta(man); memset(&mt, 0, sizeof(struct mtermp)); mt.lmargin[mt.lmargincur] = term_len(p, p->defindent); mt.offset = term_len(p, p->defindent); mt.pardist = 1; if (p->synopsisonly) { while (n != NULL) { if (n->tok == MAN_SH && n->child->child->type == MAN_TEXT && !strcmp(n->child->child->string, "SYNOPSIS")) { if (n->child->next->child != NULL) print_man_nodelist(p, &mt, n->child->next->child, meta); term_newln(p); break; } n = n->next; } } else { if (p->defindent == 0) p->defindent = 7; term_begin(p, print_man_head, print_man_foot, meta); p->flags |= TERMP_NOSPACE; if (n != NULL) print_man_nodelist(p, &mt, n, meta); term_end(p); } }
static int pre_SS(DECL_ARGS) { int i; switch (n->type) { case ROFFT_BLOCK: mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); /* * No vertical space before the first subsection * and after an empty subsection. */ do { n = n->prev; } while (n != NULL && n->tok != TOKEN_NONE && termacts[n->tok].flags & MAN_NOTEXT); if (n == NULL || (n->tok == MAN_SS && n->body->child == NULL)) break; for (i = 0; i < mt->pardist; i++) term_vspace(p); break; case ROFFT_HEAD: term_fontrepl(p, TERMFONT_BOLD); p->offset = term_len(p, 3); p->rmargin = mt->offset; p->trailspace = mt->offset; p->flags |= TERMP_NOBREAK | TERMP_BRIND; break; case ROFFT_BODY: p->offset = mt->offset; p->rmargin = p->maxrmargin; p->trailspace = 0; p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND); break; default: break; } return 1; }
static size_t a2offs(const struct termp *p, const char *v) { struct roffsu su; if ('\0' == *v) return(0); else if (0 == strcmp(v, "left")) return(0); else if (0 == strcmp(v, "indent")) return(term_len(p, p->defindent + 1)); else if (0 == strcmp(v, "indent-two")) return(term_len(p, (p->defindent + 1) * 2)); else if ( ! a2roffsu(v, &su, SCALE_MAX)) SCALE_HS_INIT(&su, term_strlen(p, v)); return(term_hspan(p, &su)); }
static void tbl_number(struct termp *tp, const struct tbl *tbl, const struct tbl_dat *dp, const struct roffcol *col) { char *cp; char buf[2]; const char *str; size_t sz, psz, ssz, d, padl; int i; /* * See calc_data_number(). Left-pad by taking the offset of our * and the maximum decimal; right-pad by the remaining amount. */ str = dp && dp->string ? dp->string : ""; sz = term_strlen(tp, str); buf[0] = tbl->decimal; buf[1] = '\0'; psz = term_strlen(tp, buf); if (NULL != (cp = strchr(str, tbl->decimal))) { buf[1] = '\0'; for (ssz = 0, i = 0; cp != &str[i]; i++) { buf[0] = str[i]; ssz += term_strlen(tp, buf); } d = ssz + psz; } else d = sz + psz; sz += term_len(tp, 2); d += term_len(tp, 1); padl = col->decimal - d; tbl_char(tp, ASCII_NBRSP, padl); term_word(tp, str); tbl_char(tp, ASCII_NBRSP, col->width - sz - padl); }
static int termp_d1_pre(DECL_ARGS) { if (n->type != ROFFT_BLOCK) return 1; term_newln(p); p->offset += term_len(p, p->defindent + 1); return 1; }
/* ARGSUSED */ static int termp_d1_pre(DECL_ARGS) { if (MDOC_BLOCK != n->type) return(1); term_newln(p); p->offset += term_len(p, p->defindent + 1); return(1); }
static size_t a2height(const struct termp *p, const char *v) { struct roffsu su; assert(v); if ( ! a2roffsu(v, &su, SCALE_VS)) SCALE_VS_INIT(&su, term_len(p, 1)); return(term_vspan(p, &su)); }
void terminal_man(void *arg, const struct man *man) { struct termp *p; const struct man_node *n; const struct man_meta *m; struct mtermp mt; p = (struct termp *)arg; p->overstep = 0; p->maxrmargin = p->defrmargin; p->tabwidth = term_len(p, 5); if (NULL == p->symtab) switch (p->enc) { case (TERMENC_ASCII): p->symtab = chars_init(CHARS_ASCII); break; default: abort(); /* NOTREACHED */ } n = man_node(man); m = man_meta(man); term_begin(p, print_man_head, print_man_foot, m); p->flags |= TERMP_NOSPACE; mt.fl = 0; mt.lmargin = term_len(p, INDENT); mt.offset = term_len(p, INDENT); if (n->child) print_man_nodelist(p, &mt, n->child, m); term_end(p); }
static void print_mdoc_foot(struct termp *p, const void *arg) { const struct mdoc_meta *meta; size_t sz; meta = (const struct mdoc_meta *)arg; term_fontrepl(p, TERMFONT_NONE); /* * Output the footer in new-groff style, that is, three columns * with the middle being the manual date and flanking columns * being the operating system: * * SYSTEM DATE SYSTEM */ term_vspace(p); p->offset = 0; sz = term_strlen(p, meta->date); p->rmargin = p->maxrmargin > sz ? (p->maxrmargin + term_len(p, 1) - sz) / 2 : 0; p->trailspace = 1; p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; term_word(p, meta->os); term_flushln(p); p->offset = p->rmargin; sz = term_strlen(p, meta->os); p->rmargin = p->maxrmargin > sz ? p->maxrmargin - sz : 0; p->flags |= TERMP_NOSPACE; term_word(p, meta->date); term_flushln(p); p->offset = p->rmargin; p->rmargin = p->maxrmargin; p->trailspace = 0; p->flags &= ~TERMP_NOBREAK; p->flags |= TERMP_NOSPACE; term_word(p, meta->os); term_flushln(p); p->offset = 0; p->rmargin = p->maxrmargin; p->flags = 0; }
static int pre_SH(DECL_ARGS) { int i; switch (n->type) { case MAN_BLOCK: mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); /* * No vertical space before the first section * and after an empty section. */ do { n = n->prev; } while (n != NULL && termacts[n->tok].flags & MAN_NOTEXT); if (n == NULL || (n->tok == MAN_SH && n->body->child == NULL)) break; for (i = 0; i < mt->pardist; i++) term_vspace(p); break; case MAN_HEAD: term_fontrepl(p, TERMFONT_BOLD); p->offset = 0; break; case MAN_BODY: p->offset = mt->offset; break; default: break; } return(1); }
static int termp_ss_pre(DECL_ARGS) { switch (n->type) { case ROFFT_BLOCK: term_newln(p); if (n->prev) term_vspace(p); break; case ROFFT_HEAD: term_fontpush(p, TERMFONT_BOLD); p->offset = term_len(p, (p->defindent+1)/2); break; case ROFFT_BODY: p->offset = term_len(p, p->defindent); break; default: break; } return 1; }
static void print_mdoc_foot(struct termp *p, const void *arg) { char buf[DATESIZ], os[BUFSIZ]; const struct mdoc_meta *m; m = (const struct mdoc_meta *)arg; term_fontrepl(p, TERMFONT_NONE); /* * Output the footer in new-groff style, that is, three columns * with the middle being the manual date and flanking columns * being the operating system: * * SYSTEM DATE SYSTEM */ time2a(m->date, buf, DATESIZ); strlcpy(os, m->os, BUFSIZ); term_vspace(p); p->offset = 0; p->rmargin = (p->maxrmargin - term_strlen(p, buf) + term_len(p, 1)) / 2; p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; term_word(p, os); term_flushln(p); p->offset = p->rmargin; p->rmargin = p->maxrmargin - term_strlen(p, os); p->flags |= TERMP_NOLPAD | TERMP_NOSPACE; term_word(p, buf); term_flushln(p); p->offset = p->rmargin; p->rmargin = p->maxrmargin; p->flags &= ~TERMP_NOBREAK; p->flags |= TERMP_NOLPAD | TERMP_NOSPACE; term_word(p, os); term_flushln(p); p->offset = 0; p->rmargin = p->maxrmargin; p->flags = 0; }
void terminal_man(void *arg, const struct man *man) { struct termp *p; const struct man_node *n; const struct man_meta *meta; struct mtermp mt; p = (struct termp *)arg; if (0 == p->defindent) p->defindent = 7; p->overstep = 0; p->maxrmargin = p->defrmargin; p->tabwidth = term_len(p, 5); if (NULL == p->symtab) p->symtab = mchars_alloc(); n = man_node(man); meta = man_meta(man); term_begin(p, print_man_head, print_man_foot, meta); p->flags |= TERMP_NOSPACE; memset(&mt, 0, sizeof(struct mtermp)); mt.lmargin[mt.lmargincur] = term_len(p, p->defindent); mt.offset = term_len(p, p->defindent); mt.pardist = 1; if (n->child) print_man_nodelist(p, &mt, n->child, meta); term_end(p); }