version 1.46, 2012/11/19 02:14:45 |
version 1.50, 2013/05/29 15:40:22 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
Line 43 static int cond_body(DECL_ARGS); |
|
Line 43 static int cond_body(DECL_ARGS); |
|
static int cond_head(DECL_ARGS); |
static int cond_head(DECL_ARGS); |
static void font_push(char); |
static void font_push(char); |
static void font_pop(void); |
static void font_pop(void); |
|
static void mid_it(void); |
static void post__t(DECL_ARGS); |
static void post__t(DECL_ARGS); |
static void post_bd(DECL_ARGS); |
static void post_bd(DECL_ARGS); |
static void post_bf(DECL_ARGS); |
static void post_bf(DECL_ARGS); |
Line 407 print_offs(const char *v) |
|
Line 408 print_offs(const char *v) |
|
struct roffsu su; |
struct roffsu su; |
size_t sz; |
size_t sz; |
|
|
|
print_line(".RS", MMAN_Bk_susp); |
|
|
/* Convert v into a number (of characters). */ |
/* Convert v into a number (of characters). */ |
if (NULL == v || '\0' == *v || 0 == strcmp(v, "left")) |
if (NULL == v || '\0' == *v || 0 == strcmp(v, "left")) |
sz = 0; |
sz = 0; |
Line 426 print_offs(const char *v) |
|
Line 429 print_offs(const char *v) |
|
* in terms of different units. |
* in terms of different units. |
*/ |
*/ |
print_word(v); |
print_word(v); |
|
outflags |= MMAN_nl; |
return; |
return; |
} |
} |
} else |
} else |
Line 440 print_offs(const char *v) |
|
Line 444 print_offs(const char *v) |
|
|
|
snprintf(buf, sizeof(buf), "%ldn", sz); |
snprintf(buf, sizeof(buf), "%ldn", sz); |
print_word(buf); |
print_word(buf); |
|
outflags |= MMAN_nl; |
} |
} |
|
|
|
/* |
|
* Set up the indentation for a list item; used from pre_it(). |
|
*/ |
void |
void |
print_width(const char *v, const struct mdoc_node *child, size_t defsz) |
print_width(const char *v, const struct mdoc_node *child, size_t defsz) |
{ |
{ |
Line 470 print_width(const char *v, const struct mdoc_node *chi |
|
Line 478 print_width(const char *v, const struct mdoc_node *chi |
|
chsz = (NULL != child && MDOC_TEXT == child->type) ? |
chsz = (NULL != child && MDOC_TEXT == child->type) ? |
strlen(child->string) : 0; |
strlen(child->string) : 0; |
|
|
/* |
/* Maybe we are inside an enclosing list? */ |
* If we are inside an enclosing list, |
mid_it(); |
* preserve its indentation. |
|
*/ |
|
if (Bl_stack_len && Bl_stack[Bl_stack_len - 1]) { |
|
print_line(".RS", MMAN_Bk_susp); |
|
snprintf(buf, sizeof(buf), "%ldn", |
|
Bl_stack[Bl_stack_len - 1]); |
|
print_word(buf); |
|
} |
|
|
|
/* |
/* |
* Save our own indentation, |
* Save our own indentation, |
Line 829 pre_bd(DECL_ARGS) |
|
Line 829 pre_bd(DECL_ARGS) |
|
print_line(".nf", 0); |
print_line(".nf", 0); |
if (0 == n->norm->Bd.comp && NULL != n->parent->prev) |
if (0 == n->norm->Bd.comp && NULL != n->parent->prev) |
outflags |= MMAN_sp; |
outflags |= MMAN_sp; |
print_line(".RS", MMAN_Bk_susp); |
|
print_offs(n->norm->Bd.offs); |
print_offs(n->norm->Bd.offs); |
outflags |= MMAN_nl; |
|
return(1); |
return(1); |
} |
} |
|
|
static void |
static void |
post_bd(DECL_ARGS) |
post_bd(DECL_ARGS) |
{ |
{ |
char buf[24]; |
|
|
|
/* Close out this display. */ |
/* Close out this display. */ |
print_line(".RE", MMAN_nl); |
print_line(".RE", MMAN_nl); |
Line 846 post_bd(DECL_ARGS) |
|
Line 843 post_bd(DECL_ARGS) |
|
DISP_literal == n->norm->Bd.type) |
DISP_literal == n->norm->Bd.type) |
print_line(".fi", MMAN_nl); |
print_line(".fi", MMAN_nl); |
|
|
/* |
/* Maybe we are inside an enclosing list? */ |
* If we are inside an enclosing list and the current |
if (NULL != n->parent->next) |
* list item is not yet finished, restore the correct |
mid_it(); |
* indentation for what remains of that item. |
|
*/ |
|
if (NULL != n->parent->next && |
|
Bl_stack_len && Bl_stack[Bl_stack_len - 1]) { |
|
print_line(".RS", MMAN_Bk_susp); |
|
snprintf(buf, sizeof(buf), "%ldn", |
|
Bl_stack[Bl_stack_len - 1]); |
|
print_word(buf); |
|
/* Remeber to close out this .RS block later. */ |
|
Bl_stack_post[Bl_stack_len - 1] = 1; |
|
} |
|
} |
} |
|
|
static int |
static int |
|
|
post_bk(DECL_ARGS) |
post_bk(DECL_ARGS) |
{ |
{ |
|
|
if (MDOC_BODY == n->type) |
if (MDOC_BODY == n->type && ! (MDOC_SYNPRETTY & n->flags)) |
outflags &= ~MMAN_Bk; |
outflags &= ~MMAN_Bk; |
} |
} |
|
|
Line 924 pre_bl(DECL_ARGS) |
|
Line 910 pre_bl(DECL_ARGS) |
|
{ |
{ |
size_t icol; |
size_t icol; |
|
|
|
/* |
|
* print_offs() will increase the -offset to account for |
|
* a possible enclosing .It, but any enclosed .It blocks |
|
* just nest and do not add up their indentation. |
|
*/ |
|
if (n->norm->Bl.offs) { |
|
print_offs(n->norm->Bl.offs); |
|
Bl_stack[Bl_stack_len++] = 0; |
|
} |
|
|
switch (n->norm->Bl.type) { |
switch (n->norm->Bl.type) { |
case (LIST_enum): |
case (LIST_enum): |
n->norm->Bl.count = 0; |
n->norm->Bl.count = 0; |
Line 956 post_bl(DECL_ARGS) |
|
Line 952 post_bl(DECL_ARGS) |
|
default: |
default: |
break; |
break; |
} |
} |
outflags |= MMAN_PP | MMAN_nl; |
|
outflags &= ~(MMAN_sp | MMAN_br); |
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 int |
static int |
|
|
pre_dl(DECL_ARGS) |
pre_dl(DECL_ARGS) |
{ |
{ |
|
|
print_line(".RS 6n", MMAN_nl); |
print_offs("6n"); |
return(1); |
return(1); |
} |
} |
|
|
Line 1001 post_dl(DECL_ARGS) |
|
Line 1010 post_dl(DECL_ARGS) |
|
{ |
{ |
|
|
print_line(".RE", MMAN_nl); |
print_line(".RE", MMAN_nl); |
|
|
|
/* Maybe we are inside an enclosing list? */ |
|
if (NULL != n->parent->next) |
|
mid_it(); |
} |
} |
|
|
static int |
static int |
Line 1263 pre_it(DECL_ARGS) |
|
Line 1276 pre_it(DECL_ARGS) |
|
return(1); |
return(1); |
} |
} |
|
|
|
/* |
|
* This function is called after closing out an indented block. |
|
* If we are inside an enclosing list, restore its indentation. |
|
*/ |
static void |
static void |
|
mid_it(void) |
|
{ |
|
char buf[24]; |
|
|
|
/* Nothing to do outside a list. */ |
|
if (0 == Bl_stack_len || 0 == Bl_stack[Bl_stack_len - 1]) |
|
return; |
|
|
|
/* The indentation has already been set up. */ |
|
if (Bl_stack_post[Bl_stack_len - 1]) |
|
return; |
|
|
|
/* Restore the indentation of the enclosing list. */ |
|
print_line(".RS", MMAN_Bk_susp); |
|
snprintf(buf, sizeof(buf), "%ldn", Bl_stack[Bl_stack_len - 1]); |
|
print_word(buf); |
|
|
|
/* Remeber to close out this .RS block later. */ |
|
Bl_stack_post[Bl_stack_len - 1] = 1; |
|
} |
|
|
|
static void |
post_it(DECL_ARGS) |
post_it(DECL_ARGS) |
{ |
{ |
const struct mdoc_node *bln; |
const struct mdoc_node *bln; |
Line 1302 post_it(DECL_ARGS) |
|
Line 1341 post_it(DECL_ARGS) |
|
|
|
/* |
/* |
* Our indentation had to be restored |
* Our indentation had to be restored |
* after a child display. |
* after a child display or child list. |
* Close out that indentation block now. |
* Close out that indentation block now. |
*/ |
*/ |
if (Bl_stack_post[Bl_stack_len]) { |
if (Bl_stack_post[Bl_stack_len]) { |
print_line(".RE", MMAN_nl); |
print_line(".RE", MMAN_nl); |
Bl_stack_post[Bl_stack_len] = 0; |
Bl_stack_post[Bl_stack_len] = 0; |
} |
} |
|
|
/* |
|
* We are inside an enclosing list. |
|
* Restore the indentation of that list. |
|
*/ |
|
if (Bl_stack_len && Bl_stack[Bl_stack_len - 1]) |
|
print_line(".RE", MMAN_nl); |
|
break; |
break; |
case (LIST_column): |
case (LIST_column): |
if (NULL != n->next) { |
if (NULL != n->next) { |