[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.69 and 1.70

version 1.69, 2009/09/15 08:16:20 version 1.70, 2009/09/16 09:41:24
Line 113  static int   termp_ud_pre(DECL_ARGS);
Line 113  static int   termp_ud_pre(DECL_ARGS);
 static  int       termp_xr_pre(DECL_ARGS);  static  int       termp_xr_pre(DECL_ARGS);
 static  int       termp_xx_pre(DECL_ARGS);  static  int       termp_xx_pre(DECL_ARGS);
   
 static const struct termact termacts[MDOC_MAX] = {  static  const struct termact termacts[MDOC_MAX] = {
         { termp_ap_pre, NULL }, /* Ap */          { termp_ap_pre, NULL }, /* Ap */
         { NULL, NULL }, /* Dd */          { NULL, NULL }, /* Dd */
         { NULL, NULL }, /* Dt */          { NULL, NULL }, /* Dt */
Line 153  static const struct termact termacts[MDOC_MAX] = {
Line 153  static const struct termact termacts[MDOC_MAX] = {
         { termp_rv_pre, NULL }, /* Rv */          { termp_rv_pre, NULL }, /* Rv */
         { NULL, NULL }, /* St */          { NULL, NULL }, /* St */
         { termp_under_pre, NULL }, /* Va */          { termp_under_pre, NULL }, /* Va */
         { termp_under_pre, termp_vt_post }, /* Vt */  /* FIXME: type name */          { termp_under_pre, termp_vt_post }, /* Vt */
         { termp_xr_pre, NULL }, /* Xr */          { termp_xr_pre, NULL }, /* Xr */
         { NULL, termp____post }, /* %A */          { NULL, termp____post }, /* %A */
         { NULL, termp____post }, /* %B */          { NULL, termp____post }, /* %B */
Line 252  static void   fmt_block_vspace(struct termp *,
Line 252  static void   fmt_block_vspace(struct termp *,
                         const struct mdoc_node *,                          const struct mdoc_node *,
                         const struct mdoc_node *);                          const struct mdoc_node *);
 static  void      print_node(DECL_ARGS);  static  void      print_node(DECL_ARGS);
 static  void      print_head(struct termp *,  static  void      print_head(DECL_ARGS);
                         const struct mdoc_meta *);  
 static  void      print_body(DECL_ARGS);  static  void      print_body(DECL_ARGS);
 static  void      print_foot(struct termp *,  static  void      print_foot(DECL_ARGS);
                         const struct mdoc_meta *);  
   
   
 int  void
 mdoc_run(struct termp *p, const struct mdoc *m)  mdoc_run(struct termp *p, const struct mdoc *mdoc)
 {  {
         /*          const struct mdoc_node  *n;
          * Main output function.  When this is called, assume that the          const struct mdoc_meta  *m;
          * tree is properly formed.  
          */          n = mdoc_node(mdoc);
         print_head(p, mdoc_meta(m));          m = mdoc_meta(mdoc);
         assert(mdoc_node(m));  
         assert(MDOC_ROOT == mdoc_node(m)->type);          print_head(p, NULL, m, n);
         if (mdoc_node(m)->child)          if (n->child)
                 print_body(p, NULL, mdoc_meta(m), mdoc_node(m)->child);                  print_body(p, NULL, m, n->child);
         print_foot(p, mdoc_meta(m));          print_foot(p, NULL, m, n);
         return(1);  
 }  }
   
   
Line 281  print_body(DECL_ARGS)
Line 278  print_body(DECL_ARGS)
 {  {
   
         print_node(p, pair, meta, node);          print_node(p, pair, meta, node);
         if ( ! node->next)          if (node->next)
                 return;                  print_body(p, pair, meta, node->next);
         print_body(p, pair, meta, node->next);  
 }  }
   
   
   /* ARGSUSED */
 static void  static void
 print_node(DECL_ARGS)  print_node(DECL_ARGS)
 {  {
         int              dochild, bold, under;          int              chld, bold, under;
         struct termpair  npair;          struct termpair  npair;
         size_t           offset, rmargin;          size_t           offset, rmargin;
   
         dochild = 1;          chld = 1;
         offset = p->offset;          offset = p->offset;
         rmargin = p->rmargin;          rmargin = p->rmargin;
         bold = p->bold;          bold = p->bold;
         under = p->under;          under = p->under;
   
           bzero(&npair, sizeof(struct termpair));
         npair.ppair = pair;          npair.ppair = pair;
         npair.flag = 0;  
         npair.count = 0;  
   
         /*  
          * Note on termpair.  This allows a pre function to set a termp  
          * flag that is automatically unset after the body, but before  
          * the post function.  Thus, if a pre uses a termpair flag, it  
          * must be reapplied in the post for use.  
          */  
   
         if (MDOC_TEXT != node->type) {          if (MDOC_TEXT != node->type) {
                 if (termacts[node->tok].pre)                  if (termacts[node->tok].pre)
                         if ( ! (*termacts[node->tok].pre)(p, &npair, meta, node))                          chld = (*termacts[node->tok].pre)
                                 dochild = 0;                                  (p, &npair, meta, node);
         } else /* MDOC_TEXT == node->type */          } else
                 term_word(p, node->string);                  term_word(p, node->string);
   
         /* Children. */          if (chld && node->child)
   
         if (dochild && node->child)  
                 print_body(p, &npair, meta, node->child);                  print_body(p, &npair, meta, node->child);
   
           /*
            * XXX - if bold/under were to span scopes, this wouldn't be
            * possible, but because decoration is always in-scope, we can
            * get away with this.
            */
   
         p->bold = bold;          p->bold = bold;
         p->under = under;          p->under = under;
   
         /* Post-processing. */  
   
         if (MDOC_TEXT != node->type)          if (MDOC_TEXT != node->type)
                 if (termacts[node->tok].post)                  if (termacts[node->tok].post)
                         (*termacts[node->tok].post)(p, &npair, meta, node);                          (*termacts[node->tok].post)
                                   (p, &npair, meta, node);
   
         p->offset = offset;          p->offset = offset;
         p->rmargin = rmargin;          p->rmargin = rmargin;
 }  }
   
   
   /* ARGSUSED */
 static void  static void
 print_foot(struct termp *p, const struct mdoc_meta *meta)  print_foot(DECL_ARGS)
 {  {
         struct tm       *tm;          struct tm       *tm;
         char            *buf, *os;          char            *buf, *os;
Line 352  print_foot(struct termp *p, const struct mdoc_meta *me
Line 345  print_foot(struct termp *p, const struct mdoc_meta *me
          */           */
   
         if (NULL == (buf = malloc(p->rmargin)))          if (NULL == (buf = malloc(p->rmargin)))
                 err(1, "malloc");                  err(EXIT_FAILURE, "malloc");
         if (NULL == (os = malloc(p->rmargin)))          if (NULL == (os = malloc(p->rmargin)))
                 err(1, "malloc");                  err(EXIT_FAILURE, "malloc");
   
         tm = localtime(&meta->date);          tm = localtime(&meta->date);
   
         if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm))          if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm))
                 err(1, "strftime");                  err(EXIT_FAILURE, "strftime");
   
         (void)strlcpy(os, meta->os, p->rmargin);          (void)strlcpy(os, meta->os, p->rmargin);
   
Line 396  print_foot(struct termp *p, const struct mdoc_meta *me
Line 389  print_foot(struct termp *p, const struct mdoc_meta *me
 }  }
   
   
   /* ARGSUSED */
 static void  static void
 print_head(struct termp *p, const struct mdoc_meta *meta)  print_head(DECL_ARGS)
 {  {
         char            *buf, *title;          char            *buf, *title;
   
Line 405  print_head(struct termp *p, const struct mdoc_meta *me
Line 399  print_head(struct termp *p, const struct mdoc_meta *me
         p->offset = 0;          p->offset = 0;
   
         if (NULL == (buf = malloc(p->rmargin)))          if (NULL == (buf = malloc(p->rmargin)))
                 err(1, "malloc");                  err(EXIT_FAILURE, "malloc");
         if (NULL == (title = malloc(p->rmargin)))          if (NULL == (title = malloc(p->rmargin)))
                 err(1, "malloc");                  err(EXIT_FAILURE, "malloc");
   
         /*          /*
          * The header is strange.  It has three components, which are           * The header is strange.  It has three components, which are
Line 431  print_head(struct termp *p, const struct mdoc_meta *me
Line 425  print_head(struct termp *p, const struct mdoc_meta *me
                 (void)strlcat(buf, ")", p->rmargin);                  (void)strlcat(buf, ")", p->rmargin);
         }          }
   
         (void)snprintf(title, p->rmargin, "%s(%d)",          snprintf(title, p->rmargin, "%s(%d)", meta->title, meta->msec);
                         meta->title, meta->msec);  
   
         p->offset = 0;          p->offset = 0;
         p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;          p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;

Legend:
Removed from v.1.69  
changed lines
  Added in v.1.70

CVSweb