[BACK]Return to mdoc_man.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mdoc_man.c between version 1.10 and 1.18

version 1.10, 2012/07/07 13:37:42 version 1.18, 2012/07/08 11:10:13
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011, 2012 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 18 
Line 18 
 #include "config.h"  #include "config.h"
 #endif  #endif
   
   #include <assert.h>
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
   
 #include "mandoc.h"  #include "mandoc.h"
   #include "out.h"
 #include "man.h"  #include "man.h"
 #include "mdoc.h"  #include "mdoc.h"
 #include "main.h"  #include "main.h"
Line 31 
Line 33 
                   struct mman *mm                    struct mman *mm
   
 struct  mman {  struct  mman {
           int               mode_space; /* spacing mode: 1 = on */
         int               need_space; /* next word needs prior ws */          int               need_space; /* next word needs prior ws */
           int               mode_keep; /* currently inside a keep */
         int               need_nl; /* next word needs prior nl */          int               need_nl; /* next word needs prior nl */
 };  };
   
Line 46  struct manact {
Line 50  struct manact {
 static  int       cond_body(DECL_ARGS);  static  int       cond_body(DECL_ARGS);
 static  int       cond_head(DECL_ARGS);  static  int       cond_head(DECL_ARGS);
 static  void      post_bd(DECL_ARGS);  static  void      post_bd(DECL_ARGS);
   static  void      post_bk(DECL_ARGS);
 static  void      post_dl(DECL_ARGS);  static  void      post_dl(DECL_ARGS);
 static  void      post_enc(DECL_ARGS);  static  void      post_enc(DECL_ARGS);
   static  void      post_fa(DECL_ARGS);
   static  void      post_fn(DECL_ARGS);
   static  void      post_fo(DECL_ARGS);
   static  void      post_in(DECL_ARGS);
   static  void      post_lb(DECL_ARGS);
 static  void      post_nm(DECL_ARGS);  static  void      post_nm(DECL_ARGS);
 static  void      post_percent(DECL_ARGS);  static  void      post_percent(DECL_ARGS);
 static  void      post_pf(DECL_ARGS);  static  void      post_pf(DECL_ARGS);
 static  void      post_sect(DECL_ARGS);  static  void      post_sect(DECL_ARGS);
 static  void      post_sp(DECL_ARGS);  static  void      post_sp(DECL_ARGS);
   static  void      post_vt(DECL_ARGS);
 static  int       pre_ap(DECL_ARGS);  static  int       pre_ap(DECL_ARGS);
 static  int       pre_bd(DECL_ARGS);  static  int       pre_bd(DECL_ARGS);
   static  int       pre_bk(DECL_ARGS);
 static  int       pre_br(DECL_ARGS);  static  int       pre_br(DECL_ARGS);
 static  int       pre_bx(DECL_ARGS);  static  int       pre_bx(DECL_ARGS);
 static  int       pre_dl(DECL_ARGS);  static  int       pre_dl(DECL_ARGS);
 static  int       pre_enc(DECL_ARGS);  static  int       pre_enc(DECL_ARGS);
   static  int       pre_fa(DECL_ARGS);
   static  int       pre_fn(DECL_ARGS);
   static  int       pre_fo(DECL_ARGS);
   static  int       pre_in(DECL_ARGS);
 static  int       pre_it(DECL_ARGS);  static  int       pre_it(DECL_ARGS);
 static  int       pre_nm(DECL_ARGS);  static  int       pre_nm(DECL_ARGS);
 static  int       pre_ns(DECL_ARGS);  static  int       pre_ns(DECL_ARGS);
 static  int       pre_pp(DECL_ARGS);  static  int       pre_pp(DECL_ARGS);
   static  int       pre_sm(DECL_ARGS);
 static  int       pre_sp(DECL_ARGS);  static  int       pre_sp(DECL_ARGS);
 static  int       pre_sect(DECL_ARGS);  static  int       pre_sect(DECL_ARGS);
   static  int       pre_vt(DECL_ARGS);
 static  int       pre_ux(DECL_ARGS);  static  int       pre_ux(DECL_ARGS);
 static  int       pre_xr(DECL_ARGS);  static  int       pre_xr(DECL_ARGS);
 static  void      print_word(struct mman *, const char *);  static  void      print_word(struct mman *, const char *);
   static  void      print_offs(struct mman *, const char *);
 static  void      print_node(DECL_ARGS);  static  void      print_node(DECL_ARGS);
   
 static  const struct manact manacts[MDOC_MAX + 1] = {  static  const struct manact manacts[MDOC_MAX + 1] = {
Line 96  static const struct manact manacts[MDOC_MAX + 1] = {
Line 115  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, pre_enc, post_enc, "The \\fB",          { NULL, pre_enc, post_enc, "The \\fB",
             "\\fP\nutility exits 0 on success, and >0 if an error occurs."              "\\fP\nutility exits 0 on success, and >0 if an error occurs."
             }, /* Ex */              }, /* Ex */
         { NULL, NULL, NULL, NULL, NULL }, /* _Fa */          { NULL, pre_fa, post_fa, NULL, NULL }, /* Fa */
         { NULL, NULL, NULL, NULL, NULL }, /* _Fd */          { NULL, NULL, NULL, NULL, NULL }, /* _Fd */
         { NULL, pre_enc, post_enc, "\\fB-", "\\fP" }, /* Fl */          { NULL, pre_enc, post_enc, "\\fB-", "\\fP" }, /* Fl */
         { NULL, NULL, NULL, NULL, NULL }, /* _Fn */          { NULL, pre_fn, post_fn, NULL, NULL }, /* Fn */
         { NULL, NULL, NULL, NULL, NULL }, /* _Ft */          { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Ft */
         { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Ic */          { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Ic */
         { NULL, NULL, NULL, NULL, NULL }, /* _In */          { NULL, pre_in, post_in, NULL, NULL }, /* In */
         { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Li */          { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Li */
         { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */          { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */
         { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */          { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */
Line 116  static const struct manact manacts[MDOC_MAX + 1] = {
Line 135  static const struct manact manacts[MDOC_MAX + 1] = {
                 }, /* Rv */                  }, /* Rv */
         { NULL, NULL, NULL, NULL, NULL }, /* St */          { NULL, NULL, NULL, NULL, NULL }, /* St */
         { NULL, NULL, NULL, NULL, NULL }, /* _Va */          { NULL, NULL, NULL, NULL, NULL }, /* _Va */
         { NULL, NULL, NULL, NULL, NULL }, /* _Vt */          { NULL, pre_vt, post_vt, NULL, NULL }, /* Vt */
         { NULL, pre_xr, NULL, NULL, NULL }, /* Xr */          { NULL, pre_xr, NULL, NULL, NULL }, /* Xr */
         { NULL, NULL, post_percent, NULL, NULL }, /* _%A */          { NULL, NULL, post_percent, NULL, NULL }, /* _%A */
         { NULL, NULL, NULL, NULL, NULL }, /* _%B */          { NULL, NULL, NULL, NULL, NULL }, /* _%B */
Line 166  static const struct manact manacts[MDOC_MAX + 1] = {
Line 185  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, NULL, NULL, NULL, NULL }, /* Sc */          { NULL, NULL, NULL, NULL, NULL }, /* Sc */
         { cond_body, pre_enc, post_enc, "`", "'" }, /* So */          { cond_body, pre_enc, post_enc, "`", "'" }, /* So */
         { cond_body, pre_enc, post_enc, "`", "'" }, /* Sq */          { cond_body, pre_enc, post_enc, "`", "'" }, /* Sq */
         { NULL, NULL, NULL, NULL, NULL }, /* _Sm */          { NULL, pre_sm, NULL, NULL, NULL }, /* Sm */
         { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Sx */          { NULL, pre_enc, post_enc, "\\fI", "\\fP" }, /* Sx */
         { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Sy */          { NULL, pre_enc, post_enc, "\\fB", "\\fP" }, /* Sy */
         { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Tn */          { NULL, pre_enc, post_enc, "\\fR", "\\fP" }, /* Tn */
         { NULL, pre_ux, NULL, "UNIX", NULL }, /* Ux */          { NULL, pre_ux, NULL, "UNIX", NULL }, /* Ux */
         { NULL, NULL, NULL, NULL, NULL }, /* _Xc */          { NULL, NULL, NULL, NULL, NULL }, /* _Xc */
         { NULL, NULL, NULL, NULL, NULL }, /* _Xo */          { NULL, NULL, NULL, NULL, NULL }, /* _Xo */
         { NULL, NULL, NULL, NULL, NULL }, /* _Fo */          { NULL, pre_fo, post_fo, NULL, NULL }, /* Fo */
         { NULL, NULL, NULL, NULL, NULL }, /* _Fc */          { NULL, NULL, NULL, NULL, NULL }, /* Fc */
         { cond_body, pre_enc, post_enc, "[", "]" }, /* Oo */          { 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, pre_bk, post_bk, NULL, NULL }, /* Bk */
         { NULL, NULL, NULL, NULL, NULL }, /* _Ek */          { NULL, NULL, NULL, NULL, NULL }, /* Ek */
         { NULL, pre_ux, NULL, "is currently in beta test.", NULL }, /* Bt */          { NULL, pre_ux, NULL, "is currently in beta test.", NULL }, /* Bt */
         { NULL, NULL, NULL, NULL, NULL }, /* Hf */          { NULL, NULL, NULL, NULL, NULL }, /* Hf */
         { NULL, NULL, NULL, NULL, NULL }, /* Fr */          { NULL, NULL, NULL, NULL, NULL }, /* Fr */
         { NULL, pre_ux, NULL, "currently under development.", NULL }, /* Ud */          { NULL, pre_ux, NULL, "currently under development.", NULL }, /* Ud */
         { NULL, NULL, NULL, NULL, NULL }, /* _Lb */          { NULL, NULL, post_lb, NULL, NULL }, /* Lb */
         { NULL, pre_pp, NULL, NULL, NULL }, /* Lp */          { NULL, pre_pp, NULL, NULL, NULL }, /* Lp */
         { NULL, NULL, NULL, NULL, NULL }, /* _Lk */          { NULL, NULL, NULL, NULL, NULL }, /* _Lk */
         { NULL, NULL, NULL, NULL, NULL }, /* _Mt */          { NULL, NULL, NULL, NULL, NULL }, /* _Mt */
Line 220  print_word(struct mman *mm, const char *s)
Line 239  print_word(struct mman *mm, const char *s)
                  * (2) a word that is non-punctuation; and                   * (2) a word that is non-punctuation; and
                  * (3) if punctuation, non-terminating puncutation.                   * (3) if punctuation, non-terminating puncutation.
                  */                   */
                 if (NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1])                  if (NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) {
                         putchar(' ');                          if (mm->mode_keep) {
                                   putchar('\\');
                                   putchar('~');
                           } else
                                   putchar(' ');
                   }
   
         /*          /*
          * Reassign needing space if we're not following opening           * Reassign needing space if we're not following opening
          * punctuation.           * punctuation.
          */           */
         mm->need_space =          mm->need_space = mm->mode_space &&
                 ('(' != s[0] && '[' != s[0]) || '\0' != s[1];                  (('(' != s[0] && '[' != s[0]) || '\0' != s[1]);
   
         for ( ; *s; s++) {          for ( ; *s; s++) {
                 switch (*s) {                  switch (*s) {
Line 245  print_word(struct mman *mm, const char *s)
Line 269  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  void
 man_man(void *arg, const struct man *man)  man_man(void *arg, const struct man *man)
 {  {
Line 273  man_mdoc(void *arg, const struct mdoc *mdoc)
Line 320  man_mdoc(void *arg, const struct mdoc *mdoc)
   
         memset(&mm, 0, sizeof(struct mman));          memset(&mm, 0, sizeof(struct mman));
   
           mm.mode_space = 1;
         mm.need_nl = 1;          mm.need_nl = 1;
         print_node(m, n, &mm);          print_node(m, n, &mm);
         putchar('\n');          putchar('\n');
Line 290  print_node(DECL_ARGS)
Line 338  print_node(DECL_ARGS)
          * This makes the page structure be more consistent.           * This makes the page structure be more consistent.
          */           */
         prev = n->prev ? n->prev : n->parent;          prev = n->prev ? n->prev : n->parent;
         if (prev && prev->line < n->line && MDOC_Ns != prev->tok)          if (prev && prev->line < n->line &&
               MDOC_Fo != prev->tok && MDOC_Ns != prev->tok)
                 mm->need_nl = 1;                  mm->need_nl = 1;
   
         act = NULL;          act = NULL;
Line 445  static int
Line 494  static int
 pre_bd(DECL_ARGS)  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 ||          if (DISP_unfilled == n->norm->Bd.type ||
             DISP_literal  == n->norm->Bd.type) {              DISP_literal  == n->norm->Bd.type) {
                 mm->need_nl = 1;                  mm->need_nl = 1;
                 print_word(mm, ".nf");                  print_word(mm, ".nf");
         }          }
         mm->need_nl = 1;          mm->need_nl = 1;
           print_word(mm, ".RS");
           print_offs(mm, n->norm->Bd.offs);
           mm->need_nl = 1;
         return(1);          return(1);
 }  }
   
Line 458  static void
Line 514  static void
 post_bd(DECL_ARGS)  post_bd(DECL_ARGS)
 {  {
   
           mm->need_nl = 1;
           print_word(mm, ".RE");
         if (DISP_unfilled == n->norm->Bd.type ||          if (DISP_unfilled == n->norm->Bd.type ||
             DISP_literal  == n->norm->Bd.type) {              DISP_literal  == n->norm->Bd.type) {
                 mm->need_nl = 1;                  mm->need_nl = 1;
Line 467  post_bd(DECL_ARGS)
Line 525  post_bd(DECL_ARGS)
 }  }
   
 static int  static int
   pre_bk(DECL_ARGS)
   {
   
           switch (n->type) {
           case (MDOC_BLOCK):
                   return(1);
           case (MDOC_BODY):
                   mm->mode_keep = 1;
                   return(1);
           default:
                   return(0);
           }
   }
   
   static void
   post_bk(DECL_ARGS)
   {
   
           if (MDOC_BODY == n->type)
                   mm->mode_keep = 0;
   }
   
   static int
 pre_br(DECL_ARGS)  pre_br(DECL_ARGS)
 {  {
   
Line 516  post_dl(DECL_ARGS)
Line 597  post_dl(DECL_ARGS)
 }  }
   
 static int  static int
   pre_fa(DECL_ARGS)
   {
   
           if (MDOC_Fa == n->tok)
                   n = n->child;
   
           while (NULL != n) {
                   print_word(mm, "\\fI");
                   mm->need_space = 0;
                   print_node(m, n, mm);
                   mm->need_space = 0;
                   print_word(mm, "\\fP");
                   if (NULL != (n = n->next))
                           print_word(mm, ",");
           }
           return(0);
   }
   
   static void
   post_fa(DECL_ARGS)
   {
   
           if (NULL != n->next && MDOC_Fa == n->next->tok)
                   print_word(mm, ",");
   }
   
   static int
   pre_fn(DECL_ARGS)
   {
   
           n = n->child;
           if (NULL == n)
                   return(0);
   
           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;
           print_node(m, n, mm);
           mm->need_space = 0;
           print_word(mm, "\\fP(");
           mm->need_space = 0;
           return(pre_fa(m, n->next, mm));
   }
   
   static void
   post_fn(DECL_ARGS)
   {
   
           print_word(mm, ")");
           if (MDOC_SYNPRETTY & n->flags) {
                   print_word(mm, ";");
                   mm->need_nl = 1;
                   print_word(mm, ".br");
                   mm->need_nl = 1;
           }
   }
   
   static int
   pre_fo(DECL_ARGS)
   {
   
           switch (n->type) {
           case (MDOC_HEAD):
                   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;
                   break;
           case (MDOC_BODY):
                   mm->need_space = 0;
                   print_word(mm, "(");
                   mm->need_space = 0;
                   break;
           default:
                   break;
           }
           return(1);
   }
   
   static void
   post_fo(DECL_ARGS)
   {
   
           switch (n->type) {
           case (MDOC_HEAD):
                   mm->need_space = 0;
                   print_word(mm, "\\fP");
                   break;
           case (MDOC_BODY):
                   post_fn(m, n, mm);
                   break;
           default:
                   break;
           }
   }
   
   static int
   pre_in(DECL_ARGS)
   {
   
           if (MDOC_SYNPRETTY & n->flags) {
                   mm->need_nl = 1;
                   print_word(mm, ".br");
                   mm->need_nl = 1;
                   print_word(mm, "\\fB#include <");
           } else
                   print_word(mm, "<\\fI");
           mm->need_space = 0;
           return(1);
   }
   
   static void
   post_in(DECL_ARGS)
   {
   
           mm->need_space = 0;
           if (MDOC_SYNPRETTY & n->flags) {
                   print_word(mm, ">\\fP");
                   mm->need_nl = 1;
                   print_word(mm, ".br");
                   mm->need_nl = 1;
           } else
                   print_word(mm, "\\fP>");
   }
   
   static int
 pre_it(DECL_ARGS)  pre_it(DECL_ARGS)
 {  {
         const struct mdoc_node *bln;          const struct mdoc_node *bln;
Line 540  pre_it(DECL_ARGS)
Line 754  pre_it(DECL_ARGS)
         return(1);          return(1);
 }  }
   
   static void
   post_lb(DECL_ARGS)
   {
   
           if (SEC_LIBRARY == n->sec) {
                   mm->need_nl = 1;
                   print_word(mm, ".br");
                   mm->need_nl = 1;
           }
   }
   
 static int  static int
 pre_nm(DECL_ARGS)  pre_nm(DECL_ARGS)
 {  {
Line 597  pre_pp(DECL_ARGS)
Line 822  pre_pp(DECL_ARGS)
 }  }
   
 static int  static int
   pre_sm(DECL_ARGS)
   {
   
           assert(n->child && MDOC_TEXT == n->child->type);
           if (0 == strcmp("on", n->child->string))
                   mm->mode_space = 1;
           else
                   mm->mode_space = 0;
           return(0);
   }
   
   static int
 pre_sp(DECL_ARGS)  pre_sp(DECL_ARGS)
 {  {
   
Line 610  post_sp(DECL_ARGS)
Line 847  post_sp(DECL_ARGS)
 {  {
   
         mm->need_nl = 1;          mm->need_nl = 1;
   }
   
   static int
   pre_vt(DECL_ARGS)
   {
   
           if (MDOC_SYNPRETTY & n->flags) {
                   switch (n->type) {
                   case (MDOC_BLOCK):
                           return(1);
                   case (MDOC_BODY):
                           break;
                   default:
                           return(0);
                   }
                   mm->need_nl = 1;
                   print_word(mm, ".br");
                   mm->need_nl = 1;
           }
           print_word(mm, "\\fI");
           mm->need_space = 0;
           return(1);
   }
   
   static void
   post_vt(DECL_ARGS)
   {
   
           if (MDOC_BODY != n->type)
                   return;
   
           mm->need_space = 0;
           print_word(mm, "\\fP");
           if (MDOC_SYNPRETTY & n->flags) {
                   mm->need_nl = 1;
                   print_word(mm, ".br");
                   mm->need_nl = 1;
           }
 }  }
   
 static int  static int

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.18

CVSweb