[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.55 and 1.70

version 1.55, 2013/12/24 22:08:50 version 1.70, 2014/08/21 12:57:17
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011, 2012, 2013, 2014 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 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
   #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
   
 #include "mandoc.h"  #include "mandoc.h"
   #include "mandoc_aux.h"
 #include "out.h"  #include "out.h"
 #include "man.h"  #include "man.h"
 #include "mdoc.h"  #include "mdoc.h"
Line 50  static void   post_bf(DECL_ARGS);
Line 51  static void   post_bf(DECL_ARGS);
 static  void      post_bk(DECL_ARGS);  static  void      post_bk(DECL_ARGS);
 static  void      post_bl(DECL_ARGS);  static  void      post_bl(DECL_ARGS);
 static  void      post_dl(DECL_ARGS);  static  void      post_dl(DECL_ARGS);
   static  void      post_en(DECL_ARGS);
 static  void      post_enc(DECL_ARGS);  static  void      post_enc(DECL_ARGS);
 static  void      post_eo(DECL_ARGS);  static  void      post_eo(DECL_ARGS);
 static  void      post_fa(DECL_ARGS);  static  void      post_fa(DECL_ARGS);
Line 77  static int   pre_bl(DECL_ARGS);
Line 79  static int   pre_bl(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_en(DECL_ARGS);
 static  int       pre_enc(DECL_ARGS);  static  int       pre_enc(DECL_ARGS);
 static  int       pre_em(DECL_ARGS);  static  int       pre_em(DECL_ARGS);
   static  int       pre_es(DECL_ARGS);
   static  int       pre_ex(DECL_ARGS);
 static  int       pre_fa(DECL_ARGS);  static  int       pre_fa(DECL_ARGS);
 static  int       pre_fd(DECL_ARGS);  static  int       pre_fd(DECL_ARGS);
 static  int       pre_fl(DECL_ARGS);  static  int       pre_fl(DECL_ARGS);
Line 89  static int   pre_in(DECL_ARGS);
Line 94  static int   pre_in(DECL_ARGS);
 static  int       pre_it(DECL_ARGS);  static  int       pre_it(DECL_ARGS);
 static  int       pre_lk(DECL_ARGS);  static  int       pre_lk(DECL_ARGS);
 static  int       pre_li(DECL_ARGS);  static  int       pre_li(DECL_ARGS);
   static  int       pre_ll(DECL_ARGS);
 static  int       pre_nm(DECL_ARGS);  static  int       pre_nm(DECL_ARGS);
 static  int       pre_no(DECL_ARGS);  static  int       pre_no(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_rs(DECL_ARGS);  static  int       pre_rs(DECL_ARGS);
   static  int       pre_rv(DECL_ARGS);
 static  int       pre_sm(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);
Line 134  static const struct manact manacts[MDOC_MAX + 1] = {
Line 141  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, pre_li, post_font, NULL, NULL }, /* Dv */          { NULL, pre_li, post_font, NULL, NULL }, /* Dv */
         { NULL, pre_li, post_font, NULL, NULL }, /* Er */          { NULL, pre_li, post_font, NULL, NULL }, /* Er */
         { NULL, pre_li, post_font, NULL, NULL }, /* Ev */          { NULL, pre_li, post_font, NULL, NULL }, /* Ev */
         { NULL, pre_enc, post_enc, "The \\fB",          { NULL, pre_ex, NULL, NULL, NULL }, /* Ex */
             "\\fP\nutility exits 0 on success, and >0 if an error occurs."  
             }, /* Ex */  
         { NULL, pre_fa, post_fa, NULL, NULL }, /* Fa */          { NULL, pre_fa, post_fa, NULL, NULL }, /* Fa */
         { NULL, pre_fd, post_fd, NULL, NULL }, /* Fd */          { NULL, pre_fd, post_fd, NULL, NULL }, /* Fd */
         { NULL, pre_fl, post_fl, NULL, NULL }, /* Fl */          { NULL, pre_fl, post_fl, NULL, NULL }, /* Fl */
Line 148  static const struct manact manacts[MDOC_MAX + 1] = {
Line 153  static const struct manact manacts[MDOC_MAX + 1] = {
         { 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 */
         { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */          { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */
         { NULL, NULL, NULL, NULL, NULL }, /* Ot */          { NULL, pre_ft, post_font, NULL, NULL }, /* Ot */
         { NULL, pre_em, post_font, NULL, NULL }, /* Pa */          { NULL, pre_em, post_font, NULL, NULL }, /* Pa */
         { NULL, pre_enc, post_enc, "The \\fB",          { NULL, pre_rv, NULL, NULL, NULL }, /* Rv */
                 "\\fP\nfunction returns the value 0 if successful;\n"  
                 "otherwise the value -1 is returned and the global\n"  
                 "variable \\fIerrno\\fP is set to indicate the error."  
                 }, /* Rv */  
         { NULL, NULL, NULL, NULL, NULL }, /* St */          { NULL, NULL, NULL, NULL, NULL }, /* St */
         { NULL, pre_em, post_font, NULL, NULL }, /* Va */          { NULL, pre_em, post_font, NULL, NULL }, /* Va */
         { NULL, pre_vt, post_vt, NULL, NULL }, /* Vt */          { NULL, pre_vt, post_vt, NULL, NULL }, /* Vt */
Line 222  static const struct manact manacts[MDOC_MAX + 1] = {
Line 223  static const struct manact manacts[MDOC_MAX + 1] = {
         { 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, pre_em, post_font, NULL, NULL }, /* Fr */
         { NULL, pre_ux, NULL, "currently under development.", NULL }, /* Ud */          { NULL, pre_ux, NULL, "currently under development.", NULL }, /* Ud */
         { NULL, NULL, post_lb, NULL, NULL }, /* Lb */          { NULL, NULL, post_lb, NULL, NULL }, /* Lb */
         { NULL, pre_pp, NULL, NULL, NULL }, /* Lp */          { NULL, pre_pp, NULL, NULL, NULL }, /* Lp */
Line 232  static const struct manact manacts[MDOC_MAX + 1] = {
Line 233  static const struct manact manacts[MDOC_MAX + 1] = {
         { cond_body, pre_enc, post_enc, "{", "}" }, /* Bro */          { cond_body, pre_enc, post_enc, "{", "}" }, /* Bro */
         { NULL, NULL, NULL, NULL, NULL }, /* Brc */          { NULL, NULL, NULL, NULL, NULL }, /* Brc */
         { NULL, NULL, post_percent, NULL, NULL }, /* %C */          { NULL, NULL, post_percent, NULL, NULL }, /* %C */
         { NULL, NULL, NULL, NULL, NULL }, /* Es */          { NULL, pre_es, NULL, NULL, NULL }, /* Es */
         { NULL, NULL, NULL, NULL, NULL }, /* En */          { cond_body, pre_en, post_en, NULL, NULL }, /* En */
         { NULL, pre_ux, NULL, "DragonFly", NULL }, /* Dx */          { NULL, pre_ux, NULL, "DragonFly", NULL }, /* Dx */
         { NULL, NULL, post_percent, NULL, NULL }, /* %Q */          { NULL, NULL, post_percent, NULL, NULL }, /* %Q */
         { NULL, pre_br, NULL, NULL, NULL }, /* br */          { NULL, pre_br, NULL, NULL, NULL }, /* br */
         { NULL, pre_sp, post_sp, NULL, NULL }, /* sp */          { NULL, pre_sp, post_sp, NULL, NULL }, /* sp */
         { NULL, NULL, post_percent, NULL, NULL }, /* %U */          { NULL, NULL, post_percent, NULL, NULL }, /* %U */
         { NULL, NULL, NULL, NULL, NULL }, /* Ta */          { NULL, NULL, NULL, NULL, NULL }, /* Ta */
           { NULL, pre_ll, post_sp, NULL, NULL }, /* ll */
         { NULL, NULL, NULL, NULL, NULL }, /* ROOT */          { NULL, NULL, NULL, NULL, NULL }, /* ROOT */
 };  };
   
Line 256  static int  outflags;
Line 258  static int  outflags;
 #define MMAN_An_split   (1 << 9)  /* author mode is "split" */  #define MMAN_An_split   (1 << 9)  /* author mode is "split" */
 #define MMAN_An_nosplit (1 << 10) /* author mode is "nosplit" */  #define MMAN_An_nosplit (1 << 10) /* author mode is "nosplit" */
 #define MMAN_PD         (1 << 11) /* inter-paragraph spacing disabled */  #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  #define BL_STACK_MAX    32
   
Line 270  static struct {
Line 273  static struct {
         size_t   size;          size_t   size;
 }       fontqueue;  }       fontqueue;
   
   
 static void  static void
 font_push(char newfont)  font_push(char newfont)
 {  {
Line 277  font_push(char newfont)
Line 281  font_push(char newfont)
         if (fontqueue.head + fontqueue.size <= ++fontqueue.tail) {          if (fontqueue.head + fontqueue.size <= ++fontqueue.tail) {
                 fontqueue.size += 8;                  fontqueue.size += 8;
                 fontqueue.head = mandoc_realloc(fontqueue.head,                  fontqueue.head = mandoc_realloc(fontqueue.head,
                                 fontqueue.size);                      fontqueue.size);
         }          }
         *fontqueue.tail = newfont;          *fontqueue.tail = newfont;
         print_word("");          print_word("");
Line 303  print_word(const char *s)
Line 307  print_word(const char *s)
 {  {
   
         if ((MMAN_PP | MMAN_sp | MMAN_br | MMAN_nl) & outflags) {          if ((MMAN_PP | MMAN_sp | MMAN_br | MMAN_nl) & outflags) {
                 /*                  /*
                  * If we need a newline, print it now and start afresh.                   * If we need a newline, print it now and start afresh.
                  */                   */
                 if (MMAN_PP & outflags) {                  if (MMAN_PP & outflags) {
Line 358  print_word(const char *s)
Line 362  print_word(const char *s)
   
         for ( ; *s; s++) {          for ( ; *s; s++) {
                 switch (*s) {                  switch (*s) {
                 case (ASCII_NBRSP):                  case ASCII_NBRSP:
                         printf("\\ ");                          printf("\\ ");
                         break;                          break;
                 case (ASCII_HYPH):                  case ASCII_HYPH:
                         putchar('-');                          putchar('-');
                         break;                          break;
                   case ASCII_BREAK:
                           printf("\\:");
                           break;
                   case ' ':
                           if (MMAN_nbrword & outflags) {
                                   printf("\\ ");
                                   break;
                           }
                           /* FALLTHROUGH */
                 default:                  default:
                         putchar((unsigned char)*s);                          putchar((unsigned char)*s);
                         break;                          break;
Line 371  print_word(const char *s)
Line 384  print_word(const char *s)
                 if (TPremain)                  if (TPremain)
                         TPremain--;                          TPremain--;
         }          }
           outflags &= ~MMAN_nbrword;
 }  }
   
 static void  static void
Line 442  print_offs(const char *v)
Line 456  print_offs(const char *v)
         if (Bl_stack_len)          if (Bl_stack_len)
                 sz += Bl_stack[Bl_stack_len - 1];                  sz += Bl_stack[Bl_stack_len - 1];
   
         snprintf(buf, sizeof(buf), "%zun", sz);          (void)snprintf(buf, sizeof(buf), "%zun", sz);
         print_word(buf);          print_word(buf);
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
 }  }
Line 450  print_offs(const char *v)
Line 464  print_offs(const char *v)
 /*  /*
  * Set up the indentation for a list item; used from pre_it().   * 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)  print_width(const char *v, const struct mdoc_node *child, size_t defsz)
 {  {
         char              buf[24];          char              buf[24];
Line 476  print_width(const char *v, const struct mdoc_node *chi
Line 490  print_width(const char *v, const struct mdoc_node *chi
   
         /* XXX Rough estimation, might have multiple parts. */          /* XXX Rough estimation, might have multiple parts. */
         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? */          /* Maybe we are inside an enclosing list? */
         mid_it();          mid_it();
Line 495  print_width(const char *v, const struct mdoc_node *chi
Line 509  print_width(const char *v, const struct mdoc_node *chi
                 remain = sz + 2;                  remain = sz + 2;
         }          }
         if (numeric) {          if (numeric) {
                 snprintf(buf, sizeof(buf), "%zun", sz + 2);                  (void)snprintf(buf, sizeof(buf), "%zun", sz + 2);
                 print_word(buf);                  print_word(buf);
         } else          } else
                 print_word(v);                  print_word(v);
         TPremain = remain;          TPremain = remain;
 }  }
   
 void  static void
 print_count(int *count)  print_count(int *count)
 {  {
         char              buf[12];          char              buf[24];
   
         snprintf(buf, sizeof(buf), "%d.", ++*count);          (void)snprintf(buf, sizeof(buf), "%d.", ++*count);
         print_word(buf);          print_word(buf);
 }  }
   
Line 534  man_mdoc(void *arg, const struct mdoc *mdoc)
Line 548  man_mdoc(void *arg, const struct mdoc *mdoc)
         n = mdoc_node(mdoc);          n = mdoc_node(mdoc);
   
         printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",          printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",
                         meta->title, meta->msec, meta->date,              meta->title,
                         meta->os, meta->vol);              (meta->msec == NULL ? "" : meta->msec),
               meta->date, meta->os, meta->vol);
   
         /* Disable hyphenation and if nroff, disable justification. */          /* Disable hyphenation and if nroff, disable justification. */
         printf(".nh\n.if n .ad l");          printf(".nh\n.if n .ad l");
Line 573  print_node(DECL_ARGS)
Line 588  print_node(DECL_ARGS)
                  * Make sure that we don't happen to start with a                   * Make sure that we don't happen to start with a
                  * control character at the start of a line.                   * control character at the start of a line.
                  */                   */
                 if (MMAN_nl & outflags && ('.' == *n->string ||                  if (MMAN_nl & outflags &&
                                         '\'' == *n->string)) {                      ('.' == *n->string || '\'' == *n->string)) {
                         print_word("");                          print_word("");
                         printf("\\&");                          printf("\\&");
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
Line 587  print_node(DECL_ARGS)
Line 602  print_node(DECL_ARGS)
                  */                   */
                 act = manacts + n->tok;                  act = manacts + n->tok;
                 cond = NULL == act->cond || (*act->cond)(meta, n);                  cond = NULL == act->cond || (*act->cond)(meta, n);
                 if (cond && act->pre)                  if (cond && act->pre && ENDBODY_NOT == n->end)
                         do_sub = (*act->pre)(meta, n);                          do_sub = (*act->pre)(meta, n);
         }          }
   
         /*          /*
          * Conditionally run all child nodes.           * Conditionally run all child nodes.
          * Note that this iterates over children instead of using           * Note that this iterates over children instead of using
          * recursion.  This prevents unnecessary depth in the stack.           * recursion.  This prevents unnecessary depth in the stack.
Line 603  print_node(DECL_ARGS)
Line 618  print_node(DECL_ARGS)
         /*          /*
          * Lastly, conditionally run the post-node handler.           * Lastly, conditionally run the post-node handler.
          */           */
           if (MDOC_ENDED & n->flags)
                   return;
   
         if (cond && act->post)          if (cond && act->post)
                 (*act->post)(meta, n);                  (*act->post)(meta, n);
   
           if (ENDBODY_NOT != n->end)
                   n->pending->flags |= MDOC_ENDED;
   
           if (ENDBODY_NOSPACE == n->end)
                   outflags &= ~(MMAN_spc | MMAN_nl);
 }  }
   
 static int  static int
Line 642  post_enc(DECL_ARGS)
Line 666  post_enc(DECL_ARGS)
         suffix = manacts[n->tok].suffix;          suffix = manacts[n->tok].suffix;
         if (NULL == suffix)          if (NULL == suffix)
                 return;                  return;
         outflags &= ~MMAN_spc;          outflags &= ~(MMAN_spc | MMAN_nl);
         print_word(suffix);          print_word(suffix);
 }  }
   
   static int
   pre_ex(DECL_ARGS)
   {
           int      nchild;
   
           outflags |= MMAN_br | MMAN_nl;
   
           print_word("The");
   
           nchild = n->nchild;
           for (n = n->child; n; n = n->next) {
                   font_push('B');
                   print_word(n->string);
                   font_pop();
   
                   if (n->next == NULL)
                           continue;
   
                   if (nchild > 2) {
                           outflags &= ~MMAN_spc;
                           print_word(",");
                   }
                   if (n->next->next == NULL)
                           print_word("and");
           }
   
           if (nchild > 1)
                   print_word("utilities exit\\~0");
           else
                   print_word("utility exits\\~0");
   
           print_word("on success, and\\~>0 if an error occurs.");
           outflags |= MMAN_nl;
           return(0);
   }
   
 static void  static void
 post_font(DECL_ARGS)  post_font(DECL_ARGS)
 {  {
Line 674  static int
Line 734  static int
 pre__t(DECL_ARGS)  pre__t(DECL_ARGS)
 {  {
   
         if (n->parent && MDOC_Rs == n->parent->tok &&          if (n->parent && MDOC_Rs == n->parent->tok &&
                         n->parent->norm->Rs.quote_T) {              n->parent->norm->Rs.quote_T) {
                 print_word("");                  print_word("");
                 putchar('\"');                  putchar('\"');
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
Line 688  static void
Line 748  static void
 post__t(DECL_ARGS)  post__t(DECL_ARGS)
 {  {
   
         if (n->parent && MDOC_Rs == n->parent->tok &&          if (n->parent && MDOC_Rs == n->parent->tok &&
                         n->parent->norm->Rs.quote_T) {              n->parent->norm->Rs.quote_T) {
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
                 print_word("");                  print_word("");
                 putchar('\"');                  putchar('\"');
Line 741  pre_syn(const struct mdoc_node *n)
Line 801  pre_syn(const struct mdoc_node *n)
                 return;                  return;
   
         if (n->prev->tok == n->tok &&          if (n->prev->tok == n->tok &&
                         MDOC_Ft != n->tok &&              MDOC_Ft != n->tok &&
                         MDOC_Fo != n->tok &&              MDOC_Fo != n->tok &&
                         MDOC_Fn != n->tok) {              MDOC_Fn != n->tok) {
                 outflags |= MMAN_br;                  outflags |= MMAN_br;
                 return;                  return;
         }          }
   
         switch (n->prev->tok) {          switch (n->prev->tok) {
         case (MDOC_Fd):          case MDOC_Fd:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Fn):          case MDOC_Fn:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Fo):          case MDOC_Fo:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_In):          case MDOC_In:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Vt):          case MDOC_Vt:
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
                 break;                  break;
         case (MDOC_Ft):          case MDOC_Ft:
                 if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) {                  if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) {
                         outflags |= MMAN_sp;                          outflags |= MMAN_sp;
                         break;                          break;
Line 777  pre_an(DECL_ARGS)
Line 837  pre_an(DECL_ARGS)
 {  {
   
         switch (n->norm->An.auth) {          switch (n->norm->An.auth) {
         case (AUTH_split):          case AUTH_split:
                 outflags &= ~MMAN_An_nosplit;                  outflags &= ~MMAN_An_nosplit;
                 outflags |= MMAN_An_split;                  outflags |= MMAN_An_split;
                 return(0);                  return(0);
         case (AUTH_nosplit):          case AUTH_nosplit:
                 outflags &= ~MMAN_An_split;                  outflags &= ~MMAN_An_split;
                 outflags |= MMAN_An_nosplit;                  outflags |= MMAN_An_nosplit;
                 return(0);                  return(0);
Line 840  pre_bf(DECL_ARGS)
Line 900  pre_bf(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_BLOCK):          case MDOC_BLOCK:
                 return(1);                  return(1);
         case (MDOC_BODY):          case MDOC_BODY:
                 break;                  break;
         default:          default:
                 return(0);                  return(0);
         }          }
         switch (n->norm->Bf.font) {          switch (n->norm->Bf.font) {
         case (FONT_Em):          case FONT_Em:
                 font_push('I');                  font_push('I');
                 break;                  break;
         case (FONT_Sy):          case FONT_Sy:
                 font_push('B');                  font_push('B');
                 break;                  break;
         default:          default:
Line 874  pre_bk(DECL_ARGS)
Line 934  pre_bk(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_BLOCK):          case MDOC_BLOCK:
                 return(1);                  return(1);
         case (MDOC_BODY):          case MDOC_BODY:
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 return(1);                  return(1);
         default:          default:
Line 908  pre_bl(DECL_ARGS)
Line 968  pre_bl(DECL_ARGS)
         }          }
   
         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;
                 return(1);                  return(1);
         case (LIST_column):          case LIST_column:
                 break;                  break;
         default:          default:
                 return(1);                  return(1);
Line 930  post_bl(DECL_ARGS)
Line 990  post_bl(DECL_ARGS)
 {  {
   
         switch (n->norm->Bl.type) {          switch (n->norm->Bl.type) {
         case (LIST_column):          case LIST_column:
                 print_line(".TE", 0);                  print_line(".TE", 0);
                 break;                  break;
         case (LIST_enum):          case LIST_enum:
                 n->norm->Bl.count = 0;                  n->norm->Bl.count = 0;
                 break;                  break;
         default:          default:
Line 1011  pre_em(DECL_ARGS)
Line 1071  pre_em(DECL_ARGS)
         return(1);          return(1);
 }  }
   
   static int
   pre_en(DECL_ARGS)
   {
   
           if (NULL == n->norm->Es ||
               NULL == n->norm->Es->child)
                   return(1);
   
           print_word(n->norm->Es->child->string);
           outflags &= ~MMAN_spc;
           return(1);
   }
   
 static void  static void
   post_en(DECL_ARGS)
   {
   
           if (NULL == n->norm->Es ||
               NULL == n->norm->Es->child ||
               NULL == n->norm->Es->child->next)
                   return;
   
           outflags &= ~MMAN_spc;
           print_word(n->norm->Es->child->next->string);
           return;
   }
   
   static void
 post_eo(DECL_ARGS)  post_eo(DECL_ARGS)
 {  {
   
Line 1020  post_eo(DECL_ARGS)
Line 1107  post_eo(DECL_ARGS)
 }  }
   
 static int  static int
   pre_es(DECL_ARGS)
   {
   
           return(0);
   }
   
   static int
 pre_fa(DECL_ARGS)  pre_fa(DECL_ARGS)
 {  {
           int      am_Fa;
   
         if (MDOC_Fa == n->tok)          am_Fa = MDOC_Fa == n->tok;
   
           if (am_Fa)
                 n = n->child;                  n = n->child;
   
         while (NULL != n) {          while (NULL != n) {
                 font_push('I');                  font_push('I');
                   if (am_Fa || MDOC_SYNPRETTY & n->flags)
                           outflags |= MMAN_nbrword;
                 print_node(meta, n);                  print_node(meta, n);
                 font_pop();                  font_pop();
                 if (NULL != (n = n->next))                  if (NULL != (n = n->next))
Line 1067  pre_fl(DECL_ARGS)
Line 1166  pre_fl(DECL_ARGS)
   
         font_push('B');          font_push('B');
         print_word("\\-");          print_word("\\-");
         outflags &= ~MMAN_spc;          if (n->nchild)
                   outflags &= ~MMAN_spc;
         return(1);          return(1);
 }  }
   
Line 1076  post_fl(DECL_ARGS)
Line 1176  post_fl(DECL_ARGS)
 {  {
   
         font_pop();          font_pop();
         if (0 == n->nchild && NULL != n->next &&          if ( ! (n->nchild ||
                         n->next->line == n->line)              n->next == NULL ||
               n->next->type == MDOC_TEXT ||
               n->next->flags & MDOC_LINE))
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
 }  }
   
Line 1123  pre_fo(DECL_ARGS)
Line 1225  pre_fo(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_BLOCK):          case MDOC_BLOCK:
                 pre_syn(n);                  pre_syn(n);
                 break;                  break;
         case (MDOC_HEAD):          case MDOC_HEAD:
                   if (MDOC_SYNPRETTY & n->flags)
                           print_block(".HP 4n", MMAN_nl);
                 font_push('B');                  font_push('B');
                 break;                  break;
         case (MDOC_BODY):          case MDOC_BODY:
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
                 print_word("(");                  print_word("(");
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
Line 1139  pre_fo(DECL_ARGS)
Line 1243  pre_fo(DECL_ARGS)
         }          }
         return(1);          return(1);
 }  }
   
 static void  static void
 post_fo(DECL_ARGS)  post_fo(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_HEAD):          case MDOC_HEAD:
                 font_pop();                  font_pop();
                 break;                  break;
         case (MDOC_BODY):          case MDOC_BODY:
                 post_fn(meta, n);                  post_fn(meta, n);
                 break;                  break;
         default:          default:
Line 1204  pre_it(DECL_ARGS)
Line 1308  pre_it(DECL_ARGS)
         const struct mdoc_node *bln;          const struct mdoc_node *bln;
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_HEAD):          case MDOC_HEAD:
                 outflags |= MMAN_PP | MMAN_nl;                  outflags |= MMAN_PP | MMAN_nl;
                 bln = n->parent->parent;                  bln = n->parent->parent;
                 if (0 == bln->norm->Bl.comp ||                  if (0 == bln->norm->Bl.comp ||
Line 1213  pre_it(DECL_ARGS)
Line 1317  pre_it(DECL_ARGS)
                         outflags |= MMAN_sp;                          outflags |= MMAN_sp;
                 outflags &= ~MMAN_br;                  outflags &= ~MMAN_br;
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case (LIST_item):                  case LIST_item:
                         return(0);                          return(0);
                 case (LIST_inset):                  case LIST_inset:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_diag):                  case LIST_diag:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_ohang):                  case LIST_ohang:
                         if (bln->norm->Bl.type == LIST_diag)                          if (bln->norm->Bl.type == LIST_diag)
                                 print_line(".B \"", 0);                                  print_line(".B \"", 0);
                         else                          else
                                 print_line(".R \"", 0);                                  print_line(".R \"", 0);
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                         return(1);                          return(1);
                 case (LIST_bullet):                  case LIST_bullet:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_dash):                  case LIST_dash:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_hyphen):                  case LIST_hyphen:
                         print_width(bln->norm->Bl.width, NULL, 0);                          print_width(bln->norm->Bl.width, NULL, 0);
                         TPremain = 0;                          TPremain = 0;
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
Line 1240  pre_it(DECL_ARGS)
Line 1344  pre_it(DECL_ARGS)
                         else                          else
                                 print_word("-");                                  print_word("-");
                         font_pop();                          font_pop();
                         break;                          outflags |= MMAN_nl;
                 case (LIST_enum):                          return(0);
                   case LIST_enum:
                         print_width(bln->norm->Bl.width, NULL, 0);                          print_width(bln->norm->Bl.width, NULL, 0);
                         TPremain = 0;                          TPremain = 0;
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         print_count(&bln->norm->Bl.count);                          print_count(&bln->norm->Bl.count);
                         break;                          outflags |= MMAN_nl;
                 case (LIST_hang):                          return(0);
                   case LIST_hang:
                         print_width(bln->norm->Bl.width, n->child, 6);                          print_width(bln->norm->Bl.width, n->child, 6);
                         TPremain = 0;                          TPremain = 0;
                         break;                          outflags |= MMAN_nl;
                 case (LIST_tag):                          return(1);
                   case LIST_tag:
                         print_width(bln->norm->Bl.width, n->child, 0);                          print_width(bln->norm->Bl.width, n->child, 0);
                         putchar('\n');                          putchar('\n');
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
Line 1259  pre_it(DECL_ARGS)
Line 1366  pre_it(DECL_ARGS)
                 default:                  default:
                         return(1);                          return(1);
                 }                  }
                 outflags |= MMAN_nl;  
         default:          default:
                 break;                  break;
         }          }
Line 1285  mid_it(void)
Line 1391  mid_it(void)
   
         /* Restore the indentation of the enclosing list. */          /* Restore the indentation of the enclosing list. */
         print_line(".RS", MMAN_Bk_susp);          print_line(".RS", MMAN_Bk_susp);
         snprintf(buf, sizeof(buf), "%zun", Bl_stack[Bl_stack_len - 1]);          (void)snprintf(buf, sizeof(buf), "%zun",
               Bl_stack[Bl_stack_len - 1]);
         print_word(buf);          print_word(buf);
   
         /* Remeber to close out this .RS block later. */          /* Remeber to close out this .RS block later. */
Line 1300  post_it(DECL_ARGS)
Line 1407  post_it(DECL_ARGS)
         bln = n->parent->parent;          bln = n->parent->parent;
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_HEAD):          case MDOC_HEAD:
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case (LIST_diag):                  case LIST_diag:
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                         print_word("\\ ");                          print_word("\\ ");
                         break;                          break;
                 case (LIST_ohang):                  case LIST_ohang:
                         outflags |= MMAN_br;                          outflags |= MMAN_br;
                         break;                          break;
                 default:                  default:
                         break;                          break;
                 }                  }
                 break;                  break;
         case (MDOC_BODY):          case MDOC_BODY:
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case (LIST_bullet):                  case LIST_bullet:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_dash):                  case LIST_dash:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_hyphen):                  case LIST_hyphen:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_enum):                  case LIST_enum:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_hang):                  case LIST_hang:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (LIST_tag):                  case LIST_tag:
                         assert(Bl_stack_len);                          assert(Bl_stack_len);
                         Bl_stack[--Bl_stack_len] = 0;                          Bl_stack[--Bl_stack_len] = 0;
   
Line 1339  post_it(DECL_ARGS)
Line 1446  post_it(DECL_ARGS)
                                 Bl_stack_post[Bl_stack_len] = 0;                                  Bl_stack_post[Bl_stack_len] = 0;
                         }                          }
                         break;                          break;
                 case (LIST_column):                  case LIST_column:
                         if (NULL != n->next) {                          if (NULL != n->next) {
                                 putchar('\t');                                  putchar('\t');
                                 outflags &= ~MMAN_spc;                                  outflags &= ~MMAN_spc;
Line 1387  pre_lk(DECL_ARGS)
Line 1494  pre_lk(DECL_ARGS)
 }  }
   
 static int  static int
   pre_ll(DECL_ARGS)
   {
   
           print_line(".ll", 0);
           return(1);
   }
   
   static int
 pre_li(DECL_ARGS)  pre_li(DECL_ARGS)
 {  {
   
Line 1426  post_nm(DECL_ARGS)
Line 1541  post_nm(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_BLOCK):          case MDOC_BLOCK:
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
                 break;                  break;
         case (MDOC_HEAD):          case MDOC_HEAD:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_ELEM):          case MDOC_ELEM:
                 font_pop();                  if (n->child != NULL || meta->name != NULL)
                           font_pop();
                 break;                  break;
         default:          default:
                 break;                  break;
Line 1485  pre_rs(DECL_ARGS)
Line 1601  pre_rs(DECL_ARGS)
 }  }
   
 static int  static int
   pre_rv(DECL_ARGS)
   {
           int      nchild;
   
           outflags |= MMAN_br | MMAN_nl;
   
           nchild = n->nchild;
           if (nchild > 0) {
                   print_word("The");
   
                   for (n = n->child; n; n = n->next) {
                           font_push('B');
                           print_word(n->string);
                           font_pop();
   
                           outflags &= ~MMAN_spc;
                           print_word("()");
   
                           if (n->next == NULL)
                                   continue;
   
                           if (nchild > 2) {
                                   outflags &= ~MMAN_spc;
                                   print_word(",");
                           }
                           if (n->next->next == NULL)
                                   print_word("and");
                   }
   
                   if (nchild > 1)
                           print_word("functions return");
                   else
                           print_word("function returns");
   
                   print_word("the value\\~0 if successful;");
           } else
                   print_word("Upon successful completion, "
                       "the value\\~0 is returned;");
   
           print_word("otherwise the value\\~\\-1 is returned"
               " and the global variable");
   
           font_push('I');
           print_word("errno");
           font_pop();
   
           print_word("is set to indicate the error.");
           outflags |= MMAN_nl;
           return(0);
   }
   
   static int
 pre_sm(DECL_ARGS)  pre_sm(DECL_ARGS)
 {  {
   
         assert(n->child && MDOC_TEXT == n->child->type);          if (NULL == n->child)
         if (0 == strcmp("on", n->child->string))                  outflags ^= MMAN_Sm;
                 outflags |= MMAN_Sm | MMAN_spc;          else if (0 == strcmp("on", n->child->string))
                   outflags |= MMAN_Sm;
         else          else
                 outflags &= ~MMAN_Sm;                  outflags &= ~MMAN_Sm;
   
           if (MMAN_Sm & outflags)
                   outflags |= MMAN_spc;
   
         return(0);          return(0);
 }  }
   
Line 1529  pre_vt(DECL_ARGS)
Line 1702  pre_vt(DECL_ARGS)
   
         if (MDOC_SYNPRETTY & n->flags) {          if (MDOC_SYNPRETTY & n->flags) {
                 switch (n->type) {                  switch (n->type) {
                 case (MDOC_BLOCK):                  case MDOC_BLOCK:
                         pre_syn(n);                          pre_syn(n);
                         return(1);                          return(1);
                 case (MDOC_BODY):                  case MDOC_BODY:
                         break;                          break;
                 default:                  default:
                         return(0);                          return(0);

Legend:
Removed from v.1.55  
changed lines
  Added in v.1.70

CVSweb