[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.149 and 1.155

version 1.149, 2010/06/12 11:58:22 version 1.155, 2010/06/13 22:05:43
Line 52  struct termact {
Line 52  struct termact {
         void    (*post)(DECL_ARGS);          void    (*post)(DECL_ARGS);
 };  };
   
 static  size_t    a2width(const struct mdoc_argv *, int);  static  size_t    a2width(const char *);
 static  size_t    a2height(const struct mdoc_node *);  static  size_t    a2height(const struct mdoc_node *);
 static  size_t    a2offs(const char *);  static  size_t    a2offs(const char *);
   
 static  int       arg_hasattr(int, const struct mdoc_node *);  static  int       arg_hasattr(int, const struct mdoc_node *);
 static  int       arg_getattrs(const int *, int *, size_t,  
                         const struct mdoc_node *);  
 static  int       arg_getattr(int, const struct mdoc_node *);  static  int       arg_getattr(int, const struct mdoc_node *);
 static  void      print_bvspace(struct termp *,  static  void      print_bvspace(struct termp *,
                         const struct mdoc_node *,                          const struct mdoc_node *,
Line 476  a2height(const struct mdoc_node *n)
Line 474  a2height(const struct mdoc_node *n)
   
   
 static size_t  static size_t
 a2width(const struct mdoc_argv *arg, int pos)  a2width(const char *v)
 {  {
         struct roffsu    su;          struct roffsu    su;
   
         assert(arg->value[pos]);          assert(v);
         if ( ! a2roffsu(arg->value[pos], &su, SCALE_MAX))          if ( ! a2roffsu(v, &su, SCALE_MAX))
                 SCALE_HS_INIT(&su, strlen(arg->value[pos]));                  SCALE_HS_INIT(&su, strlen(v));
   
         return(term_hspan(&su));          return(term_hspan(&su));
 }  }
Line 522  arg_hasattr(int arg, const struct mdoc_node *n)
Line 520  arg_hasattr(int arg, const struct mdoc_node *n)
   
 /*  /*
  * Get the index of an argument in a node's argument list or -1 if it   * Get the index of an argument in a node's argument list or -1 if it
  * does not exist.  See arg_getattrs().   * does not exist.
  */   */
 static int  static int
 arg_getattr(int v, const struct mdoc_node *n)  arg_getattr(int v, const struct mdoc_node *n)
 {  {
         int              val;          int              i;
   
         return(arg_getattrs(&v, &val, 1, n) ? val : -1);  
 }  
   
   
 /*  
  * Walk through the argument list for a node and fill an array "vals"  
  * with the positions of the argument structures listed in "keys".  
  * Return the number of elements that were written into "vals", which  
  * can be zero.  
  */  
 static int  
 arg_getattrs(const int *keys, int *vals,  
                 size_t sz, const struct mdoc_node *n)  
 {  
         int              i, j, k;  
   
         if (NULL == n->args)          if (NULL == n->args)
                 return(0);                  return(0);
   
         for (k = i = 0; i < (int)n->args->argc; i++)          for (i = 0; i < (int)n->args->argc; i++)
                 for (j = 0; j < (int)sz; j++)                  if (n->args->argv[i].arg == v)
                         if (n->args->argv[i].arg == keys[j]) {                          return(i);
                                 vals[j] = i;  
                                 k++;          return(-1);
                         }  
         return(k);  
 }  }
   
   
Line 570  print_bvspace(struct termp *p, 
Line 550  print_bvspace(struct termp *p, 
 {  {
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
   
         /* FIXME: MDOC_Bd == bl->tok && bl->data.Bd.comp */  
         term_newln(p);          term_newln(p);
         if (arg_hasattr(MDOC_Compact, bl))  
           if (MDOC_Bd == bl->tok && bl->data.Bd.comp)
                 return;                  return;
           if (MDOC_Bl == bl->tok && bl->data.Bl.comp)
                   return;
   
         /* Do not vspace directly after Ss/Sh. */          /* Do not vspace directly after Ss/Sh. */
   
Line 641  termp_it_pre(DECL_ARGS)
Line 623  termp_it_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *bl, *nn;          const struct mdoc_node *bl, *nn;
         char                    buf[7];          char                    buf[7];
         int                     i, keys[3], vals[3];          int                     i, col;
         size_t                  width, offset, ncols, dcol;          size_t                  width, offset, ncols, dcol;
         enum mdoc_list          type;          enum mdoc_list          type;
   
Line 651  termp_it_pre(DECL_ARGS)
Line 633  termp_it_pre(DECL_ARGS)
         }          }
   
         bl = n->parent->parent->parent;          bl = n->parent->parent->parent;
   
         /* Get list width, offset, and list type from argument list. */  
   
         keys[0] = MDOC_Width;  
         keys[1] = MDOC_Offset;  
         keys[2] = MDOC_Column;  
   
         vals[0] = vals[1] = vals[2] = -1;  
   
         arg_getattrs(keys, vals, 3, bl);  
   
         type = bl->data.Bl.type;          type = bl->data.Bl.type;
   
         /*          /*
Line 672  termp_it_pre(DECL_ARGS)
Line 643  termp_it_pre(DECL_ARGS)
   
         width = offset = 0;          width = offset = 0;
   
         if (vals[1] >= 0)          if (bl->data.Bl.offs)
                 offset = a2offs(bl->args->argv[vals[1]].value[0]);                  offset = a2offs(bl->data.Bl.offs);
   
         switch (type) {          switch (type) {
         case (LIST_column):          case (LIST_column):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         break;                          break;
   
                   col = arg_getattr(MDOC_Column, bl);
   
                 /*                  /*
                  * Imitate groff's column handling:                   * Imitate groff's column handling:
                  * - For each earlier column, add its width.                   * - For each earlier column, add its width.
Line 688  termp_it_pre(DECL_ARGS)
Line 662  termp_it_pre(DECL_ARGS)
                  *   column.                   *   column.
                  * - For more than 5 columns, add only one column.                   * - For more than 5 columns, add only one column.
                  */                   */
                 ncols = bl->args->argv[vals[2]].sz;                  ncols = bl->args->argv[col].sz;
                 /* LINTED */                  /* LINTED */
                 dcol = ncols < 5 ? 4 : ncols == 5 ? 3 : 1;                  dcol = ncols < 5 ? 4 : ncols == 5 ? 3 : 1;
   
Line 701  termp_it_pre(DECL_ARGS)
Line 675  termp_it_pre(DECL_ARGS)
                                 nn->prev && i < (int)ncols;                                  nn->prev && i < (int)ncols;
                                 nn = nn->prev, i++)                                  nn = nn->prev, i++)
                         offset += dcol + a2width                          offset += dcol + a2width
                                 (&bl->args->argv[vals[2]], i);                                  (bl->args->argv[col].value[i]);
   
   
                 /*                  /*
                  * When exceeding the declared number of columns, leave                   * When exceeding the declared number of columns, leave
                  * the remaining widths at 0.  This will later be                   * the remaining widths at 0.  This will later be
Line 717  termp_it_pre(DECL_ARGS)
Line 690  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(&bl->args->argv[vals[2]], i) + dcol;                  width = a2width(bl->args->argv[col].value[i]) + dcol;
                 break;                  break;
         default:          default:
                 if (vals[0] < 0)                  if (NULL == bl->data.Bl.width)
                         break;                          break;
   
                 /*                  /*
Line 728  termp_it_pre(DECL_ARGS)
Line 701  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.
                  */                   */
                 width = a2width(&bl->args->argv[vals[0]], 0) + 2;                  assert(bl->data.Bl.width);
                   width = a2width(bl->data.Bl.width) + 2;
                 break;                  break;
         }          }
   

Legend:
Removed from v.1.149  
changed lines
  Added in v.1.155

CVSweb