[BACK]Return to mdoc_term.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mdoc_term.c between version 1.339 and 1.353

version 1.339, 2017/01/10 21:59:47 version 1.353, 2017/05/05 02:06:19
Line 91  static int   termp_bf_pre(DECL_ARGS);
Line 91  static int   termp_bf_pre(DECL_ARGS);
 static  int       termp_bk_pre(DECL_ARGS);  static  int       termp_bk_pre(DECL_ARGS);
 static  int       termp_bl_pre(DECL_ARGS);  static  int       termp_bl_pre(DECL_ARGS);
 static  int       termp_bold_pre(DECL_ARGS);  static  int       termp_bold_pre(DECL_ARGS);
 static  int       termp_bt_pre(DECL_ARGS);  
 static  int       termp_bx_pre(DECL_ARGS);  
 static  int       termp_cd_pre(DECL_ARGS);  static  int       termp_cd_pre(DECL_ARGS);
 static  int       termp_d1_pre(DECL_ARGS);  static  int       termp_d1_pre(DECL_ARGS);
 static  int       termp_eo_pre(DECL_ARGS);  static  int       termp_eo_pre(DECL_ARGS);
Line 115  static int   termp_nm_pre(DECL_ARGS);
Line 113  static int   termp_nm_pre(DECL_ARGS);
 static  int       termp_ns_pre(DECL_ARGS);  static  int       termp_ns_pre(DECL_ARGS);
 static  int       termp_quote_pre(DECL_ARGS);  static  int       termp_quote_pre(DECL_ARGS);
 static  int       termp_rs_pre(DECL_ARGS);  static  int       termp_rs_pre(DECL_ARGS);
 static  int       termp_rv_pre(DECL_ARGS);  
 static  int       termp_sh_pre(DECL_ARGS);  static  int       termp_sh_pre(DECL_ARGS);
 static  int       termp_skip_pre(DECL_ARGS);  static  int       termp_skip_pre(DECL_ARGS);
 static  int       termp_sm_pre(DECL_ARGS);  static  int       termp_sm_pre(DECL_ARGS);
Line 124  static int   termp_ss_pre(DECL_ARGS);
Line 121  static int   termp_ss_pre(DECL_ARGS);
 static  int       termp_sy_pre(DECL_ARGS);  static  int       termp_sy_pre(DECL_ARGS);
 static  int       termp_tag_pre(DECL_ARGS);  static  int       termp_tag_pre(DECL_ARGS);
 static  int       termp_under_pre(DECL_ARGS);  static  int       termp_under_pre(DECL_ARGS);
 static  int       termp_ud_pre(DECL_ARGS);  
 static  int       termp_vt_pre(DECL_ARGS);  static  int       termp_vt_pre(DECL_ARGS);
 static  int       termp_xr_pre(DECL_ARGS);  static  int       termp_xr_pre(DECL_ARGS);
 static  int       termp_xx_pre(DECL_ARGS);  static  int       termp_xx_pre(DECL_ARGS);
   
 static  const struct termact termacts[MDOC_MAX] = {  static  const struct termact __termacts[MDOC_MAX - MDOC_Dd] = {
         { termp_ap_pre, NULL }, /* Ap */  
         { NULL, NULL }, /* Dd */          { NULL, NULL }, /* Dd */
         { NULL, NULL }, /* Dt */          { NULL, NULL }, /* Dt */
         { NULL, NULL }, /* Os */          { NULL, NULL }, /* Os */
Line 146  static const struct termact termacts[MDOC_MAX] = {
Line 141  static const struct termact termacts[MDOC_MAX] = {
         { termp_it_pre, termp_it_post }, /* It */          { termp_it_pre, termp_it_post }, /* It */
         { termp_under_pre, NULL }, /* Ad */          { termp_under_pre, NULL }, /* Ad */
         { termp_an_pre, NULL }, /* An */          { termp_an_pre, NULL }, /* An */
           { termp_ap_pre, NULL }, /* Ap */
         { termp_under_pre, NULL }, /* Ar */          { termp_under_pre, NULL }, /* Ar */
         { termp_cd_pre, NULL }, /* Cd */          { termp_cd_pre, NULL }, /* Cd */
         { termp_bold_pre, NULL }, /* Cm */          { termp_bold_pre, NULL }, /* Cm */
Line 166  static const struct termact termacts[MDOC_MAX] = {
Line 162  static const struct termact termacts[MDOC_MAX] = {
         { termp_quote_pre, termp_quote_post }, /* Op */          { termp_quote_pre, termp_quote_post }, /* Op */
         { termp_ft_pre, NULL }, /* Ot */          { termp_ft_pre, NULL }, /* Ot */
         { termp_under_pre, NULL }, /* Pa */          { termp_under_pre, NULL }, /* Pa */
         { termp_rv_pre, NULL }, /* Rv */          { termp_ex_pre, NULL }, /* Rv */
         { NULL, NULL }, /* St */          { NULL, NULL }, /* St */
         { termp_under_pre, NULL }, /* Va */          { termp_under_pre, NULL }, /* Va */
         { termp_vt_pre, NULL }, /* Vt */          { termp_vt_pre, NULL }, /* Vt */
Line 191  static const struct termact termacts[MDOC_MAX] = {
Line 187  static const struct termact termacts[MDOC_MAX] = {
         { termp_quote_pre, termp_quote_post }, /* Bo */          { termp_quote_pre, termp_quote_post }, /* Bo */
         { termp_quote_pre, termp_quote_post }, /* Bq */          { termp_quote_pre, termp_quote_post }, /* Bq */
         { termp_xx_pre, termp_xx_post }, /* Bsx */          { termp_xx_pre, termp_xx_post }, /* Bsx */
         { termp_bx_pre, NULL }, /* Bx */          { NULL, NULL }, /* Bx */
         { termp_skip_pre, NULL }, /* Db */          { termp_skip_pre, NULL }, /* Db */
         { NULL, NULL }, /* Dc */          { NULL, NULL }, /* Dc */
         { termp_quote_pre, termp_quote_post }, /* Do */          { termp_quote_pre, termp_quote_post }, /* Do */
Line 232  static const struct termact termacts[MDOC_MAX] = {
Line 228  static const struct termact termacts[MDOC_MAX] = {
         { NULL, NULL }, /* Oc */          { NULL, NULL }, /* Oc */
         { termp_bk_pre, termp_bk_post }, /* Bk */          { termp_bk_pre, termp_bk_post }, /* Bk */
         { NULL, NULL }, /* Ek */          { NULL, NULL }, /* Ek */
         { termp_bt_pre, NULL }, /* Bt */          { NULL, NULL }, /* Bt */
         { NULL, NULL }, /* Hf */          { NULL, NULL }, /* Hf */
         { termp_under_pre, NULL }, /* Fr */          { termp_under_pre, NULL }, /* Fr */
         { termp_ud_pre, NULL }, /* Ud */          { NULL, NULL }, /* Ud */
         { NULL, termp_lb_post }, /* Lb */          { NULL, termp_lb_post }, /* Lb */
         { termp_sp_pre, NULL }, /* Lp */          { termp_sp_pre, NULL }, /* Lp */
         { termp_lk_pre, NULL }, /* Lk */          { termp_lk_pre, NULL }, /* Lk */
Line 248  static const struct termact termacts[MDOC_MAX] = {
Line 244  static const struct termact termacts[MDOC_MAX] = {
         { termp_quote_pre, termp_quote_post }, /* En */          { termp_quote_pre, termp_quote_post }, /* En */
         { termp_xx_pre, termp_xx_post }, /* Dx */          { termp_xx_pre, termp_xx_post }, /* Dx */
         { NULL, termp____post }, /* %Q */          { NULL, termp____post }, /* %Q */
         { termp_sp_pre, NULL }, /* br */  
         { termp_sp_pre, NULL }, /* sp */          { termp_sp_pre, NULL }, /* sp */
         { NULL, termp____post }, /* %U */          { NULL, termp____post }, /* %U */
         { NULL, NULL }, /* Ta */          { NULL, NULL }, /* Ta */
         { termp_ll_pre, NULL }, /* ll */          { termp_ll_pre, NULL }, /* ll */
 };  };
   static  const struct termact *const termacts = __termacts - MDOC_Dd;
   
 static  int      fn_prio;  static  int      fn_prio;
   
   
 void  void
 terminal_mdoc(void *arg, const struct roff_man *mdoc)  terminal_mdoc(void *arg, const struct roff_man *mdoc)
 {  {
         struct roff_node        *n;          struct roff_node        *n;
         struct termp            *p;          struct termp            *p;
           size_t                   save_defindent;
   
         p = (struct termp *)arg;          p = (struct termp *)arg;
         p->overstep = 0;          p->overstep = 0;
Line 282  terminal_mdoc(void *arg, const struct roff_man *mdoc)
Line 280  terminal_mdoc(void *arg, const struct roff_man *mdoc)
                         n = n->next;                          n = n->next;
                 }                  }
         } else {          } else {
                   save_defindent = p->defindent;
                 if (p->defindent == 0)                  if (p->defindent == 0)
                         p->defindent = 5;                          p->defindent = 5;
                 term_begin(p, print_mdoc_head, print_mdoc_foot,                  term_begin(p, print_mdoc_head, print_mdoc_foot,
Line 294  terminal_mdoc(void *arg, const struct roff_man *mdoc)
Line 293  terminal_mdoc(void *arg, const struct roff_man *mdoc)
                         print_mdoc_nodelist(p, NULL, &mdoc->meta, n);                          print_mdoc_nodelist(p, NULL, &mdoc->meta, n);
                 }                  }
                 term_end(p);                  term_end(p);
                   p->defindent = save_defindent;
         }          }
 }  }
   
Line 364  print_mdoc_node(DECL_ARGS)
Line 364  print_mdoc_node(DECL_ARGS)
                 term_tbl(p, n->span);                  term_tbl(p, n->span);
                 break;                  break;
         default:          default:
                 if (termacts[n->tok].pre &&                  if (n->tok < ROFF_MAX) {
                           roff_term_pre(p, n);
                           chld = 0;
                           break;
                   }
                   assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
                   if (termacts[n->tok].pre != NULL &&
                     (n->end == ENDBODY_NOT || n->child != NULL))                      (n->end == ENDBODY_NOT || n->child != NULL))
                         chld = (*termacts[n->tok].pre)                          chld = (*termacts[n->tok].pre)
                                 (p, &npair, meta, n);                                  (p, &npair, meta, n);
Line 385  print_mdoc_node(DECL_ARGS)
Line 391  print_mdoc_node(DECL_ARGS)
         case ROFFT_EQN:          case ROFFT_EQN:
                 break;                  break;
         default:          default:
                 if ( ! termacts[n->tok].post || NODE_ENDED & n->flags)                  if (n->tok < ROFF_MAX ||
                       termacts[n->tok].post == NULL ||
                       n->flags & NODE_ENDED)
                         break;                          break;
                 (void)(*termacts[n->tok].post)(p, &npair, meta, n);                  (void)(*termacts[n->tok].post)(p, &npair, meta, n);
   
Line 396  print_mdoc_node(DECL_ARGS)
Line 404  print_mdoc_node(DECL_ARGS)
                  */                   */
                 if (ENDBODY_NOT != n->end)                  if (ENDBODY_NOT != n->end)
                         n->body->flags |= NODE_ENDED;                          n->body->flags |= NODE_ENDED;
   
                 /*  
                  * End of line terminating an implicit block  
                  * while an explicit block is still open.  
                  * Continue the explicit block without spacing.  
                  */  
                 if (ENDBODY_NOSPACE == n->end)  
                         p->flags |= TERMP_NOSPACE;  
                 break;                  break;
         }          }
   
Line 615  termp_ll_pre(DECL_ARGS)
Line 615  termp_ll_pre(DECL_ARGS)
 static int  static int
 termp_it_pre(DECL_ARGS)  termp_it_pre(DECL_ARGS)
 {  {
           struct roffsu           su;
         char                    buf[24];          char                    buf[24];
         const struct roff_node *bl, *nn;          const struct roff_node *bl, *nn;
         size_t                  ncols, dcol;          size_t                  ncols, dcol;
Line 692  termp_it_pre(DECL_ARGS)
Line 693  termp_it_pre(DECL_ARGS)
   
                 for (i = 0, nn = n->prev;                  for (i = 0, nn = n->prev;
                     nn->prev && i < (int)ncols;                      nn->prev && i < (int)ncols;
                     nn = nn->prev, i++)                      nn = nn->prev, i++) {
                         offset += dcol + a2width(p,                          SCALE_HS_INIT(&su,
                             bl->norm->Bl.cols[i]);                              term_strlen(p, bl->norm->Bl.cols[i]));
                           su.scale /= term_strlen(p, "0");
                           offset += term_hspan(p, &su) / 24 + dcol;
                   }
   
                 /*                  /*
                  * When exceeding the declared number of columns, leave                   * When exceeding the declared number of columns, leave
Line 709  termp_it_pre(DECL_ARGS)
Line 713  termp_it_pre(DECL_ARGS)
                  * Use the declared column widths, extended as explained                   * Use the declared column widths, extended as explained
                  * in the preceding paragraph.                   * in the preceding paragraph.
                  */                   */
                 width = a2width(p, bl->norm->Bl.cols[i]) + dcol;                  SCALE_HS_INIT(&su, term_strlen(p, bl->norm->Bl.cols[i]));
                   su.scale /= term_strlen(p, "0");
                   width = term_hspan(p, &su) / 24 + dcol;
                 break;                  break;
         default:          default:
                 if (NULL == bl->norm->Bl.width)                  if (NULL == bl->norm->Bl.width)
Line 997  termp_nm_pre(DECL_ARGS)
Line 1003  termp_nm_pre(DECL_ARGS)
                 return 1;                  return 1;
         }          }
   
         if (NULL == n->child && NULL == meta->name)          if (n->child == NULL)
                 return 0;                  return 0;
   
         if (n->type == ROFFT_HEAD)          if (n->type == ROFFT_HEAD)
Line 1021  termp_nm_pre(DECL_ARGS)
Line 1027  termp_nm_pre(DECL_ARGS)
         }          }
   
         term_fontpush(p, TERMFONT_BOLD);          term_fontpush(p, TERMFONT_BOLD);
         if (NULL == n->child)  
                 term_word(p, meta->name);  
         return 1;          return 1;
 }  }
   
Line 1114  termp_rs_pre(DECL_ARGS)
Line 1118  termp_rs_pre(DECL_ARGS)
 }  }
   
 static int  static int
 termp_rv_pre(DECL_ARGS)  
 {  
         struct roff_node *nch;  
   
         term_newln(p);  
   
         if (n->child != NULL) {  
                 term_word(p, "The");  
   
                 for (nch = n->child; nch != NULL; nch = nch->next) {  
                         term_fontpush(p, TERMFONT_BOLD);  
                         term_word(p, nch->string);  
                         term_fontpop(p);  
   
                         p->flags |= TERMP_NOSPACE;  
                         term_word(p, "()");  
   
                         if (nch->next == NULL)  
                                 continue;  
   
                         if (nch->prev != NULL || nch->next->next != NULL) {  
                                 p->flags |= TERMP_NOSPACE;  
                                 term_word(p, ",");  
                         }  
                         if (nch->next->next == NULL)  
                                 term_word(p, "and");  
                 }  
   
                 if (n->child != NULL && n->child->next != NULL)  
                         term_word(p, "functions return");  
                 else  
                         term_word(p, "function returns");  
   
                 term_word(p, "the value\\~0 if successful;");  
         } else  
                 term_word(p, "Upon successful completion,"  
                     " the value\\~0 is returned;");  
   
         term_word(p, "otherwise the value\\~\\-1 is returned"  
             " and the global variable");  
   
         term_fontpush(p, TERMFONT_UNDER);  
         term_word(p, "errno");  
         term_fontpop(p);  
   
         term_word(p, "is set to indicate the error.");  
         p->flags |= TERMP_SENTENCE;  
   
         return 0;  
 }  
   
 static int  
 termp_ex_pre(DECL_ARGS)  termp_ex_pre(DECL_ARGS)
 {  {
         struct roff_node *nch;  
   
         term_newln(p);          term_newln(p);
         term_word(p, "The");          return 1;
   
         for (nch = n->child; nch != NULL; nch = nch->next) {  
                 term_fontpush(p, TERMFONT_BOLD);  
                 term_word(p, nch->string);  
                 term_fontpop(p);  
   
                 if (nch->next == NULL)  
                         continue;  
   
                 if (nch->prev != NULL || nch->next->next != NULL) {  
                         p->flags |= TERMP_NOSPACE;  
                         term_word(p, ",");  
                 }  
   
                 if (nch->next->next == NULL)  
                         term_word(p, "and");  
         }  
   
         if (n->child != NULL && n->child->next != NULL)  
                 term_word(p, "utilities exit\\~0");  
         else  
                 term_word(p, "utility exits\\~0");  
   
         term_word(p, "on success, and\\~>0 if an error occurs.");  
   
         p->flags |= TERMP_SENTENCE;  
         return 0;  
 }  }
   
 static int  static int
Line 1399  termp_sh_post(DECL_ARGS)
Line 1322  termp_sh_post(DECL_ARGS)
         }          }
 }  }
   
 static int  
 termp_bt_pre(DECL_ARGS)  
 {  
   
         term_word(p, "is currently in beta test.");  
         p->flags |= TERMP_SENTENCE;  
         return 0;  
 }  
   
 static void  static void
 termp_lb_post(DECL_ARGS)  termp_lb_post(DECL_ARGS)
 {  {
Line 1417  termp_lb_post(DECL_ARGS)
Line 1331  termp_lb_post(DECL_ARGS)
 }  }
   
 static int  static int
 termp_ud_pre(DECL_ARGS)  
 {  
   
         term_word(p, "currently under development.");  
         p->flags |= TERMP_SENTENCE;  
         return 0;  
 }  
   
 static int  
 termp_d1_pre(DECL_ARGS)  termp_d1_pre(DECL_ARGS)
 {  {
   
Line 1606  termp_bd_pre(DECL_ARGS)
Line 1511  termp_bd_pre(DECL_ARGS)
                  */                   */
                 switch (nn->tok) {                  switch (nn->tok) {
                 case MDOC_Sm:                  case MDOC_Sm:
                 case MDOC_br:                  case ROFF_br:
                 case MDOC_sp:                  case MDOC_sp:
                 case MDOC_Bl:                  case MDOC_Bl:
                 case MDOC_D1:                  case MDOC_D1:
Line 1653  termp_bd_post(DECL_ARGS)
Line 1558  termp_bd_post(DECL_ARGS)
 }  }
   
 static int  static int
 termp_bx_pre(DECL_ARGS)  
 {  
   
         if (NULL != (n = n->child)) {  
                 term_word(p, n->string);  
                 p->flags |= TERMP_NOSPACE;  
                 term_word(p, "BSD");  
         } else {  
                 term_word(p, "BSD");  
                 return 0;  
         }  
   
         if (NULL != (n = n->next)) {  
                 p->flags |= TERMP_NOSPACE;  
                 term_word(p, "-");  
                 p->flags |= TERMP_NOSPACE;  
                 term_word(p, n->string);  
         }  
   
         return 0;  
 }  
   
 static int  
 termp_xx_pre(DECL_ARGS)  termp_xx_pre(DECL_ARGS)
 {  {
         if ((n->aux = p->flags & TERMP_PREKEEP) == 0)          if ((n->aux = p->flags & TERMP_PREKEEP) == 0)
Line 1791  termp_sp_pre(DECL_ARGS)
Line 1673  termp_sp_pre(DECL_ARGS)
                 } else                  } else
                         len = 1;                          len = 1;
                 break;                  break;
         case MDOC_br:          case ROFF_br:
                 len = 0;                  len = 0;
                 break;                  break;
         default:          default:
Line 1841  termp_quote_pre(DECL_ARGS)
Line 1723  termp_quote_pre(DECL_ARGS)
         case MDOC_Bq:          case MDOC_Bq:
                 term_word(p, "[");                  term_word(p, "[");
                 break;                  break;
           case MDOC__T:
                   /* FALLTHROUGH */
         case MDOC_Do:          case MDOC_Do:
         case MDOC_Dq:          case MDOC_Dq:
                 term_word(p, "\\(Lq");                  term_word(p, "\\(Lq");
Line 1855  termp_quote_pre(DECL_ARGS)
Line 1739  termp_quote_pre(DECL_ARGS)
         case MDOC_Pq:          case MDOC_Pq:
                 term_word(p, "(");                  term_word(p, "(");
                 break;                  break;
         case MDOC__T:  
         case MDOC_Qo:          case MDOC_Qo:
         case MDOC_Qq:          case MDOC_Qq:
                 term_word(p, "\"");                  term_word(p, "\"");
Line 1898  termp_quote_post(DECL_ARGS)
Line 1781  termp_quote_post(DECL_ARGS)
         case MDOC_Bq:          case MDOC_Bq:
                 term_word(p, "]");                  term_word(p, "]");
                 break;                  break;
           case MDOC__T:
                   /* FALLTHROUGH */
         case MDOC_Do:          case MDOC_Do:
         case MDOC_Dq:          case MDOC_Dq:
                 term_word(p, "\\(Rq");                  term_word(p, "\\(Rq");
Line 1914  termp_quote_post(DECL_ARGS)
Line 1799  termp_quote_post(DECL_ARGS)
         case MDOC_Pq:          case MDOC_Pq:
                 term_word(p, ")");                  term_word(p, ")");
                 break;                  break;
         case MDOC__T:  
         case MDOC_Qo:          case MDOC_Qo:
         case MDOC_Qq:          case MDOC_Qq:
                 term_word(p, "\"");                  term_word(p, "\"");
Line 2118  static int
Line 2002  static int
 termp_lk_pre(DECL_ARGS)  termp_lk_pre(DECL_ARGS)
 {  {
         const struct roff_node *link, *descr;          const struct roff_node *link, *descr;
           int display;
   
         if (NULL == (link = n->child))          if ((link = n->child) == NULL)
                 return 0;                  return 0;
   
         if (NULL != (descr = link->next)) {          /* Link text. */
           if ((descr = link->next) != NULL && !(descr->flags & NODE_DELIMC)) {
                 term_fontpush(p, TERMFONT_UNDER);                  term_fontpush(p, TERMFONT_UNDER);
                 while (NULL != descr) {                  while (descr != NULL && !(descr->flags & NODE_DELIMC)) {
                         term_word(p, descr->string);                          term_word(p, descr->string);
                         descr = descr->next;                          descr = descr->next;
                 }                  }
                   term_fontpop(p);
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
                 term_word(p, ":");                  term_word(p, ":");
                 term_fontpop(p);  
         }          }
   
           /* Link target. */
           display = term_strlen(p, link->string) >= 26;
           if (display) {
                   term_newln(p);
                   p->offset += term_len(p, p->defindent + 1);
           }
         term_fontpush(p, TERMFONT_BOLD);          term_fontpush(p, TERMFONT_BOLD);
         term_word(p, link->string);          term_word(p, link->string);
         term_fontpop(p);          term_fontpop(p);
   
           /* Trailing punctuation. */
           while (descr != NULL) {
                   p->flags |= TERMP_NOSPACE;
                   term_word(p, descr->string);
                   descr = descr->next;
           }
           if (display)
                   term_newln(p);
         return 0;          return 0;
 }  }
   

Legend:
Removed from v.1.339  
changed lines
  Added in v.1.353

CVSweb