[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.242 and 1.249

version 1.242, 2012/07/10 14:38:51 version 1.249, 2013/06/02 18:16:57
Line 41  struct termpair {
Line 41  struct termpair {
   
 #define DECL_ARGS struct termp *p, \  #define DECL_ARGS struct termp *p, \
                   struct termpair *pair, \                    struct termpair *pair, \
                   const struct mdoc_meta *m, \                    const struct mdoc_meta *meta, \
                   const struct mdoc_node *n                    struct mdoc_node *n
   
 struct  termact {  struct  termact {
         int     (*pre)(DECL_ARGS);          int     (*pre)(DECL_ARGS);
Line 242  static const struct termact termacts[MDOC_MAX] = {
Line 242  static const struct termact termacts[MDOC_MAX] = {
         { NULL, termp____post }, /* %Q */          { NULL, termp____post }, /* %Q */
         { termp_sp_pre, NULL }, /* br */          { termp_sp_pre, NULL }, /* br */
         { termp_sp_pre, NULL }, /* sp */          { termp_sp_pre, NULL }, /* sp */
         { termp_under_pre, termp____post }, /* %U */          { NULL, termp____post }, /* %U */
         { NULL, NULL }, /* Ta */          { NULL, NULL }, /* Ta */
 };  };
   
Line 251  void
Line 251  void
 terminal_mdoc(void *arg, 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  *meta;
         struct termp            *p;          struct termp            *p;
   
         p = (struct termp *)arg;          p = (struct termp *)arg;
Line 267  terminal_mdoc(void *arg, const struct mdoc *mdoc)
Line 267  terminal_mdoc(void *arg, const struct mdoc *mdoc)
                 p->symtab = mchars_alloc();                  p->symtab = mchars_alloc();
   
         n = mdoc_node(mdoc);          n = mdoc_node(mdoc);
         m = mdoc_meta(mdoc);          meta = mdoc_meta(mdoc);
   
         term_begin(p, print_mdoc_head, print_mdoc_foot, m);          term_begin(p, print_mdoc_head, print_mdoc_foot, meta);
   
         if (n->child)          if (n->child)
                 print_mdoc_nodelist(p, NULL, m, n->child);                  print_mdoc_nodelist(p, NULL, meta, n->child);
   
         term_end(p);          term_end(p);
 }  }
Line 282  static void
Line 282  static void
 print_mdoc_nodelist(DECL_ARGS)  print_mdoc_nodelist(DECL_ARGS)
 {  {
   
         print_mdoc_node(p, pair, m, n);          print_mdoc_node(p, pair, meta, n);
         if (n->next)          if (n->next)
                 print_mdoc_nodelist(p, pair, m, n->next);                  print_mdoc_nodelist(p, pair, meta, n->next);
 }  }
   
   
Line 293  static void
Line 293  static void
 print_mdoc_node(DECL_ARGS)  print_mdoc_node(DECL_ARGS)
 {  {
         int              chld;          int              chld;
         const void      *font;  
         struct termpair  npair;          struct termpair  npair;
         size_t           offset, rmargin;          size_t           offset, rmargin;
   
         chld = 1;          chld = 1;
         offset = p->offset;          offset = p->offset;
         rmargin = p->rmargin;          rmargin = p->rmargin;
         font = term_fontq(p);          n->prev_font = term_fontq(p);
   
         memset(&npair, 0, sizeof(struct termpair));          memset(&npair, 0, sizeof(struct termpair));
         npair.ppair = pair;          npair.ppair = pair;
Line 314  print_mdoc_node(DECL_ARGS)
Line 313  print_mdoc_node(DECL_ARGS)
          */           */
   
         if (TERMP_KEEP & p->flags || MDOC_SYNPRETTY & n->flags) {          if (TERMP_KEEP & p->flags || MDOC_SYNPRETTY & n->flags) {
                 if (n->prev && n->prev->line != n->line) {                  if (n->prev ? (n->prev->line != n->line) :
                       (n->parent && n->parent->line != n->line)) {
                         p->flags &= ~TERMP_KEEP;                          p->flags &= ~TERMP_KEEP;
                         p->flags |= TERMP_PREKEEP;                          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;  
                         }  
                 }                  }
         }          }
   
Line 359  print_mdoc_node(DECL_ARGS)
Line 354  print_mdoc_node(DECL_ARGS)
         default:          default:
                 if (termacts[n->tok].pre && ENDBODY_NOT == n->end)                  if (termacts[n->tok].pre && ENDBODY_NOT == n->end)
                         chld = (*termacts[n->tok].pre)                          chld = (*termacts[n->tok].pre)
                                 (p, &npair, m, n);                                  (p, &npair, meta, n);
                 break;                  break;
         }          }
   
         if (chld && n->child)          if (chld && n->child)
                 print_mdoc_nodelist(p, &npair, m, n->child);                  print_mdoc_nodelist(p, &npair, meta, n->child);
   
         term_fontpopq(p, font);          term_fontpopq(p,
               (ENDBODY_NOT == n->end ? n : n->pending)->prev_font);
   
         switch (n->type) {          switch (n->type) {
         case (MDOC_TEXT):          case (MDOC_TEXT):
Line 378  print_mdoc_node(DECL_ARGS)
Line 374  print_mdoc_node(DECL_ARGS)
         default:          default:
                 if ( ! termacts[n->tok].post || MDOC_ENDED & n->flags)                  if ( ! termacts[n->tok].post || MDOC_ENDED & n->flags)
                         break;                          break;
                 (void)(*termacts[n->tok].post)(p, &npair, m, n);                  (void)(*termacts[n->tok].post)(p, &npair, meta, n);
   
                 /*                  /*
                  * Explicit end tokens not only call the post                   * Explicit end tokens not only call the post
Line 409  print_mdoc_node(DECL_ARGS)
Line 405  print_mdoc_node(DECL_ARGS)
 static void  static void
 print_mdoc_foot(struct termp *p, const void *arg)  print_mdoc_foot(struct termp *p, const void *arg)
 {  {
         const struct mdoc_meta *m;          const struct mdoc_meta *meta;
   
         m = (const struct mdoc_meta *)arg;          meta = (const struct mdoc_meta *)arg;
   
         term_fontrepl(p, TERMFONT_NONE);          term_fontrepl(p, TERMFONT_NONE);
   
Line 427  print_mdoc_foot(struct termp *p, const void *arg)
Line 423  print_mdoc_foot(struct termp *p, const void *arg)
   
         p->offset = 0;          p->offset = 0;
         p->rmargin = (p->maxrmargin -          p->rmargin = (p->maxrmargin -
                         term_strlen(p, m->date) + term_len(p, 1)) / 2;                          term_strlen(p, meta->date) + term_len(p, 1)) / 2;
         p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;          p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
   
         term_word(p, m->os);          term_word(p, meta->os);
         term_flushln(p);          term_flushln(p);
   
         p->offset = p->rmargin;          p->offset = p->rmargin;
         p->rmargin = p->maxrmargin - term_strlen(p, m->os);          p->rmargin = p->maxrmargin - term_strlen(p, meta->os);
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
   
         term_word(p, m->date);          term_word(p, meta->date);
         term_flushln(p);          term_flushln(p);
   
         p->offset = p->rmargin;          p->offset = p->rmargin;
Line 445  print_mdoc_foot(struct termp *p, const void *arg)
Line 441  print_mdoc_foot(struct termp *p, const void *arg)
         p->flags &= ~TERMP_NOBREAK;          p->flags &= ~TERMP_NOBREAK;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
   
         term_word(p, m->os);          term_word(p, meta->os);
         term_flushln(p);          term_flushln(p);
   
         p->offset = 0;          p->offset = 0;
Line 459  print_mdoc_head(struct termp *p, const void *arg)
Line 455  print_mdoc_head(struct termp *p, const void *arg)
 {  {
         char            buf[BUFSIZ], title[BUFSIZ];          char            buf[BUFSIZ], title[BUFSIZ];
         size_t          buflen, titlen;          size_t          buflen, titlen;
         const struct mdoc_meta *m;          const struct mdoc_meta *meta;
   
         m = (const struct mdoc_meta *)arg;          meta = (const struct mdoc_meta *)arg;
   
         /*          /*
          * The header is strange.  It has three components, which are           * The header is strange.  It has three components, which are
Line 479  print_mdoc_head(struct termp *p, const void *arg)
Line 475  print_mdoc_head(struct termp *p, const void *arg)
         p->offset = 0;          p->offset = 0;
         p->rmargin = p->maxrmargin;          p->rmargin = p->maxrmargin;
   
         assert(m->vol);          assert(meta->vol);
         strlcpy(buf, m->vol, BUFSIZ);          strlcpy(buf, meta->vol, BUFSIZ);
         buflen = term_strlen(p, buf);          buflen = term_strlen(p, buf);
   
         if (m->arch) {          if (meta->arch) {
                 strlcat(buf, " (", BUFSIZ);                  strlcat(buf, " (", BUFSIZ);
                 strlcat(buf, m->arch, BUFSIZ);                  strlcat(buf, meta->arch, BUFSIZ);
                 strlcat(buf, ")", BUFSIZ);                  strlcat(buf, ")", BUFSIZ);
         }          }
   
         snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);          snprintf(title, BUFSIZ, "%s(%s)", meta->title, meta->msec);
         titlen = term_strlen(p, title);          titlen = term_strlen(p, title);
   
         p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;          p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
Line 1011  termp_nm_pre(DECL_ARGS)
Line 1007  termp_nm_pre(DECL_ARGS)
                         return(0);                          return(0);
                 p->flags |= TERMP_NOSPACE;                  p->flags |= TERMP_NOSPACE;
                 p->offset += term_len(p, 1) +                  p->offset += term_len(p, 1) +
                     (NULL == n->prev->child ? term_strlen(p, m->name) :                      (NULL == n->prev->child ?
                        term_strlen(p, meta->name) :
                      MDOC_TEXT == n->prev->child->type ?                       MDOC_TEXT == n->prev->child->type ?
                         term_strlen(p, n->prev->child->string) :                       term_strlen(p, n->prev->child->string) :
                      term_len(p, 5));                       term_len(p, 5));
                 return(1);                  return(1);
         }          }
   
         if (NULL == n->child && NULL == m->name)          if (NULL == n->child && NULL == meta->name)
                 return(0);                  return(0);
   
         if (MDOC_HEAD == n->type)          if (MDOC_HEAD == n->type)
Line 1028  termp_nm_pre(DECL_ARGS)
Line 1025  termp_nm_pre(DECL_ARGS)
                 p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;                  p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
                 p->rmargin = p->offset + term_len(p, 1);                  p->rmargin = p->offset + term_len(p, 1);
                 if (NULL == n->child) {                  if (NULL == n->child) {
                         p->rmargin += term_strlen(p, m->name);                          p->rmargin += term_strlen(p, meta->name);
                 } else if (MDOC_TEXT == n->child->type) {                  } else if (MDOC_TEXT == n->child->type) {
                         p->rmargin += term_strlen(p, n->child->string);                          p->rmargin += term_strlen(p, n->child->string);
                         if (n->child->next)                          if (n->child->next)
Line 1041  termp_nm_pre(DECL_ARGS)
Line 1038  termp_nm_pre(DECL_ARGS)
   
         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, meta->name);
         return(1);          return(1);
 }  }
   
Line 1379  termp_vt_pre(DECL_ARGS)
Line 1376  termp_vt_pre(DECL_ARGS)
   
         if (MDOC_ELEM == n->type) {          if (MDOC_ELEM == n->type) {
                 synopsis_pre(p, n);                  synopsis_pre(p, n);
                 return(termp_under_pre(p, pair, m, n));                  return(termp_under_pre(p, pair, meta, n));
         } else if (MDOC_BLOCK == n->type) {          } else if (MDOC_BLOCK == n->type) {
                 synopsis_pre(p, n);                  synopsis_pre(p, n);
                 return(1);                  return(1);
         } else if (MDOC_HEAD == n->type)          } else if (MDOC_HEAD == n->type)
                 return(0);                  return(0);
   
         return(termp_under_pre(p, pair, m, n));          return(termp_under_pre(p, pair, meta, n));
 }  }
   
   
Line 1406  termp_fd_pre(DECL_ARGS)
Line 1403  termp_fd_pre(DECL_ARGS)
 {  {
   
         synopsis_pre(p, n);          synopsis_pre(p, n);
         return(termp_bold_pre(p, pair, m, n));          return(termp_bold_pre(p, pair, meta, n));
 }  }
   
   
Line 1606  static int
Line 1603  static int
 termp_bd_pre(DECL_ARGS)  termp_bd_pre(DECL_ARGS)
 {  {
         size_t                   tabwidth, rm, rmax;          size_t                   tabwidth, rm, rmax;
         const struct mdoc_node  *nn;          struct mdoc_node        *nn;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                 print_bvspace(p, n, n);                  print_bvspace(p, n, n);
Line 1638  termp_bd_pre(DECL_ARGS)
Line 1635  termp_bd_pre(DECL_ARGS)
         p->rmargin = p->maxrmargin = TERM_MAXMARGIN;          p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
   
         for (nn = n->child; nn; nn = nn->next) {          for (nn = n->child; nn; nn = nn->next) {
                 print_mdoc_node(p, pair, m, nn);                  print_mdoc_node(p, pair, meta, nn);
                 /*                  /*
                  * If the printed node flushes its own line, then we                   * If the printed node flushes its own line, then we
                  * needn't do it here as well.  This is hacky, but the                   * needn't do it here as well.  This is hacky, but the
Line 1755  termp_xx_pre(DECL_ARGS)
Line 1752  termp_xx_pre(DECL_ARGS)
                 pp = "UNIX";                  pp = "UNIX";
                 break;                  break;
         default:          default:
                 break;                  abort();
                   /* NOTREACHED */
         }          }
   
         term_word(p, pp);          term_word(p, pp);
Line 1927  termp_quote_pre(DECL_ARGS)
Line 1925  termp_quote_pre(DECL_ARGS)
         case (MDOC_Do):          case (MDOC_Do):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dq):          case (MDOC_Dq):
                 term_word(p, "``");                  term_word(p, "\\(lq");
                 break;                  break;
         case (MDOC_Eo):          case (MDOC_Eo):
                 break;                  break;
Line 1948  termp_quote_pre(DECL_ARGS)
Line 1946  termp_quote_pre(DECL_ARGS)
         case (MDOC_So):          case (MDOC_So):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Sq):          case (MDOC_Sq):
                 term_word(p, "`");                  term_word(p, "\\(oq");
                 break;                  break;
         default:          default:
                 abort();                  abort();
Line 1993  termp_quote_post(DECL_ARGS)
Line 1991  termp_quote_post(DECL_ARGS)
         case (MDOC_Do):          case (MDOC_Do):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dq):          case (MDOC_Dq):
                 term_word(p, "''");                  term_word(p, "\\(rq");
                 break;                  break;
         case (MDOC_Eo):          case (MDOC_Eo):
                 break;                  break;
Line 2014  termp_quote_post(DECL_ARGS)
Line 2012  termp_quote_post(DECL_ARGS)
         case (MDOC_So):          case (MDOC_So):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Sq):          case (MDOC_Sq):
                 term_word(p, "'");                  term_word(p, "\\(cq");
                 break;                  break;
         default:          default:
                 abort();                  abort();
Line 2075  termp_bf_pre(DECL_ARGS)
Line 2073  termp_bf_pre(DECL_ARGS)
   
         if (MDOC_HEAD == n->type)          if (MDOC_HEAD == n->type)
                 return(0);                  return(0);
         else if (MDOC_BLOCK != n->type)          else if (MDOC_BODY != n->type)
                 return(1);                  return(1);
   
         if (FONT_Em == n->norm->Bf.font)          if (FONT_Em == n->norm->Bf.font)
Line 2213  static void
Line 2211  static void
 termp_bk_post(DECL_ARGS)  termp_bk_post(DECL_ARGS)
 {  {
   
         if (MDOC_BODY == n->type)          if (MDOC_BODY == n->type && ! (MDOC_SYNPRETTY & n->flags))
                 p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);                  p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);
 }  }
   
Line 2228  termp__t_post(DECL_ARGS)
Line 2226  termp__t_post(DECL_ARGS)
          */           */
         if (n->parent && MDOC_Rs == n->parent->tok &&          if (n->parent && MDOC_Rs == n->parent->tok &&
                         n->parent->norm->Rs.quote_T)                          n->parent->norm->Rs.quote_T)
                 termp_quote_post(p, pair, m, n);                  termp_quote_post(p, pair, meta, n);
   
         termp____post(p, pair, m, n);          termp____post(p, pair, meta, n);
 }  }
   
 /* ARGSUSED */  /* ARGSUSED */
Line 2244  termp__t_pre(DECL_ARGS)
Line 2242  termp__t_pre(DECL_ARGS)
          */           */
         if (n->parent && MDOC_Rs == n->parent->tok &&          if (n->parent && MDOC_Rs == n->parent->tok &&
                         n->parent->norm->Rs.quote_T)                          n->parent->norm->Rs.quote_T)
                 return(termp_quote_pre(p, pair, m, n));                  return(termp_quote_pre(p, pair, meta, n));
   
         term_fontpush(p, TERMFONT_UNDER);          term_fontpush(p, TERMFONT_UNDER);
         return(1);          return(1);

Legend:
Removed from v.1.242  
changed lines
  Added in v.1.249

CVSweb