[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.79 and 1.99

version 1.79, 2014/12/23 10:09:44 version 1.99, 2017/01/10 21:59:47
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011-2017 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 22 
Line 22 
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
   
 #include "mandoc.h"  
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "out.h"  #include "mandoc.h"
 #include "man.h"  #include "roff.h"
 #include "mdoc.h"  #include "mdoc.h"
   #include "man.h"
   #include "out.h"
 #include "main.h"  #include "main.h"
   
 #define DECL_ARGS const struct mdoc_meta *meta, \  #define DECL_ARGS const struct roff_meta *meta, struct roff_node *n
                   const struct mdoc_node *n  
   
 struct  manact {  struct  manact {
         int             (*cond)(DECL_ARGS); /* DON'T run actions */          int             (*cond)(DECL_ARGS); /* DON'T run actions */
Line 108  static int   pre_sm(DECL_ARGS);
Line 108  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_sy(DECL_ARGS);  static  int       pre_sy(DECL_ARGS);
 static  void      pre_syn(const struct mdoc_node *);  static  void      pre_syn(const struct roff_node *);
 static  int       pre_vt(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);
Line 116  static void   print_word(const char *);
Line 116  static void   print_word(const char *);
 static  void      print_line(const char *, int);  static  void      print_line(const char *, int);
 static  void      print_block(const char *, int);  static  void      print_block(const char *, int);
 static  void      print_offs(const char *, int);  static  void      print_offs(const char *, int);
 static  void      print_width(const char *,  static  void      print_width(const struct mdoc_bl *,
                                 const struct mdoc_node *, size_t);                          const struct roff_node *);
 static  void      print_count(int *);  static  void      print_count(int *);
 static  void      print_node(DECL_ARGS);  static  void      print_node(DECL_ARGS);
   
Line 182  static const struct manact manacts[MDOC_MAX + 1] = {
Line 182  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, pre_bf, post_bf, NULL, NULL }, /* Bf */          { NULL, pre_bf, post_bf, NULL, NULL }, /* Bf */
         { cond_body, pre_enc, post_enc, "[", "]" }, /* Bo */          { cond_body, pre_enc, post_enc, "[", "]" }, /* Bo */
         { cond_body, pre_enc, post_enc, "[", "]" }, /* Bq */          { cond_body, pre_enc, post_enc, "[", "]" }, /* Bq */
         { NULL, pre_ux, NULL, "BSD/OS", NULL }, /* Bsx */          { NULL, NULL, NULL, NULL, NULL }, /* Bsx */
         { NULL, pre_bx, NULL, NULL, NULL }, /* Bx */          { NULL, pre_bx, NULL, NULL, NULL }, /* Bx */
         { NULL, pre_skip, NULL, NULL, NULL }, /* Db */          { NULL, pre_skip, NULL, NULL, NULL }, /* Db */
         { NULL, NULL, NULL, NULL, NULL }, /* Dc */          { NULL, NULL, NULL, NULL, NULL }, /* Dc */
         { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Do */          { cond_body, pre_enc, post_enc, "\\(Lq", "\\(Rq" }, /* Do */
         { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Dq */          { cond_body, pre_enc, post_enc, "\\(Lq", "\\(Rq" }, /* Dq */
         { NULL, NULL, NULL, NULL, NULL }, /* Ec */          { NULL, NULL, NULL, NULL, NULL }, /* Ec */
         { NULL, NULL, NULL, NULL, NULL }, /* Ef */          { NULL, NULL, NULL, NULL, NULL }, /* Ef */
         { NULL, pre_em, post_font, NULL, NULL }, /* Em */          { NULL, pre_em, post_font, NULL, NULL }, /* Em */
         { cond_body, pre_eo, post_eo, NULL, NULL }, /* Eo */          { cond_body, pre_eo, post_eo, NULL, NULL }, /* Eo */
         { NULL, pre_ux, NULL, "FreeBSD", NULL }, /* Fx */          { NULL, NULL, NULL, NULL, NULL }, /* Fx */
         { NULL, pre_sy, post_font, NULL, NULL }, /* Ms */          { NULL, pre_sy, post_font, NULL, NULL }, /* Ms */
         { NULL, pre_no, NULL, NULL, NULL }, /* No */          { NULL, pre_no, NULL, NULL, NULL }, /* No */
         { NULL, pre_ns, NULL, NULL, NULL }, /* Ns */          { NULL, pre_ns, NULL, NULL, NULL }, /* Ns */
         { NULL, pre_ux, NULL, "NetBSD", NULL }, /* Nx */          { NULL, NULL, NULL, NULL, NULL }, /* Nx */
         { NULL, pre_ux, NULL, "OpenBSD", NULL }, /* Ox */          { NULL, NULL, NULL, NULL, NULL }, /* Ox */
         { NULL, NULL, NULL, NULL, NULL }, /* Pc */          { NULL, NULL, NULL, NULL, NULL }, /* Pc */
         { NULL, NULL, post_pf, NULL, NULL }, /* Pf */          { NULL, NULL, post_pf, NULL, NULL }, /* Pf */
         { cond_body, pre_enc, post_enc, "(", ")" }, /* Po */          { cond_body, pre_enc, post_enc, "(", ")" }, /* Po */
Line 215  static const struct manact manacts[MDOC_MAX + 1] = {
Line 215  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, pre_em, post_font, NULL, NULL }, /* Sx */          { NULL, pre_em, post_font, NULL, NULL }, /* Sx */
         { NULL, pre_sy, post_font, NULL, NULL }, /* Sy */          { NULL, pre_sy, post_font, NULL, NULL }, /* Sy */
         { NULL, pre_li, post_font, NULL, NULL }, /* Tn */          { NULL, pre_li, post_font, NULL, NULL }, /* Tn */
         { NULL, pre_ux, NULL, "UNIX", NULL }, /* Ux */          { NULL, NULL, NULL, NULL, 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, pre_fo, post_fo, NULL, NULL }, /* Fo */          { NULL, pre_fo, post_fo, NULL, NULL }, /* Fo */
Line 238  static const struct manact manacts[MDOC_MAX + 1] = {
Line 238  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, NULL, post_percent, NULL, NULL }, /* %C */          { NULL, NULL, post_percent, NULL, NULL }, /* %C */
         { NULL, pre_skip, NULL, NULL, NULL }, /* Es */          { NULL, pre_skip, NULL, NULL, NULL }, /* Es */
         { cond_body, pre_en, post_en, NULL, NULL }, /* En */          { cond_body, pre_en, post_en, NULL, NULL }, /* En */
         { NULL, pre_ux, NULL, "DragonFly", NULL }, /* Dx */          { NULL, NULL, NULL, NULL, 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 */
Line 265  static int  outflags;
Line 265  static int  outflags;
   
 #define BL_STACK_MAX    32  #define BL_STACK_MAX    32
   
 static  size_t          Bl_stack[BL_STACK_MAX];  /* offsets [chars] */  static  int             Bl_stack[BL_STACK_MAX];  /* offsets [chars] */
 static  int             Bl_stack_post[BL_STACK_MAX];  /* add final .RE */  static  int             Bl_stack_post[BL_STACK_MAX];  /* add final .RE */
 static  int             Bl_stack_len;  /* number of nested Bl blocks */  static  int             Bl_stack_len;  /* number of nested Bl blocks */
 static  int             TPremain;  /* characters before tag is full */  static  int             TPremain;  /* characters before tag is full */
Line 423  print_offs(const char *v, int keywords)
Line 423  print_offs(const char *v, int keywords)
 {  {
         char              buf[24];          char              buf[24];
         struct roffsu     su;          struct roffsu     su;
         size_t            sz;          int               sz;
   
         print_line(".RS", MMAN_Bk_susp);          print_line(".RS", MMAN_Bk_susp);
   
Line 459  print_offs(const char *v, int keywords)
Line 459  print_offs(const char *v, int keywords)
         if (Bl_stack_len)          if (Bl_stack_len)
                 sz += Bl_stack[Bl_stack_len - 1];                  sz += Bl_stack[Bl_stack_len - 1];
   
         (void)snprintf(buf, sizeof(buf), "%zun", sz);          (void)snprintf(buf, sizeof(buf), "%dn", sz);
         print_word(buf);          print_word(buf);
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
 }  }
Line 468  print_offs(const char *v, int keywords)
Line 468  print_offs(const char *v, int keywords)
  * Set up the indentation for a list item; used from pre_it().   * Set up the indentation for a list item; used from pre_it().
  */   */
 static void  static void
 print_width(const char *v, const struct mdoc_node *child, size_t defsz)  print_width(const struct mdoc_bl *bl, const struct roff_node *child)
 {  {
         char              buf[24];          char              buf[24];
         struct roffsu     su;          struct roffsu     su;
         size_t            sz, chsz;          int               numeric, remain, sz, chsz;
         int               numeric, remain;  
   
         numeric = 1;          numeric = 1;
         remain = 0;          remain = 0;
   
         /* Convert v into a number (of characters). */          /* Convert the width into a number (of characters). */
         if (NULL == v)          if (bl->width == NULL)
                 sz = defsz;                  sz = (bl->type == LIST_hang) ? 6 : 0;
         else if (a2roffsu(v, &su, SCALE_MAX) > 1) {          else if (a2roffsu(bl->width, &su, SCALE_MAX) > 1) {
                 if (SCALE_EN == su.unit)                  if (SCALE_EN == su.unit)
                         sz = su.scale;                          sz = su.scale;
                 else {                  else {
Line 489  print_width(const char *v, const struct mdoc_node *chi
Line 488  print_width(const char *v, const struct mdoc_node *chi
                         numeric = 0;                          numeric = 0;
                 }                  }
         } else          } else
                 sz = strlen(v);                  sz = strlen(bl->width);
   
         /* XXX Rough estimation, might have multiple parts. */          /* XXX Rough estimation, might have multiple parts. */
         chsz = (NULL != child && MDOC_TEXT == child->type) ?          if (bl->type == LIST_enum)
             strlen(child->string) : 0;                  chsz = (bl->count > 8) + 1;
           else if (child != NULL && child->type == ROFFT_TEXT)
                   chsz = strlen(child->string);
           else
                   chsz = 0;
   
         /* Maybe we are inside an enclosing list? */          /* Maybe we are inside an enclosing list? */
         mid_it();          mid_it();
Line 505  print_width(const char *v, const struct mdoc_node *chi
Line 508  print_width(const char *v, const struct mdoc_node *chi
         Bl_stack[Bl_stack_len++] = sz + 2;          Bl_stack[Bl_stack_len++] = sz + 2;
   
         /* Set up the current list. */          /* Set up the current list. */
         if (defsz && chsz > sz)          if (chsz > sz && bl->type != LIST_tag)
                 print_block(".HP", 0);                  print_block(".HP", 0);
         else {          else {
                 print_block(".TP", 0);                  print_block(".TP", 0);
                 remain = sz + 2;                  remain = sz + 2;
         }          }
         if (numeric) {          if (numeric) {
                 (void)snprintf(buf, sizeof(buf), "%zun", sz + 2);                  (void)snprintf(buf, sizeof(buf), "%dn", sz + 2);
                 print_word(buf);                  print_word(buf);
         } else          } else
                 print_word(v);                  print_word(bl->width);
         TPremain = remain;          TPremain = remain;
 }  }
   
Line 524  print_count(int *count)
Line 527  print_count(int *count)
 {  {
         char              buf[24];          char              buf[24];
   
         (void)snprintf(buf, sizeof(buf), "%d.", ++*count);          (void)snprintf(buf, sizeof(buf), "%d.\\&", ++*count);
         print_word(buf);          print_word(buf);
 }  }
   
 void  void
 man_man(void *arg, const struct man *man)  man_man(void *arg, const struct roff_man *man)
 {  {
   
         /*          /*
Line 542  man_man(void *arg, const struct man *man)
Line 545  man_man(void *arg, const struct man *man)
 }  }
   
 void  void
 man_mdoc(void *arg, const struct mdoc *mdoc)  man_mdoc(void *arg, const struct roff_man *mdoc)
 {  {
         const struct mdoc_meta *meta;          struct roff_node *n;
         const struct mdoc_node *n;  
   
         meta = mdoc_meta(mdoc);  
         n = mdoc_node(mdoc);  
   
         printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",          printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",
             meta->title,              mdoc->meta.title,
             (meta->msec == NULL ? "" : meta->msec),              (mdoc->meta.msec == NULL ? "" : mdoc->meta.msec),
             meta->date, meta->os, meta->vol);              mdoc->meta.date, mdoc->meta.os, mdoc->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 564  man_mdoc(void *arg, const struct mdoc *mdoc)
Line 563  man_mdoc(void *arg, const struct mdoc *mdoc)
                 fontqueue.head = fontqueue.tail = mandoc_malloc(8);                  fontqueue.head = fontqueue.tail = mandoc_malloc(8);
                 *fontqueue.tail = 'R';                  *fontqueue.tail = 'R';
         }          }
         print_node(meta, n);          for (n = mdoc->first->child; n != NULL; n = n->next)
                   print_node(&mdoc->meta, n);
         putchar('\n');          putchar('\n');
 }  }
   
 static void  static void
 print_node(DECL_ARGS)  print_node(DECL_ARGS)
 {  {
         const struct mdoc_node  *sub;  
         const struct manact     *act;          const struct manact     *act;
           struct roff_node        *sub;
         int                      cond, do_sub;          int                      cond, do_sub;
   
           if (n->flags & NODE_NOPRT)
                   return;
   
         /*          /*
          * Break the line if we were parsed subsequent the current node.           * Break the line if we were parsed subsequent the current node.
          * This makes the page structure be more consistent.           * This makes the page structure be more consistent.
          */           */
         if (MMAN_spc & outflags && MDOC_LINE & n->flags)          if (MMAN_spc & outflags && NODE_LINE & n->flags)
                 outflags |= MMAN_nl;                  outflags |= MMAN_nl;
   
         act = NULL;          act = NULL;
         cond = 0;          cond = 0;
         do_sub = 1;          do_sub = 1;
           n->flags &= ~NODE_ENDED;
   
         if (MDOC_TEXT == n->type) {          if (n->type == ROFFT_TEXT) {
                 /*                  /*
                  * 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.
Line 597  print_node(DECL_ARGS)
Line 601  print_node(DECL_ARGS)
                         printf("\\&");                          printf("\\&");
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                 }                  }
                 if (outflags & MMAN_Sm && ! (n->flags & MDOC_DELIMC))                  if (outflags & MMAN_Sm && ! (n->flags & NODE_DELIMC))
                         outflags |= MMAN_spc_force;                          outflags |= MMAN_spc_force;
                 print_word(n->string);                  print_word(n->string);
                 if (outflags & MMAN_Sm && ! (n->flags & MDOC_DELIMO))                  if (outflags & MMAN_Sm && ! (n->flags & NODE_DELIMO))
                         outflags |= MMAN_spc;                          outflags |= MMAN_spc;
         } else {          } else {
                 /*                  /*
Line 609  print_node(DECL_ARGS)
Line 613  print_node(DECL_ARGS)
                  */                   */
                 act = manacts + n->tok;                  act = manacts + n->tok;
                 cond = act->cond == NULL || (*act->cond)(meta, n);                  cond = act->cond == NULL || (*act->cond)(meta, n);
                 if (cond && act->pre && (n->end == ENDBODY_NOT || n->nchild))                  if (cond && act->pre != NULL &&
                       (n->end == ENDBODY_NOT || n->child != NULL))
                         do_sub = (*act->pre)(meta, n);                          do_sub = (*act->pre)(meta, n);
         }          }
   
Line 625  print_node(DECL_ARGS)
Line 630  print_node(DECL_ARGS)
         /*          /*
          * Lastly, conditionally run the post-node handler.           * Lastly, conditionally run the post-node handler.
          */           */
         if (MDOC_ENDED & n->flags)          if (NODE_ENDED & n->flags)
                 return;                  return;
   
         if (cond && act->post)          if (cond && act->post)
                 (*act->post)(meta, n);                  (*act->post)(meta, n);
   
         if (ENDBODY_NOT != n->end)          if (ENDBODY_NOT != n->end)
                 n->pending->flags |= MDOC_ENDED;                  n->body->flags |= NODE_ENDED;
   
         if (ENDBODY_NOSPACE == n->end)          if (ENDBODY_NOSPACE == n->end)
                 outflags &= ~(MMAN_spc | MMAN_nl);                  outflags &= ~(MMAN_spc | MMAN_nl);
Line 642  static int
Line 647  static int
 cond_head(DECL_ARGS)  cond_head(DECL_ARGS)
 {  {
   
         return(MDOC_HEAD == n->type);          return n->type == ROFFT_HEAD;
 }  }
   
 static int  static int
 cond_body(DECL_ARGS)  cond_body(DECL_ARGS)
 {  {
   
         return(MDOC_BODY == n->type);          return n->type == ROFFT_BODY;
 }  }
   
 static int  static int
Line 659  pre_enc(DECL_ARGS)
Line 664  pre_enc(DECL_ARGS)
   
         prefix = manacts[n->tok].prefix;          prefix = manacts[n->tok].prefix;
         if (NULL == prefix)          if (NULL == prefix)
                 return(1);                  return 1;
         print_word(prefix);          print_word(prefix);
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return(1);          return 1;
 }  }
   
 static void  static void
Line 680  post_enc(DECL_ARGS)
Line 685  post_enc(DECL_ARGS)
 static int  static int
 pre_ex(DECL_ARGS)  pre_ex(DECL_ARGS)
 {  {
         int      nchild;          struct roff_node *nch;
   
         outflags |= MMAN_br | MMAN_nl;          outflags |= MMAN_br | MMAN_nl;
   
         print_word("The");          print_word("The");
   
         nchild = n->nchild;          for (nch = n->child; nch != NULL; nch = nch->next) {
         for (n = n->child; n; n = n->next) {  
                 font_push('B');                  font_push('B');
                 print_word(n->string);                  print_word(nch->string);
                 font_pop();                  font_pop();
   
                 if (n->next == NULL)                  if (nch->next == NULL)
                         continue;                          continue;
   
                 if (nchild > 2) {                  if (nch->prev != NULL || nch->next->next != NULL) {
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                         print_word(",");                          print_word(",");
                 }                  }
                 if (n->next->next == NULL)                  if (nch->next->next == NULL)
                         print_word("and");                          print_word("and");
         }          }
   
         if (nchild > 1)          if (n->child != NULL && n->child->next != NULL)
                 print_word("utilities exit\\~0");                  print_word("utilities exit\\~0");
         else          else
                 print_word("utility exits\\~0");                  print_word("utility exits\\~0");
   
         print_word("on success, and\\~>0 if an error occurs.");          print_word("on success, and\\~>0 if an error occurs.");
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
         return(0);          return 0;
 }  }
   
 static void  static void
Line 748  pre__t(DECL_ARGS)
Line 752  pre__t(DECL_ARGS)
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
         } else          } else
                 font_push('I');                  font_push('I');
         return(1);          return 1;
 }  }
   
 static void  static void
Line 772  static int
Line 776  static int
 pre_sect(DECL_ARGS)  pre_sect(DECL_ARGS)
 {  {
   
         if (MDOC_HEAD == n->type) {          if (n->type == ROFFT_HEAD) {
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
                 print_block(manacts[n->tok].prefix, 0);                  print_block(manacts[n->tok].prefix, 0);
                 print_word("");                  print_word("");
                 putchar('\"');                  putchar('\"');
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
         }          }
         return(1);          return 1;
 }  }
   
 /*  /*
Line 789  static void
Line 793  static void
 post_sect(DECL_ARGS)  post_sect(DECL_ARGS)
 {  {
   
         if (MDOC_HEAD != n->type)          if (n->type != ROFFT_HEAD)
                 return;                  return;
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word("");          print_word("");
Line 801  post_sect(DECL_ARGS)
Line 805  post_sect(DECL_ARGS)
   
 /* See mdoc_term.c, synopsis_pre() for comments. */  /* See mdoc_term.c, synopsis_pre() for comments. */
 static void  static void
 pre_syn(const struct mdoc_node *n)  pre_syn(const struct roff_node *n)
 {  {
   
         if (NULL == n->prev || ! (MDOC_SYNPRETTY & n->flags))          if (NULL == n->prev || ! (NODE_SYNPRETTY & n->flags))
                 return;                  return;
   
         if (n->prev->tok == n->tok &&          if (n->prev->tok == n->tok &&
Line 817  pre_syn(const struct mdoc_node *n)
Line 821  pre_syn(const struct mdoc_node *n)
   
         switch (n->prev->tok) {          switch (n->prev->tok) {
         case MDOC_Fd:          case MDOC_Fd:
                 /* FALLTHROUGH */  
         case MDOC_Fn:          case MDOC_Fn:
                 /* FALLTHROUGH */  
         case MDOC_Fo:          case MDOC_Fo:
                 /* FALLTHROUGH */  
         case MDOC_In:          case MDOC_In:
                 /* FALLTHROUGH */  
         case MDOC_Vt:          case MDOC_Vt:
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
                 break;                  break;
Line 847  pre_an(DECL_ARGS)
Line 847  pre_an(DECL_ARGS)
         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;
         default:          default:
                 if (MMAN_An_split & outflags)                  if (MMAN_An_split & outflags)
                         outflags |= MMAN_br;                          outflags |= MMAN_br;
                 else if (SEC_AUTHORS == n->sec &&                  else if (SEC_AUTHORS == n->sec &&
                     ! (MMAN_An_nosplit & outflags))                      ! (MMAN_An_nosplit & outflags))
                         outflags |= MMAN_An_split;                          outflags |= MMAN_An_split;
                 return(1);                  return 1;
         }          }
 }  }
   
Line 869  pre_ap(DECL_ARGS)
Line 869  pre_ap(DECL_ARGS)
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word("'");          print_word("'");
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return(0);          return 0;
 }  }
   
 static int  static int
 pre_aq(DECL_ARGS)  pre_aq(DECL_ARGS)
 {  {
   
         print_word(n->parent->prev != NULL &&          print_word(n->child != NULL && n->child->next == NULL &&
             n->parent->prev->tok == MDOC_An ?  "<" : "\\(la");              n->child->tok == MDOC_Mt ?  "<" : "\\(la");
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return(1);          return 1;
 }  }
   
 static void  static void
Line 887  post_aq(DECL_ARGS)
Line 887  post_aq(DECL_ARGS)
 {  {
   
         outflags &= ~(MMAN_spc | MMAN_nl);          outflags &= ~(MMAN_spc | MMAN_nl);
         print_word(n->parent->prev != NULL &&          print_word(n->child != NULL && n->child->next == NULL &&
             n->parent->prev->tok == MDOC_An ?  ">" : "\\(ra");              n->child->tok == MDOC_Mt ?  ">" : "\\(ra");
 }  }
   
 static int  static int
Line 903  pre_bd(DECL_ARGS)
Line 903  pre_bd(DECL_ARGS)
         if (0 == n->norm->Bd.comp && NULL != n->parent->prev)          if (0 == n->norm->Bd.comp && NULL != n->parent->prev)
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
         print_offs(n->norm->Bd.offs, 1);          print_offs(n->norm->Bd.offs, 1);
         return(1);          return 1;
 }  }
   
 static void  static void
Line 926  pre_bf(DECL_ARGS)
Line 926  pre_bf(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 return(1);                  return 1;
         case MDOC_BODY:          case ROFFT_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:
Line 944  pre_bf(DECL_ARGS)
Line 944  pre_bf(DECL_ARGS)
                 font_push('R');                  font_push('R');
                 break;                  break;
         }          }
         return(1);          return 1;
 }  }
   
 static void  static void
 post_bf(DECL_ARGS)  post_bf(DECL_ARGS)
 {  {
   
         if (MDOC_BODY == n->type)          if (n->type == ROFFT_BODY)
                 font_pop();                  font_pop();
 }  }
   
Line 960  pre_bk(DECL_ARGS)
Line 960  pre_bk(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 return(1);                  return 1;
         case MDOC_BODY:          case ROFFT_BODY:
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 return(1);                  return 1;
         default:          default:
                 return(0);                  return 0;
         }          }
 }  }
   
Line 974  static void
Line 974  static void
 post_bk(DECL_ARGS)  post_bk(DECL_ARGS)
 {  {
   
         if (MDOC_BODY == n->type)          if (n->type == ROFFT_BODY)
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
 }  }
   
Line 996  pre_bl(DECL_ARGS)
Line 996  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;
         }          }
   
         print_line(".TS", MMAN_nl);          if (n->child != NULL) {
         for (icol = 0; icol < n->norm->Bl.ncols; icol++)                  print_line(".TS", MMAN_nl);
                 print_word("l");                  for (icol = 0; icol < n->norm->Bl.ncols; icol++)
         print_word(".");                          print_word("l");
                   print_word(".");
           }
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1017  post_bl(DECL_ARGS)
Line 1019  post_bl(DECL_ARGS)
   
         switch (n->norm->Bl.type) {          switch (n->norm->Bl.type) {
         case LIST_column:          case LIST_column:
                 print_line(".TE", 0);                  if (n->child != NULL)
                           print_line(".TE", 0);
                 break;                  break;
         case LIST_enum:          case LIST_enum:
                 n->norm->Bl.count = 0;                  n->norm->Bl.count = 0;
Line 1047  pre_br(DECL_ARGS)
Line 1050  pre_br(DECL_ARGS)
 {  {
   
         outflags |= MMAN_br;          outflags |= MMAN_br;
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1062  pre_bx(DECL_ARGS)
Line 1065  pre_bx(DECL_ARGS)
         }          }
         print_word("BSD");          print_word("BSD");
         if (NULL == n)          if (NULL == n)
                 return(0);                  return 0;
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word("-");          print_word("-");
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word(n->string);          print_word(n->string);
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1075  pre_dl(DECL_ARGS)
Line 1078  pre_dl(DECL_ARGS)
 {  {
   
         print_offs("6n", 0);          print_offs("6n", 0);
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1094  pre_em(DECL_ARGS)
Line 1097  pre_em(DECL_ARGS)
 {  {
   
         font_push('I');          font_push('I');
         return(1);          return 1;
 }  }
   
 static int  static int
Line 1103  pre_en(DECL_ARGS)
Line 1106  pre_en(DECL_ARGS)
   
         if (NULL == n->norm->Es ||          if (NULL == n->norm->Es ||
             NULL == n->norm->Es->child)              NULL == n->norm->Es->child)
                 return(1);                  return 1;
   
         print_word(n->norm->Es->child->string);          print_word(n->norm->Es->child->string);
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1128  static int
Line 1131  static int
 pre_eo(DECL_ARGS)  pre_eo(DECL_ARGS)
 {  {
   
         outflags &= ~(MMAN_spc | MMAN_nl);          if (n->end == ENDBODY_NOT &&
         return(1);              n->parent->head->child == NULL &&
               n->child != NULL &&
               n->child->end != ENDBODY_NOT)
                   print_word("\\&");
           else if (n->end != ENDBODY_NOT ? n->child != NULL :
               n->parent->head->child != NULL && (n->child != NULL ||
               (n->parent->tail != NULL && n->parent->tail->child != NULL)))
                   outflags &= ~(MMAN_spc | MMAN_nl);
           return 1;
 }  }
   
 static void  static void
 post_eo(DECL_ARGS)  post_eo(DECL_ARGS)
 {  {
           int      body, tail;
   
         if (n->end != ENDBODY_SPACE)          if (n->end != ENDBODY_NOT) {
                   outflags |= MMAN_spc;
                   return;
           }
   
           body = n->child != NULL || n->parent->head->child != NULL;
           tail = n->parent->tail != NULL && n->parent->tail->child != NULL;
   
           if (body && tail)
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
           else if ( ! (body || tail))
                   print_word("\\&");
           else if ( ! tail)
                   outflags |= MMAN_spc;
 }  }
   
 static int  static int
Line 1152  pre_fa(DECL_ARGS)
Line 1176  pre_fa(DECL_ARGS)
   
         while (NULL != n) {          while (NULL != n) {
                 font_push('I');                  font_push('I');
                 if (am_Fa || MDOC_SYNPRETTY & n->flags)                  if (am_Fa || NODE_SYNPRETTY & n->flags)
                         outflags |= MMAN_nbrword;                          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))
                         print_word(",");                          print_word(",");
         }          }
         return(0);          return 0;
 }  }
   
 static void  static void
Line 1176  pre_fd(DECL_ARGS)
Line 1200  pre_fd(DECL_ARGS)
   
         pre_syn(n);          pre_syn(n);
         font_push('B');          font_push('B');
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1193  pre_fl(DECL_ARGS)
Line 1217  pre_fl(DECL_ARGS)
   
         font_push('B');          font_push('B');
         print_word("\\-");          print_word("\\-");
         if (n->nchild)          if (n->child != NULL)
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1203  post_fl(DECL_ARGS)
Line 1227  post_fl(DECL_ARGS)
 {  {
   
         font_pop();          font_pop();
         if ( ! (n->nchild ||          if (!(n->child != NULL ||
             n->next == NULL ||              n->next == NULL ||
             n->next->type == MDOC_TEXT ||              n->next->type == ROFFT_TEXT ||
             n->next->flags & MDOC_LINE))              n->next->flags & NODE_LINE))
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
 }  }
   
Line 1218  pre_fn(DECL_ARGS)
Line 1242  pre_fn(DECL_ARGS)
   
         n = n->child;          n = n->child;
         if (NULL == n)          if (NULL == n)
                 return(0);                  return 0;
   
         if (MDOC_SYNPRETTY & n->flags)          if (NODE_SYNPRETTY & n->flags)
                 print_block(".HP 4n", MMAN_nl);                  print_block(".HP 4n", MMAN_nl);
   
         font_push('B');          font_push('B');
Line 1233  pre_fn(DECL_ARGS)
Line 1257  pre_fn(DECL_ARGS)
         n = n->next;          n = n->next;
         if (NULL != n)          if (NULL != n)
                 pre_fa(meta, n);                  pre_fa(meta, n);
         return(0);          return 0;
 }  }
   
 static void  static void
Line 1241  post_fn(DECL_ARGS)
Line 1265  post_fn(DECL_ARGS)
 {  {
   
         print_word(")");          print_word(")");
         if (MDOC_SYNPRETTY & n->flags) {          if (NODE_SYNPRETTY & n->flags) {
                 print_word(";");                  print_word(";");
                 outflags |= MMAN_PP;                  outflags |= MMAN_PP;
         }          }
Line 1252  pre_fo(DECL_ARGS)
Line 1276  pre_fo(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 pre_syn(n);                  pre_syn(n);
                 break;                  break;
         case MDOC_HEAD:          case ROFFT_HEAD:
                 if (MDOC_SYNPRETTY & n->flags)                  if (n->child == NULL)
                           return 0;
                   if (NODE_SYNPRETTY & n->flags)
                         print_block(".HP 4n", MMAN_nl);                          print_block(".HP 4n", MMAN_nl);
                 font_push('B');                  font_push('B');
                 break;                  break;
         case MDOC_BODY:          case ROFFT_BODY:
                 outflags &= ~MMAN_spc;                  outflags &= ~(MMAN_spc | MMAN_nl);
                 print_word("(");                  print_word("(");
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
                 break;                  break;
         default:          default:
                 break;                  break;
         }          }
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1276  post_fo(DECL_ARGS)
Line 1302  post_fo(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_HEAD:          case ROFFT_HEAD:
                 font_pop();                  if (n->child != NULL)
                           font_pop();
                 break;                  break;
         case MDOC_BODY:          case ROFFT_BODY:
                 post_fn(meta, n);                  post_fn(meta, n);
                 break;                  break;
         default:          default:
Line 1293  pre_ft(DECL_ARGS)
Line 1320  pre_ft(DECL_ARGS)
   
         pre_syn(n);          pre_syn(n);
         font_push('I');          font_push('I');
         return(1);          return 1;
 }  }
   
 static int  static int
 pre_in(DECL_ARGS)  pre_in(DECL_ARGS)
 {  {
   
         if (MDOC_SYNPRETTY & n->flags) {          if (NODE_SYNPRETTY & n->flags) {
                 pre_syn(n);                  pre_syn(n);
                 font_push('B');                  font_push('B');
                 print_word("#include <");                  print_word("#include <");
Line 1310  pre_in(DECL_ARGS)
Line 1337  pre_in(DECL_ARGS)
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
                 font_push('I');                  font_push('I');
         }          }
         return(1);          return 1;
 }  }
   
 static void  static void
 post_in(DECL_ARGS)  post_in(DECL_ARGS)
 {  {
   
         if (MDOC_SYNPRETTY & n->flags) {          if (NODE_SYNPRETTY & n->flags) {
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
                 print_word(">");                  print_word(">");
                 font_pop();                  font_pop();
Line 1332  post_in(DECL_ARGS)
Line 1359  post_in(DECL_ARGS)
 static int  static int
 pre_it(DECL_ARGS)  pre_it(DECL_ARGS)
 {  {
         const struct mdoc_node *bln;          const struct roff_node *bln;
   
         switch (n->type) {          switch (n->type) {
         case MDOC_HEAD:          case ROFFT_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 1345  pre_it(DECL_ARGS)
Line 1372  pre_it(DECL_ARGS)
                 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 */  
                 case LIST_diag:                  case LIST_diag:
                         /* 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 */  
                 case LIST_dash:                  case LIST_dash:
                         /* FALLTHROUGH */  
                 case LIST_hyphen:                  case LIST_hyphen:
                         print_width(bln->norm->Bl.width, NULL, 0);                          print_width(&bln->norm->Bl, NULL);
                         TPremain = 0;                          TPremain = 0;
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         font_push('B');                          font_push('B');
Line 1372  pre_it(DECL_ARGS)
Line 1395  pre_it(DECL_ARGS)
                                 print_word("-");                                  print_word("-");
                         font_pop();                          font_pop();
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         return(0);                          return 0;
                 case LIST_enum:                  case LIST_enum:
                         print_width(bln->norm->Bl.width, NULL, 0);                          print_width(&bln->norm->Bl, NULL);
                         TPremain = 0;                          TPremain = 0;
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         print_count(&bln->norm->Bl.count);                          print_count(&bln->norm->Bl.count);
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         return(0);                          return 0;
                 case LIST_hang:                  case LIST_hang:
                         print_width(bln->norm->Bl.width, n->child, 6);                          print_width(&bln->norm->Bl, n->child);
                         TPremain = 0;                          TPremain = 0;
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         return(1);                          return 1;
                 case LIST_tag:                  case LIST_tag:
                         print_width(bln->norm->Bl.width, n->child, 0);                          print_width(&bln->norm->Bl, n->child);
                         putchar('\n');                          putchar('\n');
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                         return(1);                          return 1;
                 default:                  default:
                         return(1);                          return 1;
                 }                  }
         default:          default:
                 break;                  break;
         }          }
         return(1);          return 1;
 }  }
   
 /*  /*
Line 1418  mid_it(void)
Line 1441  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);
         (void)snprintf(buf, sizeof(buf), "%zun",          (void)snprintf(buf, sizeof(buf), "%dn",
             Bl_stack[Bl_stack_len - 1]);              Bl_stack[Bl_stack_len - 1]);
         print_word(buf);          print_word(buf);
   
Line 1429  mid_it(void)
Line 1452  mid_it(void)
 static void  static void
 post_it(DECL_ARGS)  post_it(DECL_ARGS)
 {  {
         const struct mdoc_node *bln;          const struct roff_node *bln;
   
         bln = n->parent->parent;          bln = n->parent->parent;
   
         switch (n->type) {          switch (n->type) {
         case MDOC_HEAD:          case ROFFT_HEAD:
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case LIST_diag:                  case LIST_diag:
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
Line 1447  post_it(DECL_ARGS)
Line 1470  post_it(DECL_ARGS)
                         break;                          break;
                 }                  }
                 break;                  break;
         case MDOC_BODY:          case ROFFT_BODY:
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case LIST_bullet:                  case LIST_bullet:
                         /* FALLTHROUGH */  
                 case LIST_dash:                  case LIST_dash:
                         /* FALLTHROUGH */  
                 case LIST_hyphen:                  case LIST_hyphen:
                         /* FALLTHROUGH */  
                 case LIST_enum:                  case LIST_enum:
                         /* FALLTHROUGH */  
                 case LIST_hang:                  case LIST_hang:
                         /* 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 1499  post_lb(DECL_ARGS)
Line 1517  post_lb(DECL_ARGS)
 static int  static int
 pre_lk(DECL_ARGS)  pre_lk(DECL_ARGS)
 {  {
         const struct mdoc_node *link, *descr;          const struct roff_node *link, *descr;
   
         if (NULL == (link = n->child))          if (NULL == (link = n->child))
                 return(0);                  return 0;
   
         if (NULL != (descr = link->next)) {          if (NULL != (descr = link->next)) {
                 font_push('I');                  font_push('I');
Line 1517  pre_lk(DECL_ARGS)
Line 1535  pre_lk(DECL_ARGS)
         font_push('B');          font_push('B');
         print_word(link->string);          print_word(link->string);
         font_pop();          font_pop();
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1525  pre_ll(DECL_ARGS)
Line 1543  pre_ll(DECL_ARGS)
 {  {
   
         print_line(".ll", 0);          print_line(".ll", 0);
         return(1);          return 1;
 }  }
   
 static int  static int
Line 1533  pre_li(DECL_ARGS)
Line 1551  pre_li(DECL_ARGS)
 {  {
   
         font_push('R');          font_push('R');
         return(1);          return 1;
 }  }
   
 static int  static int
Line 1541  pre_nm(DECL_ARGS)
Line 1559  pre_nm(DECL_ARGS)
 {  {
         char    *name;          char    *name;
   
         if (MDOC_BLOCK == n->type) {          if (n->type == ROFFT_BLOCK) {
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 pre_syn(n);                  pre_syn(n);
         }          }
         if (MDOC_ELEM != n->type && MDOC_HEAD != n->type)          if (n->type != ROFFT_ELEM && n->type != ROFFT_HEAD)
                 return(1);                  return 1;
         name = n->child ? n->child->string : meta->name;          name = n->child ? n->child->string : meta->name;
         if (NULL == name)          if (NULL == name)
                 return(0);                  return 0;
         if (MDOC_HEAD == n->type) {          if (n->type == ROFFT_HEAD) {
                 if (NULL == n->parent->prev)                  if (NULL == n->parent->prev)
                         outflags |= MMAN_sp;                          outflags |= MMAN_sp;
                 print_block(".HP", 0);                  print_block(".HP", 0);
Line 1560  pre_nm(DECL_ARGS)
Line 1578  pre_nm(DECL_ARGS)
         font_push('B');          font_push('B');
         if (NULL == n->child)          if (NULL == n->child)
                 print_word(meta->name);                  print_word(meta->name);
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1568  post_nm(DECL_ARGS)
Line 1586  post_nm(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
                 break;                  break;
         case MDOC_HEAD:          case ROFFT_HEAD:
                 /* FALLTHROUGH */          case ROFFT_ELEM:
         case MDOC_ELEM:  
                 if (n->child != NULL || meta->name != NULL)                  if (n->child != NULL || meta->name != NULL)
                         font_pop();                          font_pop();
                 break;                  break;
Line 1587  pre_no(DECL_ARGS)
Line 1604  pre_no(DECL_ARGS)
 {  {
   
         outflags |= MMAN_spc_force;          outflags |= MMAN_spc_force;
         return(1);          return 1;
 }  }
   
 static int  static int
Line 1595  pre_ns(DECL_ARGS)
Line 1612  pre_ns(DECL_ARGS)
 {  {
   
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return(0);          return 0;
 }  }
   
 static void  static void
 post_pf(DECL_ARGS)  post_pf(DECL_ARGS)
 {  {
   
         if ( ! (n->next == NULL || n->next->flags & MDOC_LINE))          if ( ! (n->next == NULL || n->next->flags & NODE_LINE))
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
 }  }
   
Line 1614  pre_pp(DECL_ARGS)
Line 1631  pre_pp(DECL_ARGS)
                 outflags |= MMAN_PP;                  outflags |= MMAN_PP;
         outflags |= MMAN_sp | MMAN_nl;          outflags |= MMAN_sp | MMAN_nl;
         outflags &= ~MMAN_br;          outflags &= ~MMAN_br;
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1625  pre_rs(DECL_ARGS)
Line 1642  pre_rs(DECL_ARGS)
                 outflags |= MMAN_PP | MMAN_sp | MMAN_nl;                  outflags |= MMAN_PP | MMAN_sp | MMAN_nl;
                 outflags &= ~MMAN_br;                  outflags &= ~MMAN_br;
         }          }
         return(1);          return 1;
 }  }
   
 static int  static int
 pre_rv(DECL_ARGS)  pre_rv(DECL_ARGS)
 {  {
         int      nchild;          struct roff_node *nch;
   
         outflags |= MMAN_br | MMAN_nl;          outflags |= MMAN_br | MMAN_nl;
   
         nchild = n->nchild;          if (n->child != NULL) {
         if (nchild > 0) {  
                 print_word("The");                  print_word("The");
   
                 for (n = n->child; n; n = n->next) {                  for (nch = n->child; nch != NULL; nch = nch->next) {
                         font_push('B');                          font_push('B');
                         print_word(n->string);                          print_word(nch->string);
                         font_pop();                          font_pop();
   
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                         print_word("()");                          print_word("()");
   
                         if (n->next == NULL)                          if (nch->next == NULL)
                                 continue;                                  continue;
   
                         if (nchild > 2) {                          if (nch->prev != NULL || nch->next->next != NULL) {
                                 outflags &= ~MMAN_spc;                                  outflags &= ~MMAN_spc;
                                 print_word(",");                                  print_word(",");
                         }                          }
                         if (n->next->next == NULL)                          if (nch->next->next == NULL)
                                 print_word("and");                                  print_word("and");
                 }                  }
   
                 if (nchild > 1)                  if (n->child != NULL && n->child->next != NULL)
                         print_word("functions return");                          print_word("functions return");
                 else                  else
                         print_word("function returns");                          print_word("function returns");
Line 1677  pre_rv(DECL_ARGS)
Line 1693  pre_rv(DECL_ARGS)
   
         print_word("is set to indicate the error.");          print_word("is set to indicate the error.");
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
         return(0);          return 0;
 }  }
   
 static int  static int
 pre_skip(DECL_ARGS)  pre_skip(DECL_ARGS)
 {  {
   
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1701  pre_sm(DECL_ARGS)
Line 1717  pre_sm(DECL_ARGS)
         if (MMAN_Sm & outflags)          if (MMAN_Sm & outflags)
                 outflags |= MMAN_spc;                  outflags |= MMAN_spc;
   
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1713  pre_sp(DECL_ARGS)
Line 1729  pre_sp(DECL_ARGS)
                 print_line(".PP", 0);                  print_line(".PP", 0);
         } else          } else
                 print_line(".sp", 0);                  print_line(".sp", 0);
         return(1);          return 1;
 }  }
   
 static void  static void
Line 1728  pre_sy(DECL_ARGS)
Line 1744  pre_sy(DECL_ARGS)
 {  {
   
         font_push('B');          font_push('B');
         return(1);          return 1;
 }  }
   
 static int  static int
 pre_vt(DECL_ARGS)  pre_vt(DECL_ARGS)
 {  {
   
         if (MDOC_SYNPRETTY & n->flags) {          if (NODE_SYNPRETTY & n->flags) {
                 switch (n->type) {                  switch (n->type) {
                 case MDOC_BLOCK:                  case ROFFT_BLOCK:
                         pre_syn(n);                          pre_syn(n);
                         return(1);                          return 1;
                 case MDOC_BODY:                  case ROFFT_BODY:
                         break;                          break;
                 default:                  default:
                         return(0);                          return 0;
                 }                  }
         }          }
         font_push('I');          font_push('I');
         return(1);          return 1;
 }  }
   
 static void  static void
 post_vt(DECL_ARGS)  post_vt(DECL_ARGS)
 {  {
   
         if (MDOC_SYNPRETTY & n->flags && MDOC_BODY != n->type)          if (n->flags & NODE_SYNPRETTY && n->type != ROFFT_BODY)
                 return;                  return;
         font_pop();          font_pop();
 }  }
Line 1765  pre_xr(DECL_ARGS)
Line 1781  pre_xr(DECL_ARGS)
   
         n = n->child;          n = n->child;
         if (NULL == n)          if (NULL == n)
                 return(0);                  return 0;
         print_node(meta, n);          print_node(meta, n);
         n = n->next;          n = n->next;
         if (NULL == n)          if (NULL == n)
                 return(0);                  return 0;
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word("(");          print_word("(");
         print_node(meta, n);          print_node(meta, n);
         print_word(")");          print_word(")");
         return(0);          return 0;
 }  }
   
 static int  static int
Line 1783  pre_ux(DECL_ARGS)
Line 1799  pre_ux(DECL_ARGS)
   
         print_word(manacts[n->tok].prefix);          print_word(manacts[n->tok].prefix);
         if (NULL == n->child)          if (NULL == n->child)
                 return(0);                  return 0;
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word("\\ ");          print_word("\\ ");
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return(1);          return 1;
 }  }

Legend:
Removed from v.1.79  
changed lines
  Added in v.1.99

CVSweb