[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.126 and 1.136

version 1.126, 2018/04/11 17:11:13 version 1.136, 2020/02/27 01:43:52
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2011-2018 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011-2020 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 36 
Line 36 
 typedef int     (*int_fp)(DECL_ARGS);  typedef int     (*int_fp)(DECL_ARGS);
 typedef void    (*void_fp)(DECL_ARGS);  typedef void    (*void_fp)(DECL_ARGS);
   
 struct  manact {  struct  mdoc_man_act {
         int_fp            cond; /* DON'T run actions */          int_fp            cond; /* DON'T run actions */
         int_fp            pre; /* pre-node action */          int_fp            pre; /* pre-node action */
         void_fp           post; /* post-node action */          void_fp           post; /* post-node action */
Line 75  static void   post_pf(DECL_ARGS);
Line 75  static void   post_pf(DECL_ARGS);
 static  void      post_sect(DECL_ARGS);  static  void      post_sect(DECL_ARGS);
 static  void      post_vt(DECL_ARGS);  static  void      post_vt(DECL_ARGS);
 static  int       pre__t(DECL_ARGS);  static  int       pre__t(DECL_ARGS);
   static  int       pre_abort(DECL_ARGS);
 static  int       pre_an(DECL_ARGS);  static  int       pre_an(DECL_ARGS);
 static  int       pre_ap(DECL_ARGS);  static  int       pre_ap(DECL_ARGS);
 static  int       pre_aq(DECL_ARGS);  static  int       pre_aq(DECL_ARGS);
Line 103  static int   pre_lk(DECL_ARGS);
Line 104  static int   pre_lk(DECL_ARGS);
 static  int       pre_li(DECL_ARGS);  static  int       pre_li(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  void      pre_noarg(DECL_ARGS);
 static  int       pre_ns(DECL_ARGS);  static  int       pre_ns(DECL_ARGS);
 static  void      pre_onearg(DECL_ARGS);  static  void      pre_onearg(DECL_ARGS);
 static  int       pre_pp(DECL_ARGS);  static  int       pre_pp(DECL_ARGS);
Line 111  static int   pre_sm(DECL_ARGS);
Line 113  static int   pre_sm(DECL_ARGS);
 static  void      pre_sp(DECL_ARGS);  static  void      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 roff_node *);  static  void      pre_syn(struct roff_node *);
 static  void      pre_ta(DECL_ARGS);  static  void      pre_ta(DECL_ARGS);
 static  int       pre_vt(DECL_ARGS);  static  int       pre_vt(DECL_ARGS);
 static  int       pre_xr(DECL_ARGS);  static  int       pre_xr(DECL_ARGS);
Line 124  static void   print_width(const struct mdoc_bl *,
Line 126  static void   print_width(const struct mdoc_bl *,
 static  void      print_count(int *);  static  void      print_count(int *);
 static  void      print_node(DECL_ARGS);  static  void      print_node(DECL_ARGS);
   
 static  const void_fp roff_manacts[ROFF_MAX] = {  static const void_fp roff_man_acts[ROFF_MAX] = {
         pre_br,         /* br */          pre_br,         /* br */
         pre_onearg,     /* ce */          pre_onearg,     /* ce */
           pre_noarg,      /* fi */
         pre_ft,         /* ft */          pre_ft,         /* ft */
         pre_onearg,     /* ll */          pre_onearg,     /* ll */
         pre_onearg,     /* mc */          pre_onearg,     /* mc */
           pre_noarg,      /* nf */
         pre_onearg,     /* po */          pre_onearg,     /* po */
         pre_onearg,     /* rj */          pre_onearg,     /* rj */
         pre_sp,         /* sp */          pre_sp,         /* sp */
Line 137  static const void_fp roff_manacts[ROFF_MAX] = {
Line 141  static const void_fp roff_manacts[ROFF_MAX] = {
         pre_onearg,     /* ti */          pre_onearg,     /* ti */
 };  };
   
 static  const struct manact __manacts[MDOC_MAX - MDOC_Dd] = {  static const struct mdoc_man_act mdoc_man_acts[MDOC_MAX - MDOC_Dd] = {
         { NULL, NULL, NULL, NULL, NULL }, /* Dd */          { NULL, NULL, NULL, NULL, NULL }, /* Dd */
         { NULL, NULL, NULL, NULL, NULL }, /* Dt */          { NULL, NULL, NULL, NULL, NULL }, /* Dt */
         { NULL, NULL, NULL, NULL, NULL }, /* Os */          { NULL, NULL, NULL, NULL, NULL }, /* Os */
Line 172  static const struct manact __manacts[MDOC_MAX - MDOC_D
Line 176  static const struct manact __manacts[MDOC_MAX - MDOC_D
         { 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, pre_Ft, post_font, NULL, NULL }, /* Ot */          { NULL, pre_abort, NULL, NULL, NULL }, /* Ot */
         { NULL, pre_em, post_font, NULL, NULL }, /* Pa */          { NULL, pre_em, post_font, NULL, NULL }, /* Pa */
         { NULL, pre_ex, NULL, NULL, NULL }, /* Rv */          { NULL, pre_ex, NULL, NULL, NULL }, /* Rv */
         { NULL, NULL, NULL, NULL, NULL }, /* St */          { NULL, NULL, NULL, NULL, NULL }, /* St */
Line 245  static const struct manact __manacts[MDOC_MAX - MDOC_D
Line 249  static const struct manact __manacts[MDOC_MAX - MDOC_D
         { NULL, pre_em, post_font, NULL, NULL }, /* Fr */          { NULL, pre_em, post_font, NULL, NULL }, /* Fr */
         { NULL, NULL, NULL, NULL, NULL }, /* Ud */          { NULL, NULL, NULL, NULL, 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_abort, NULL, NULL, NULL }, /* Lp */
         { NULL, pre_lk, NULL, NULL, NULL }, /* Lk */          { NULL, pre_lk, NULL, NULL, NULL }, /* Lk */
         { NULL, pre_em, post_font, NULL, NULL }, /* Mt */          { NULL, pre_em, post_font, NULL, NULL }, /* Mt */
         { cond_body, pre_enc, post_enc, "{", "}" }, /* Brq */          { cond_body, pre_enc, post_enc, "{", "}" }, /* Brq */
Line 258  static const struct manact __manacts[MDOC_MAX - MDOC_D
Line 262  static const struct manact __manacts[MDOC_MAX - MDOC_D
         { NULL, NULL, post_percent, NULL, NULL }, /* %Q */          { NULL, NULL, post_percent, NULL, NULL }, /* %Q */
         { 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_skip, NULL, NULL, NULL }, /* Tg */
 };  };
 static  const struct manact *const manacts = __manacts - MDOC_Dd;  static const struct mdoc_man_act *mdoc_man_act(enum roff_tok);
   
 static  int             outflags;  static  int             outflags;
 #define MMAN_spc        (1 << 0)  /* blank character before next word */  #define MMAN_spc        (1 << 0)  /* blank character before next word */
Line 290  static struct {
Line 295  static struct {
 }       fontqueue;  }       fontqueue;
   
   
   static const struct mdoc_man_act *
   mdoc_man_act(enum roff_tok tok)
   {
           assert(tok >= MDOC_Dd && tok <= MDOC_MAX);
           return mdoc_man_acts + (tok - MDOC_Dd);
   }
   
 static int  static int
 man_strlen(const char *cp)  man_strlen(const char *cp)
 {  {
Line 317  man_strlen(const char *cp)
Line 329  man_strlen(const char *cp)
                 case ESCAPE_UNICODE:                  case ESCAPE_UNICODE:
                 case ESCAPE_NUMBERED:                  case ESCAPE_NUMBERED:
                 case ESCAPE_SPECIAL:                  case ESCAPE_SPECIAL:
                   case ESCAPE_UNDEF:
                 case ESCAPE_OVERSTRIKE:                  case ESCAPE_OVERSTRIKE:
                         if (skip)                          if (skip)
                                 skip = 0;                                  skip = 0;
Line 570  print_width(const struct mdoc_bl *bl, const struct rof
Line 583  print_width(const struct mdoc_bl *bl, const struct rof
   
         /* Set up the current list. */          /* Set up the current list. */
         if (chsz > sz && bl->type != LIST_tag)          if (chsz > sz && bl->type != LIST_tag)
                 print_block(".HP", 0);                  print_block(".HP", MMAN_spc);
         else {          else {
                 print_block(".TP", 0);                  print_block(".TP", MMAN_spc);
                 remain = sz + 2;                  remain = sz + 2;
         }          }
         if (numeric) {          if (numeric) {
Line 593  print_count(int *count)
Line 606  print_count(int *count)
 }  }
   
 void  void
 man_man(void *arg, const struct roff_man *man)  man_mdoc(void *arg, const struct roff_meta *mdoc)
 {  {
   
         /*  
          * Dump the keep buffer.  
          * We're guaranteed by now that this exists (is non-NULL).  
          * Flush stdout afterward, just in case.  
          */  
         fputs(mparse_getkeep(man_mparse(man)), stdout);  
         fflush(stdout);  
 }  
   
 void  
 man_mdoc(void *arg, const struct roff_man *mdoc)  
 {  
         struct roff_node *n;          struct roff_node *n;
   
         printf(".\\\" Automatically generated from an mdoc input file."          printf(".\\\" Automatically generated from an mdoc input file."
Line 619  man_mdoc(void *arg, const struct roff_man *mdoc)
Line 619  man_mdoc(void *arg, const struct roff_man *mdoc)
         }          }
   
         printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",          printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",
             mdoc->meta.title,              mdoc->title, (mdoc->msec == NULL ? "" : mdoc->msec),
             (mdoc->meta.msec == NULL ? "" : mdoc->meta.msec),              mdoc->date, mdoc->os, mdoc->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 633  man_mdoc(void *arg, const struct roff_man *mdoc)
Line 632  man_mdoc(void *arg, const struct roff_man *mdoc)
                 *fontqueue.tail = 'R';                  *fontqueue.tail = 'R';
         }          }
         for (; n != NULL; n = n->next)          for (; n != NULL; n = n->next)
                 print_node(&mdoc->meta, n);                  print_node(mdoc, n);
         putchar('\n');          putchar('\n');
 }  }
   
 static void  static void
 print_node(DECL_ARGS)  print_node(DECL_ARGS)
 {  {
         const struct manact     *act;          const struct mdoc_man_act       *act;
         struct roff_node        *sub;          struct roff_node                *sub;
         int                      cond, do_sub;          int                              cond, do_sub;
   
         if (n->flags & NODE_NOPRT)          if (n->flags & NODE_NOPRT)
                 return;                  return;
Line 651  print_node(DECL_ARGS)
Line 650  print_node(DECL_ARGS)
          * 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 && NODE_LINE & n->flags)          if (outflags & MMAN_spc &&
               n->flags & NODE_LINE &&
               !roff_node_transparent(n))
                 outflags |= MMAN_nl;                  outflags |= MMAN_nl;
   
         act = NULL;          act = NULL;
Line 680  print_node(DECL_ARGS)
Line 681  print_node(DECL_ARGS)
                 else if (outflags & MMAN_Sm)                  else if (outflags & MMAN_Sm)
                         outflags |= MMAN_spc;                          outflags |= MMAN_spc;
         } else if (n->tok < ROFF_MAX) {          } else if (n->tok < ROFF_MAX) {
                 (*roff_manacts[n->tok])(meta, n);                  (*roff_man_acts[n->tok])(meta, n);
                 return;                  return;
         } else {          } else {
                 assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);  
                 /*                  /*
                  * Conditionally run the pre-node action handler for a                   * Conditionally run the pre-node action handler for a
                  * node.                   * node.
                  */                   */
                 act = manacts + n->tok;                  act = mdoc_man_act(n->tok);
                 cond = act->cond == NULL || (*act->cond)(meta, n);                  cond = act->cond == NULL || (*act->cond)(meta, n);
                 if (cond && act->pre != NULL &&                  if (cond && act->pre != NULL &&
                     (n->end == ENDBODY_NOT || n->child != NULL))                      (n->end == ENDBODY_NOT || n->child != NULL))
Line 732  cond_body(DECL_ARGS)
Line 732  cond_body(DECL_ARGS)
 }  }
   
 static int  static int
   pre_abort(DECL_ARGS)
   {
           abort();
   }
   
   static int
 pre_enc(DECL_ARGS)  pre_enc(DECL_ARGS)
 {  {
         const char      *prefix;          const char      *prefix;
   
         prefix = manacts[n->tok].prefix;          prefix = mdoc_man_act(n->tok)->prefix;
         if (NULL == prefix)          if (NULL == prefix)
                 return 1;                  return 1;
         print_word(prefix);          print_word(prefix);
Line 749  post_enc(DECL_ARGS)
Line 755  post_enc(DECL_ARGS)
 {  {
         const char *suffix;          const char *suffix;
   
         suffix = manacts[n->tok].suffix;          suffix = mdoc_man_act(n->tok)->suffix;
         if (NULL == suffix)          if (NULL == suffix)
                 return;                  return;
         outflags &= ~(MMAN_spc | MMAN_nl);          outflags &= ~(MMAN_spc | MMAN_nl);
Line 773  post_font(DECL_ARGS)
Line 779  post_font(DECL_ARGS)
 static void  static void
 post_percent(DECL_ARGS)  post_percent(DECL_ARGS)
 {  {
           struct roff_node *np, *nn, *nnn;
   
         if (pre_em == manacts[n->tok].pre)          if (mdoc_man_act(n->tok)->pre == pre_em)
                 font_pop();                  font_pop();
         if (n->next) {  
                 print_word(",");          if ((nn = roff_node_next(n)) != NULL) {
                 if (n->prev &&  n->prev->tok == n->tok &&                  np = roff_node_prev(n);
                                 n->next->tok == n->tok)                  nnn = nn == NULL ? NULL : roff_node_next(nn);
                   if (nn->tok != n->tok ||
                       (np != NULL && np->tok == n->tok) ||
                       (nnn != NULL && nnn->tok == n->tok))
                           print_word(",");
                   if (nn->tok == n->tok &&
                       (nnn == NULL || nnn->tok != n->tok))
                         print_word("and");                          print_word("and");
         } else {          } else {
                 print_word(".");                  print_word(".");
Line 820  pre_sect(DECL_ARGS)
Line 833  pre_sect(DECL_ARGS)
   
         if (n->type == ROFFT_HEAD) {          if (n->type == ROFFT_HEAD) {
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
                 print_block(manacts[n->tok].prefix, 0);                  print_block(mdoc_man_act(n->tok)->prefix, 0);
                 print_word("");                  print_word("");
                 putchar('\"');                  putchar('\"');
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
Line 847  post_sect(DECL_ARGS)
Line 860  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 roff_node *n)  pre_syn(struct roff_node *n)
 {  {
           struct roff_node *np;
   
         if (NULL == n->prev || ! (NODE_SYNPRETTY & n->flags))          if ((n->flags & NODE_SYNPRETTY) == 0 ||
               (np = roff_node_prev(n)) == NULL)
                 return;                  return;
   
         if (n->prev->tok == n->tok &&          if (np->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) {
Line 861  pre_syn(const struct roff_node *n)
Line 876  pre_syn(const struct roff_node *n)
                 return;                  return;
         }          }
   
         switch (n->prev->tok) {          switch (np->tok) {
         case MDOC_Fd:          case MDOC_Fd:
         case MDOC_Fn:          case MDOC_Fn:
         case MDOC_Fo:          case MDOC_Fo:
Line 936  post_aq(DECL_ARGS)
Line 951  post_aq(DECL_ARGS)
 static int  static int
 pre_bd(DECL_ARGS)  pre_bd(DECL_ARGS)
 {  {
   
         outflags &= ~(MMAN_PP | MMAN_sp | MMAN_br);          outflags &= ~(MMAN_PP | MMAN_sp | MMAN_br);
           if (n->norm->Bd.type == DISP_unfilled ||
         if (DISP_unfilled == n->norm->Bd.type ||              n->norm->Bd.type == DISP_literal)
             DISP_literal  == n->norm->Bd.type)  
                 print_line(".nf", 0);                  print_line(".nf", 0);
         if (0 == n->norm->Bd.comp && NULL != n->parent->prev)          if (n->norm->Bd.comp == 0 && roff_node_prev(n->parent) != NULL)
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
         print_offs(n->norm->Bd.offs, 1);          print_offs(n->norm->Bd.offs, 1);
         return 1;          return 1;
Line 951  pre_bd(DECL_ARGS)
Line 964  pre_bd(DECL_ARGS)
 static void  static void
 post_bd(DECL_ARGS)  post_bd(DECL_ARGS)
 {  {
           enum roff_tok    bef, now;
   
         /* Close out this display. */          /* Close out this display. */
         print_line(".RE", MMAN_nl);          print_line(".RE", MMAN_nl);
         if (DISP_unfilled == n->norm->Bd.type ||          bef = n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi;
             DISP_literal  == n->norm->Bd.type)          if (n->last == NULL)
                 print_line(".fi", MMAN_nl);                  now = n->norm->Bd.type == DISP_unfilled ||
                       n->norm->Bd.type == DISP_literal ? ROFF_nf : ROFF_fi;
           else if (n->last->tok == ROFF_nf)
                   now = ROFF_nf;
           else if (n->last->tok == ROFF_fi)
                   now = ROFF_fi;
           else
                   now = n->last->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi;
           if (bef != now) {
                   outflags |= MMAN_nl;
                   print_word(".");
                   outflags &= ~MMAN_spc;
                   print_word(roff_name[bef]);
                   outflags |= MMAN_nl;
           }
   
         /* Maybe we are inside an enclosing list? */          /* Maybe we are inside an enclosing list? */
         if (NULL != n->parent->next)          if (roff_node_next(n->parent) != NULL)
                 mid_it();                  mid_it();
 }  }
   
Line 1084  post_bl(DECL_ARGS)
Line 1112  post_bl(DECL_ARGS)
                 print_line(".RE", MMAN_nl);                  print_line(".RE", MMAN_nl);
                 assert(Bl_stack_len);                  assert(Bl_stack_len);
                 Bl_stack_len--;                  Bl_stack_len--;
                 assert(0 == Bl_stack[Bl_stack_len]);                  assert(Bl_stack[Bl_stack_len] == 0);
         } else {          } else {
                 outflags |= MMAN_PP | MMAN_nl;                  outflags |= MMAN_PP | MMAN_nl;
                 outflags &= ~(MMAN_sp | MMAN_br);                  outflags &= ~(MMAN_sp | MMAN_br);
         }          }
   
         /* Maybe we are inside an enclosing list? */          /* Maybe we are inside an enclosing list? */
         if (NULL != n->parent->next)          if (roff_node_next(n->parent) != NULL)
                 mid_it();                  mid_it();
   
 }  }
   
 static void  static void
Line 1105  pre_br(DECL_ARGS)
Line 1132  pre_br(DECL_ARGS)
 static int  static int
 pre_dl(DECL_ARGS)  pre_dl(DECL_ARGS)
 {  {
   
         print_offs("6n", 0);          print_offs("6n", 0);
         return 1;          return 1;
 }  }
Line 1113  pre_dl(DECL_ARGS)
Line 1139  pre_dl(DECL_ARGS)
 static void  static void
 post_dl(DECL_ARGS)  post_dl(DECL_ARGS)
 {  {
   
         print_line(".RE", MMAN_nl);          print_line(".RE", MMAN_nl);
   
         /* Maybe we are inside an enclosing list? */          /* Maybe we are inside an enclosing list? */
         if (NULL != n->parent->next)          if (roff_node_next(n->parent) != NULL)
                 mid_it();                  mid_it();
 }  }
   
Line 1218  pre_fa(DECL_ARGS)
Line 1243  pre_fa(DECL_ARGS)
 static void  static void
 post_fa(DECL_ARGS)  post_fa(DECL_ARGS)
 {  {
           struct roff_node *nn;
   
         if (NULL != n->next && MDOC_Fa == n->next->tok)          if ((nn = roff_node_next(n)) != NULL && nn->tok == MDOC_Fa)
                 print_word(",");                  print_word(",");
 }  }
   
 static int  static int
 pre_fd(DECL_ARGS)  pre_fd(DECL_ARGS)
 {  {
   
         pre_syn(n);          pre_syn(n);
         font_push('B');          font_push('B');
         return 1;          return 1;
Line 1235  pre_fd(DECL_ARGS)
Line 1260  pre_fd(DECL_ARGS)
 static void  static void
 post_fd(DECL_ARGS)  post_fd(DECL_ARGS)
 {  {
   
         font_pop();          font_pop();
         outflags |= MMAN_br;          outflags |= MMAN_br;
 }  }
Line 1243  post_fd(DECL_ARGS)
Line 1267  post_fd(DECL_ARGS)
 static int  static int
 pre_fl(DECL_ARGS)  pre_fl(DECL_ARGS)
 {  {
   
         font_push('B');          font_push('B');
         print_word("\\-");          print_word("\\-");
         if (n->child != NULL)          if (n->child != NULL)
Line 1254  pre_fl(DECL_ARGS)
Line 1277  pre_fl(DECL_ARGS)
 static void  static void
 post_fl(DECL_ARGS)  post_fl(DECL_ARGS)
 {  {
           struct roff_node *nn;
   
         font_pop();          font_pop();
         if (!(n->child != NULL ||          if (n->child == NULL &&
             n->next == NULL ||              ((nn = roff_node_next(n)) != NULL &&
             n->next->type == ROFFT_TEXT ||              nn->type != ROFFT_TEXT &&
             n->next->flags & NODE_LINE))              (nn->flags & NODE_LINE) == 0))
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
 }  }
   
Line 1402  pre_it(DECL_ARGS)
Line 1426  pre_it(DECL_ARGS)
         case ROFFT_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 (bln->norm->Bl.comp == 0 ||
                     (NULL == n->parent->prev &&                      (n->parent->prev == NULL &&
                      NULL == bln->parent->prev))                       roff_node_prev(bln->parent) == NULL))
                         outflags |= MMAN_sp;                          outflags |= MMAN_sp;
                 outflags &= ~MMAN_br;                  outflags &= ~MMAN_br;
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
Line 1607  pre_onearg(DECL_ARGS)
Line 1631  pre_onearg(DECL_ARGS)
 static int  static int
 pre_li(DECL_ARGS)  pre_li(DECL_ARGS)
 {  {
   
         font_push('R');          font_push('R');
         return 1;          return 1;
 }  }
Line 1617  pre_nm(DECL_ARGS)
Line 1640  pre_nm(DECL_ARGS)
 {  {
         char    *name;          char    *name;
   
         if (n->type == ROFFT_BLOCK) {          switch (n->type) {
           case ROFFT_BLOCK:
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 pre_syn(n);                  pre_syn(n);
         }  
         if (n->type != ROFFT_ELEM && n->type != ROFFT_HEAD)  
                 return 1;                  return 1;
           case ROFFT_HEAD:
           case ROFFT_ELEM:
                   break;
           default:
                   return 1;
           }
         name = n->child == NULL ? NULL : n->child->string;          name = n->child == NULL ? NULL : n->child->string;
         if (NULL == name)          if (name == NULL)
                 return 0;                  return 0;
         if (n->type == ROFFT_HEAD) {          if (n->type == ROFFT_HEAD) {
                 if (NULL == n->parent->prev)                  if (roff_node_prev(n->parent) == NULL)
                         outflags |= MMAN_sp;                          outflags |= MMAN_sp;
                 print_block(".HP", 0);                  print_block(".HP", 0);
                 printf(" %dn", man_strlen(name) + 1);                  printf(" %dn", man_strlen(name) + 1);
Line 1640  pre_nm(DECL_ARGS)
Line 1668  pre_nm(DECL_ARGS)
 static void  static void
 post_nm(DECL_ARGS)  post_nm(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case ROFFT_BLOCK:          case ROFFT_BLOCK:
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
Line 1658  post_nm(DECL_ARGS)
Line 1685  post_nm(DECL_ARGS)
 static int  static int
 pre_no(DECL_ARGS)  pre_no(DECL_ARGS)
 {  {
   
         outflags |= MMAN_spc_force;          outflags |= MMAN_spc_force;
         return 1;          return 1;
 }  }
   
   static void
   pre_noarg(DECL_ARGS)
   {
           outflags |= MMAN_nl;
           print_word(".");
           outflags &= ~MMAN_spc;
           print_word(roff_name[n->tok]);
           outflags |= MMAN_nl;
   }
   
 static int  static int
 pre_ns(DECL_ARGS)  pre_ns(DECL_ARGS)
 {  {
   
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         return 0;          return 0;
 }  }

Legend:
Removed from v.1.126  
changed lines
  Added in v.1.136

CVSweb