[BACK]Return to mdoc_man.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mdoc_man.c between version 1.82 and 1.90

version 1.82, 2015/01/23 14:21:01 version 1.90, 2015/04/02 22:48:17
Line 22 
Line 22 
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
   
 #include "mandoc.h"  
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
 #include "out.h"  #include "mandoc.h"
 #include "man.h"  #include "roff.h"
 #include "mdoc.h"  #include "mdoc.h"
   #include "man.h"
   #include "out.h"
 #include "main.h"  #include "main.h"
   
 #define DECL_ARGS const struct mdoc_meta *meta, \  #define DECL_ARGS const struct mdoc_meta *meta, struct roff_node *n
                   const struct mdoc_node *n  
   
 struct  manact {  struct  manact {
         int             (*cond)(DECL_ARGS); /* DON'T run actions */          int             (*cond)(DECL_ARGS); /* DON'T run actions */
Line 108  static int   pre_sm(DECL_ARGS);
Line 108  static int   pre_sm(DECL_ARGS);
 static  int       pre_sp(DECL_ARGS);  static  int       pre_sp(DECL_ARGS);
 static  int       pre_sect(DECL_ARGS);  static  int       pre_sect(DECL_ARGS);
 static  int       pre_sy(DECL_ARGS);  static  int       pre_sy(DECL_ARGS);
 static  void      pre_syn(const struct mdoc_node *);  static  void      pre_syn(const struct roff_node *);
 static  int       pre_vt(DECL_ARGS);  static  int       pre_vt(DECL_ARGS);
 static  int       pre_ux(DECL_ARGS);  static  int       pre_ux(DECL_ARGS);
 static  int       pre_xr(DECL_ARGS);  static  int       pre_xr(DECL_ARGS);
Line 117  static void   print_line(const char *, int);
Line 117  static void   print_line(const char *, int);
 static  void      print_block(const char *, int);  static  void      print_block(const char *, int);
 static  void      print_offs(const char *, int);  static  void      print_offs(const char *, int);
 static  void      print_width(const struct mdoc_bl *,  static  void      print_width(const struct mdoc_bl *,
                         const struct mdoc_node *);                          const struct roff_node *);
 static  void      print_count(int *);  static  void      print_count(int *);
 static  void      print_node(DECL_ARGS);  static  void      print_node(DECL_ARGS);
   
Line 186  static const struct manact manacts[MDOC_MAX + 1] = {
Line 186  static const struct manact manacts[MDOC_MAX + 1] = {
         { NULL, pre_bx, NULL, NULL, NULL }, /* Bx */          { NULL, pre_bx, NULL, NULL, NULL }, /* Bx */
         { NULL, pre_skip, NULL, NULL, NULL }, /* Db */          { NULL, pre_skip, NULL, NULL, NULL }, /* Db */
         { NULL, NULL, NULL, NULL, NULL }, /* Dc */          { NULL, NULL, NULL, NULL, NULL }, /* Dc */
         { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Do */          { cond_body, pre_enc, post_enc, "\\(Lq", "\\(Rq" }, /* Do */
         { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Dq */          { cond_body, pre_enc, post_enc, "\\(Lq", "\\(Rq" }, /* Dq */
         { NULL, NULL, NULL, NULL, NULL }, /* Ec */          { NULL, NULL, NULL, NULL, NULL }, /* Ec */
         { NULL, NULL, NULL, NULL, NULL }, /* Ef */          { NULL, NULL, NULL, NULL, NULL }, /* Ef */
         { NULL, pre_em, post_font, NULL, NULL }, /* Em */          { NULL, pre_em, post_font, NULL, NULL }, /* Em */
Line 468  print_offs(const char *v, int keywords)
Line 468  print_offs(const char *v, int keywords)
  * Set up the indentation for a list item; used from pre_it().   * Set up the indentation for a list item; used from pre_it().
  */   */
 static void  static void
 print_width(const struct mdoc_bl *bl, const struct mdoc_node *child)  print_width(const struct mdoc_bl *bl, const struct roff_node *child)
 {  {
         char              buf[24];          char              buf[24];
         struct roffsu     su;          struct roffsu     su;
Line 493  print_width(const struct mdoc_bl *bl, const struct mdo
Line 493  print_width(const struct mdoc_bl *bl, const struct mdo
         /* XXX Rough estimation, might have multiple parts. */          /* XXX Rough estimation, might have multiple parts. */
         if (bl->type == LIST_enum)          if (bl->type == LIST_enum)
                 chsz = (bl->count > 8) + 1;                  chsz = (bl->count > 8) + 1;
         else if (child != NULL && child->type == MDOC_TEXT)          else if (child != NULL && child->type == ROFFT_TEXT)
                 chsz = strlen(child->string);                  chsz = strlen(child->string);
         else          else
                 chsz = 0;                  chsz = 0;
Line 548  void
Line 548  void
 man_mdoc(void *arg, const struct mdoc *mdoc)  man_mdoc(void *arg, const struct mdoc *mdoc)
 {  {
         const struct mdoc_meta *meta;          const struct mdoc_meta *meta;
         const struct mdoc_node *n;          struct roff_node *n;
   
         meta = mdoc_meta(mdoc);          meta = mdoc_meta(mdoc);
         n = mdoc_node(mdoc);          n = mdoc_node(mdoc)->child;
   
         printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",          printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n",
             meta->title,              meta->title,
Line 567  man_mdoc(void *arg, const struct mdoc *mdoc)
Line 567  man_mdoc(void *arg, const struct mdoc *mdoc)
                 fontqueue.head = fontqueue.tail = mandoc_malloc(8);                  fontqueue.head = fontqueue.tail = mandoc_malloc(8);
                 *fontqueue.tail = 'R';                  *fontqueue.tail = 'R';
         }          }
         print_node(meta, n);          while (n != NULL) {
                   print_node(meta, n);
                   n = n->next;
           }
         putchar('\n');          putchar('\n');
 }  }
   
 static void  static void
 print_node(DECL_ARGS)  print_node(DECL_ARGS)
 {  {
         const struct mdoc_node  *sub;  
         const struct manact     *act;          const struct manact     *act;
           struct roff_node        *sub;
         int                      cond, do_sub;          int                      cond, do_sub;
   
         /*          /*
Line 588  print_node(DECL_ARGS)
Line 591  print_node(DECL_ARGS)
         act = NULL;          act = NULL;
         cond = 0;          cond = 0;
         do_sub = 1;          do_sub = 1;
           n->flags &= ~MDOC_ENDED;
   
         if (MDOC_TEXT == n->type) {          if (n->type == ROFFT_TEXT) {
                 /*                  /*
                  * Make sure that we don't happen to start with a                   * Make sure that we don't happen to start with a
                  * control character at the start of a line.                   * control character at the start of a line.
Line 635  print_node(DECL_ARGS)
Line 639  print_node(DECL_ARGS)
                 (*act->post)(meta, n);                  (*act->post)(meta, n);
   
         if (ENDBODY_NOT != n->end)          if (ENDBODY_NOT != n->end)
                 n->pending->flags |= MDOC_ENDED;                  n->body->flags |= MDOC_ENDED;
   
         if (ENDBODY_NOSPACE == n->end)          if (ENDBODY_NOSPACE == n->end)
                 outflags &= ~(MMAN_spc | MMAN_nl);                  outflags &= ~(MMAN_spc | MMAN_nl);
Line 645  static int
Line 649  static int
 cond_head(DECL_ARGS)  cond_head(DECL_ARGS)
 {  {
   
         return(MDOC_HEAD == n->type);          return(n->type == ROFFT_HEAD);
 }  }
   
 static int  static int
 cond_body(DECL_ARGS)  cond_body(DECL_ARGS)
 {  {
   
         return(MDOC_BODY == n->type);          return(n->type == ROFFT_BODY);
 }  }
   
 static int  static int
Line 775  static int
Line 779  static int
 pre_sect(DECL_ARGS)  pre_sect(DECL_ARGS)
 {  {
   
         if (MDOC_HEAD == n->type) {          if (n->type == ROFFT_HEAD) {
                 outflags |= MMAN_sp;                  outflags |= MMAN_sp;
                 print_block(manacts[n->tok].prefix, 0);                  print_block(manacts[n->tok].prefix, 0);
                 print_word("");                  print_word("");
Line 792  static void
Line 796  static void
 post_sect(DECL_ARGS)  post_sect(DECL_ARGS)
 {  {
   
         if (MDOC_HEAD != n->type)          if (n->type != ROFFT_HEAD)
                 return;                  return;
         outflags &= ~MMAN_spc;          outflags &= ~MMAN_spc;
         print_word("");          print_word("");
Line 804  post_sect(DECL_ARGS)
Line 808  post_sect(DECL_ARGS)
   
 /* See mdoc_term.c, synopsis_pre() for comments. */  /* See mdoc_term.c, synopsis_pre() for comments. */
 static void  static void
 pre_syn(const struct mdoc_node *n)  pre_syn(const struct roff_node *n)
 {  {
   
         if (NULL == n->prev || ! (MDOC_SYNPRETTY & n->flags))          if (NULL == n->prev || ! (MDOC_SYNPRETTY & n->flags))
Line 929  pre_bf(DECL_ARGS)
Line 933  pre_bf(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 return(1);                  return(1);
         case MDOC_BODY:          case ROFFT_BODY:
                 break;                  break;
         default:          default:
                 return(0);                  return(0);
Line 954  static void
Line 958  static void
 post_bf(DECL_ARGS)  post_bf(DECL_ARGS)
 {  {
   
         if (MDOC_BODY == n->type)          if (n->type == ROFFT_BODY)
                 font_pop();                  font_pop();
 }  }
   
Line 963  pre_bk(DECL_ARGS)
Line 967  pre_bk(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 return(1);                  return(1);
         case MDOC_BODY:          case ROFFT_BODY:
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 return(1);                  return(1);
         default:          default:
Line 977  static void
Line 981  static void
 post_bk(DECL_ARGS)  post_bk(DECL_ARGS)
 {  {
   
         if (MDOC_BODY == n->type)          if (n->type == ROFFT_BODY)
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
 }  }
   
Line 1006  pre_bl(DECL_ARGS)
Line 1010  pre_bl(DECL_ARGS)
                 return(1);                  return(1);
         }          }
   
         print_line(".TS", MMAN_nl);          if (n->nchild) {
         for (icol = 0; icol < n->norm->Bl.ncols; icol++)                  print_line(".TS", MMAN_nl);
                 print_word("l");                  for (icol = 0; icol < n->norm->Bl.ncols; icol++)
         print_word(".");                          print_word("l");
                   print_word(".");
           }
         outflags |= MMAN_nl;          outflags |= MMAN_nl;
         return(1);          return(1);
 }  }
Line 1020  post_bl(DECL_ARGS)
Line 1026  post_bl(DECL_ARGS)
   
         switch (n->norm->Bl.type) {          switch (n->norm->Bl.type) {
         case LIST_column:          case LIST_column:
                 print_line(".TE", 0);                  if (n->nchild)
                           print_line(".TE", 0);
                 break;                  break;
         case LIST_enum:          case LIST_enum:
                 n->norm->Bl.count = 0;                  n->norm->Bl.count = 0;
Line 1131  static int
Line 1138  static int
 pre_eo(DECL_ARGS)  pre_eo(DECL_ARGS)
 {  {
   
         outflags &= ~(MMAN_spc | MMAN_nl);          if (n->end == ENDBODY_NOT &&
               n->parent->head->child == NULL &&
               n->child != NULL &&
               n->child->end != ENDBODY_NOT)
                   print_word("\\&");
           else if (n->end != ENDBODY_NOT ? n->child != NULL :
               n->parent->head->child != NULL && (n->child != NULL ||
               (n->parent->tail != NULL && n->parent->tail->child != NULL)))
                   outflags &= ~(MMAN_spc | MMAN_nl);
         return(1);          return(1);
 }  }
   
 static void  static void
 post_eo(DECL_ARGS)  post_eo(DECL_ARGS)
 {  {
           int      body, tail;
   
         if (n->end != ENDBODY_SPACE)          if (n->end != ENDBODY_NOT) {
                   outflags |= MMAN_spc;
                   return;
           }
   
           body = n->child != NULL || n->parent->head->child != NULL;
           tail = n->parent->tail != NULL && n->parent->tail->child != NULL;
   
           if (body && tail)
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
           else if ( ! (body || tail))
                   print_word("\\&");
           else if ( ! tail)
                   outflags |= MMAN_spc;
 }  }
   
 static int  static int
Line 1208  post_fl(DECL_ARGS)
Line 1236  post_fl(DECL_ARGS)
         font_pop();          font_pop();
         if ( ! (n->nchild ||          if ( ! (n->nchild ||
             n->next == NULL ||              n->next == NULL ||
             n->next->type == MDOC_TEXT ||              n->next->type == ROFFT_TEXT ||
             n->next->flags & MDOC_LINE))              n->next->flags & MDOC_LINE))
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
 }  }
Line 1255  pre_fo(DECL_ARGS)
Line 1283  pre_fo(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 pre_syn(n);                  pre_syn(n);
                 break;                  break;
         case MDOC_HEAD:          case ROFFT_HEAD:
                   if (n->child == NULL)
                           return(0);
                 if (MDOC_SYNPRETTY & n->flags)                  if (MDOC_SYNPRETTY & n->flags)
                         print_block(".HP 4n", MMAN_nl);                          print_block(".HP 4n", MMAN_nl);
                 font_push('B');                  font_push('B');
                 break;                  break;
         case MDOC_BODY:          case ROFFT_BODY:
                 outflags &= ~MMAN_spc;                  outflags &= ~(MMAN_spc | MMAN_nl);
                 print_word("(");                  print_word("(");
                 outflags &= ~MMAN_spc;                  outflags &= ~MMAN_spc;
                 break;                  break;
Line 1279  post_fo(DECL_ARGS)
Line 1309  post_fo(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_HEAD:          case ROFFT_HEAD:
                 font_pop();                  if (n->child != NULL)
                           font_pop();
                 break;                  break;
         case MDOC_BODY:          case ROFFT_BODY:
                 post_fn(meta, n);                  post_fn(meta, n);
                 break;                  break;
         default:          default:
Line 1335  post_in(DECL_ARGS)
Line 1366  post_in(DECL_ARGS)
 static int  static int
 pre_it(DECL_ARGS)  pre_it(DECL_ARGS)
 {  {
         const struct mdoc_node *bln;          const struct roff_node *bln;
   
         switch (n->type) {          switch (n->type) {
         case MDOC_HEAD:          case ROFFT_HEAD:
                 outflags |= MMAN_PP | MMAN_nl;                  outflags |= MMAN_PP | MMAN_nl;
                 bln = n->parent->parent;                  bln = n->parent->parent;
                 if (0 == bln->norm->Bl.comp ||                  if (0 == bln->norm->Bl.comp ||
Line 1432  mid_it(void)
Line 1463  mid_it(void)
 static void  static void
 post_it(DECL_ARGS)  post_it(DECL_ARGS)
 {  {
         const struct mdoc_node *bln;          const struct roff_node *bln;
   
         bln = n->parent->parent;          bln = n->parent->parent;
   
         switch (n->type) {          switch (n->type) {
         case MDOC_HEAD:          case ROFFT_HEAD:
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case LIST_diag:                  case LIST_diag:
                         outflags &= ~MMAN_spc;                          outflags &= ~MMAN_spc;
Line 1450  post_it(DECL_ARGS)
Line 1481  post_it(DECL_ARGS)
                         break;                          break;
                 }                  }
                 break;                  break;
         case MDOC_BODY:          case ROFFT_BODY:
                 switch (bln->norm->Bl.type) {                  switch (bln->norm->Bl.type) {
                 case LIST_bullet:                  case LIST_bullet:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
Line 1502  post_lb(DECL_ARGS)
Line 1533  post_lb(DECL_ARGS)
 static int  static int
 pre_lk(DECL_ARGS)  pre_lk(DECL_ARGS)
 {  {
         const struct mdoc_node *link, *descr;          const struct roff_node *link, *descr;
   
         if (NULL == (link = n->child))          if (NULL == (link = n->child))
                 return(0);                  return(0);
Line 1544  pre_nm(DECL_ARGS)
Line 1575  pre_nm(DECL_ARGS)
 {  {
         char    *name;          char    *name;
   
         if (MDOC_BLOCK == n->type) {          if (n->type == ROFFT_BLOCK) {
                 outflags |= MMAN_Bk;                  outflags |= MMAN_Bk;
                 pre_syn(n);                  pre_syn(n);
         }          }
         if (MDOC_ELEM != n->type && MDOC_HEAD != n->type)          if (n->type != ROFFT_ELEM && n->type != ROFFT_HEAD)
                 return(1);                  return(1);
         name = n->child ? n->child->string : meta->name;          name = n->child ? n->child->string : meta->name;
         if (NULL == name)          if (NULL == name)
                 return(0);                  return(0);
         if (MDOC_HEAD == n->type) {          if (n->type == ROFFT_HEAD) {
                 if (NULL == n->parent->prev)                  if (NULL == n->parent->prev)
                         outflags |= MMAN_sp;                          outflags |= MMAN_sp;
                 print_block(".HP", 0);                  print_block(".HP", 0);
Line 1571  post_nm(DECL_ARGS)
Line 1602  post_nm(DECL_ARGS)
 {  {
   
         switch (n->type) {          switch (n->type) {
         case MDOC_BLOCK:          case ROFFT_BLOCK:
                 outflags &= ~MMAN_Bk;                  outflags &= ~MMAN_Bk;
                 break;                  break;
         case MDOC_HEAD:          case ROFFT_HEAD:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case MDOC_ELEM:          case ROFFT_ELEM:
                 if (n->child != NULL || meta->name != NULL)                  if (n->child != NULL || meta->name != NULL)
                         font_pop();                          font_pop();
                 break;                  break;
Line 1740  pre_vt(DECL_ARGS)
Line 1771  pre_vt(DECL_ARGS)
   
         if (MDOC_SYNPRETTY & n->flags) {          if (MDOC_SYNPRETTY & n->flags) {
                 switch (n->type) {                  switch (n->type) {
                 case MDOC_BLOCK:                  case ROFFT_BLOCK:
                         pre_syn(n);                          pre_syn(n);
                         return(1);                          return(1);
                 case MDOC_BODY:                  case ROFFT_BODY:
                         break;                          break;
                 default:                  default:
                         return(0);                          return(0);
Line 1757  static void
Line 1788  static void
 post_vt(DECL_ARGS)  post_vt(DECL_ARGS)
 {  {
   
         if (MDOC_SYNPRETTY & n->flags && MDOC_BODY != n->type)          if (n->flags & MDOC_SYNPRETTY && n->type != ROFFT_BODY)
                 return;                  return;
         font_pop();          font_pop();
 }  }

Legend:
Removed from v.1.82  
changed lines
  Added in v.1.90

CVSweb