=================================================================== RCS file: /cvs/mandoc/mdoc_man.c,v retrieving revision 1.8 retrieving revision 1.11 diff -u -p -r1.8 -r1.11 --- mandoc/mdoc_man.c 2011/10/20 20:27:21 1.8 +++ mandoc/mdoc_man.c 2012/07/07 13:46:59 1.11 @@ -1,6 +1,6 @@ -/* $Id: mdoc_man.c,v 1.8 2011/10/20 20:27:21 schwarze Exp $ */ +/* $Id: mdoc_man.c,v 1.11 2012/07/07 13:46:59 schwarze Exp $ */ /* - * Copyright (c) 2011 Ingo Schwarze + * Copyright (c) 2011, 2012 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 @@ -22,6 +22,7 @@ #include #include "mandoc.h" +#include "out.h" #include "man.h" #include "mdoc.h" #include "main.h" @@ -68,6 +69,7 @@ static int pre_sect(DECL_ARGS); static int pre_ux(DECL_ARGS); static int pre_xr(DECL_ARGS); static void print_word(struct mman *, const char *); +static void print_offs(struct mman *, const char *); static void print_node(DECL_ARGS); static const struct manact manacts[MDOC_MAX + 1] = { @@ -85,14 +87,14 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, NULL, NULL, NULL, NULL }, /* Bl */ { NULL, NULL, NULL, NULL, NULL }, /* El */ { NULL, pre_it, NULL, NULL, NULL }, /* _It */ - { NULL, NULL, NULL, NULL, NULL }, /* _Ad */ + { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Ad */ { NULL, NULL, NULL, NULL, NULL }, /* _An */ { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Ar */ - { NULL, NULL, NULL, NULL, NULL }, /* _Cd */ + { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Cd */ { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Cm */ - { NULL, NULL, NULL, NULL, NULL }, /* _Dv */ - { NULL, NULL, NULL, NULL, NULL }, /* _Er */ - { NULL, NULL, NULL, NULL, NULL }, /* _Ev */ + { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Dv */ + { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Er */ + { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Ev */ { NULL, pre_enc, post_enc, "The \\fB", "\\fP\nutility exits 0 on success, and >0 if an error occurs." }, /* Ex */ @@ -103,7 +105,7 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, NULL, NULL, NULL, NULL }, /* _Ft */ { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Ic */ { NULL, NULL, NULL, NULL, NULL }, /* _In */ - { NULL, NULL, NULL, NULL, NULL }, /* _Li */ + { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Li */ { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */ { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */ { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */ @@ -129,8 +131,8 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, NULL, NULL, NULL, NULL }, /* _%R */ { NULL, pre_enc, post_percent, "\"", "\"" }, /* %T */ { NULL, NULL, NULL, NULL, NULL }, /* _%V */ - { NULL, NULL, NULL, NULL, NULL }, /* _Ac */ - { NULL, NULL, NULL, NULL, NULL }, /* _Ao */ + { NULL, NULL, NULL, NULL, NULL }, /* Ac */ + { cond_body, pre_enc, post_enc, "<", ">" }, /* Ao */ { cond_body, pre_enc, post_enc, "<", ">" }, /* Aq */ { NULL, NULL, NULL, NULL, NULL }, /* At */ { NULL, NULL, NULL, NULL, NULL }, /* Bc */ @@ -140,16 +142,16 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, pre_ux, NULL, "BSD/OS", NULL }, /* Bsx */ { NULL, pre_bx, NULL, NULL, NULL }, /* Bx */ { NULL, NULL, NULL, NULL, NULL }, /* Db */ - { NULL, NULL, NULL, NULL, NULL }, /* _Dc */ - { NULL, NULL, NULL, NULL, NULL }, /* _Do */ + { NULL, NULL, NULL, NULL, NULL }, /* Dc */ + { cond_body, pre_enc, post_enc, "``", "''" }, /* Do */ { cond_body, pre_enc, post_enc, "``", "''" }, /* Dq */ { NULL, NULL, NULL, NULL, NULL }, /* _Ec */ { NULL, NULL, NULL, NULL, NULL }, /* _Ef */ { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Em */ { NULL, NULL, NULL, NULL, NULL }, /* _Eo */ { NULL, pre_ux, NULL, "FreeBSD", NULL }, /* Fx */ - { NULL, NULL, NULL, NULL, NULL }, /* _Ms */ - { NULL, NULL, NULL, NULL, NULL }, /* _No */ + { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Ms */ + { NULL, NULL, NULL, NULL, NULL }, /* No */ { NULL, pre_ns, NULL, NULL, NULL }, /* Ns */ { NULL, pre_ux, NULL, "NetBSD", NULL }, /* Nx */ { NULL, pre_ux, NULL, "OpenBSD", NULL }, /* Ox */ @@ -157,26 +159,26 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, NULL, post_pf, NULL, NULL }, /* Pf */ { cond_body, pre_enc, post_enc, "(", ")" }, /* Po */ { cond_body, pre_enc, post_enc, "(", ")" }, /* Pq */ - { NULL, NULL, NULL, NULL, NULL }, /* _Qc */ + { NULL, NULL, NULL, NULL, NULL }, /* Qc */ { cond_body, pre_enc, post_enc, "`", "'" }, /* Ql */ - { NULL, NULL, NULL, NULL, NULL }, /* _Qo */ - { NULL, NULL, NULL, NULL, NULL }, /* _Qq */ - { NULL, NULL, NULL, NULL, NULL }, /* _Re */ + { cond_body, pre_enc, post_enc, "\"", "\"" }, /* Qo */ + { cond_body, pre_enc, post_enc, "\"", "\"" }, /* Qq */ + { NULL, NULL, NULL, NULL, NULL }, /* Re */ { cond_body, pre_pp, NULL, NULL, NULL }, /* Rs */ - { NULL, NULL, NULL, NULL, NULL }, /* _Sc */ - { NULL, NULL, NULL, NULL, NULL }, /* _So */ + { NULL, NULL, NULL, NULL, NULL }, /* Sc */ + { cond_body, pre_enc, post_enc, "`", "'" }, /* So */ { cond_body, pre_enc, post_enc, "`", "'" }, /* Sq */ { NULL, NULL, NULL, NULL, NULL }, /* _Sm */ { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Sx */ { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Sy */ - { NULL, NULL, NULL, NULL, NULL }, /* _Tn */ + { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Tn */ { NULL, pre_ux, NULL, "UNIX", NULL }, /* Ux */ { NULL, NULL, NULL, NULL, NULL }, /* _Xc */ { NULL, NULL, NULL, NULL, NULL }, /* _Xo */ { NULL, NULL, NULL, NULL, NULL }, /* _Fo */ { NULL, NULL, NULL, NULL, NULL }, /* _Fc */ { cond_body, pre_enc, post_enc, "[", "]" }, /* Oo */ - { NULL, NULL, NULL, NULL, NULL }, /* _Oc */ + { NULL, NULL, NULL, NULL, NULL }, /* Oc */ { NULL, NULL, NULL, NULL, NULL }, /* _Bk */ { NULL, NULL, NULL, NULL, NULL }, /* _Ek */ { NULL, pre_ux, NULL, "is currently in beta test.", NULL }, /* Bt */ @@ -187,9 +189,9 @@ static const struct manact manacts[MDOC_MAX + 1] = { { NULL, pre_pp, NULL, NULL, NULL }, /* Lp */ { NULL, NULL, NULL, NULL, NULL }, /* _Lk */ { NULL, NULL, NULL, NULL, NULL }, /* _Mt */ - { NULL, NULL, NULL, NULL, NULL }, /* _Brq */ - { NULL, NULL, NULL, NULL, NULL }, /* _Bro */ - { NULL, NULL, NULL, NULL, NULL }, /* _Brc */ + { cond_body, pre_enc, post_enc, "{", "}" }, /* Brq */ + { cond_body, pre_enc, post_enc, "{", "}" }, /* Bro */ + { NULL, NULL, NULL, NULL, NULL }, /* Brc */ { NULL, NULL, NULL, NULL, NULL }, /* _%C */ { NULL, NULL, NULL, NULL, NULL }, /* _Es */ { NULL, NULL, NULL, NULL, NULL }, /* _En */ @@ -245,6 +247,29 @@ print_word(struct mman *mm, const char *s) } } +static void +print_offs(struct mman *mm, const char *v) +{ + char buf[24]; + struct roffsu su; + size_t sz; + + if (NULL == v || '\0' == *v || 0 == strcmp(v, "left")) + sz = 0; + else if (0 == strcmp(v, "indent")) + sz = 6; + else if (0 == strcmp(v, "indent-two")) + sz = 12; + else if (a2roffsu(v, &su, SCALE_MAX)) { + print_word(mm, v); + return; + } else + sz = strlen(v); + + snprintf(buf, sizeof(buf), "%ldn", sz); + print_word(mm, buf); +} + void man_man(void *arg, const struct man *man) { @@ -290,7 +315,7 @@ print_node(DECL_ARGS) * This makes the page structure be more consistent. */ prev = n->prev ? n->prev : n->parent; - if (prev && prev->line < n->line) + if (prev && prev->line < n->line && MDOC_Ns != prev->tok) mm->need_nl = 1; act = NULL; @@ -379,6 +404,8 @@ post_enc(DECL_ARGS) return; mm->need_space = 0; print_word(mm, suffix); + if (MDOC_Fl == n->tok && 0 == n->nchild) + mm->need_space = 0; } /* @@ -443,12 +470,19 @@ static int pre_bd(DECL_ARGS) { + if (0 == n->norm->Bd.comp) { + mm->need_nl = 1; + print_word(mm, ".sp"); + } if (DISP_unfilled == n->norm->Bd.type || DISP_literal == n->norm->Bd.type) { mm->need_nl = 1; print_word(mm, ".nf"); } mm->need_nl = 1; + print_word(mm, ".RS"); + print_offs(mm, n->norm->Bd.offs); + mm->need_nl = 1; return(1); } @@ -456,6 +490,8 @@ static void post_bd(DECL_ARGS) { + mm->need_nl = 1; + print_word(mm, ".RE"); if (DISP_unfilled == n->norm->Bd.type || DISP_literal == n->norm->Bd.type) { mm->need_nl = 1; @@ -544,6 +580,11 @@ pre_nm(DECL_ARGS) if (MDOC_ELEM != n->type && MDOC_HEAD != n->type) return(1); + if (MDOC_SYNPRETTY & n->flags) { + mm->need_nl = 1; + print_word(mm, ".br"); + mm->need_nl = 1; + } print_word(mm, "\\fB"); mm->need_space = 0; if (NULL == n->child) @@ -586,7 +627,7 @@ pre_pp(DECL_ARGS) else print_word(mm, ".PP"); mm->need_nl = 1; - return(1); + return(MDOC_Rs == n->tok); } static int