[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.119 and 1.128

version 1.119, 2010/05/09 16:38:38 version 1.128, 2010/05/24 14:35:59
Line 27 
Line 27 
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
   
   #include "mandoc.h"
 #include "out.h"  #include "out.h"
 #include "term.h"  #include "term.h"
 #include "mdoc.h"  #include "mdoc.h"
Line 60  static int   arg_getattrs(const int *, int *, size_t,
Line 61  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  int       arg_disptype(const struct mdoc_node *);  static  int       arg_disptype(const struct mdoc_node *);
 static  int       arg_listtype(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 273  terminal_mdoc(void *arg, const struct mdoc *mdoc)
Line 273  terminal_mdoc(void *arg, const struct mdoc *mdoc)
         p = (struct termp *)arg;          p = (struct termp *)arg;
   
         p->overstep = 0;          p->overstep = 0;
         p->maxrmargin = 78;          p->maxrmargin = p->defrmargin;
   
         if (NULL == p->symtab)          if (NULL == p->symtab)
                 switch (p->enc) {                  switch (p->enc) {
Line 337  print_mdoc_node(DECL_ARGS)
Line 337  print_mdoc_node(DECL_ARGS)
                 if (termacts[n->tok].post)                  if (termacts[n->tok].post)
                         (*termacts[n->tok].post)(p, &npair, m, n);                          (*termacts[n->tok].post)(p, &npair, m, n);
   
           if (MDOC_EOS & n->flags)
                   p->flags |= TERMP_SENTENCE;
   
         p->offset = offset;          p->offset = offset;
         p->rmargin = rmargin;          p->rmargin = rmargin;
 }  }
Line 422  print_mdoc_head(DECL_ARGS)
Line 425  print_mdoc_head(DECL_ARGS)
                 strlcat(buf, ")", BUFSIZ);                  strlcat(buf, ")", BUFSIZ);
         }          }
   
         snprintf(title, BUFSIZ, "%s(%d)", m->title, m->msec);          snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
   
         p->offset = 0;          p->offset = 0;
         p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;          p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;
Line 508  arg_disptype(const struct mdoc_node *n)
Line 511  arg_disptype(const struct mdoc_node *n)
 }  }
   
   
 static int  
 arg_listtype(const struct mdoc_node *n)  
 {  
         int              i, len;  
   
         assert(MDOC_BLOCK == n->type);  
   
         len = (int)(n->args ? n->args->argc : 0);  
   
         for (i = 0; i < len; i++)  
                 switch (n->args->argv[i].arg) {  
                 case (MDOC_Bullet):  
                         /* FALLTHROUGH */  
                 case (MDOC_Dash):  
                         /* FALLTHROUGH */  
                 case (MDOC_Enum):  
                         /* FALLTHROUGH */  
                 case (MDOC_Hyphen):  
                         /* FALLTHROUGH */  
                 case (MDOC_Tag):  
                         /* FALLTHROUGH */  
                 case (MDOC_Inset):  
                         /* FALLTHROUGH */  
                 case (MDOC_Diag):  
                         /* FALLTHROUGH */  
                 case (MDOC_Item):  
                         /* FALLTHROUGH */  
                 case (MDOC_Column):  
                         /* FALLTHROUGH */  
                 case (MDOC_Hang):  
                         /* FALLTHROUGH */  
                 case (MDOC_Ohang):  
                         return(n->args->argv[i].arg);  
                 default:  
                         break;  
                 }  
   
         return(-1);  
 }  
   
   
 static size_t  static size_t
 a2offs(const struct mdoc_argv *arg)  a2offs(const struct mdoc_argv *arg)
 {  {
Line 651  print_bvspace(struct termp *p, 
Line 613  print_bvspace(struct termp *p, 
   
         /* A `-column' does not assert vspace within the list. */          /* A `-column' does not assert vspace within the list. */
   
         if (MDOC_Bl == bl->tok && arg_hasattr(MDOC_Column, bl))          if (MDOC_Bl == bl->tok && LIST_column == bl->data.list)
                 if (n->prev && MDOC_It == n->prev->tok)                  if (n->prev && MDOC_It == n->prev->tok)
                         return;                          return;
   
         /* A `-diag' without body does not vspace. */          /* A `-diag' without body does not vspace. */
   
         if (MDOC_Bl == bl->tok && arg_hasattr(MDOC_Diag, bl))          if (MDOC_Bl == bl->tok && LIST_diag == bl->data.list)
                 if (n->prev && MDOC_It == n->prev->tok) {                  if (n->prev && MDOC_It == n->prev->tok) {
                         assert(n->prev->body);                          assert(n->prev->body);
                         if (NULL == n->prev->body->child)                          if (NULL == n->prev->body->child)
Line 701  termp_it_pre(DECL_ARGS)
Line 663  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, type, keys[3], vals[3];          int                     i, keys[3], vals[3];
         size_t                  width, offset, ncols, dcol;          size_t                  width, offset, ncols, dcol;
           enum mdoc_list          type;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                 print_bvspace(p, n->parent->parent, n);                  print_bvspace(p, n->parent->parent, n);
Line 721  termp_it_pre(DECL_ARGS)
Line 684  termp_it_pre(DECL_ARGS)
   
         arg_getattrs(keys, vals, 3, bl);          arg_getattrs(keys, vals, 3, bl);
   
         type = arg_listtype(bl);          type = bl->data.list;
         assert(-1 != type);  
   
         /*          /*
          * First calculate width and offset.  This is pretty easy unless           * First calculate width and offset.  This is pretty easy unless
Line 736  termp_it_pre(DECL_ARGS)
Line 698  termp_it_pre(DECL_ARGS)
                 offset = a2offs(&bl->args->argv[vals[1]]);                  offset = a2offs(&bl->args->argv[vals[1]]);
   
         switch (type) {          switch (type) {
         case (MDOC_Column):          case (LIST_column):
                 if (MDOC_BODY == n->type)                  if (MDOC_BODY == n->type)
                         break;                          break;
                 /*                  /*
Line 794  termp_it_pre(DECL_ARGS)
Line 756  termp_it_pre(DECL_ARGS)
          */           */
   
         switch (type) {          switch (type) {
         case (MDOC_Bullet):          case (LIST_bullet):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dash):          case (LIST_dash):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Hyphen):          case (LIST_hyphen):
                 if (width < 4)                  if (width < 4)
                         width = 4;                          width = 4;
                 break;                  break;
         case (MDOC_Enum):          case (LIST_enum):
                 if (width < 5)                  if (width < 5)
                         width = 5;                          width = 5;
                 break;                  break;
         case (MDOC_Hang):          case (LIST_hang):
                 if (0 == width)                  if (0 == width)
                         width = 8;                          width = 8;
                 break;                  break;
         case (MDOC_Column):          case (LIST_column):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Tag):          case (LIST_tag):
                 if (0 == width)                  if (0 == width)
                         width = 10;                          width = 10;
                 break;                  break;
Line 828  termp_it_pre(DECL_ARGS)
Line 790  termp_it_pre(DECL_ARGS)
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
   
         switch (type) {          switch (type) {
         case (MDOC_Diag):          case (LIST_diag):
                 if (MDOC_BODY == n->type)                  if (MDOC_BODY == n->type)
                         term_word(p, "\\ \\ ");                          term_word(p, "\\ \\ ");
                 break;                  break;
         case (MDOC_Inset):          case (LIST_inset):
                 if (MDOC_BODY == n->type)                  if (MDOC_BODY == n->type)
                         term_word(p, "\\ ");                          term_word(p, "\\ ");
                 break;                  break;
Line 843  termp_it_pre(DECL_ARGS)
Line 805  termp_it_pre(DECL_ARGS)
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
   
         switch (type) {          switch (type) {
         case (MDOC_Diag):          case (LIST_diag):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         term_fontpush(p, TERMFONT_BOLD);                          term_fontpush(p, TERMFONT_BOLD);
                 break;                  break;
Line 859  termp_it_pre(DECL_ARGS)
Line 821  termp_it_pre(DECL_ARGS)
          */           */
   
         switch (type) {          switch (type) {
         case (MDOC_Bullet):          case (LIST_bullet):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dash):          case (LIST_dash):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Enum):          case (LIST_enum):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Hyphen):          case (LIST_hyphen):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK;                          p->flags |= TERMP_NOBREAK;
                 else                  else
                         p->flags |= TERMP_NOLPAD;                          p->flags |= TERMP_NOLPAD;
                 break;                  break;
         case (MDOC_Hang):          case (LIST_hang):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK;                          p->flags |= TERMP_NOBREAK;
                 else                  else
Line 894  termp_it_pre(DECL_ARGS)
Line 856  termp_it_pre(DECL_ARGS)
                 } else                  } else
                         p->flags |= TERMP_HANG;                          p->flags |= TERMP_HANG;
                 break;                  break;
         case (MDOC_Tag):          case (LIST_tag):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;                          p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;
                 else                  else
Line 905  termp_it_pre(DECL_ARGS)
Line 867  termp_it_pre(DECL_ARGS)
                 if (NULL == n->next || NULL == n->next->child)                  if (NULL == n->next || NULL == n->next->child)
                         p->flags |= TERMP_DANGLE;                          p->flags |= TERMP_DANGLE;
                 break;                  break;
         case (MDOC_Column):          case (LIST_column):
                 if (MDOC_HEAD == n->type) {                  if (MDOC_HEAD == n->type) {
                         assert(n->next);                          assert(n->next);
                         if (MDOC_BODY == n->next->type)                          if (MDOC_BODY == n->next->type)
Line 916  termp_it_pre(DECL_ARGS)
Line 878  termp_it_pre(DECL_ARGS)
                                 p->flags |= TERMP_NOLPAD;                                  p->flags |= TERMP_NOLPAD;
                 }                  }
                 break;                  break;
         case (MDOC_Diag):          case (LIST_diag):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK;                          p->flags |= TERMP_NOBREAK;
                 break;                  break;
Line 933  termp_it_pre(DECL_ARGS)
Line 895  termp_it_pre(DECL_ARGS)
         p->offset += offset;          p->offset += offset;
   
         switch (type) {          switch (type) {
         case (MDOC_Hang):          case (LIST_hang):
                 /*                  /*
                  * Same stipulation as above, regarding `-hang'.  We                   * Same stipulation as above, regarding `-hang'.  We
                  * don't want to recalculate rmargin and offsets when                   * don't want to recalculate rmargin and offsets when
Line 944  termp_it_pre(DECL_ARGS)
Line 906  termp_it_pre(DECL_ARGS)
                                  MDOC_Bd == n->next->child->tok))                                   MDOC_Bd == n->next->child->tok))
                         break;                          break;
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Bullet):          case (LIST_bullet):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dash):          case (LIST_dash):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Enum):          case (LIST_enum):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Hyphen):          case (LIST_hyphen):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Tag):          case (LIST_tag):
                 assert(width);                  assert(width);
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         p->rmargin = p->offset + width;                          p->rmargin = p->offset + width;
                 else                  else
                         p->offset += width;                          p->offset += width;
                 break;                  break;
         case (MDOC_Column):          case (LIST_column):
                 assert(width);                  assert(width);
                 p->rmargin = p->offset + width;                  p->rmargin = p->offset + width;
                 /*                  /*
Line 982  termp_it_pre(DECL_ARGS)
Line 944  termp_it_pre(DECL_ARGS)
   
         if (MDOC_HEAD == n->type)          if (MDOC_HEAD == n->type)
                 switch (type) {                  switch (type) {
                 case (MDOC_Bullet):                  case (LIST_bullet):
                         term_fontpush(p, TERMFONT_BOLD);                          term_fontpush(p, TERMFONT_BOLD);
                         term_word(p, "\\[bu]");                          term_word(p, "\\[bu]");
                         term_fontpop(p);                          term_fontpop(p);
                         break;                          break;
                 case (MDOC_Dash):                  case (LIST_dash):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_Hyphen):                  case (LIST_hyphen):
                         term_fontpush(p, TERMFONT_BOLD);                          term_fontpush(p, TERMFONT_BOLD);
                         term_word(p, "\\(hy");                          term_word(p, "\\(hy");
                         term_fontpop(p);                          term_fontpop(p);
                         break;                          break;
                 case (MDOC_Enum):                  case (LIST_enum):
                         (pair->ppair->ppair->count)++;                          (pair->ppair->ppair->count)++;
                         snprintf(buf, sizeof(buf), "%d.",                          snprintf(buf, sizeof(buf), "%d.",
                                         pair->ppair->ppair->count);                                          pair->ppair->ppair->count);
Line 1009  termp_it_pre(DECL_ARGS)
Line 971  termp_it_pre(DECL_ARGS)
          */           */
   
         switch (type) {          switch (type) {
         case (MDOC_Bullet):          case (LIST_bullet):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Item):          case (LIST_item):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dash):          case (LIST_dash):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Hyphen):          case (LIST_hyphen):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Enum):          case (LIST_enum):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         return(0);                          return(0);
                 break;                  break;
         case (MDOC_Column):          case (LIST_column):
                 if (MDOC_BODY == n->type)                  if (MDOC_BODY == n->type)
                         return(0);                          return(0);
                 break;                  break;
Line 1037  termp_it_pre(DECL_ARGS)
Line 999  termp_it_pre(DECL_ARGS)
 static void  static void
 termp_it_post(DECL_ARGS)  termp_it_post(DECL_ARGS)
 {  {
         int                type;          enum mdoc_list     type;
   
         if (MDOC_BLOCK == n->type)          if (MDOC_BLOCK == n->type)
                 return;                  return;
   
         type = arg_listtype(n->parent->parent->parent);          type = n->parent->parent->parent->data.list;
         assert(-1 != type);  
   
         switch (type) {          switch (type) {
         case (MDOC_Item):          case (LIST_item):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Diag):          case (LIST_diag):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Inset):          case (LIST_inset):
                 if (MDOC_BODY == n->type)                  if (MDOC_BODY == n->type)
                         term_flushln(p);                          term_flushln(p);
                 break;                  break;
         case (MDOC_Column):          case (LIST_column):
                 if (MDOC_HEAD == n->type)                  if (MDOC_HEAD == n->type)
                         term_flushln(p);                          term_flushln(p);
                 break;                  break;
Line 1082  static int
Line 1043  static int
 termp_nm_pre(DECL_ARGS)  termp_nm_pre(DECL_ARGS)
 {  {
   
         if (SEC_SYNOPSIS == n->sec)          if (NULL == n->child && NULL == m->name)
                   return(1);
   
           if (SEC_SYNOPSIS == n->sec && MDOC_LINE & n->flags)
                 term_newln(p);                  term_newln(p);
   
         term_fontpush(p, TERMFONT_BOLD);          term_fontpush(p, TERMFONT_BOLD);
   
         if (NULL == n->child)          if (NULL == n->child)
                 term_word(p, m->name);                  term_word(p, m->name);
   
         return(1);          return(1);
 }  }
   
Line 1213  termp_rv_pre(DECL_ARGS)
Line 1178  termp_rv_pre(DECL_ARGS)
                         term_word(p, "()");                          term_word(p, "()");
         }          }
   
         if (n->child->next)          if (n->child && n->child->next)
                 term_word(p, "functions return");                  term_word(p, "functions return");
         else          else
                 term_word(p, "function returns");                  term_word(p, "function returns");
Line 1252  termp_ex_pre(DECL_ARGS)
Line 1217  termp_ex_pre(DECL_ARGS)
                         p->flags &= ~TERMP_NOSPACE;                          p->flags &= ~TERMP_NOSPACE;
         }          }
   
         if (n->child->next)          if (n->child && n->child->next)
                 term_word(p, "utilities exit");                  term_word(p, "utilities exit");
         else          else
                 term_word(p, "utility exits");                  term_word(p, "utility exits");
Line 1381  static void
Line 1346  static void
 termp_fd_post(DECL_ARGS)  termp_fd_post(DECL_ARGS)
 {  {
   
         if (n->sec != SEC_SYNOPSIS)          if (n->sec != SEC_SYNOPSIS || ! (MDOC_LINE & n->flags))
                 return;                  return;
   
         term_newln(p);          term_newln(p);
Line 1468  static void
Line 1433  static void
 termp_lb_post(DECL_ARGS)  termp_lb_post(DECL_ARGS)
 {  {
   
         if (SEC_LIBRARY == n->sec)          if (SEC_LIBRARY == n->sec && MDOC_LINE & n->flags)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1537  static int
Line 1502  static int
 termp_ft_pre(DECL_ARGS)  termp_ft_pre(DECL_ARGS)
 {  {
   
         if (SEC_SYNOPSIS == n->sec)          if (SEC_SYNOPSIS == n->sec && MDOC_LINE & n->flags)
                 if (n->prev && MDOC_Fo == n->prev->tok)                  if (n->prev && MDOC_Fo == n->prev->tok)
                         term_vspace(p);                          term_vspace(p);
   
Line 1551  static void
Line 1516  static void
 termp_ft_post(DECL_ARGS)  termp_ft_post(DECL_ARGS)
 {  {
   
         if (SEC_SYNOPSIS == n->sec)          if (SEC_SYNOPSIS == n->sec && MDOC_LINE & n->flags)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1592  static void
Line 1557  static void
 termp_fn_post(DECL_ARGS)  termp_fn_post(DECL_ARGS)
 {  {
   
         if (n->sec == SEC_SYNOPSIS && n->next)          if (n->sec == SEC_SYNOPSIS && n->next && MDOC_LINE & n->flags)
                 term_vspace(p);                  term_vspace(p);
 }  }
   
Line 1659  termp_bd_pre(DECL_ARGS)
Line 1624  termp_bd_pre(DECL_ARGS)
   
         rm = p->rmargin;          rm = p->rmargin;
         rmax = p->maxrmargin;          rmax = p->maxrmargin;
         p->rmargin = p->maxrmargin = 100000; /* FIXME */          p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
   
         for (nn = n->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
Line 1695  termp_bd_post(DECL_ARGS)
Line 1660  termp_bd_post(DECL_ARGS)
         rmax = p->maxrmargin;          rmax = p->maxrmargin;
   
         if (MDOC_Literal == type || MDOC_Unfilled == type)          if (MDOC_Literal == type || MDOC_Unfilled == type)
                 p->rmargin = p->maxrmargin = 100000; /* FIXME */                  p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
   
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_flushln(p);          term_flushln(p);
Line 1891  termp_in_post(DECL_ARGS)
Line 1856  termp_in_post(DECL_ARGS)
         term_word(p, ">");          term_word(p, ">");
         term_fontpop(p);          term_fontpop(p);
   
         if (SEC_SYNOPSIS != n->sec)          if (SEC_SYNOPSIS != n->sec && ! (MDOC_LINE & n->flags))
                 return;                  return;
   
         term_newln(p);          term_newln(p);

Legend:
Removed from v.1.119  
changed lines
  Added in v.1.128

CVSweb