[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.168 and 1.175

version 1.168, 2010/07/02 15:03:14 version 1.175, 2010/07/19 11:06:31
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
    * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 30 
Line 31 
 #include "mandoc.h"  #include "mandoc.h"
 #include "out.h"  #include "out.h"
 #include "term.h"  #include "term.h"
 #include "regs.h"  
 #include "mdoc.h"  #include "mdoc.h"
 #include "chars.h"  #include "chars.h"
 #include "main.h"  #include "main.h"
Line 57  static size_t   a2width(const struct termp *, const ch
Line 57  static size_t   a2width(const struct termp *, const ch
 static  size_t    a2height(const struct termp *, const char *);  static  size_t    a2height(const struct termp *, const char *);
 static  size_t    a2offs(const struct termp *, const char *);  static  size_t    a2offs(const struct termp *, const char *);
   
 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 *,
                         const struct mdoc_node *);                          const struct mdoc_node *);
Line 330  print_mdoc_node(DECL_ARGS)
Line 329  print_mdoc_node(DECL_ARGS)
         else if (termacts[n->tok].pre && ENDBODY_NOT == n->end)          else if (termacts[n->tok].pre && ENDBODY_NOT == n->end)
                 chld = (*termacts[n->tok].pre)(p, &npair, m, n);                  chld = (*termacts[n->tok].pre)(p, &npair, m, n);
   
           /*
            * Keeps only work until the end of a line.  If a keep was
            * invoked in a prior line, revert it to PREKEEP.
            */
   
           if (TERMP_KEEP & p->flags) {
                   if (n->prev && n->prev->line != n->line) {
                           p->flags &= ~TERMP_KEEP;
                           p->flags |= TERMP_PREKEEP;
                   } else if (NULL == n->prev) {
                           if (n->parent && n->parent->line != n->line) {
                                   p->flags &= ~TERMP_KEEP;
                                   p->flags |= TERMP_PREKEEP;
                           }
                   }
           }
   
         if (chld && n->child)          if (chld && n->child)
                 print_mdoc_nodelist(p, &npair, m, n->child);                  print_mdoc_nodelist(p, &npair, m, n->child);
   
Line 527  a2offs(const struct termp *p, const char *v)
Line 543  a2offs(const struct termp *p, const char *v)
   
   
 /*  /*
  * Get the index of an argument in a node's argument list or -1 if it  
  * does not exist.  
  */  
 static int  
 arg_getattr(int v, const struct mdoc_node *n)  
 {  
         int              i;  
   
         if (NULL == n->args)  
                 return(0);  
   
         for (i = 0; i < (int)n->args->argc; i++)  
                 if (n->args->argv[i].arg == v)  
                         return(i);  
   
         return(-1);  
 }  
   
   
 /*  
  * Determine how much space to print out before block elements of `It'   * Determine how much space to print out before block elements of `It'
  * (and thus `Bl') and `Bd'.  And then go ahead and print that space,   * (and thus `Bl') and `Bd'.  And then go ahead and print that space,
  * too.   * too.
Line 631  termp_it_pre(DECL_ARGS)
Line 627  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, col;          int                     i;
         size_t                  width, offset, ncols, dcol;          size_t                  width, offset, ncols, dcol;
         enum mdoc_list          type;          enum mdoc_list          type;
   
Line 660  termp_it_pre(DECL_ARGS)
Line 656  termp_it_pre(DECL_ARGS)
                 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 671  termp_it_pre(DECL_ARGS)
Line 665  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[col].sz;                  ncols = bl->data.Bl->ncols;
   
                 /* LINTED */                  /* LINTED */
                 dcol = ncols < 5 ? term_len(p, 4) :                  dcol = ncols < 5 ? term_len(p, 4) :
                         ncols == 5 ? term_len(p, 3) : term_len(p, 1);                          ncols == 5 ? term_len(p, 3) : term_len(p, 1);
Line 685  termp_it_pre(DECL_ARGS)
Line 680  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
                                 (p, bl->args->argv[col].value[i]);                                  (p, bl->data.Bl->cols[i]);
   
                 /*                  /*
                  * When exceeding the declared number of columns, leave                   * When exceeding the declared number of columns, leave
Line 700  termp_it_pre(DECL_ARGS)
Line 695  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(p, bl->args->argv[col].value[i]) + dcol;                  width = a2width(p, bl->data.Bl->cols[i]) + dcol;
                 break;                  break;
         default:          default:
                 if (NULL == bl->data.Bl->width)                  if (NULL == bl->data.Bl->width)
Line 1910  termp_sp_pre(DECL_ARGS)
Line 1905  termp_sp_pre(DECL_ARGS)
                 len = 0;                  len = 0;
                 break;                  break;
         default:          default:
                   assert(n->parent);
                   if ((NULL == n->next || NULL == n->prev) &&
                                   (MDOC_Ss == n->parent->tok ||
                                    MDOC_Sh == n->parent->tok))
                           return(0);
                 len = 1;                  len = 1;
                 break;                  break;
         }          }
Line 2012  termp_fo_pre(DECL_ARGS)
Line 2012  termp_fo_pre(DECL_ARGS)
                 return(1);                  return(1);
         }          }
   
           if (NULL == n->child)
                   return(0);
   
         /* XXX: we drop non-initial arguments as per groff. */          /* XXX: we drop non-initial arguments as per groff. */
   
         assert(n->child);  
         assert(n->child->string);          assert(n->child->string);
         term_fontpush(p, TERMFONT_BOLD);          term_fontpush(p, TERMFONT_BOLD);
         term_word(p, n->child->string);          term_word(p, n->child->string);
Line 2069  termp_sm_pre(DECL_ARGS)
Line 2071  termp_sm_pre(DECL_ARGS)
 {  {
   
         assert(n->child && MDOC_TEXT == n->child->type);          assert(n->child && MDOC_TEXT == n->child->type);
         if (0 == strcmp("on", n->child->string))          if (0 == strcmp("on", n->child->string)) {
                   if (p->col)
                           p->flags &= ~TERMP_NOSPACE;
                 p->flags &= ~TERMP_NONOSPACE;                  p->flags &= ~TERMP_NONOSPACE;
         else          } else
                 p->flags |= TERMP_NONOSPACE;                  p->flags |= TERMP_NONOSPACE;
   
         return(0);          return(0);

Legend:
Removed from v.1.168  
changed lines
  Added in v.1.175

CVSweb