[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.85 and 1.86

version 1.85, 2009/09/26 17:35:49 version 1.86, 2009/10/03 19:02:45
Line 72  struct termpair {
Line 72  struct termpair {
   
 #define DECL_ARGS struct termp *p, \  #define DECL_ARGS struct termp *p, \
                   struct termpair *pair, \                    struct termpair *pair, \
                   const struct mdoc_meta *meta, \                    const struct mdoc_meta *m, \
                   const struct mdoc_node *node                    const struct mdoc_node *n
   
 struct  termact {  struct  termact {
         int     (*pre)(DECL_ARGS);          int     (*pre)(DECL_ARGS);
Line 311  static void
Line 311  static void
 print_body(DECL_ARGS)  print_body(DECL_ARGS)
 {  {
   
         print_node(p, pair, meta, node);          print_node(p, pair, m, n);
         if (node->next)          if (n->next)
                 print_body(p, pair, meta, node->next);                  print_body(p, pair, m, n->next);
 }  }
   
   
Line 334  print_node(DECL_ARGS)
Line 334  print_node(DECL_ARGS)
         bzero(&npair, sizeof(struct termpair));          bzero(&npair, sizeof(struct termpair));
         npair.ppair = pair;          npair.ppair = pair;
   
         if (MDOC_TEXT != node->type) {          if (MDOC_TEXT != n->type) {
                 if (termacts[node->tok].pre)                  if (termacts[n->tok].pre)
                         chld = (*termacts[node->tok].pre)                          chld = (*termacts[n->tok].pre)(p, &npair, m, n);
                                 (p, &npair, meta, node);  
         } else          } else
                 term_word(p, node->string);                  term_word(p, n->string);
           if (chld && n->child)
                   print_body(p, &npair, m, n->child);
   
         if (chld && node->child)  
                 print_body(p, &npair, meta, node->child);  
   
         /*          /*
          * XXX - if bold/under were to span scopes, this wouldn't be           * XXX - if bold/under were to span scopes, this wouldn't be
          * possible, but because decoration is always in-scope, we can           * possible, but because decoration is always in-scope, we can
Line 353  print_node(DECL_ARGS)
Line 351  print_node(DECL_ARGS)
         p->bold = bold;          p->bold = bold;
         p->under = under;          p->under = under;
   
         if (MDOC_TEXT != node->type)          if (MDOC_TEXT != n->type)
                 if (termacts[node->tok].post)                  if (termacts[n->tok].post)
                         (*termacts[node->tok].post)                          (*termacts[n->tok].post)(p, &npair, m, n);
                                 (p, &npair, meta, node);  
   
         p->offset = offset;          p->offset = offset;
         p->rmargin = rmargin;          p->rmargin = rmargin;
Line 383  print_foot(DECL_ARGS)
Line 380  print_foot(DECL_ARGS)
         if (NULL == (os = malloc(p->rmargin)))          if (NULL == (os = malloc(p->rmargin)))
                 err(EXIT_FAILURE, "malloc");                  err(EXIT_FAILURE, "malloc");
   
         tm = localtime(&meta->date);          tm = localtime(&m->date);
   
         if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm))          if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm))
                 err(EXIT_FAILURE, "strftime");                  err(EXIT_FAILURE, "strftime");
   
         (void)strlcpy(os, meta->os, p->rmargin);          (void)strlcpy(os, m->os, p->rmargin);
   
         term_vspace(p);          term_vspace(p);
   
Line 451  print_head(DECL_ARGS)
Line 448  print_head(DECL_ARGS)
          * switches on the manual section.           * switches on the manual section.
          */           */
   
         assert(meta->vol);          assert(m->vol);
         (void)strlcpy(buf, meta->vol, p->rmargin);          (void)strlcpy(buf, m->vol, p->rmargin);
   
         if (meta->arch) {          if (m->arch) {
                 (void)strlcat(buf, " (", p->rmargin);                  (void)strlcat(buf, " (", p->rmargin);
                 (void)strlcat(buf, meta->arch, p->rmargin);                  (void)strlcat(buf, m->arch, p->rmargin);
                 (void)strlcat(buf, ")", p->rmargin);                  (void)strlcat(buf, ")", p->rmargin);
         }          }
   
         snprintf(title, p->rmargin, "%s(%d)", meta->title, meta->msec);          snprintf(title, p->rmargin, "%s(%d)", 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 634  arg_getattrs(const int *keys, int *vals, 
Line 631  arg_getattrs(const int *keys, int *vals, 
 static void  static void
 fmt_block_vspace(struct termp *p,  fmt_block_vspace(struct termp *p,
                 const struct mdoc_node *bl,                  const struct mdoc_node *bl,
                 const struct mdoc_node *node)                  const struct mdoc_node *n)
 {  {
         const struct mdoc_node *n;          const struct mdoc_node  *nn;
   
         term_newln(p);          term_newln(p);
         if (arg_hasattr(MDOC_Compact, bl))          if (arg_hasattr(MDOC_Compact, bl))
Line 644  fmt_block_vspace(struct termp *p, 
Line 641  fmt_block_vspace(struct termp *p, 
   
         /* Do not vspace directly after Ss/Sh. */          /* Do not vspace directly after Ss/Sh. */
   
         for (n = node; n; n = n->parent) {          for (nn = n; nn; nn = nn->parent) {
                 if (MDOC_BLOCK != n->type)                  if (MDOC_BLOCK != nn->type)
                         continue;                          continue;
                 if (MDOC_Ss == n->tok)                  if (MDOC_Ss == nn->tok)
                         return;                          return;
                 if (MDOC_Sh == n->tok)                  if (MDOC_Sh == nn->tok)
                         return;                          return;
                 if (NULL == n->prev)                  if (NULL == nn->prev)
                         continue;                          continue;
                 break;                  break;
         }          }
Line 659  fmt_block_vspace(struct termp *p, 
Line 656  fmt_block_vspace(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 && arg_hasattr(MDOC_Column, bl))
                 if (node->prev && MDOC_It == node->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 && arg_hasattr(MDOC_Diag, bl))
                 if (node->prev && MDOC_It == node->prev->tok) {                  if (n->prev && MDOC_It == n->prev->tok) {
                         assert(node->prev->body);                          assert(n->prev->body);
                         if (NULL == node->prev->body->child)                          if (NULL == n->prev->body->child)
                                 return;                                  return;
                 }                  }
   
Line 680  static int
Line 677  static int
 termp_dq_pre(DECL_ARGS)  termp_dq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
   
         term_word(p, "\\(lq");          term_word(p, "\\(lq");
Line 694  static void
Line 691  static void
 termp_dq_post(DECL_ARGS)  termp_dq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
   
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 706  termp_dq_post(DECL_ARGS)
Line 703  termp_dq_post(DECL_ARGS)
 static int  static int
 termp_it_pre(DECL_ARGS)  termp_it_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *bl, *n;          const struct mdoc_node *bl, *nn;
         char                    buf[7];          char                    buf[7];
         int                     i, type, keys[3], vals[3];          int                     i, type, keys[3], vals[3];
         size_t                  width, offset;          size_t                  width, offset;
   
         if (MDOC_BLOCK == node->type) {          if (MDOC_BLOCK == n->type) {
                 fmt_block_vspace(p, node->parent->parent, node);                  fmt_block_vspace(p, n->parent->parent, n);
                 return(1);                  return(1);
         }          }
   
         bl = node->parent->parent->parent;          bl = n->parent->parent->parent;
   
         /* Save parent attributes. */          /* Save parent attributes. */
   
Line 741  termp_it_pre(DECL_ARGS)
Line 738  termp_it_pre(DECL_ARGS)
   
         switch (type) {          switch (type) {
         case (MDOC_Column):          case (MDOC_Column):
                 if (MDOC_BODY == node->type)                  if (MDOC_BODY == n->type)
                         break;                          break;
                 /*                  /*
                  * Work around groff's column handling.  The offset is                   * Work around groff's column handling.  The offset is
Line 752  termp_it_pre(DECL_ARGS)
Line 749  termp_it_pre(DECL_ARGS)
                  * the 0 will be adjusted to default 10 or, if in the                   * the 0 will be adjusted to default 10 or, if in the
                  * last column case, set to stretch to the margin).                   * last column case, set to stretch to the margin).
                  */                   */
                 for (i = 0, n = node->prev; n &&                  for (i = 0, nn = n->prev; nn &&
                                 i < (int)bl->args->argv[vals[2]].sz;                                  i < (int)bl->args->argv[vals[2]].sz;
                                 n = n->prev, i++)                                  nn = nn->prev, i++)
                         offset += arg_width                          offset += arg_width
                                 (&bl->args->argv[vals[2]], i);                                  (&bl->args->argv[vals[2]], i);
   
Line 817  termp_it_pre(DECL_ARGS)
Line 814  termp_it_pre(DECL_ARGS)
   
         switch (type) {          switch (type) {
         case (MDOC_Diag):          case (MDOC_Diag):
                 if (MDOC_BODY == node->type)                  if (MDOC_BODY == n->type)
                         term_word(p, "\\ \\ ");                          term_word(p, "\\ \\ ");
                 break;                  break;
         case (MDOC_Inset):          case (MDOC_Inset):
                 if (MDOC_BODY == node->type)                  if (MDOC_BODY == n->type)
                         term_word(p, "\\ ");                          term_word(p, "\\ ");
                 break;                  break;
         default:          default:
Line 832  termp_it_pre(DECL_ARGS)
Line 829  termp_it_pre(DECL_ARGS)
   
         switch (type) {          switch (type) {
         case (MDOC_Diag):          case (MDOC_Diag):
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         p->bold++;                          p->bold++;
                 break;                  break;
         default:          default:
Line 855  termp_it_pre(DECL_ARGS)
Line 852  termp_it_pre(DECL_ARGS)
         case (MDOC_Enum):          case (MDOC_Enum):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Hyphen):          case (MDOC_Hyphen):
                 if (MDOC_HEAD == node->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 (MDOC_Hang):
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK;                          p->flags |= TERMP_NOBREAK;
                 else                  else
                         p->flags |= TERMP_NOLPAD;                          p->flags |= TERMP_NOLPAD;
   
                 if (MDOC_HEAD != node->type)                  if (MDOC_HEAD != n->type)
                         break;                          break;
   
                 /*                  /*
Line 875  termp_it_pre(DECL_ARGS)
Line 872  termp_it_pre(DECL_ARGS)
                  * the "overstep" effect in term_flushln() and treat                   * the "overstep" effect in term_flushln() and treat
                  * this as a `-ohang' list instead.                   * this as a `-ohang' list instead.
                  */                   */
                 if (node->next->child &&                  if (n->next->child &&
                                 (MDOC_Bl == node->next->child->tok ||                                  (MDOC_Bl == n->next->child->tok ||
                                  MDOC_Bd == node->next->child->tok)) {                                   MDOC_Bd == n->next->child->tok)) {
                         p->flags &= ~TERMP_NOBREAK;                          p->flags &= ~TERMP_NOBREAK;
                         p->flags &= ~TERMP_NOLPAD;                          p->flags &= ~TERMP_NOLPAD;
                 } else                  } else
                         p->flags |= TERMP_HANG;                          p->flags |= TERMP_HANG;
                 break;                  break;
         case (MDOC_Tag):          case (MDOC_Tag):
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;                          p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;
                 else                  else
                         p->flags |= TERMP_NOLPAD;                          p->flags |= TERMP_NOLPAD;
   
                 if (MDOC_HEAD != node->type)                  if (MDOC_HEAD != n->type)
                         break;                          break;
                 if (NULL == node->next || NULL == node->next->child)                  if (NULL == n->next || NULL == n->next->child)
                         p->flags |= TERMP_DANGLE;                          p->flags |= TERMP_DANGLE;
                 break;                  break;
         case (MDOC_Column):          case (MDOC_Column):
                 if (MDOC_HEAD == node->type) {                  if (MDOC_HEAD == n->type) {
                         assert(node->next);                          assert(n->next);
                         if (MDOC_BODY == node->next->type)                          if (MDOC_BODY == n->next->type)
                                 p->flags &= ~TERMP_NOBREAK;                                  p->flags &= ~TERMP_NOBREAK;
                         else                          else
                                 p->flags |= TERMP_NOBREAK;                                  p->flags |= TERMP_NOBREAK;
                         if (node->prev)                          if (n->prev)
                                 p->flags |= TERMP_NOLPAD;                                  p->flags |= TERMP_NOLPAD;
                 }                  }
                 break;                  break;
         case (MDOC_Diag):          case (MDOC_Diag):
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         p->flags |= TERMP_NOBREAK;                          p->flags |= TERMP_NOBREAK;
                 break;                  break;
         default:          default:
Line 928  termp_it_pre(DECL_ARGS)
Line 925  termp_it_pre(DECL_ARGS)
                  * don't want to recalculate rmargin and offsets when                   * don't want to recalculate rmargin and offsets when
                  * using `Bd' or `Bl' within `-hang' overstep lists.                   * using `Bd' or `Bl' within `-hang' overstep lists.
                  */                   */
                 if (MDOC_HEAD == node->type && node->next->child &&                  if (MDOC_HEAD == n->type && n->next->child &&
                                 (MDOC_Bl == node->next->child->tok ||                                  (MDOC_Bl == n->next->child->tok ||
                                  MDOC_Bd == node->next->child->tok))                                   MDOC_Bd == n->next->child->tok))
                         break;                          break;
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Bullet):          case (MDOC_Bullet):
Line 943  termp_it_pre(DECL_ARGS)
Line 940  termp_it_pre(DECL_ARGS)
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Tag):          case (MDOC_Tag):
                 assert(width);                  assert(width);
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         p->rmargin = p->offset + width;                          p->rmargin = p->offset + width;
                 else                  else
                         p->offset += width;                          p->offset += width;
Line 955  termp_it_pre(DECL_ARGS)
Line 952  termp_it_pre(DECL_ARGS)
                  * XXX - this behaviour is not documented: the                   * XXX - this behaviour is not documented: the
                  * right-most column is filled to the right margin.                   * right-most column is filled to the right margin.
                  */                   */
                 if (MDOC_HEAD == node->type &&                  if (MDOC_HEAD == n->type &&
                                 MDOC_BODY == node->next->type)                                  MDOC_BODY == n->next->type)
                         p->rmargin = p->maxrmargin;                          p->rmargin = p->maxrmargin;
                 break;                  break;
         default:          default:
Line 968  termp_it_pre(DECL_ARGS)
Line 965  termp_it_pre(DECL_ARGS)
          * HEAD character (temporarily bold, in some cases).           * HEAD character (temporarily bold, in some cases).
          */           */
   
         if (MDOC_HEAD == node->type)          if (MDOC_HEAD == n->type)
                 switch (type) {                  switch (type) {
                 case (MDOC_Bullet):                  case (MDOC_Bullet):
                         p->bold++;                          p->bold++;
Line 1006  termp_it_pre(DECL_ARGS)
Line 1003  termp_it_pre(DECL_ARGS)
         case (MDOC_Hyphen):          case (MDOC_Hyphen):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Enum):          case (MDOC_Enum):
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         return(0);                          return(0);
                 break;                  break;
         case (MDOC_Column):          case (MDOC_Column):
                 if (MDOC_BODY == node->type)                  if (MDOC_BODY == n->type)
                         return(0);                          return(0);
                 break;                  break;
         default:          default:
Line 1027  termp_it_post(DECL_ARGS)
Line 1024  termp_it_post(DECL_ARGS)
 {  {
         int                type;          int                type;
   
         if (MDOC_BODY != node->type && MDOC_HEAD != node->type)          if (MDOC_BODY != n->type && MDOC_HEAD != n->type)
                 return;                  return;
   
         type = arg_listtype(node->parent->parent->parent);          type = arg_listtype(n->parent->parent->parent);
         assert(-1 != type);          assert(-1 != type);
   
         switch (type) {          switch (type) {
Line 1039  termp_it_post(DECL_ARGS)
Line 1036  termp_it_post(DECL_ARGS)
         case (MDOC_Diag):          case (MDOC_Diag):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Inset):          case (MDOC_Inset):
                 if (MDOC_BODY == node->type)                  if (MDOC_BODY == n->type)
                         term_flushln(p);                          term_flushln(p);
                 break;                  break;
         case (MDOC_Column):          case (MDOC_Column):
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == n->type)
                         term_flushln(p);                          term_flushln(p);
                 break;                  break;
         default:          default:
Line 1060  static int
Line 1057  static int
 termp_nm_pre(DECL_ARGS)  termp_nm_pre(DECL_ARGS)
 {  {
   
         if (SEC_SYNOPSIS == node->sec)          if (SEC_SYNOPSIS == n->sec)
                 term_newln(p);                  term_newln(p);
         p->bold++;          p->bold++;
         if (NULL == node->child)          if (NULL == n->child)
                 term_word(p, meta->name);                  term_word(p, m->name);
         return(1);          return(1);
 }  }
   
Line 1086  static int
Line 1083  static int
 termp_an_pre(DECL_ARGS)  termp_an_pre(DECL_ARGS)
 {  {
   
         if (NULL == node->child)          if (NULL == n->child)
                 return(1);                  return(1);
   
         /*          /*
Line 1098  termp_an_pre(DECL_ARGS)
Line 1095  termp_an_pre(DECL_ARGS)
          * will override the condition of the implied first -nosplit.           * will override the condition of the implied first -nosplit.
          */           */
   
         if (node->sec == SEC_AUTHORS) {          if (n->sec == SEC_AUTHORS) {
                 if ( ! (TERMP_ANPREC & p->flags)) {                  if ( ! (TERMP_ANPREC & p->flags)) {
                         if (TERMP_SPLIT & p->flags)                          if (TERMP_SPLIT & p->flags)
                                 term_newln(p);                                  term_newln(p);
Line 1122  static void
Line 1119  static void
 termp_an_post(DECL_ARGS)  termp_an_post(DECL_ARGS)
 {  {
   
         if (node->child) {          if (n->child) {
                 if (SEC_AUTHORS == node->sec)                  if (SEC_AUTHORS == n->sec)
                         p->flags |= TERMP_ANPREC;                          p->flags |= TERMP_ANPREC;
                 return;                  return;
         }          }
   
         if (arg_getattr(MDOC_Split, node) > -1) {          if (arg_getattr(MDOC_Split, n) > -1) {
                 p->flags &= ~TERMP_NOSPLIT;                  p->flags &= ~TERMP_NOSPLIT;
                 p->flags |= TERMP_SPLIT;                  p->flags |= TERMP_SPLIT;
         } else {          } else {
Line 1154  static int
Line 1151  static int
 termp_rs_pre(DECL_ARGS)  termp_rs_pre(DECL_ARGS)
 {  {
   
         if (SEC_SEE_ALSO != node->sec)          if (SEC_SEE_ALSO != n->sec)
                 return(1);                  return(1);
         if (MDOC_BLOCK == node->type && node->prev)          if (MDOC_BLOCK == n->type && n->prev)
                 term_vspace(p);                  term_vspace(p);
         return(1);          return(1);
 }  }
Line 1171  termp_rv_pre(DECL_ARGS)
Line 1168  termp_rv_pre(DECL_ARGS)
         term_newln(p);          term_newln(p);
         term_word(p, "The");          term_word(p, "The");
   
         nn = node->child;          for (nn = n->child; nn; nn = nn->next) {
         assert(nn);  
         for ( ; nn; nn = nn->next) {  
                 p->bold++;                  p->bold++;
                 term_word(p, nn->string);                  term_word(p, nn->string);
                 p->bold--;                  p->bold--;
Line 1186  termp_rv_pre(DECL_ARGS)
Line 1181  termp_rv_pre(DECL_ARGS)
                         term_word(p, "()");                          term_word(p, "()");
         }          }
   
         if (node->child->next)          if (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 1212  termp_ex_pre(DECL_ARGS)
Line 1207  termp_ex_pre(DECL_ARGS)
   
         term_word(p, "The");          term_word(p, "The");
   
         nn = node->child;          for (nn = n->child; nn; nn = nn->next) {
         assert(nn);  
         for ( ; nn; nn = nn->next) {  
                 p->bold++;                  p->bold++;
                 term_word(p, nn->string);                  term_word(p, nn->string);
                 p->bold--;                  p->bold--;
Line 1227  termp_ex_pre(DECL_ARGS)
Line 1220  termp_ex_pre(DECL_ARGS)
                         p->flags &= ~TERMP_NOSPACE;                          p->flags &= ~TERMP_NOSPACE;
         }          }
   
         if (node->child->next)          if (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 1243  static int
Line 1236  static int
 termp_nd_pre(DECL_ARGS)  termp_nd_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
   
 #if defined(__OpenBSD__) || defined(__linux__)  #if defined(__OpenBSD__) || defined(__linux__)
Line 1260  static void
Line 1253  static void
 termp_bl_post(DECL_ARGS)  termp_bl_post(DECL_ARGS)
 {  {
   
         if (MDOC_BLOCK == node->type)          if (MDOC_BLOCK == n->type)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1270  static void
Line 1263  static void
 termp_op_post(DECL_ARGS)  termp_op_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "\\(rB");          term_word(p, "\\(rB");
Line 1281  termp_op_post(DECL_ARGS)
Line 1274  termp_op_post(DECL_ARGS)
 static int  static int
 termp_xr_pre(DECL_ARGS)  termp_xr_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *n;          const struct mdoc_node *nn;
   
         assert(node->child && MDOC_TEXT == node->child->type);          assert(n->child && MDOC_TEXT == n->child->type);
         n = node->child;          nn = n->child;
   
         term_word(p, n->string);          term_word(p, nn->string);
         if (NULL == (n = n->next))          if (NULL == (nn = nn->next))
                 return(0);                  return(0);
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "(");          term_word(p, "(");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, n->string);          term_word(p, nn->string);
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, ")");          term_word(p, ")");
   
         return(0);          return(0);
 }  }
   
Line 1304  static void
Line 1298  static void
 termp_vt_post(DECL_ARGS)  termp_vt_post(DECL_ARGS)
 {  {
   
         if (node->sec != SEC_SYNOPSIS)          if (n->sec != SEC_SYNOPSIS)
                 return;                  return;
         if (node->next && MDOC_Vt == node->next->tok)          if (n->next && MDOC_Vt == n->next->tok)
                 term_newln(p);                  term_newln(p);
         else if (node->next)          else if (n->next)
                 term_vspace(p);                  term_vspace(p);
 }  }
   
Line 1328  static void
Line 1322  static void
 termp_fd_post(DECL_ARGS)  termp_fd_post(DECL_ARGS)
 {  {
   
         if (node->sec != SEC_SYNOPSIS)          if (n->sec != SEC_SYNOPSIS)
                 return;                  return;
   
         term_newln(p);          term_newln(p);
         if (node->next && MDOC_Fd != node->next->tok)          if (n->next && MDOC_Fd != n->next->tok)
                 term_vspace(p);                  term_vspace(p);
 }  }
   
Line 1344  termp_sh_pre(DECL_ARGS)
Line 1338  termp_sh_pre(DECL_ARGS)
   
         /* No vspace between consecutive `Sh' calls. */          /* No vspace between consecutive `Sh' calls. */
   
         switch (node->type) {          switch (n->type) {
         case (MDOC_BLOCK):          case (MDOC_BLOCK):
                 if (node->prev && MDOC_Sh == node->prev->tok)                  if (n->prev && MDOC_Sh == n->prev->tok)
                         if (NULL == node->prev->body->child)                          if (NULL == n->prev->body->child)
                                 break;                                  break;
                 term_vspace(p);                  term_vspace(p);
                 break;                  break;
Line 1369  static void
Line 1363  static void
 termp_sh_post(DECL_ARGS)  termp_sh_post(DECL_ARGS)
 {  {
   
         switch (node->type) {          switch (n->type) {
         case (MDOC_HEAD):          case (MDOC_HEAD):
                 term_newln(p);                  term_newln(p);
                 break;                  break;
Line 1388  static int
Line 1382  static int
 termp_op_pre(DECL_ARGS)  termp_op_pre(DECL_ARGS)
 {  {
   
         switch (node->type) {          switch (n->type) {
         case (MDOC_BODY):          case (MDOC_BODY):
                 term_word(p, "\\(lB");                  term_word(p, "\\(lB");
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
Line 1415  static void
Line 1409  static void
 termp_lb_post(DECL_ARGS)  termp_lb_post(DECL_ARGS)
 {  {
   
         if (SEC_LIBRARY == node->sec)          if (SEC_LIBRARY == n->sec)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1426  termp_ud_pre(DECL_ARGS)
Line 1420  termp_ud_pre(DECL_ARGS)
 {  {
   
         term_word(p, "currently under development.");          term_word(p, "currently under development.");
         return(1);          return(0);
 }  }
   
   
Line 1435  static int
Line 1429  static int
 termp_d1_pre(DECL_ARGS)  termp_d1_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BLOCK != node->type)          if (MDOC_BLOCK != n->type)
                 return(1);                  return(1);
         term_newln(p);          term_newln(p);
         p->offset += (INDENT + 1);          p->offset += (INDENT + 1);
Line 1448  static void
Line 1442  static void
 termp_d1_post(DECL_ARGS)  termp_d1_post(DECL_ARGS)
 {  {
   
         if (MDOC_BLOCK != node->type)          if (MDOC_BLOCK != n->type)
                 return;                  return;
         term_newln(p);          term_newln(p);
 }  }
Line 1459  static int
Line 1453  static int
 termp_aq_pre(DECL_ARGS)  termp_aq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
         term_word(p, "\\(la");          term_word(p, "\\(la");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 1472  static void
Line 1466  static void
 termp_aq_post(DECL_ARGS)  termp_aq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "\\(ra");          term_word(p, "\\(ra");
Line 1484  static int
Line 1478  static int
 termp_ft_pre(DECL_ARGS)  termp_ft_pre(DECL_ARGS)
 {  {
   
         if (SEC_SYNOPSIS == node->sec)          if (SEC_SYNOPSIS == n->sec)
                 if (node->prev && MDOC_Fo == node->prev->tok)                  if (n->prev && MDOC_Fo == n->prev->tok)
                         term_vspace(p);                          term_vspace(p);
         p->under++;          p->under++;
         return(1);          return(1);
Line 1497  static void
Line 1491  static void
 termp_ft_post(DECL_ARGS)  termp_ft_post(DECL_ARGS)
 {  {
   
         if (SEC_SYNOPSIS == node->sec)          if (SEC_SYNOPSIS == n->sec)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1506  termp_ft_post(DECL_ARGS)
Line 1500  termp_ft_post(DECL_ARGS)
 static int  static int
 termp_fn_pre(DECL_ARGS)  termp_fn_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *n;          const struct mdoc_node  *nn;
   
         p->bold++;          p->bold++;
         term_word(p, node->child->string);          term_word(p, n->child->string);
         p->bold--;          p->bold--;
   
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "(");          term_word(p, "(");
   
         for (n = node->child->next; n; n = n->next) {          for (nn = n->child->next; nn; nn = nn->next) {
                 p->under++;                  p->under++;
                 term_word(p, n->string);                  term_word(p, nn->string);
                 p->under--;                  p->under--;
                 if (n->next)                  if (nn->next)
                         term_word(p, ",");                          term_word(p, ",");
         }          }
   
         term_word(p, ")");          term_word(p, ")");
   
         if (SEC_SYNOPSIS == node->sec)          if (SEC_SYNOPSIS == n->sec)
                 term_word(p, ";");                  term_word(p, ";");
   
         return(0);          return(0);
Line 1537  static void
Line 1531  static void
 termp_fn_post(DECL_ARGS)  termp_fn_post(DECL_ARGS)
 {  {
   
         if (node->sec == SEC_SYNOPSIS && node->next)          if (n->sec == SEC_SYNOPSIS && n->next)
                 term_vspace(p);                  term_vspace(p);
 }  }
   
Line 1546  termp_fn_post(DECL_ARGS)
Line 1540  termp_fn_post(DECL_ARGS)
 static int  static int
 termp_fa_pre(DECL_ARGS)  termp_fa_pre(DECL_ARGS)
 {  {
         struct mdoc_node *n;          const struct mdoc_node  *nn;
   
         if (node->parent->tok != MDOC_Fo) {          if (n->parent->tok != MDOC_Fo) {
                 p->under++;                  p->under++;
                 return(1);                  return(1);
         }          }
   
         for (n = node->child; n; n = n->next) {          for (nn = n->child; nn; nn = nn->next) {
                 p->under++;                  p->under++;
                 term_word(p, n->string);                  term_word(p, nn->string);
                 p->under--;                  p->under--;
                 if (n->next)                  if (nn->next)
                         term_word(p, ",");                          term_word(p, ",");
         }          }
   
         if (node->child && node->next && node->next->tok == MDOC_Fa)          if (n->child && n->next && n->next->tok == MDOC_Fa)
                 term_word(p, ",");                  term_word(p, ",");
   
         return(0);          return(0);
Line 1575  termp_bd_pre(DECL_ARGS)
Line 1569  termp_bd_pre(DECL_ARGS)
         int                      i, type;          int                      i, type;
         const struct mdoc_node  *nn;          const struct mdoc_node  *nn;
   
         if (MDOC_BLOCK == node->type) {          if (MDOC_BLOCK == n->type) {
                 fmt_block_vspace(p, node, node);                  fmt_block_vspace(p, n, n);
                 return(1);                  return(1);
         } else if (MDOC_BODY != node->type)          } else if (MDOC_BODY != n->type)
                 return(1);                  return(1);
   
         nn = node->parent;          nn = n->parent;
   
         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) {
Line 1614  termp_bd_pre(DECL_ARGS)
Line 1608  termp_bd_pre(DECL_ARGS)
         if (MDOC_Literal != type && MDOC_Unfilled != type)          if (MDOC_Literal != type && MDOC_Unfilled != type)
                 return(1);                  return(1);
   
         for (nn = node->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                 print_node(p, pair, meta, 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)
Line 1631  static void
Line 1625  static void
 termp_bd_post(DECL_ARGS)  termp_bd_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_flushln(p);          term_flushln(p);
Line 1643  static int
Line 1637  static int
 termp_qq_pre(DECL_ARGS)  termp_qq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
         term_word(p, "\"");          term_word(p, "\"");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 1656  static void
Line 1650  static void
 termp_qq_post(DECL_ARGS)  termp_qq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "\"");          term_word(p, "\"");
Line 1668  static void
Line 1662  static void
 termp_bx_post(DECL_ARGS)  termp_bx_post(DECL_ARGS)
 {  {
   
         if (node->child)          if (n->child)
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
         term_word(p, "BSD");          term_word(p, "BSD");
 }  }
Line 1681  termp_xx_pre(DECL_ARGS)
Line 1675  termp_xx_pre(DECL_ARGS)
         const char      *pp;          const char      *pp;
   
         pp = NULL;          pp = NULL;
         switch (node->tok) {          switch (n->tok) {
         case (MDOC_Bsx):          case (MDOC_Bsx):
                 pp = "BSDI BSD/OS";                  pp = "BSDI BSD/OS";
                 break;                  break;
Line 1715  static int
Line 1709  static int
 termp_sq_pre(DECL_ARGS)  termp_sq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
         term_word(p, "\\(oq");          term_word(p, "\\(oq");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 1728  static void
Line 1722  static void
 termp_sq_post(DECL_ARGS)  termp_sq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "\\(aq");          term_word(p, "\\(aq");
Line 1760  static int
Line 1754  static int
 termp_ss_pre(DECL_ARGS)  termp_ss_pre(DECL_ARGS)
 {  {
   
         switch (node->type) {          switch (n->type) {
         case (MDOC_BLOCK):          case (MDOC_BLOCK):
                 term_newln(p);                  term_newln(p);
                 if (node->prev)                  if (n->prev)
                         term_vspace(p);                          term_vspace(p);
                 break;                  break;
         case (MDOC_HEAD):          case (MDOC_HEAD):
Line 1783  static void
Line 1777  static void
 termp_ss_post(DECL_ARGS)  termp_ss_post(DECL_ARGS)
 {  {
   
         if (MDOC_HEAD == node->type)          if (MDOC_HEAD == n->type)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1805  termp_in_pre(DECL_ARGS)
Line 1799  termp_in_pre(DECL_ARGS)
 {  {
   
         p->bold++;          p->bold++;
         if (SEC_SYNOPSIS == node->sec)          if (SEC_SYNOPSIS == n->sec)
                 term_word(p, "#include");                  term_word(p, "#include");
   
         term_word(p, "<");          term_word(p, "<");
Line 1824  termp_in_post(DECL_ARGS)
Line 1818  termp_in_post(DECL_ARGS)
         term_word(p, ">");          term_word(p, ">");
         p->bold--;          p->bold--;
   
         if (SEC_SYNOPSIS != node->sec)          if (SEC_SYNOPSIS != n->sec)
                 return;                  return;
   
         term_newln(p);          term_newln(p);
Line 1834  termp_in_post(DECL_ARGS)
Line 1828  termp_in_post(DECL_ARGS)
          * the <foo>; mandoc asserts a vertical space.  Since this           * the <foo>; mandoc asserts a vertical space.  Since this
          * construction is rarely used, I think it's fine.           * construction is rarely used, I think it's fine.
          */           */
         if (node->next && MDOC_In != node->next->tok)          if (n->next && MDOC_In != n->next->tok)
                 term_vspace(p);                  term_vspace(p);
 }  }
   
Line 1845  termp_sp_pre(DECL_ARGS)
Line 1839  termp_sp_pre(DECL_ARGS)
 {  {
         int              i, len;          int              i, len;
   
         switch (node->tok) {          switch (n->tok) {
         case (MDOC_sp):          case (MDOC_sp):
                 len = node->child ? atoi(node->child->string) : 1;                  len = n->child ? atoi(n->child->string) : 1;
                 break;                  break;
         case (MDOC_br):          case (MDOC_br):
                 len = 0;                  len = 0;
Line 1871  static int
Line 1865  static int
 termp_brq_pre(DECL_ARGS)  termp_brq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
         term_word(p, "\\(lC");          term_word(p, "\\(lC");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 1884  static void
Line 1878  static void
 termp_brq_post(DECL_ARGS)  termp_brq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "\\(rC");          term_word(p, "\\(rC");
Line 1896  static int
Line 1890  static int
 termp_bq_pre(DECL_ARGS)  termp_bq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
         term_word(p, "\\(lB");          term_word(p, "\\(lB");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 1909  static void
Line 1903  static void
 termp_bq_post(DECL_ARGS)  termp_bq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, "\\(rB");          term_word(p, "\\(rB");
Line 1921  static int
Line 1915  static int
 termp_pq_pre(DECL_ARGS)  termp_pq_pre(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return(1);                  return(1);
         term_word(p, "\\&(");          term_word(p, "\\&(");
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
Line 1934  static void
Line 1928  static void
 termp_pq_post(DECL_ARGS)  termp_pq_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         term_word(p, ")");          term_word(p, ")");
 }  }
Line 1944  termp_pq_post(DECL_ARGS)
Line 1938  termp_pq_post(DECL_ARGS)
 static int  static int
 termp_fo_pre(DECL_ARGS)  termp_fo_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *n;          const struct mdoc_node *nn;
   
         if (MDOC_BODY == node->type) {          if (MDOC_BODY == n->type) {
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
                 term_word(p, "(");                  term_word(p, "(");
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
                 return(1);                  return(1);
         } else if (MDOC_HEAD != node->type)          } else if (MDOC_HEAD != n->type)
                 return(1);                  return(1);
   
         p->bold++;          p->bold++;
         for (n = node->child; n; n = n->next) {          for (nn = n->child; nn; nn = nn->next) {
                 assert(MDOC_TEXT == n->type);                  assert(MDOC_TEXT == nn->type);
                 term_word(p, n->string);                  term_word(p, nn->string);
         }          }
         p->bold--;          p->bold--;
   
Line 1970  static void
Line 1964  static void
 termp_fo_post(DECL_ARGS)  termp_fo_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != n->type)
                 return;                  return;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, ")");          term_word(p, ")");
Line 1984  termp_fo_post(DECL_ARGS)
Line 1978  termp_fo_post(DECL_ARGS)
 static int  static int
 termp_bf_pre(DECL_ARGS)  termp_bf_pre(DECL_ARGS)
 {  {
         const struct mdoc_node  *n;          const struct mdoc_node  *nn;
   
         if (MDOC_HEAD == node->type)          if (MDOC_HEAD == n->type)
                 return(0);                  return(0);
         else if (MDOC_BLOCK != node->type)          else if (MDOC_BLOCK != n->type)
                 return(1);                  return(1);
   
         if (NULL == (n = node->head->child)) {          if (NULL == (nn = n->head->child)) {
                 if (arg_hasattr(MDOC_Emphasis, node))                  if (arg_hasattr(MDOC_Emphasis, n))
                         p->under++;                          p->under++;
                 else if (arg_hasattr(MDOC_Symbolic, node))                  else if (arg_hasattr(MDOC_Symbolic, n))
                         p->bold++;                          p->bold++;
   
                 return(1);                  return(1);
         }          }
   
         assert(MDOC_TEXT == n->type);          assert(MDOC_TEXT == nn->type);
         if (0 == strcmp("Em", n->string))          if (0 == strcmp("Em", nn->string))
                 p->under++;                  p->under++;
         else if (0 == strcmp("Sy", n->string))          else if (0 == strcmp("Sy", nn->string))
                 p->bold++;                  p->bold++;
   
         return(1);          return(1);
Line 2015  static int
Line 2009  static int
 termp_sm_pre(DECL_ARGS)  termp_sm_pre(DECL_ARGS)
 {  {
   
         assert(node->child && MDOC_TEXT == node->child->type);          assert(n->child && MDOC_TEXT == n->child->type);
         if (0 == strcmp("on", node->child->string)) {          if (0 == strcmp("on", n->child->string)) {
                 p->flags &= ~TERMP_NONOSPACE;                  p->flags &= ~TERMP_NONOSPACE;
                 p->flags &= ~TERMP_NOSPACE;                  p->flags &= ~TERMP_NOSPACE;
         } else          } else
Line 2044  termp____post(DECL_ARGS)
Line 2038  termp____post(DECL_ARGS)
 {  {
   
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         switch (node->tok) {          switch (n->tok) {
         case (MDOC__T):          case (MDOC__T):
                 term_word(p, "\\(rq");                  term_word(p, "\\(rq");
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
Line 2052  termp____post(DECL_ARGS)
Line 2046  termp____post(DECL_ARGS)
         default:          default:
                 break;                  break;
         }          }
         term_word(p, node->next ? "," : ".");          term_word(p, n->next ? "," : ".");
 }  }
   
   
Line 2060  termp____post(DECL_ARGS)
Line 2054  termp____post(DECL_ARGS)
 static int  static int
 termp_lk_pre(DECL_ARGS)  termp_lk_pre(DECL_ARGS)
 {  {
         const struct mdoc_node *n;          const struct mdoc_node *nn;
   
         assert(node->child);          if (NULL == (nn = n->child->next)) {
         n = node->child;  
   
         if (NULL == n->next) {  
                 p->under++;                  p->under++;
                 return(1);                  return(1);
         }          }
   
         p->under++;          p->under++;
         term_word(p, n->string);          term_word(p, nn->string);
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         term_word(p, ":");          term_word(p, ":");
         p->under--;          p->under--;
   
         p->bold++;          p->bold++;
         for (n = n->next; n; n = n->next)          for (nn = nn->next; nn; nn = nn->next)
                 term_word(p, n->string);                  term_word(p, nn->string);
         p->bold--;          p->bold--;
   
         return(0);          return(0);

Legend:
Removed from v.1.85  
changed lines
  Added in v.1.86

CVSweb