[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.110 and 1.125

version 1.110, 2017/05/04 17:48:29 version 1.125, 2018/04/05 22:05:08
Line 33 
Line 33 
   
 #define DECL_ARGS const struct roff_meta *meta, struct roff_node *n  #define DECL_ARGS const struct roff_meta *meta, struct roff_node *n
   
   typedef int     (*int_fp)(DECL_ARGS);
   typedef void    (*void_fp)(DECL_ARGS);
   
 struct  manact {  struct  manact {
         int             (*cond)(DECL_ARGS); /* DON'T run actions */          int_fp            cond; /* DON'T run actions */
         int             (*pre)(DECL_ARGS); /* pre-node action */          int_fp            pre; /* pre-node action */
         void            (*post)(DECL_ARGS); /* post-node action */          void_fp           post; /* post-node action */
         const char       *prefix; /* pre-node string constant */          const char       *prefix; /* pre-node string constant */
         const char       *suffix; /* post-node string constant */          const char       *suffix; /* post-node string constant */
 };  };
Line 70  static void   post_nm(DECL_ARGS);
Line 73  static void   post_nm(DECL_ARGS);
 static  void      post_percent(DECL_ARGS);  static  void      post_percent(DECL_ARGS);
 static  void      post_pf(DECL_ARGS);  static  void      post_pf(DECL_ARGS);
 static  void      post_sect(DECL_ARGS);  static  void      post_sect(DECL_ARGS);
 static  void      post_sp(DECL_ARGS);  
 static  void      post_vt(DECL_ARGS);  static  void      post_vt(DECL_ARGS);
 static  int       pre__t(DECL_ARGS);  static  int       pre__t(DECL_ARGS);
 static  int       pre_an(DECL_ARGS);  static  int       pre_an(DECL_ARGS);
Line 80  static int   pre_bd(DECL_ARGS);
Line 82  static int   pre_bd(DECL_ARGS);
 static  int       pre_bf(DECL_ARGS);  static  int       pre_bf(DECL_ARGS);
 static  int       pre_bk(DECL_ARGS);  static  int       pre_bk(DECL_ARGS);
 static  int       pre_bl(DECL_ARGS);  static  int       pre_bl(DECL_ARGS);
 static  int       pre_br(DECL_ARGS);  static  void      pre_br(DECL_ARGS);
 static  int       pre_dl(DECL_ARGS);  static  int       pre_dl(DECL_ARGS);
 static  int       pre_en(DECL_ARGS);  static  int       pre_en(DECL_ARGS);
 static  int       pre_enc(DECL_ARGS);  static  int       pre_enc(DECL_ARGS);
Line 93  static int   pre_fd(DECL_ARGS);
Line 95  static int   pre_fd(DECL_ARGS);
 static  int       pre_fl(DECL_ARGS);  static  int       pre_fl(DECL_ARGS);
 static  int       pre_fn(DECL_ARGS);  static  int       pre_fn(DECL_ARGS);
 static  int       pre_fo(DECL_ARGS);  static  int       pre_fo(DECL_ARGS);
 static  int       pre_ft(DECL_ARGS);  static  void      pre_ft(DECL_ARGS);
   static  int       pre_Ft(DECL_ARGS);
 static  int       pre_in(DECL_ARGS);  static  int       pre_in(DECL_ARGS);
 static  int       pre_it(DECL_ARGS);  static  int       pre_it(DECL_ARGS);
 static  int       pre_lk(DECL_ARGS);  static  int       pre_lk(DECL_ARGS);
 static  int       pre_li(DECL_ARGS);  static  int       pre_li(DECL_ARGS);
 static  int       pre_ll(DECL_ARGS);  
 static  int       pre_nm(DECL_ARGS);  static  int       pre_nm(DECL_ARGS);
 static  int       pre_no(DECL_ARGS);  static  int       pre_no(DECL_ARGS);
 static  int       pre_ns(DECL_ARGS);  static  int       pre_ns(DECL_ARGS);
   static  void      pre_onearg(DECL_ARGS);
 static  int       pre_pp(DECL_ARGS);  static  int       pre_pp(DECL_ARGS);
 static  int       pre_rs(DECL_ARGS);  static  int       pre_rs(DECL_ARGS);
 static  int       pre_sm(DECL_ARGS);  static  int       pre_sm(DECL_ARGS);
 static  int       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(const struct roff_node *);
   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);
 static  void      print_word(const char *);  static  void      print_word(const char *);
Line 120  static void   print_width(const struct mdoc_bl *,
Line 124  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] = {
           pre_br,         /* br */
           pre_onearg,     /* ce */
           pre_ft,         /* ft */
           pre_onearg,     /* ll */
           pre_onearg,     /* mc */
           pre_onearg,     /* po */
           pre_onearg,     /* rj */
           pre_sp,         /* sp */
           pre_ta,         /* ta */
           pre_onearg,     /* ti */
   };
   
 static  const struct manact __manacts[MDOC_MAX - MDOC_Dd] = {  static  const struct manact __manacts[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 */
Line 148  static const struct manact __manacts[MDOC_MAX - MDOC_D
Line 165  static const struct manact __manacts[MDOC_MAX - MDOC_D
         { NULL, pre_fd, post_fd, NULL, NULL }, /* Fd */          { NULL, pre_fd, post_fd, NULL, NULL }, /* Fd */
         { NULL, pre_fl, post_fl, NULL, NULL }, /* Fl */          { NULL, pre_fl, post_fl, NULL, NULL }, /* Fl */
         { NULL, pre_fn, post_fn, NULL, NULL }, /* Fn */          { NULL, pre_fn, post_fn, NULL, NULL }, /* Fn */
         { NULL, pre_ft, post_font, NULL, NULL }, /* Ft */          { NULL, pre_Ft, post_font, NULL, NULL }, /* Ft */
         { NULL, pre_sy, post_font, NULL, NULL }, /* Ic */          { NULL, pre_sy, post_font, NULL, NULL }, /* Ic */
         { NULL, pre_in, post_in, NULL, NULL }, /* In */          { NULL, pre_in, post_in, NULL, NULL }, /* In */
         { NULL, pre_li, post_font, NULL, NULL }, /* Li */          { NULL, pre_li, post_font, NULL, NULL }, /* Li */
         { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */          { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */
         { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */          { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */
         { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */          { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */
         { NULL, pre_ft, post_font, NULL, NULL }, /* Ot */          { NULL, pre_Ft, post_font, NULL, NULL }, /* Ot */
         { NULL, pre_em, post_font, NULL, NULL }, /* Pa */          { NULL, pre_em, post_font, NULL, NULL }, /* Pa */
         { NULL, pre_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 181  static const struct manact __manacts[MDOC_MAX - MDOC_D
Line 198  static const struct manact __manacts[MDOC_MAX - MDOC_D
         { 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, NULL, NULL, NULL, NULL }, /* Bsx */          { NULL, pre_bk, post_bk, NULL, NULL }, /* Bsx */
         { NULL, NULL, NULL, NULL, NULL }, /* Bx */          { NULL, pre_bk, post_bk, 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, NULL, NULL, NULL, NULL }, /* Fx */          { NULL, pre_bk, post_bk, 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, NULL, NULL, NULL, NULL }, /* Nx */          { NULL, pre_bk, post_bk, NULL, NULL }, /* Nx */
         { NULL, NULL, NULL, NULL, NULL }, /* Ox */          { NULL, pre_bk, post_bk, 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 237  static const struct manact __manacts[MDOC_MAX - MDOC_D
Line 254  static const struct manact __manacts[MDOC_MAX - MDOC_D
         { 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, NULL, NULL, NULL, NULL }, /* Dx */          { NULL, pre_bk, post_bk, NULL, NULL }, /* Dx */
         { NULL, NULL, post_percent, NULL, NULL }, /* %Q */          { NULL, NULL, post_percent, NULL, NULL }, /* %Q */
         { NULL, pre_sp, post_sp, NULL, NULL }, /* sp */  
         { NULL, NULL, post_percent, NULL, NULL }, /* %U */          { NULL, NULL, post_percent, NULL, NULL }, /* %U */
         { NULL, NULL, NULL, NULL, NULL }, /* Ta */          { NULL, NULL, NULL, NULL, NULL }, /* Ta */
         { NULL, pre_ll, post_sp, NULL, NULL }, /* ll */  
 };  };
 static  const struct manact *const manacts = __manacts - MDOC_Dd;  static  const struct manact *const manacts = __manacts - MDOC_Dd;
   
Line 435  static void
Line 450  static void
 print_line(const char *s, int newflags)  print_line(const char *s, int newflags)
 {  {
   
         outflags &= ~MMAN_br;  
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
         print_word(s);          print_word(s);
         outflags |= newflags;          outflags |= newflags;
Line 464  print_offs(const char *v, int keywords)
Line 478  print_offs(const char *v, int keywords)
 {  {
         char              buf[24];          char              buf[24];
         struct roffsu     su;          struct roffsu     su;
           const char       *end;
         int               sz;          int               sz;
   
         print_line(".RS", MMAN_Bk_susp);          print_line(".RS", MMAN_Bk_susp);
Line 475  print_offs(const char *v, int keywords)
Line 490  print_offs(const char *v, int keywords)
                 sz = 6;                  sz = 6;
         else if (keywords && !strcmp(v, "indent-two"))          else if (keywords && !strcmp(v, "indent-two"))
                 sz = 12;                  sz = 12;
         else if (a2roffsu(v, &su, SCALE_EN) > 1) {          else {
                 if (SCALE_EN == su.unit)                  end = a2roffsu(v, &su, SCALE_EN);
                   if (end == NULL || *end != '\0')
                           sz = man_strlen(v);
                   else if (SCALE_EN == su.unit)
                         sz = su.scale;                          sz = su.scale;
                 else {                  else {
                         /*                          /*
Line 490  print_offs(const char *v, int keywords)
Line 508  print_offs(const char *v, int keywords)
                         outflags |= MMAN_nl;                          outflags |= MMAN_nl;
                         return;                          return;
                 }                  }
         } else          }
                 sz = man_strlen(v);  
   
         /*          /*
          * We are inside an enclosing list.           * We are inside an enclosing list.
Line 513  print_width(const struct mdoc_bl *bl, const struct rof
Line 530  print_width(const struct mdoc_bl *bl, const struct rof
 {  {
         char              buf[24];          char              buf[24];
         struct roffsu     su;          struct roffsu     su;
           const char       *end;
         int               numeric, remain, sz, chsz;          int               numeric, remain, sz, chsz;
   
         numeric = 1;          numeric = 1;
Line 521  print_width(const struct mdoc_bl *bl, const struct rof
Line 539  print_width(const struct mdoc_bl *bl, const struct rof
         /* Convert the width into a number (of characters). */          /* Convert the width into a number (of characters). */
         if (bl->width == NULL)          if (bl->width == NULL)
                 sz = (bl->type == LIST_hang) ? 6 : 0;                  sz = (bl->type == LIST_hang) ? 6 : 0;
         else if (a2roffsu(bl->width, &su, SCALE_MAX) > 1) {          else {
                 if (SCALE_EN == su.unit)                  end = a2roffsu(bl->width, &su, SCALE_MAX);
                   if (end == NULL || *end != '\0')
                           sz = man_strlen(bl->width);
                   else if (SCALE_EN == su.unit)
                         sz = su.scale;                          sz = su.scale;
                 else {                  else {
                         sz = 0;                          sz = 0;
                         numeric = 0;                          numeric = 0;
                 }                  }
         } else          }
                 sz = man_strlen(bl->width);  
   
         /* XXX Rough estimation, might have multiple parts. */          /* XXX Rough estimation, might have multiple parts. */
         if (bl->type == LIST_enum)          if (bl->type == LIST_enum)
Line 652  print_node(DECL_ARGS)
Line 672  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) {
                 switch (n->tok) {                  (*roff_manacts[n->tok])(meta, n);
                 case ROFF_br:                  return;
                         pre_br(meta, n);  
                         break;  
                 default:  
                         abort();  
                 }  
         } else {          } else {
                 assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);                  assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
                 /*                  /*
Line 977  post_bf(DECL_ARGS)
Line 992  post_bf(DECL_ARGS)
 static int  static int
 pre_bk(DECL_ARGS)  pre_bk(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case ROFFT_BLOCK:          case ROFFT_BLOCK:
                 return 1;                  return 1;
         case ROFFT_BODY:          case ROFFT_BODY:
           case ROFFT_ELEM:
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 return 1;                  return 1;
         default:          default:
Line 992  pre_bk(DECL_ARGS)
Line 1007  pre_bk(DECL_ARGS)
 static void  static void
 post_bk(DECL_ARGS)  post_bk(DECL_ARGS)
 {  {
           switch (n->type) {
         if (n->type == ROFFT_BODY)          case ROFFT_ELEM:
                   while ((n = n->parent) != NULL)
                            if (n->tok == MDOC_Bk)
                                   return;
                   /* FALLTHROUGH */
           case ROFFT_BODY:
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
                   break;
           default:
                   break;
           }
 }  }
   
 static int  static int
Line 1064  post_bl(DECL_ARGS)
Line 1088  post_bl(DECL_ARGS)
   
 }  }
   
 static int  static void
 pre_br(DECL_ARGS)  pre_br(DECL_ARGS)
 {  {
   
         outflags |= MMAN_br;          outflags |= MMAN_br;
         return 0;  
 }  }
   
 static int  static int
Line 1314  post_fo(DECL_ARGS)
Line 1336  post_fo(DECL_ARGS)
 }  }
   
 static int  static int
 pre_ft(DECL_ARGS)  pre_Ft(DECL_ARGS)
 {  {
   
         pre_syn(n);          pre_syn(n);
Line 1322  pre_ft(DECL_ARGS)
Line 1344  pre_ft(DECL_ARGS)
         return 1;          return 1;
 }  }
   
   static void
   pre_ft(DECL_ARGS)
   {
           print_line(".ft", 0);
           print_word(n->child->string);
           outflags |= MMAN_nl;
   }
   
 static int  static int
 pre_in(DECL_ARGS)  pre_in(DECL_ARGS)
 {  {
Line 1378  pre_it(DECL_ARGS)
Line 1408  pre_it(DECL_ARGS)
                         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(".BR \\& \"", 0);
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
                         return 1;                          return 1;
                 case LIST_bullet:                  case LIST_bullet:
Line 1516  post_lb(DECL_ARGS)
Line 1546  post_lb(DECL_ARGS)
 static int  static int
 pre_lk(DECL_ARGS)  pre_lk(DECL_ARGS)
 {  {
         const struct roff_node *link, *descr;          const struct roff_node *link, *descr, *punct;
         int display;  
   
         if ((link = n->child) == NULL)          if ((link = n->child) == NULL)
                 return 0;                  return 0;
   
           /* Find beginning of trailing punctuation. */
           punct = n->last;
           while (punct != link && punct->flags & NODE_DELIMC)
                   punct = punct->prev;
           punct = punct->next;
   
         /* Link text. */          /* Link text. */
         if ((descr = link->next) != NULL && !(descr->flags & NODE_DELIMC)) {          if ((descr = link->next) != NULL && descr != punct) {
                 font_push('I');                  font_push('I');
                 while (descr != NULL && !(descr->flags & NODE_DELIMC)) {                  while (descr != punct) {
                         print_word(descr->string);                          print_word(descr->string);
                         descr = descr->next;                          descr = descr->next;
                 }                  }
Line 1534  pre_lk(DECL_ARGS)
Line 1569  pre_lk(DECL_ARGS)
         }          }
   
         /* Link target. */          /* Link target. */
         display = man_strlen(link->string) >= 26;  
         if (display) {  
                 print_line(".RS", MMAN_Bk_susp);  
                 print_word("6n");  
                 outflags |= MMAN_nl;  
         }  
         font_push('B');          font_push('B');
         print_word(link->string);          print_word(link->string);
         font_pop();          font_pop();
   
         /* Trailing punctuation. */          /* Trailing punctuation. */
         while (descr != NULL) {          while (punct != NULL) {
                 print_word(descr->string);                  print_word(punct->string);
                 descr = descr->next;                  punct = punct->next;
         }          }
         if (display)  
                 print_line(".RE", MMAN_nl);  
         return 0;          return 0;
 }  }
   
 static int  static void
 pre_ll(DECL_ARGS)  pre_onearg(DECL_ARGS)
 {  {
           outflags |= MMAN_nl;
         print_line(".ll", 0);          print_word(".");
         return 1;          outflags &= ~MMAN_spc;
           print_word(roff_name[n->tok]);
           if (n->child != NULL)
                   print_word(n->child->string);
           outflags |= MMAN_nl;
           if (n->tok == ROFF_ce)
                   for (n = n->child->next; n != NULL; n = n->next)
                           print_node(meta, n);
 }  }
   
 static int  static int
Line 1683  pre_sm(DECL_ARGS)
Line 1717  pre_sm(DECL_ARGS)
         return 0;          return 0;
 }  }
   
 static int  static void
 pre_sp(DECL_ARGS)  pre_sp(DECL_ARGS)
 {  {
           if (outflags & MMAN_PP) {
         if (MMAN_PP & outflags) {  
                 outflags &= ~MMAN_PP;                  outflags &= ~MMAN_PP;
                 print_line(".PP", 0);                  print_line(".PP", 0);
         } else          } else {
                 print_line(".sp", 0);                  print_line(".sp", 0);
         return 1;                  if (n->child != NULL)
 }                          print_word(n->child->string);
           }
 static void  
 post_sp(DECL_ARGS)  
 {  
   
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
 }  }
   
Line 1708  pre_sy(DECL_ARGS)
Line 1737  pre_sy(DECL_ARGS)
   
         font_push('B');          font_push('B');
         return 1;          return 1;
   }
   
   static void
   pre_ta(DECL_ARGS)
   {
           print_line(".ta", 0);
           for (n = n->child; n != NULL; n = n->next)
                   print_word(n->string);
           outflags |= MMAN_nl;
 }  }
   
 static int  static int

Legend:
Removed from v.1.110  
changed lines
  Added in v.1.125

CVSweb