[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.265 and 1.279

version 1.265, 2014/04/20 19:40:13 version 1.279, 2014/08/17 16:51:55
Line 16 
Line 16 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
 #include <sys/types.h>  #include <sys/types.h>
   
Line 30 
Line 28 
 #include <string.h>  #include <string.h>
   
 #include "mandoc.h"  #include "mandoc.h"
   #include "mandoc_aux.h"
 #include "out.h"  #include "out.h"
 #include "term.h"  #include "term.h"
 #include "mdoc.h"  #include "mdoc.h"
Line 94  static int   termp_bt_pre(DECL_ARGS);
Line 93  static int   termp_bt_pre(DECL_ARGS);
 static  int       termp_bx_pre(DECL_ARGS);  static  int       termp_bx_pre(DECL_ARGS);
 static  int       termp_cd_pre(DECL_ARGS);  static  int       termp_cd_pre(DECL_ARGS);
 static  int       termp_d1_pre(DECL_ARGS);  static  int       termp_d1_pre(DECL_ARGS);
   static  int       termp_es_pre(DECL_ARGS);
 static  int       termp_ex_pre(DECL_ARGS);  static  int       termp_ex_pre(DECL_ARGS);
 static  int       termp_fa_pre(DECL_ARGS);  static  int       termp_fa_pre(DECL_ARGS);
 static  int       termp_fd_pre(DECL_ARGS);  static  int       termp_fd_pre(DECL_ARGS);
Line 157  static const struct termact termacts[MDOC_MAX] = {
Line 157  static const struct termact termacts[MDOC_MAX] = {
         { termp_nd_pre, NULL }, /* Nd */          { termp_nd_pre, NULL }, /* Nd */
         { termp_nm_pre, termp_nm_post }, /* Nm */          { termp_nm_pre, termp_nm_post }, /* Nm */
         { termp_quote_pre, termp_quote_post }, /* Op */          { termp_quote_pre, termp_quote_post }, /* Op */
         { NULL, NULL }, /* Ot */          { termp_ft_pre, NULL }, /* Ot */
         { termp_under_pre, NULL }, /* Pa */          { termp_under_pre, NULL }, /* Pa */
         { termp_rv_pre, NULL }, /* Rv */          { termp_rv_pre, NULL }, /* Rv */
         { NULL, NULL }, /* St */          { NULL, NULL }, /* St */
Line 227  static const struct termact termacts[MDOC_MAX] = {
Line 227  static const struct termact termacts[MDOC_MAX] = {
         { NULL, NULL }, /* Ek */          { NULL, NULL }, /* Ek */
         { termp_bt_pre, NULL }, /* Bt */          { termp_bt_pre, NULL }, /* Bt */
         { NULL, NULL }, /* Hf */          { NULL, NULL }, /* Hf */
         { NULL, NULL }, /* Fr */          { termp_under_pre, NULL }, /* Fr */
         { termp_ud_pre, NULL }, /* Ud */          { termp_ud_pre, NULL }, /* Ud */
         { NULL, termp_lb_post }, /* Lb */          { NULL, termp_lb_post }, /* Lb */
         { termp_sp_pre, NULL }, /* Lp */          { termp_sp_pre, NULL }, /* Lp */
Line 237  static const struct termact termacts[MDOC_MAX] = {
Line 237  static const struct termact termacts[MDOC_MAX] = {
         { termp_quote_pre, termp_quote_post }, /* Bro */          { termp_quote_pre, termp_quote_post }, /* Bro */
         { NULL, NULL }, /* Brc */          { NULL, NULL }, /* Brc */
         { NULL, termp____post }, /* %C */          { NULL, termp____post }, /* %C */
         { NULL, NULL }, /* Es */ /* TODO */          { termp_es_pre, NULL }, /* Es */
         { NULL, NULL }, /* En */ /* TODO */          { termp_quote_pre, termp_quote_post }, /* En */
         { termp_xx_pre, NULL }, /* Dx */          { termp_xx_pre, NULL }, /* Dx */
         { NULL, termp____post }, /* %Q */          { NULL, termp____post }, /* %Q */
         { termp_sp_pre, NULL }, /* br */          { termp_sp_pre, NULL }, /* br */
Line 273  terminal_mdoc(void *arg, const struct mdoc *mdoc)
Line 273  terminal_mdoc(void *arg, const struct mdoc *mdoc)
   
         term_begin(p, print_mdoc_head, print_mdoc_foot, meta);          term_begin(p, print_mdoc_head, print_mdoc_foot, meta);
   
         if (n->child)          if (n->child) {
                   if (MDOC_Sh != n->child->tok)
                           term_vspace(p);
                 print_mdoc_nodelist(p, NULL, meta, n->child);                  print_mdoc_nodelist(p, NULL, meta, n->child);
           }
   
         term_end(p);          term_end(p);
 }  }
Line 441  print_mdoc_foot(struct termp *p, const void *arg)
Line 444  print_mdoc_foot(struct termp *p, const void *arg)
 static void  static void
 print_mdoc_head(struct termp *p, const void *arg)  print_mdoc_head(struct termp *p, const void *arg)
 {  {
         char            buf[BUFSIZ], title[BUFSIZ];          const struct mdoc_meta  *meta;
         size_t          buflen, titlen;          char                    *volume, *title;
         const struct mdoc_meta *meta;          size_t                   vollen, titlen;
   
         meta = (const struct mdoc_meta *)arg;          meta = (const struct mdoc_meta *)arg;
   
Line 464  print_mdoc_head(struct termp *p, const void *arg)
Line 467  print_mdoc_head(struct termp *p, const void *arg)
         p->rmargin = p->maxrmargin;          p->rmargin = p->maxrmargin;
   
         assert(meta->vol);          assert(meta->vol);
         strlcpy(buf, meta->vol, BUFSIZ);          if (NULL == meta->arch)
         buflen = term_strlen(p, buf);                  volume = mandoc_strdup(meta->vol);
           else
                   mandoc_asprintf(&volume, "%s (%s)",
                       meta->vol, meta->arch);
           vollen = term_strlen(p, volume);
   
         if (meta->arch) {          if (NULL == meta->msec)
                 strlcat(buf, " (", BUFSIZ);                  title = mandoc_strdup(meta->title);
                 strlcat(buf, meta->arch, BUFSIZ);          else
                 strlcat(buf, ")", BUFSIZ);                  mandoc_asprintf(&title, "%s(%s)",
         }                      meta->title, meta->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;
         p->trailspace = 1;          p->trailspace = 1;
         p->offset = 0;          p->offset = 0;
         p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?          p->rmargin = 2 * (titlen+1) + vollen < p->maxrmargin ?
             (p->maxrmargin -              (p->maxrmargin - vollen + term_len(p, 1)) / 2 :
              term_strlen(p, buf) + term_len(p, 1)) / 2 :              p->maxrmargin - vollen;
             p->maxrmargin - buflen;  
   
         term_word(p, title);          term_word(p, title);
         term_flushln(p);          term_flushln(p);
   
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         p->offset = p->rmargin;          p->offset = p->rmargin;
         p->rmargin = p->offset + buflen + titlen < p->maxrmargin ?          p->rmargin = p->offset + vollen + titlen < p->maxrmargin ?
             p->maxrmargin - titlen : p->maxrmargin;              p->maxrmargin - titlen : p->maxrmargin;
   
         term_word(p, buf);          term_word(p, volume);
         term_flushln(p);          term_flushln(p);
   
         p->flags &= ~TERMP_NOBREAK;          p->flags &= ~TERMP_NOBREAK;
Line 508  print_mdoc_head(struct termp *p, const void *arg)
Line 512  print_mdoc_head(struct termp *p, const void *arg)
         p->flags &= ~TERMP_NOSPACE;          p->flags &= ~TERMP_NOSPACE;
         p->offset = 0;          p->offset = 0;
         p->rmargin = p->maxrmargin;          p->rmargin = p->maxrmargin;
           free(title);
           free(volume);
 }  }
   
 static size_t  static size_t
Line 746  termp_it_pre(DECL_ARGS)
Line 752  termp_it_pre(DECL_ARGS)
                         term_word(p, "\\ \\ ");                          term_word(p, "\\ \\ ");
                 break;                  break;
         case LIST_inset:          case LIST_inset:
                 if (MDOC_BODY == n->type)                  if (MDOC_BODY == n->type && n->parent->head->nchild)
                         term_word(p, "\\ ");                          term_word(p, "\\ ");
                 break;                  break;
         default:          default:
Line 800  termp_it_pre(DECL_ARGS)
Line 806  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 (n->next->child &&                  if (NULL != n->next &&
                       NULL != n->next->child &&
                     (MDOC_Bl == n->next->child->tok ||                      (MDOC_Bl == n->next->child->tok ||
                      MDOC_Bd == n->next->child->tok))                       MDOC_Bd == n->next->child->tok))
                         break;                          break;
Line 856  termp_it_pre(DECL_ARGS)
Line 863  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 == n->type && n->next->child &&                  if (MDOC_HEAD == n->type &&
                       NULL != n->next &&
                       NULL != n->next->child &&
                     (MDOC_Bl == n->next->child->tok ||                      (MDOC_Bl == n->next->child->tok ||
                      MDOC_Bd == n->next->child->tok))                       MDOC_Bd == n->next->child->tok))
                         break;                          break;
Line 1021  termp_nm_pre(DECL_ARGS)
Line 1030  termp_nm_pre(DECL_ARGS)
         if (MDOC_HEAD == n->type)          if (MDOC_HEAD == n->type)
                 synopsis_pre(p, n->parent);                  synopsis_pre(p, n->parent);
   
         if (MDOC_HEAD == n->type && n->next->child) {          if (MDOC_HEAD == n->type &&
               NULL != n->next && NULL != n->next->child) {
                 p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_BRIND;                  p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_BRIND;
                 p->trailspace = 1;                  p->trailspace = 1;
                 p->rmargin = p->offset + term_len(p, 1);                  p->rmargin = p->offset + term_len(p, 1);
Line 1049  termp_nm_post(DECL_ARGS)
Line 1059  termp_nm_post(DECL_ARGS)
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
                 p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);                  p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);
         } else if (MDOC_HEAD == n->type && n->next->child) {          } else if (MDOC_HEAD == n->type &&
               NULL != n->next && NULL != n->next->child) {
                 term_flushln(p);                  term_flushln(p);
                 p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG);                  p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND | TERMP_HANG);
                 p->trailspace = 0;                  p->trailspace = 0;
Line 1163  termp_rv_pre(DECL_ARGS)
Line 1174  termp_rv_pre(DECL_ARGS)
         int              nchild;          int              nchild;
   
         term_newln(p);          term_newln(p);
         term_word(p, "The");  
   
         nchild = n->nchild;          nchild = n->nchild;
         for (n = n->child; n; n = n->next) {          if (nchild > 0) {
                 term_fontpush(p, TERMFONT_BOLD);                  term_word(p, "The");
                 term_word(p, n->string);  
                 term_fontpop(p);  
   
                 p->flags |= TERMP_NOSPACE;                  for (n = n->child; n; n = n->next) {
                 term_word(p, "()");                          term_fontpush(p, TERMFONT_BOLD);
                           term_word(p, n->string);
                           term_fontpop(p);
   
                 if (nchild > 2 && n->next) {  
                         p->flags |= TERMP_NOSPACE;                          p->flags |= TERMP_NOSPACE;
                         term_word(p, ",");                          term_word(p, "()");
   
                           if (n->next == NULL)
                                   continue;
   
                           if (nchild > 2) {
                                   p->flags |= TERMP_NOSPACE;
                                   term_word(p, ",");
                           }
                           if (n->next->next == NULL)
                                   term_word(p, "and");
                 }                  }
   
                 if (n->next && NULL == n->next->next)                  if (nchild > 1)
                         term_word(p, "and");                          term_word(p, "functions return");
         }                  else
                           term_word(p, "function returns");
   
         if (nchild > 1)                  term_word(p, "the value\\~0 if successful;");
                 term_word(p, "functions return");          } else
         else                  term_word(p, "Upon successful completion,"
                 term_word(p, "function returns");                      " the value\\~0 is returned;");
   
         term_word(p, "the value 0 if successful; otherwise the "          term_word(p, "otherwise the value\\~\\-1 is returned"
             "value -1 is returned and the global variable");              " and the global variable");
   
         term_fontpush(p, TERMFONT_UNDER);          term_fontpush(p, TERMFONT_UNDER);
         term_word(p, "errno");          term_word(p, "errno");
Line 1225  termp_ex_pre(DECL_ARGS)
Line 1245  termp_ex_pre(DECL_ARGS)
         }          }
   
         if (nchild > 1)          if (nchild > 1)
                 term_word(p, "utilities exit");                  term_word(p, "utilities exit\\~0");
         else          else
                 term_word(p, "utility exits");                  term_word(p, "utility exits\\~0");
   
         term_word(p, "0 on success, and >0 if an error occurs.");          term_word(p, "on success, and\\~>0 if an error occurs.");
   
         p->flags |= TERMP_SENTENCE;          p->flags |= TERMP_SENTENCE;
         return(0);          return(0);
Line 1567  termp_fa_pre(DECL_ARGS)
Line 1587  termp_fa_pre(DECL_ARGS)
 static int  static int
 termp_bd_pre(DECL_ARGS)  termp_bd_pre(DECL_ARGS)
 {  {
         size_t                   tabwidth, rm, rmax;          size_t                   tabwidth, lm, len, rm, rmax;
         struct mdoc_node        *nn;          struct mdoc_node        *nn;
   
         if (MDOC_BLOCK == n->type) {          if (MDOC_BLOCK == n->type) {
Line 1588  termp_bd_pre(DECL_ARGS)
Line 1608  termp_bd_pre(DECL_ARGS)
          */           */
   
         if (DISP_literal != n->norm->Bd.type &&          if (DISP_literal != n->norm->Bd.type &&
             DISP_unfilled != n->norm->Bd.type)              DISP_unfilled != n->norm->Bd.type &&
               DISP_centered != n->norm->Bd.type)
                 return(1);                  return(1);
   
         tabwidth = p->tabwidth;          tabwidth = p->tabwidth;
         if (DISP_literal == n->norm->Bd.type)          if (DISP_literal == n->norm->Bd.type)
                 p->tabwidth = term_len(p, 8);                  p->tabwidth = term_len(p, 8);
   
           lm = p->offset;
         rm = p->rmargin;          rm = p->rmargin;
         rmax = p->maxrmargin;          rmax = p->maxrmargin;
         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) {
                   if (DISP_centered == n->norm->Bd.type) {
                           if (MDOC_TEXT == nn->type) {
                                   len = term_strlen(p, nn->string);
                                   p->offset = len >= rm ? 0 :
                                       lm + len >= rm ? rm - len :
                                       (lm + rm - len) / 2;
                           } else
                                   p->offset = lm;
                   }
                 print_mdoc_node(p, pair, meta, 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
Line 1746  termp_ss_pre(DECL_ARGS)
Line 1777  termp_ss_pre(DECL_ARGS)
                 term_fontpush(p, TERMFONT_BOLD);                  term_fontpush(p, TERMFONT_BOLD);
                 p->offset = term_len(p, (p->defindent+1)/2);                  p->offset = term_len(p, (p->defindent+1)/2);
                 break;                  break;
           case MDOC_BODY:
                   p->offset = term_len(p, p->defindent);
                   break;
         default:          default:
                 break;                  break;
         }          }
Line 1757  static void
Line 1791  static void
 termp_ss_post(DECL_ARGS)  termp_ss_post(DECL_ARGS)
 {  {
   
         if (MDOC_HEAD == n->type)          if (n->type == MDOC_HEAD || n->type == MDOC_BODY)
                 term_newln(p);                  term_newln(p);
 }  }
   
Line 1829  termp_sp_pre(DECL_ARGS)
Line 1863  termp_sp_pre(DECL_ARGS)
 }  }
   
 static int  static int
   termp_es_pre(DECL_ARGS)
   {
   
           return(0);
   }
   
   static int
 termp_quote_pre(DECL_ARGS)  termp_quote_pre(DECL_ARGS)
 {  {
   
Line 1860  termp_quote_pre(DECL_ARGS)
Line 1901  termp_quote_pre(DECL_ARGS)
         case MDOC_Dq:          case MDOC_Dq:
                 term_word(p, "\\(lq");                  term_word(p, "\\(lq");
                 break;                  break;
           case MDOC_En:
                   if (NULL == n->norm->Es ||
                       NULL == n->norm->Es->child)
                           return(1);
                   term_word(p, n->norm->Es->child->string);
                   break;
         case MDOC_Eo:          case MDOC_Eo:
                 break;                  break;
         case MDOC_Po:          case MDOC_Po:
Line 1897  termp_quote_post(DECL_ARGS)
Line 1944  termp_quote_post(DECL_ARGS)
         if (MDOC_BODY != n->type && MDOC_ELEM != n->type)          if (MDOC_BODY != n->type && MDOC_ELEM != n->type)
                 return;                  return;
   
         p->flags |= TERMP_NOSPACE;          if (MDOC_En != n->tok)
                   p->flags |= TERMP_NOSPACE;
   
         switch (n->tok) {          switch (n->tok) {
         case MDOC_Ao:          case MDOC_Ao:
Line 1924  termp_quote_post(DECL_ARGS)
Line 1972  termp_quote_post(DECL_ARGS)
         case MDOC_Dq:          case MDOC_Dq:
                 term_word(p, "\\(rq");                  term_word(p, "\\(rq");
                 break;                  break;
           case MDOC_En:
                   if (NULL != n->norm->Es &&
                       NULL != n->norm->Es->child &&
                       NULL != n->norm->Es->child->next) {
                           p->flags |= TERMP_NOSPACE;
                           term_word(p, n->norm->Es->child->next->string);
                   }
                   break;
         case MDOC_Eo:          case MDOC_Eo:
                 break;                  break;
         case MDOC_Po:          case MDOC_Po:
Line 2033  static int
Line 2089  static int
 termp_sm_pre(DECL_ARGS)  termp_sm_pre(DECL_ARGS)
 {  {
   
         assert(n->child && MDOC_TEXT == n->child->type);          if (NULL == n->child)
         if (0 == strcmp("on", n->child->string)) {                  p->flags ^= TERMP_NONOSPACE;
                 if (p->col)          else if (0 == strcmp("on", n->child->string))
                         p->flags &= ~TERMP_NOSPACE;  
                 p->flags &= ~TERMP_NONOSPACE;                  p->flags &= ~TERMP_NONOSPACE;
         } else          else
                 p->flags |= TERMP_NONOSPACE;                  p->flags |= TERMP_NONOSPACE;
   
           if (p->col && ! (TERMP_NONOSPACE & p->flags))
                   p->flags &= ~TERMP_NOSPACE;
   
         return(0);          return(0);
 }  }

Legend:
Removed from v.1.265  
changed lines
  Added in v.1.279

CVSweb