=================================================================== RCS file: /cvs/mandoc/mdoc_man.c,v retrieving revision 1.51 retrieving revision 1.60 diff -u -p -r1.51 -r1.60 --- mandoc/mdoc_man.c 2013/06/02 18:16:57 1.51 +++ mandoc/mdoc_man.c 2014/03/30 19:47:48 1.60 @@ -1,6 +1,6 @@ -/* $Id: mdoc_man.c,v 1.51 2013/06/02 18:16:57 schwarze Exp $ */ +/* $Id: mdoc_man.c,v 1.60 2014/03/30 19:47:48 schwarze Exp $ */ /* - * Copyright (c) 2011, 2012, 2013 Ingo Schwarze + * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -23,6 +23,7 @@ #include #include "mandoc.h" +#include "mandoc_aux.h" #include "out.h" #include "man.h" #include "mdoc.h" @@ -89,6 +90,7 @@ static int pre_in(DECL_ARGS); static int pre_it(DECL_ARGS); static int pre_lk(DECL_ARGS); static int pre_li(DECL_ARGS); +static int pre_ll(DECL_ARGS); static int pre_nm(DECL_ARGS); static int pre_no(DECL_ARGS); static int pre_ns(DECL_ARGS); @@ -240,6 +242,7 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, pre_sp, post_sp, NULL, NULL }, /* sp */ { NULL, NULL, post_percent, NULL, NULL }, /* %U */ { NULL, NULL, NULL, NULL, NULL }, /* Ta */ + { NULL, pre_ll, post_sp, NULL, NULL }, /* ll */ { NULL, NULL, NULL, NULL, NULL }, /* ROOT */ }; @@ -256,6 +259,7 @@ static int outflags; #define MMAN_An_split (1 << 9) /* author mode is "split" */ #define MMAN_An_nosplit (1 << 10) /* author mode is "nosplit" */ #define MMAN_PD (1 << 11) /* inter-paragraph spacing disabled */ +#define MMAN_nbrword (1 << 12) /* do not break the next word */ #define BL_STACK_MAX 32 @@ -364,6 +368,15 @@ print_word(const char *s) case (ASCII_HYPH): putchar('-'); break; + case (ASCII_BREAK): + printf("\\:"); + break; + case (' '): + if (MMAN_nbrword & outflags) { + printf("\\ "); + break; + } + /* FALLTHROUGH */ default: putchar((unsigned char)*s); break; @@ -371,6 +384,7 @@ print_word(const char *s) if (TPremain) TPremain--; } + outflags &= ~MMAN_nbrword; } static void @@ -442,7 +456,7 @@ print_offs(const char *v) if (Bl_stack_len) sz += Bl_stack[Bl_stack_len - 1]; - snprintf(buf, sizeof(buf), "%ldn", sz); + snprintf(buf, sizeof(buf), "%zun", sz); print_word(buf); outflags |= MMAN_nl; } @@ -450,7 +464,7 @@ print_offs(const char *v) /* * Set up the indentation for a list item; used from pre_it(). */ -void +static void print_width(const char *v, const struct mdoc_node *child, size_t defsz) { char buf[24]; @@ -495,14 +509,14 @@ print_width(const char *v, const struct mdoc_node *chi remain = sz + 2; } if (numeric) { - snprintf(buf, sizeof(buf), "%ldn", sz + 2); + snprintf(buf, sizeof(buf), "%zun", sz + 2); print_word(buf); } else print_word(v); TPremain = remain; } -void +static void print_count(int *count) { char buf[12]; @@ -553,7 +567,7 @@ man_mdoc(void *arg, const struct mdoc *mdoc) static void print_node(DECL_ARGS) { - const struct mdoc_node *prev, *sub; + const struct mdoc_node *sub; const struct manact *act; int cond, do_sub; @@ -561,8 +575,7 @@ print_node(DECL_ARGS) * Break the line if we were parsed subsequent the current node. * This makes the page structure be more consistent. */ - prev = n->prev ? n->prev : n->parent; - if (MMAN_spc & outflags && prev && prev->line < n->line) + if (MMAN_spc & outflags && MDOC_LINE & n->flags) outflags |= MMAN_nl; act = NULL; @@ -706,24 +719,12 @@ static int pre_sect(DECL_ARGS) { - switch (n->type) { - case (MDOC_HEAD): + if (MDOC_HEAD == n->type) { outflags |= MMAN_sp; print_block(manacts[n->tok].prefix, 0); print_word(""); putchar('\"'); outflags &= ~MMAN_spc; - break; - case (MDOC_BODY): - if (MDOC_Sh == n->tok) { - if (MDOC_SYNPRETTY & n->flags) - outflags |= MMAN_Bk; - else - outflags &= ~MMAN_Bk; - } - break; - default: - break; } return(1); } @@ -901,7 +902,7 @@ static void post_bk(DECL_ARGS) { - if (MDOC_BODY == n->type && ! (MDOC_SYNPRETTY & n->flags)) + if (MDOC_BODY == n->type) outflags &= ~MMAN_Bk; } @@ -1035,12 +1036,17 @@ post_eo(DECL_ARGS) static int pre_fa(DECL_ARGS) { + int am_Fa; - if (MDOC_Fa == n->tok) + am_Fa = MDOC_Fa == n->tok; + + if (am_Fa) n = n->child; while (NULL != n) { font_push('I'); + if (am_Fa || MDOC_SYNPRETTY & n->flags) + outflags |= MMAN_nbrword; print_node(meta, n); font_pop(); if (NULL != (n = n->next)) @@ -1104,6 +1110,9 @@ pre_fn(DECL_ARGS) if (NULL == n) return(0); + if (MDOC_SYNPRETTY & n->flags) + print_block(".HP 4n", MMAN_nl); + font_push('B'); print_node(meta, n); font_pop(); @@ -1124,7 +1133,7 @@ post_fn(DECL_ARGS) print_word(")"); if (MDOC_SYNPRETTY & n->flags) { print_word(";"); - outflags |= MMAN_br; + outflags |= MMAN_PP; } } @@ -1137,6 +1146,8 @@ pre_fo(DECL_ARGS) pre_syn(n); break; case (MDOC_HEAD): + if (MDOC_SYNPRETTY & n->flags) + print_block(".HP 4n", MMAN_nl); font_push('B'); break; case (MDOC_BODY): @@ -1149,7 +1160,7 @@ pre_fo(DECL_ARGS) } return(1); } - + static void post_fo(DECL_ARGS) { @@ -1295,7 +1306,7 @@ mid_it(void) /* Restore the indentation of the enclosing list. */ print_line(".RS", MMAN_Bk_susp); - snprintf(buf, sizeof(buf), "%ldn", Bl_stack[Bl_stack_len - 1]); + snprintf(buf, sizeof(buf), "%zun", Bl_stack[Bl_stack_len - 1]); print_word(buf); /* Remeber to close out this .RS block later. */ @@ -1397,6 +1408,14 @@ pre_lk(DECL_ARGS) } static int +pre_ll(DECL_ARGS) +{ + + print_line(".ll", 0); + return(1); +} + +static int pre_li(DECL_ARGS) { @@ -1409,8 +1428,10 @@ pre_nm(DECL_ARGS) { char *name; - if (MDOC_BLOCK == n->type) + if (MDOC_BLOCK == n->type) { + outflags |= MMAN_Bk; pre_syn(n); + } if (MDOC_ELEM != n->type && MDOC_HEAD != n->type) return(1); name = n->child ? n->child->string : meta->name; @@ -1420,7 +1441,7 @@ pre_nm(DECL_ARGS) if (NULL == n->parent->prev) outflags |= MMAN_sp; print_block(".HP", 0); - printf(" %ldn", strlen(name) + 1); + printf(" %zun", strlen(name) + 1); outflags |= MMAN_nl; } font_push('B'); @@ -1433,9 +1454,18 @@ static void post_nm(DECL_ARGS) { - if (MDOC_ELEM != n->type && MDOC_HEAD != n->type) - return; - font_pop(); + switch (n->type) { + case (MDOC_BLOCK): + outflags &= ~MMAN_Bk; + break; + case (MDOC_HEAD): + /* FALLTHROUGH */ + case (MDOC_ELEM): + font_pop(); + break; + default: + break; + } } static int