]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_man.c
To better support MLINKS, we will have to split the "docs" database
[mandoc.git] / mdoc_man.c
index dba05063bb1f980cab816ade44556c92d9fba1d5..6ee8b3abf45e5781857c765acae3a3261359f3e7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_man.c,v 1.50 2013/05/29 15:40:22 schwarze Exp $ */
+/*     $Id: mdoc_man.c,v 1.57 2013/12/25 22:00:45 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -182,8 +182,8 @@ static      const struct manact manacts[MDOC_MAX + 1] = {
        { NULL, pre_bx, NULL, NULL, NULL }, /* Bx */
        { NULL, NULL, NULL, NULL, NULL }, /* Db */
        { NULL, NULL, NULL, NULL, NULL }, /* Dc */
-       { cond_body, pre_enc, post_enc, "``", "''" }, /* Do */
-       { cond_body, pre_enc, post_enc, "``", "''" }, /* Dq */
+       { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Do */
+       { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Dq */
        { NULL, NULL, NULL, NULL, NULL }, /* Ec */
        { NULL, NULL, NULL, NULL, NULL }, /* Ef */
        { NULL, pre_em, post_font, NULL, NULL }, /* Em */
@@ -199,14 +199,14 @@ static    const struct manact manacts[MDOC_MAX + 1] = {
        { cond_body, pre_enc, post_enc, "(", ")" }, /* Po */
        { cond_body, pre_enc, post_enc, "(", ")" }, /* Pq */
        { NULL, NULL, NULL, NULL, NULL }, /* Qc */
-       { cond_body, pre_enc, post_enc, "`", "'" }, /* Ql */
+       { cond_body, pre_enc, post_enc, "\\(oq", "\\(cq" }, /* Ql */
        { cond_body, pre_enc, post_enc, "\"", "\"" }, /* Qo */
        { cond_body, pre_enc, post_enc, "\"", "\"" }, /* Qq */
        { NULL, NULL, NULL, NULL, NULL }, /* Re */
        { cond_body, pre_rs, NULL, NULL, NULL }, /* Rs */
        { NULL, NULL, NULL, NULL, NULL }, /* Sc */
-       { cond_body, pre_enc, post_enc, "`", "'" }, /* So */
-       { cond_body, pre_enc, post_enc, "`", "'" }, /* Sq */
+       { cond_body, pre_enc, post_enc, "\\(oq", "\\(cq" }, /* So */
+       { cond_body, pre_enc, post_enc, "\\(oq", "\\(cq" }, /* Sq */
        { NULL, pre_sm, NULL, NULL, NULL }, /* Sm */
        { NULL, pre_em, post_font, NULL, NULL }, /* Sx */
        { NULL, pre_sy, post_font, NULL, NULL }, /* Sy */
@@ -256,6 +256,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 +365,12 @@ print_word(const char *s)
                case (ASCII_HYPH):
                        putchar('-');
                        break;
+               case (' '):
+                       if (MMAN_nbrword & outflags) {
+                               printf("\\ ");
+                               break;
+                       }
+                       /* FALLTHROUGH */
                default:
                        putchar((unsigned char)*s);
                        break;
@@ -371,6 +378,7 @@ print_word(const char *s)
                if (TPremain)
                        TPremain--;
        }
+       outflags &= ~MMAN_nbrword;
 }
 
 static void
@@ -442,7 +450,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;
 }
@@ -495,7 +503,7 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz)
                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);
@@ -553,7 +561,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 +569,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 +713,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 +896,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 +1030,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 +1104,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 +1127,7 @@ post_fn(DECL_ARGS)
        print_word(")");
        if (MDOC_SYNPRETTY & n->flags) {
                print_word(";");
-               outflags |= MMAN_br;
+               outflags |= MMAN_PP;
        }
 }
 
@@ -1137,6 +1140,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 +1154,7 @@ pre_fo(DECL_ARGS)
        }
        return(1);
 }
-               
+
 static void
 post_fo(DECL_ARGS)
 {
@@ -1295,7 +1300,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. */
@@ -1409,8 +1414,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 +1427,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 +1440,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