[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.314 and 1.323

version 1.314, 2015/04/02 21:36:50 version 1.323, 2015/07/25 14:23:08
Line 34 
Line 34 
 #include "mdoc.h"  #include "mdoc.h"
 #include "out.h"  #include "out.h"
 #include "term.h"  #include "term.h"
   #include "tag.h"
 #include "main.h"  #include "main.h"
   
 struct  termpair {  struct  termpair {
Line 43  struct termpair {
Line 44  struct termpair {
   
 #define DECL_ARGS struct termp *p, \  #define DECL_ARGS struct termp *p, \
                   struct termpair *pair, \                    struct termpair *pair, \
                   const struct mdoc_meta *meta, \                    const struct roff_meta *meta, \
                   struct mdoc_node *n                    struct roff_node *n
   
 struct  termact {  struct  termact {
         int     (*pre)(DECL_ARGS);          int     (*pre)(DECL_ARGS);
Line 54  struct termact {
Line 55  struct termact {
 static  int       a2width(const struct termp *, const char *);  static  int       a2width(const struct termp *, const char *);
   
 static  void      print_bvspace(struct termp *,  static  void      print_bvspace(struct termp *,
                         const struct mdoc_node *,                          const struct roff_node *,
                         const struct mdoc_node *);                          const struct roff_node *);
 static  void      print_mdoc_node(DECL_ARGS);  static  void      print_mdoc_node(DECL_ARGS);
 static  void      print_mdoc_nodelist(DECL_ARGS);  static  void      print_mdoc_nodelist(DECL_ARGS);
 static  void      print_mdoc_head(struct termp *, const void *);  static  void      print_mdoc_head(struct termp *, const struct roff_meta *);
 static  void      print_mdoc_foot(struct termp *, const void *);  static  void      print_mdoc_foot(struct termp *, const struct roff_meta *);
 static  void      synopsis_pre(struct termp *,  static  void      synopsis_pre(struct termp *,
                         const struct mdoc_node *);                          const struct roff_node *);
   
 static  void      termp____post(DECL_ARGS);  static  void      termp____post(DECL_ARGS);
 static  void      termp__t_post(DECL_ARGS);  static  void      termp__t_post(DECL_ARGS);
Line 94  static int   termp_bx_pre(DECL_ARGS);
Line 95  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);
   static  int       termp_er_pre(DECL_ARGS);
 static  int       termp_ex_pre(DECL_ARGS);  static  int       termp_ex_pre(DECL_ARGS);
 static  int       termp_fa_pre(DECL_ARGS);  static  int       termp_fa_pre(DECL_ARGS);
 static  int       termp_fd_pre(DECL_ARGS);  static  int       termp_fd_pre(DECL_ARGS);
Line 117  static int   termp_skip_pre(DECL_ARGS);
Line 119  static int   termp_skip_pre(DECL_ARGS);
 static  int       termp_sm_pre(DECL_ARGS);  static  int       termp_sm_pre(DECL_ARGS);
 static  int       termp_sp_pre(DECL_ARGS);  static  int       termp_sp_pre(DECL_ARGS);
 static  int       termp_ss_pre(DECL_ARGS);  static  int       termp_ss_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_ud_pre(DECL_ARGS);
 static  int       termp_vt_pre(DECL_ARGS);  static  int       termp_vt_pre(DECL_ARGS);
Line 144  static const struct termact termacts[MDOC_MAX] = {
Line 147  static const struct termact termacts[MDOC_MAX] = {
         { termp_cd_pre, NULL }, /* Cd */          { termp_cd_pre, NULL }, /* Cd */
         { termp_bold_pre, NULL }, /* Cm */          { termp_bold_pre, NULL }, /* Cm */
         { NULL, NULL }, /* Dv */          { NULL, NULL }, /* Dv */
         { NULL, NULL }, /* Er */          { termp_er_pre, NULL }, /* Er */
         { NULL, NULL }, /* Ev */          { termp_tag_pre, NULL }, /* Ev */
         { termp_ex_pre, NULL }, /* Ex */          { termp_ex_pre, NULL }, /* Ex */
         { termp_fa_pre, NULL }, /* Fa */          { termp_fa_pre, NULL }, /* Fa */
         { termp_fd_pre, termp_fd_post }, /* Fd */          { termp_fd_pre, termp_fd_post }, /* Fd */
Line 249  static const struct termact termacts[MDOC_MAX] = {
Line 252  static const struct termact termacts[MDOC_MAX] = {
         { termp_ll_pre, NULL }, /* ll */          { termp_ll_pre, NULL }, /* ll */
 };  };
   
   static  int      fn_prio;
   
 void  void
 terminal_mdoc(void *arg, const struct mdoc *mdoc)  terminal_mdoc(void *arg, const struct roff_man *mdoc)
 {  {
         const struct mdoc_meta  *meta;          struct roff_node        *n;
         struct mdoc_node        *n;  
         struct termp            *p;          struct termp            *p;
   
         p = (struct termp *)arg;          p = (struct termp *)arg;
   
         p->overstep = 0;          p->overstep = 0;
         p->rmargin = p->maxrmargin = p->defrmargin;          p->rmargin = p->maxrmargin = p->defrmargin;
         p->tabwidth = term_len(p, 5);          p->tabwidth = term_len(p, 5);
   
         n = mdoc_node(mdoc)->child;          n = mdoc->first->child;
         meta = mdoc_meta(mdoc);  
   
         if (p->synopsisonly) {          if (p->synopsisonly) {
                 while (n != NULL) {                  while (n != NULL) {
                         if (n->tok == MDOC_Sh && n->sec == SEC_SYNOPSIS) {                          if (n->tok == MDOC_Sh && n->sec == SEC_SYNOPSIS) {
                                 if (n->child->next->child != NULL)                                  if (n->child->next->child != NULL)
                                         print_mdoc_nodelist(p, NULL,                                          print_mdoc_nodelist(p, NULL,
                                             meta, n->child->next->child);                                              &mdoc->meta,
                                               n->child->next->child);
                                 term_newln(p);                                  term_newln(p);
                                 break;                                  break;
                         }                          }
Line 280  terminal_mdoc(void *arg, const struct mdoc *mdoc)
Line 281  terminal_mdoc(void *arg, const struct mdoc *mdoc)
         } else {          } else {
                 if (p->defindent == 0)                  if (p->defindent == 0)
                         p->defindent = 5;                          p->defindent = 5;
                 term_begin(p, print_mdoc_head, print_mdoc_foot, meta);                  term_begin(p, print_mdoc_head, print_mdoc_foot,
                       &mdoc->meta);
                 if (n != NULL) {                  if (n != NULL) {
                         if (n->tok != MDOC_Sh)                          if (n->tok != MDOC_Sh)
                                 term_vspace(p);                                  term_vspace(p);
                         print_mdoc_nodelist(p, NULL, meta, n);                          print_mdoc_nodelist(p, NULL, &mdoc->meta, n);
                 }                  }
                 term_end(p);                  term_end(p);
         }          }
Line 407  print_mdoc_node(DECL_ARGS)
Line 409  print_mdoc_node(DECL_ARGS)
 }  }
   
 static void  static void
 print_mdoc_foot(struct termp *p, const void *arg)  print_mdoc_foot(struct termp *p, const struct roff_meta *meta)
 {  {
         const struct mdoc_meta *meta;  
         size_t sz;          size_t sz;
   
         meta = (const struct mdoc_meta *)arg;  
   
         term_fontrepl(p, TERMFONT_NONE);          term_fontrepl(p, TERMFONT_NONE);
   
         /*          /*
Line 459  print_mdoc_foot(struct termp *p, const void *arg)
Line 458  print_mdoc_foot(struct termp *p, const void *arg)
 }  }
   
 static void  static void
 print_mdoc_head(struct termp *p, const void *arg)  print_mdoc_head(struct termp *p, const struct roff_meta *meta)
 {  {
         const struct mdoc_meta  *meta;  
         char                    *volume, *title;          char                    *volume, *title;
         size_t                   vollen, titlen;          size_t                   vollen, titlen;
   
         meta = (const struct mdoc_meta *)arg;  
   
         /*          /*
          * The header is strange.  It has three components, which are           * The header is strange.  It has three components, which are
          * really two with the first duplicated.  It goes like this:           * really two with the first duplicated.  It goes like this:
Line 539  a2width(const struct termp *p, const char *v)
Line 535  a2width(const struct termp *p, const char *v)
                 SCALE_HS_INIT(&su, term_strlen(p, v));                  SCALE_HS_INIT(&su, term_strlen(p, v));
                 su.scale /= term_strlen(p, "0");                  su.scale /= term_strlen(p, "0");
         }          }
         return(term_hspan(p, &su));          return(term_hspan(p, &su) / 24);
 }  }
   
 /*  /*
Line 549  a2width(const struct termp *p, const char *v)
Line 545  a2width(const struct termp *p, const char *v)
  */   */
 static void  static void
 print_bvspace(struct termp *p,  print_bvspace(struct termp *p,
         const struct mdoc_node *bl,          const struct roff_node *bl,
         const struct mdoc_node *n)          const struct roff_node *n)
 {  {
         const struct mdoc_node  *nn;          const struct roff_node  *nn;
   
         assert(n);          assert(n);
   
Line 610  static int
Line 606  static int
 termp_it_pre(DECL_ARGS)  termp_it_pre(DECL_ARGS)
 {  {
         char                    buf[24];          char                    buf[24];
         const struct mdoc_node *bl, *nn;          const struct roff_node *bl, *nn;
         size_t                  ncols, dcol;          size_t                  ncols, dcol;
         int                     i, offset, width;          int                     i, offset, width;
         enum mdoc_list          type;          enum mdoc_list          type;
Line 1057  static int
Line 1053  static int
 termp_fl_pre(DECL_ARGS)  termp_fl_pre(DECL_ARGS)
 {  {
   
           termp_tag_pre(p, pair, meta, n);
         term_fontpush(p, TERMFONT_BOLD);          term_fontpush(p, TERMFONT_BOLD);
         term_word(p, "\\-");          term_word(p, "\\-");
   
Line 1267  termp_xr_pre(DECL_ARGS)
Line 1264  termp_xr_pre(DECL_ARGS)
  * macro combos).   * macro combos).
  */   */
 static void  static void
 synopsis_pre(struct termp *p, const struct mdoc_node *n)  synopsis_pre(struct termp *p, const struct roff_node *n)
 {  {
         /*          /*
          * Obviously, if we're not in a SYNOPSIS or no prior macros           * Obviously, if we're not in a SYNOPSIS or no prior macros
Line 1338  static int
Line 1335  static int
 termp_bold_pre(DECL_ARGS)  termp_bold_pre(DECL_ARGS)
 {  {
   
           termp_tag_pre(p, pair, meta, n);
         term_fontpush(p, TERMFONT_BOLD);          term_fontpush(p, TERMFONT_BOLD);
         return(1);          return(1);
 }  }
Line 1368  termp_sh_pre(DECL_ARGS)
Line 1366  termp_sh_pre(DECL_ARGS)
                  * when the previous section was empty.                   * when the previous section was empty.
                  */                   */
                 if (n->prev == NULL ||                  if (n->prev == NULL ||
                     MDOC_Sh != n->prev->tok ||                      n->prev->tok != MDOC_Sh ||
                     (n->prev->body != NULL &&                      (n->prev->body != NULL &&
                      n->prev->body->child != NULL))                       n->prev->body->child != NULL))
                         term_vspace(p);                          term_vspace(p);
Line 1378  termp_sh_pre(DECL_ARGS)
Line 1376  termp_sh_pre(DECL_ARGS)
                 break;                  break;
         case ROFFT_BODY:          case ROFFT_BODY:
                 p->offset = term_len(p, p->defindent);                  p->offset = term_len(p, p->defindent);
                 if (SEC_AUTHORS == n->sec)                  switch (n->sec) {
                   case SEC_DESCRIPTION:
                           fn_prio = 0;
                           break;
                   case SEC_AUTHORS:
                         p->flags &= ~(TERMP_SPLIT|TERMP_NOSPLIT);                          p->flags &= ~(TERMP_SPLIT|TERMP_NOSPLIT);
                           break;
                   default:
                           break;
                   }
                 break;                  break;
         default:          default:
                 break;                  break;
Line 1475  termp_fn_pre(DECL_ARGS)
Line 1481  termp_fn_pre(DECL_ARGS)
         term_word(p, n->string);          term_word(p, n->string);
         term_fontpop(p);          term_fontpop(p);
   
           if (n->sec == SEC_DESCRIPTION) {
                   if ( ! tag_get(n->string, 0, ++fn_prio))
                           tag_put(n->string, 0, fn_prio, p->line);
           }
   
         if (pretty) {          if (pretty) {
                 term_flushln(p);                  term_flushln(p);
                 p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG);                  p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG);
Line 1515  termp_fn_pre(DECL_ARGS)
Line 1526  termp_fn_pre(DECL_ARGS)
 static int  static int
 termp_fa_pre(DECL_ARGS)  termp_fa_pre(DECL_ARGS)
 {  {
         const struct mdoc_node  *nn;          const struct roff_node  *nn;
   
         if (n->parent->tok != MDOC_Fo) {          if (n->parent->tok != MDOC_Fo) {
                 term_fontpush(p, TERMFONT_UNDER);                  term_fontpush(p, TERMFONT_UNDER);
Line 1541  static int
Line 1552  static int
 termp_bd_pre(DECL_ARGS)  termp_bd_pre(DECL_ARGS)
 {  {
         size_t                   tabwidth, lm, len, rm, rmax;          size_t                   tabwidth, lm, len, rm, rmax;
         struct mdoc_node        *nn;          struct roff_node        *nn;
         int                      offset;          int                      offset;
   
         if (n->type == ROFFT_BLOCK) {          if (n->type == ROFFT_BLOCK) {
Line 1827  termp_sp_pre(DECL_ARGS)
Line 1838  termp_sp_pre(DECL_ARGS)
                 break;                  break;
         default:          default:
                 len = 1;                  len = 1;
                   fn_prio = 0;
                 break;                  break;
         }          }
   
Line 2170  termp_li_pre(DECL_ARGS)
Line 2182  termp_li_pre(DECL_ARGS)
 static int  static int
 termp_lk_pre(DECL_ARGS)  termp_lk_pre(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);
Line 2258  termp_under_pre(DECL_ARGS)
Line 2270  termp_under_pre(DECL_ARGS)
 {  {
   
         term_fontpush(p, TERMFONT_UNDER);          term_fontpush(p, TERMFONT_UNDER);
           return(1);
   }
   
   static int
   termp_er_pre(DECL_ARGS)
   {
   
           if (n->sec == SEC_ERRORS &&
               (n->parent->tok == MDOC_It ||
                (n->parent->tok == MDOC_Bq &&
                 n->parent->parent->parent->tok == MDOC_It)) &&
               ! tag_get(n->child->string, 0, 1))
                   tag_put(n->child->string, 0, 1, p->line);
           return(1);
   }
   
   static int
   termp_tag_pre(DECL_ARGS)
   {
   
           if (n->child != NULL &&
               n->child->type == ROFFT_TEXT &&
               n->prev == NULL &&
               (n->parent->tok == MDOC_It ||
                (n->parent->tok == MDOC_Xo &&
                 n->parent->parent->prev == NULL &&
                 n->parent->parent->parent->tok == MDOC_It)) &&
               ! tag_get(n->child->string, 0, 1))
                   tag_put(n->child->string, 0, 1, p->line);
         return(1);          return(1);
 }  }

Legend:
Removed from v.1.314  
changed lines
  Added in v.1.323

CVSweb