[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.90 and 1.91

version 1.90, 2009/10/15 01:33:12 version 1.91, 2009/10/18 13:34:17
Line 242  extern size_t   strlcpy(char *, const char *, size_t);
Line 242  extern size_t   strlcpy(char *, const char *, size_t);
 extern  size_t    strlcat(char *, const char *, size_t);  extern  size_t    strlcat(char *, const char *, size_t);
 #endif  #endif
   
   static  size_t    arg2width(const struct mdoc_argv *, int);
   static  size_t    arg2height(const struct mdoc_node *);
   static  size_t    arg2offs(const struct mdoc_argv *);
   
 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,  static  int       arg_getattrs(const int *, int *, size_t,
                         const struct mdoc_node *);                          const struct mdoc_node *);
 static  int       arg_getattr(int, const struct mdoc_node *);  static  int       arg_getattr(int, const struct mdoc_node *);
 static  size_t    arg_offset(const struct mdoc_argv *);  
 static  size_t    arg_width(const struct mdoc_argv *, int);  
 static  int       arg_listtype(const struct mdoc_node *);  static  int       arg_listtype(const struct mdoc_node *);
 static  void      fmt_block_vspace(struct termp *,  static  void      print_bvspace(struct termp *,
                         const struct mdoc_node *,                          const struct mdoc_node *,
                         const struct mdoc_node *);                          const struct mdoc_node *);
 static  void      print_node(DECL_ARGS);  static  void      print_node(DECL_ARGS);
Line 470  print_head(DECL_ARGS)
Line 472  print_head(DECL_ARGS)
 }  }
   
   
 /* FIXME: put in utility file for front-ends. */  
 static size_t  static size_t
 arg_width(const struct mdoc_argv *arg, int pos)  arg2height(const struct mdoc_node *n)
 {  {
         int              i, len;          int              r;
         const char      *p;  
   
         assert(pos < (int)arg->sz && pos >= 0);          assert(MDOC_TEXT == n->type);
         assert(arg->value[pos]);          assert(n->string);
   
         p = arg->value[pos];          if ((r = a2height(n->string)) < 0)
                   return(1);
   
         if (0 == (len = (int)strlen(p)))          return((size_t)r);
                 return(0);  }
   
         for (i = 0; i < len - 1; i++)  
                 if ( ! isdigit((u_char)p[i]))  
                         break;  
   
         if (i == len - 1)  static size_t
                 if ('n' == p[len - 1] || 'm' == p[len - 1])  arg2width(const struct mdoc_argv *arg, int pos)
                         return((size_t)atoi(p) + 2);  {
           int              r;
   
         return((size_t)len + 2);          assert(arg->value[pos]);
           if ('\0' == arg->value[pos][0])
                   return(2);
   
           if ((r = a2width(arg->value[pos])) >= 0)
                   return((size_t)r);
   
           return(strlen(arg->value[pos]) + 2);
 }  }
   
   
Line 539  arg_listtype(const struct mdoc_node *n)
Line 545  arg_listtype(const struct mdoc_node *n)
 }  }
   
   
 /* FIXME: put in utility file for front-ends. */  
 static size_t  static size_t
 arg_offset(const struct mdoc_argv *arg)  arg2offs(const struct mdoc_argv *arg)
 {  {
         int              len, i;          int              r;
         const char      *p;  
   
         assert(*arg->value);          if ('\0' == arg->value[0][0])
         p = *arg->value;  
   
         if (0 == strcmp(p, "left"))  
                 return(0);                  return(0);
         if (0 == strcmp(p, "indent"))          else if (0 == strcmp(arg->value[0], "left"))
                   return(0);
           else if (0 == strcmp(arg->value[0], "indent"))
                 return(INDENT + 1);                  return(INDENT + 1);
         if (0 == strcmp(p, "indent-two"))          else if (0 == strcmp(arg->value[0], "indent-two"))
                 return((INDENT + 1) * 2);                  return((INDENT + 1) * 2);
           else if ((r = a2width(arg->value[0])) >= 0)
                   return((size_t)r);
   
         if (0 == (len = (int)strlen(p)))          return(strlen(arg->value[0]));
                 return(0);  
   
         for (i = 0; i < len - 1; i++)  
                 if ( ! isdigit((u_char)p[i]))  
                         break;  
   
         if (i == len - 1)  
                 if ('n' == p[len - 1] || 'm' == p[len - 1])  
                         return((size_t)atoi(p));  
   
         return((size_t)len);  
 }  }
   
   
Line 607  arg_getattrs(const int *keys, int *vals, 
Line 601  arg_getattrs(const int *keys, int *vals, 
 }  }
   
   
 /* ARGSUSED */  
 static void  static void
 fmt_block_vspace(struct termp *p,  print_bvspace(struct termp *p,
                 const struct mdoc_node *bl,                  const struct mdoc_node *bl,
                 const struct mdoc_node *n)                  const struct mdoc_node *n)
 {  {
Line 689  termp_it_pre(DECL_ARGS)
Line 682  termp_it_pre(DECL_ARGS)
         size_t                  width, offset;          size_t                  width, offset;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                 fmt_block_vspace(p, n->parent->parent, n);                  print_bvspace(p, n->parent->parent, n);
                 return(1);                  return(1);
         }          }
   
Line 732  termp_it_pre(DECL_ARGS)
Line 725  termp_it_pre(DECL_ARGS)
                 for (i = 0, nn = n->prev; nn &&                  for (i = 0, nn = n->prev; nn &&
                                 i < (int)bl->args->argv[vals[2]].sz;                                  i < (int)bl->args->argv[vals[2]].sz;
                                 nn = nn->prev, i++)                                  nn = nn->prev, i++)
                         offset += arg_width                          offset += arg2width
                                 (&bl->args->argv[vals[2]], i);                                  (&bl->args->argv[vals[2]], i);
   
                 /* Whether exceeds maximum column. */                  /* Whether exceeds maximum column. */
                 if (i < (int)bl->args->argv[vals[2]].sz)                  if (i < (int)bl->args->argv[vals[2]].sz)
                         width = arg_width(&bl->args->argv[vals[2]], i);                          width = arg2width(&bl->args->argv[vals[2]], i);
                 else                  else
                         width = 0;                          width = 0;
   
                 if (vals[1] >= 0)                  if (vals[1] >= 0)
                         offset += arg_offset(&bl->args->argv[vals[1]]);                          offset += arg2offs(&bl->args->argv[vals[1]]);
                 break;                  break;
         default:          default:
                 if (vals[0] >= 0)                  if (vals[0] >= 0)
                         width = arg_width(&bl->args->argv[vals[0]], 0);                          width = arg2width(&bl->args->argv[vals[0]], 0);
                 if (vals[1] >= 0)                  if (vals[1] >= 0)
                         offset += arg_offset(&bl->args->argv[vals[1]]);                          offset += arg2offs(&bl->args->argv[vals[1]]);
                 break;                  break;
         }          }
   
Line 1550  termp_bd_pre(DECL_ARGS)
Line 1543  termp_bd_pre(DECL_ARGS)
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                 fmt_block_vspace(p, n, n);                  print_bvspace(p, n, n);
                 return(1);                  return(1);
         } else if (MDOC_BODY != n->type)          } else if (MDOC_BODY != n->type)
                 return(1);                  return(1);
Line 1571  termp_bd_pre(DECL_ARGS)
Line 1564  termp_bd_pre(DECL_ARGS)
                         type = nn->args->argv[i].arg;                          type = nn->args->argv[i].arg;
                         break;                          break;
                 case (MDOC_Offset):                  case (MDOC_Offset):
                         p->offset += arg_offset(&nn->args->argv[i]);                          p->offset += arg2offs(&nn->args->argv[i]);
                         break;                          break;
                 default:                  default:
                         break;                          break;
Line 1822  termp_in_post(DECL_ARGS)
Line 1815  termp_in_post(DECL_ARGS)
 static int  static int
 termp_sp_pre(DECL_ARGS)  termp_sp_pre(DECL_ARGS)
 {  {
         int              i, len;          size_t           i, len;
   
         switch (n->tok) {          switch (n->tok) {
         case (MDOC_sp):          case (MDOC_sp):
                 len = n->child ? atoi(n->child->string) : 1;                  len = n->child ? arg2height(n->child) : 1;
                 break;                  break;
         case (MDOC_br):          case (MDOC_br):
                 len = 0;                  len = 0;

Legend:
Removed from v.1.90  
changed lines
  Added in v.1.91

CVSweb