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

version 1.86, 2009/10/03 19:02:45 version 1.91, 2009/10/18 13:34:17
Line 25 
Line 25 
   
 #include "term.h"  #include "term.h"
 #include "mdoc.h"  #include "mdoc.h"
   #include "chars.h"
   #include "main.h"
   
 /* FIXME: check HANG lists: they seem to be broken... :  
  * .Bl -hang -width Ds  
  * .It a  
  * b  
  * .It Fl f Ns Ar option...  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * .  
  * .It a sasd fasd as afsd sfad sfds sadfs sd sfd ssfad asfd  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * Override default compiler behaviour.  See  
  * .Sx Compiler Options  
  * for details.  
  * .El  
  *  
  */  
   
 #define INDENT            5  #define INDENT            5
 #define HALFINDENT        3  #define HALFINDENT        3
   
Line 275  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 292  static void   print_foot(DECL_ARGS);
Line 261  static void   print_foot(DECL_ARGS);
   
   
 void  void
 mdoc_run(struct termp *p, const struct mdoc *mdoc)  terminal_mdoc(void *arg, const struct mdoc *mdoc)
 {  {
         const struct mdoc_node  *n;          const struct mdoc_node  *n;
         const struct mdoc_meta  *m;          const struct mdoc_meta  *m;
           struct termp            *p;
   
           p = (struct termp *)arg;
   
           if (NULL == p->symtab)
                   switch (p->enc) {
                   case (TERMENC_ASCII):
                           p->symtab = chars_init(CHARS_ASCII);
                           break;
                   default:
                           abort();
                           /* NOTREACHED */
                   }
   
         n = mdoc_node(mdoc);          n = mdoc_node(mdoc);
         m = mdoc_meta(mdoc);          m = mdoc_meta(mdoc);
   
Line 490  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 559  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 627  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 709  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 752  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 1570  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 1579  termp_bd_pre(DECL_ARGS)
Line 1552  termp_bd_pre(DECL_ARGS)
   
         for (type = -1, i = 0; i < (int)nn->args->argc; i++) {          for (type = -1, i = 0; i < (int)nn->args->argc; i++) {
                 switch (nn->args->argv[i].arg) {                  switch (nn->args->argv[i].arg) {
                   case (MDOC_Centred):
                           /* FALLTHROUGH */
                 case (MDOC_Ragged):                  case (MDOC_Ragged):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_Filled):                  case (MDOC_Filled):
Line 1589  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 1609  termp_bd_pre(DECL_ARGS)
Line 1584  termp_bd_pre(DECL_ARGS)
                 return(1);                  return(1);
   
         for (nn = n->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                   p->flags |= TERMP_NOSPACE;
                 print_node(p, pair, m, nn);                  print_node(p, pair, m, nn);
                 if (NULL == nn->next)                  if (NULL == nn->next)
                         continue;                          continue;
                 if (nn->prev && nn->prev->line < nn->line)                  if (nn->prev && nn->prev->line < nn->line)
                         term_flushln(p);                          term_flushln(p);
                   else if (NULL == nn->prev)
                           term_flushln(p);
         }          }
   
         return(0);          return(0);
Line 1837  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.86  
changed lines
  Added in v.1.91

CVSweb