[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.131 and 1.138

version 1.131, 2018/12/30 00:49:55 version 1.138, 2023/04/28 19:11:04
Line 1 
Line 1 
 /*      $Id$ */  /* $Id$ */
 /*  /*
  * Copyright (c) 2011-2018 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011-2021 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 104  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 112  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 128  static void   print_node(DECL_ARGS);
Line 129  static void   print_node(DECL_ARGS);
 static const void_fp roff_man_acts[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 259  static const struct mdoc_man_act mdoc_man_acts[MDOC_MA
Line 262  static const struct mdoc_man_act mdoc_man_acts[MDOC_MA
         { 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 mdoc_man_act *mdoc_man_act(enum roff_tok);  static const struct mdoc_man_act *mdoc_man_act(enum roff_tok);
   
Line 579  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 646  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 654  print_node(DECL_ARGS)
Line 660  print_node(DECL_ARGS)
         do_sub = 1;          do_sub = 1;
         n->flags &= ~NODE_ENDED;          n->flags &= ~NODE_ENDED;
   
         if (n->type == ROFFT_TEXT) {          switch (n->type) {
           case ROFFT_EQN:
           case ROFFT_TBL:
                   mandoc_msg(n->type == ROFFT_EQN ? MANDOCERR_EQN_TMAN :
                       MANDOCERR_TBL_TMAN, n->line, n->pos, NULL);
                   outflags |= MMAN_PP | MMAN_sp | MMAN_nl;
                   print_word("The");
                   print_line(".B \\-T man", MMAN_nl);
                   print_word("output mode does not support");
                   print_word(n->type == ROFFT_EQN ? "eqn(7)" : "tbl(7)");
                   print_word("input.");
                   outflags |= MMAN_PP | MMAN_sp | MMAN_nl;
                   return;
           case 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 674  print_node(DECL_ARGS)
Line 693  print_node(DECL_ARGS)
                         outflags &= ~(MMAN_spc | MMAN_spc_force);                          outflags &= ~(MMAN_spc | MMAN_spc_force);
                 else if (outflags & MMAN_Sm)                  else if (outflags & MMAN_Sm)
                         outflags |= MMAN_spc;                          outflags |= MMAN_spc;
         } else if (n->tok < ROFF_MAX) {                  break;
                 (*roff_man_acts[n->tok])(meta, n);          default:
                 return;                  if (n->tok < ROFF_MAX) {
         } else {                          (*roff_man_acts[n->tok])(meta, n);
                 /*                          return;
                  * Conditionally run the pre-node action handler for a                  }
                  * node.  
                  */  
                 act = mdoc_man_act(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))
                         do_sub = (*act->pre)(meta, n);                          do_sub = (*act->pre)(meta, n);
                   break;
         }          }
   
         /*          /*
Line 773  post_font(DECL_ARGS)
Line 791  post_font(DECL_ARGS)
 static void  static void
 post_percent(DECL_ARGS)  post_percent(DECL_ARGS)
 {  {
           struct roff_node *np, *nn, *nnn;
   
         if (mdoc_man_act(n->tok)->pre == pre_em)          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 847  post_sect(DECL_ARGS)
Line 872  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 888  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 963  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 976  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 1124  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 1144  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 1151  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 1255  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 1272  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 1279  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 1289  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 1438  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 1482  mid_it(void)
Line 1518  mid_it(void)
             Bl_stack[Bl_stack_len - 1]);              Bl_stack[Bl_stack_len - 1]);
         print_word(buf);          print_word(buf);
   
         /* Remeber to close out this .RS block later. */          /* Remember to close out this .RS block later. */
         Bl_stack_post[Bl_stack_len - 1] = 1;          Bl_stack_post[Bl_stack_len - 1] = 1;
 }  }
   
Line 1607  pre_onearg(DECL_ARGS)
Line 1643  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 1652  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 1680  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 1697  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.131  
changed lines
  Added in v.1.138

CVSweb