[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.301 and 1.302

version 1.301, 2014/12/23 13:48:57 version 1.302, 2014/12/24 23:32:42
Line 22 
Line 22 
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
   #include <limits.h>
 #include <stdint.h>  #include <stdint.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 49  struct termact {
Line 50  struct termact {
         void    (*post)(DECL_ARGS);          void    (*post)(DECL_ARGS);
 };  };
   
 static  size_t    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 mdoc_node *,
Line 525  print_mdoc_head(struct termp *p, const void *arg)
Line 526  print_mdoc_head(struct termp *p, const void *arg)
         free(volume);          free(volume);
 }  }
   
 static size_t  static int
 a2width(const struct termp *p, const char *v)  a2width(const struct termp *p, const char *v)
 {  {
         struct roffsu    su;          struct roffsu    su;
Line 533  a2width(const struct termp *p, const char *v)
Line 534  a2width(const struct termp *p, const char *v)
         if (a2roffsu(v, &su, SCALE_MAX) < 2) {          if (a2roffsu(v, &su, SCALE_MAX) < 2) {
                 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");
         } else if (su.scale < 0.0)          }
                 su.scale = 0.0;  
   
         return(term_hspan(p, &su));          return(term_hspan(p, &su));
 }  }
   
Line 606  termp_ll_pre(DECL_ARGS)
Line 605  termp_ll_pre(DECL_ARGS)
 static int  static int
 termp_it_pre(DECL_ARGS)  termp_it_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *bl, *nn;  
         char                    buf[24];          char                    buf[24];
         int                     i;          const struct mdoc_node *bl, *nn;
         size_t                  width, offset, ncols, dcol;          size_t                  ncols, dcol;
           int                     i, offset, width;
         enum mdoc_list          type;          enum mdoc_list          type;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
Line 621  termp_it_pre(DECL_ARGS)
Line 620  termp_it_pre(DECL_ARGS)
         type = bl->norm->Bl.type;          type = bl->norm->Bl.type;
   
         /*          /*
            * Defaults for specific list types.
            */
   
           switch (type) {
           case LIST_bullet:
                   /* FALLTHROUGH */
           case LIST_dash:
                   /* FALLTHROUGH */
           case LIST_hyphen:
                   /* FALLTHROUGH */
           case LIST_enum:
                   width = term_len(p, 2);
                   break;
           case LIST_hang:
                   width = term_len(p, 8);
                   break;
           case LIST_column:
                   /* FALLTHROUGH */
           case LIST_tag:
                   width = term_len(p, 10);
                   break;
           default:
                   width = 0;
                   break;
           }
           offset = 0;
   
           /*
          * First calculate width and offset.  This is pretty easy unless           * First calculate width and offset.  This is pretty easy unless
          * we're a -column list, in which case all prior columns must           * we're a -column list, in which case all prior columns must
          * be accounted for.           * be accounted for.
          */           */
   
         width = offset = 0;          if (bl->norm->Bl.offs != NULL) {
   
         if (bl->norm->Bl.offs)  
                 offset = a2width(p, bl->norm->Bl.offs);                  offset = a2width(p, bl->norm->Bl.offs);
                   if (offset < 0 && (size_t)(-offset) > p->offset)
                           offset = -p->offset;
                   else if (offset > SHRT_MAX)
                           offset = 0;
           }
   
         switch (type) {          switch (type) {
         case LIST_column:          case LIST_column:
Line 684  termp_it_pre(DECL_ARGS)
Line 714  termp_it_pre(DECL_ARGS)
                  * number for buffering single arguments.  See the above                   * number for buffering single arguments.  See the above
                  * handling for column for how this changes.                   * handling for column for how this changes.
                  */                   */
                 assert(bl->norm->Bl.width);  
                 width = a2width(p, bl->norm->Bl.width) + term_len(p, 2);                  width = a2width(p, bl->norm->Bl.width) + term_len(p, 2);
                   if (width < 0 && (size_t)(-width) > p->offset)
                           width = -p->offset;
                   else if (width > SHRT_MAX)
                           width = 0;
                 break;                  break;
         }          }
   
         /*          /*
          * List-type can override the width in the case of fixed-head  
          * values (bullet, dash/hyphen, enum).  Tags need a non-zero  
          * offset.  
          */  
   
         switch (type) {  
         case LIST_bullet:  
                 /* FALLTHROUGH */  
         case LIST_dash:  
                 /* FALLTHROUGH */  
         case LIST_hyphen:  
                 /* FALLTHROUGH */  
         case LIST_enum:  
                 if (width < term_len(p, 2))  
                         width = term_len(p, 2);  
                 break;  
         case LIST_hang:  
                 if (0 == width)  
                         width = term_len(p, 8);  
                 break;  
         case LIST_column:  
                 /* FALLTHROUGH */  
         case LIST_tag:  
                 if (0 == width)  
                         width = term_len(p, 10);  
                 break;  
         default:  
                 break;  
         }  
   
         /*  
          * Whitespace control.  Inset bodies need an initial space,           * Whitespace control.  Inset bodies need an initial space,
          * while diagonal bodies need two.           * while diagonal bodies need two.
          */           */
Line 762  termp_it_pre(DECL_ARGS)
Line 764  termp_it_pre(DECL_ARGS)
         case LIST_enum:          case LIST_enum:
                 /*                  /*
                  * Weird special case.                   * Weird special case.
                  * Very narrow enum lists actually hang.                   * Some very narrow lists actually hang.
                  */                   */
                 if (width == term_len(p, 2))  
                         p->flags |= TERMP_HANG;  
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case LIST_bullet:          case LIST_bullet:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case LIST_dash:          case LIST_dash:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case LIST_hyphen:          case LIST_hyphen:
                   if (width <= (int)term_len(p, 2))
                           p->flags |= TERMP_HANG;
                 if (MDOC_HEAD != n->type)                  if (MDOC_HEAD != n->type)
                         break;                          break;
                 p->flags |= TERMP_NOBREAK;                  p->flags |= TERMP_NOBREAK;
Line 860  termp_it_pre(DECL_ARGS)
Line 862  termp_it_pre(DECL_ARGS)
         case LIST_hyphen:          case LIST_hyphen:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case LIST_tag:          case LIST_tag:
                 assert(width);  
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         p->rmargin = p->offset + width;                          p->rmargin = p->offset + width;
                 else                  else
Line 1540  termp_bd_pre(DECL_ARGS)
Line 1541  termp_bd_pre(DECL_ARGS)
 {  {
         size_t                   tabwidth, lm, len, rm, rmax;          size_t                   tabwidth, lm, len, rm, rmax;
         struct mdoc_node        *nn;          struct mdoc_node        *nn;
           int                      offset;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                 print_bvspace(p, n, n);                  print_bvspace(p, n, n);
Line 1556  termp_bd_pre(DECL_ARGS)
Line 1558  termp_bd_pre(DECL_ARGS)
                 p->offset += term_len(p, p->defindent + 1);                  p->offset += term_len(p, p->defindent + 1);
         else if ( ! strcmp(n->norm->Bd.offs, "indent-two"))          else if ( ! strcmp(n->norm->Bd.offs, "indent-two"))
                 p->offset += term_len(p, (p->defindent + 1) * 2);                  p->offset += term_len(p, (p->defindent + 1) * 2);
         else          else {
                 p->offset += a2width(p, n->norm->Bd.offs);                  offset = a2width(p, n->norm->Bd.offs);
                   if (offset < 0 && (size_t)(-offset) > p->offset)
                           p->offset = 0;
                   else if (offset < SHRT_MAX)
                           p->offset += offset;
           }
   
         /*          /*
          * If -ragged or -filled are specified, the block does nothing           * If -ragged or -filled are specified, the block does nothing

Legend:
Removed from v.1.301  
changed lines
  Added in v.1.302

CVSweb