static void post_bl(DECL_ARGS) { switch (n->norm->Bl.type) { case LIST_column: if (n->child != NULL) print_line(".TE", 0); break; case LIST_enum: n->norm->Bl.count = 0; break; default: break; } if (n->norm->Bl.offs) { print_line(".RE", MMAN_nl); assert(Bl_stack_len); Bl_stack_len--; assert(0 == Bl_stack[Bl_stack_len]); } else { outflags |= MMAN_PP | MMAN_nl; outflags &= ~(MMAN_sp | MMAN_br); } /* Maybe we are inside an enclosing list? */ if (NULL != n->parent->next) mid_it(); }
static void post_bd(DECL_ARGS) { enum roff_tok bef, now; /* Close out this display. */ print_line(".RE", MMAN_nl); bef = n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi; if (n->last == NULL) now = n->norm->Bd.type == DISP_unfilled || n->norm->Bd.type == DISP_literal ? ROFF_nf : ROFF_fi; else if (n->last->tok == ROFF_nf) now = ROFF_nf; else if (n->last->tok == ROFF_fi) now = ROFF_fi; else now = n->last->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi; if (bef != now) { outflags |= MMAN_nl; print_word("."); outflags &= ~MMAN_spc; print_word(roff_name[bef]); outflags |= MMAN_nl; } /* Maybe we are inside an enclosing list? */ if (NULL != n->parent->next) mid_it(); }
/* * Set up the indentation for a list item; used from pre_it(). */ static void print_width(const struct mdoc_bl *bl, const struct roff_node *child) { char buf[24]; struct roffsu su; const char *end; int numeric, remain, sz, chsz; numeric = 1; remain = 0; /* Convert the width into a number (of characters). */ if (bl->width == NULL) sz = (bl->type == LIST_hang) ? 6 : 0; else { end = a2roffsu(bl->width, &su, SCALE_MAX); if (end == NULL || *end != '\0') sz = man_strlen(bl->width); else if (SCALE_EN == su.unit) sz = su.scale; else { sz = 0; numeric = 0; } } /* XXX Rough estimation, might have multiple parts. */ if (bl->type == LIST_enum) chsz = (bl->count > 8) + 1; else if (child != NULL && child->type == ROFFT_TEXT) chsz = man_strlen(child->string); else chsz = 0; /* Maybe we are inside an enclosing list? */ mid_it(); /* * Save our own indentation, * such that child lists can use it. */ Bl_stack[Bl_stack_len++] = sz + 2; /* Set up the current list. */ if (chsz > sz && bl->type != LIST_tag) print_block(".HP", 0); else { print_block(".TP", 0); remain = sz + 2; } if (numeric) { (void)snprintf(buf, sizeof(buf), "%dn", sz + 2); print_word(buf); } else print_word(bl->width); TPremain = remain; }
static void post_dl(DECL_ARGS) { print_line(".RE", MMAN_nl); /* Maybe we are inside an enclosing list? */ if (NULL != n->parent->next) mid_it(); }
/* * Set up the indentation for a list item; used from pre_it(). */ static void print_width(const char *v, const struct mdoc_node *child, size_t defsz) { char buf[24]; struct roffsu su; size_t sz, chsz; int numeric, remain; numeric = 1; remain = 0; /* Convert v into a number (of characters). */ if (NULL == v) sz = defsz; else if (a2roffsu(v, &su, SCALE_MAX)) { if (SCALE_EN == su.unit) sz = su.scale; else { sz = 0; numeric = 0; } } else sz = strlen(v); /* XXX Rough estimation, might have multiple parts. */ chsz = (NULL != child && MDOC_TEXT == child->type) ? strlen(child->string) : 0; /* Maybe we are inside an enclosing list? */ mid_it(); /* * Save our own indentation, * such that child lists can use it. */ Bl_stack[Bl_stack_len++] = sz + 2; /* Set up the current list. */ if (defsz && chsz > sz) print_block(".HP", 0); else { print_block(".TP", 0); remain = sz + 2; } if (numeric) { (void)snprintf(buf, sizeof(buf), "%zun", sz + 2); print_word(buf); } else print_word(v); TPremain = remain; }
static void post_bd(DECL_ARGS) { /* Close out this display. */ print_line(".RE", MMAN_nl); if (DISP_unfilled == n->norm->Bd.type || DISP_literal == n->norm->Bd.type) print_line(".fi", MMAN_nl); /* Maybe we are inside an enclosing list? */ if (NULL != n->parent->next) mid_it(); }