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

Diff for /mandoc/man_term.c between version 1.234 and 1.238

version 1.234, 2020/02/27 01:43:52 version 1.238, 2022/08/15 13:04:43
Line 1 
Line 1 
 /*      $Id$ */  /* $Id$ */
 /*  /*
    * Copyright (c) 2010-2015,2017-2020,2022 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017-2020 Ingo Schwarze <schwarze@openbsd.org>  
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 14 
Line 14 
  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  * 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.
    *
    * Plain text formatter for man(7), used by mandoc(1)
    * for ASCII, UTF-8, PostScript, and PDF output.
  */   */
 #include "config.h"  #include "config.h"
   
Line 32 
Line 35 
 #include "man.h"  #include "man.h"
 #include "out.h"  #include "out.h"
 #include "term.h"  #include "term.h"
 #include "tag.h"  #include "term_tag.h"
 #include "main.h"  #include "main.h"
   
 #define MAXMARGINS        64 /* maximum number of indented scopes */  #define MAXMARGINS        64 /* maximum number of indented scopes */
Line 94  static void    post_SY(DECL_ARGS);
Line 97  static void    post_SY(DECL_ARGS);
 static  void              post_TP(DECL_ARGS);  static  void              post_TP(DECL_ARGS);
 static  void              post_UR(DECL_ARGS);  static  void              post_UR(DECL_ARGS);
   
 static  void              tag_man(struct termp *, struct roff_node *);  
   
 static const struct man_term_act man_term_acts[MAN_MAX - MAN_TH] = {  static const struct man_term_act man_term_acts[MAN_MAX - MAN_TH] = {
         { NULL, NULL, 0 }, /* TH */          { NULL, NULL, 0 }, /* TH */
         { pre_SH, post_SH, 0 }, /* SH */          { pre_SH, post_SH, 0 }, /* SH */
Line 120  static const struct man_term_act man_term_acts[MAN_MAX
Line 121  static const struct man_term_act man_term_acts[MAN_MAX
         { pre_alternate, NULL, 0 }, /* RI */          { pre_alternate, NULL, 0 }, /* RI */
         { NULL, NULL, 0 }, /* RE */          { NULL, NULL, 0 }, /* RE */
         { pre_RS, post_RS, 0 }, /* RS */          { pre_RS, post_RS, 0 }, /* RS */
         { pre_DT, NULL, 0 }, /* DT */          { pre_DT, NULL, MAN_NOTEXT }, /* DT */
         { pre_ign, NULL, MAN_NOTEXT }, /* UC */          { pre_ign, NULL, MAN_NOTEXT }, /* UC */
         { pre_PD, NULL, MAN_NOTEXT }, /* PD */          { pre_PD, NULL, MAN_NOTEXT }, /* PD */
         { pre_ign, NULL, 0 }, /* AT */          { pre_ign, NULL, MAN_NOTEXT }, /* AT */
         { pre_in, NULL, MAN_NOTEXT }, /* in */          { pre_in, NULL, MAN_NOTEXT }, /* in */
         { pre_SY, post_SY, 0 }, /* SY */          { pre_SY, post_SY, 0 }, /* SY */
         { NULL, NULL, 0 }, /* YS */          { NULL, NULL, 0 }, /* YS */
Line 539  pre_IP(DECL_ARGS)
Line 540  pre_IP(DECL_ARGS)
         case ROFFT_HEAD:          case ROFFT_HEAD:
                 p->tcol->offset = mt->offset;                  p->tcol->offset = mt->offset;
                 p->tcol->rmargin = mt->offset + len;                  p->tcol->rmargin = mt->offset + len;
                 if (n->child != NULL) {                  if (n->child != NULL)
                         print_man_node(p, mt, n->child, meta);                          print_man_node(p, mt, n->child, meta);
                         tag_man(p, n->child);  
                 }  
                 return 0;                  return 0;
         case ROFFT_BODY:          case ROFFT_BODY:
                 p->tcol->offset = mt->offset + len;                  p->tcol->offset = mt->offset + len;
Line 622  pre_TP(DECL_ARGS)
Line 621  pre_TP(DECL_ARGS)
                 while (nn != NULL && (nn->flags & NODE_LINE) == 0)                  while (nn != NULL && (nn->flags & NODE_LINE) == 0)
                         nn = nn->next;                          nn = nn->next;
   
                 if (nn == NULL)  
                         return 0;  
   
                 if (nn->type == ROFFT_TEXT)  
                         tag_man(p, nn);  
                 else if (nn->child != NULL &&  
                     nn->child->type == ROFFT_TEXT &&  
                     (nn->tok == MAN_B || nn->tok == MAN_BI ||  
                      nn->tok == MAN_BR || nn->tok == MAN_I ||  
                      nn->tok == MAN_IB || nn->tok == MAN_IR))  
                         tag_man(p, nn->child);  
   
                 while (nn != NULL) {                  while (nn != NULL) {
                         print_man_node(p, mt, nn, meta);                          print_man_node(p, mt, nn, meta);
                         nn = nn->next;                          nn = nn->next;
Line 913  print_man_node(DECL_ARGS)
Line 900  print_man_node(DECL_ARGS)
         const struct man_term_act *act;          const struct man_term_act *act;
         int c;          int c;
   
           if (n->flags & NODE_ID)
                   term_tag_write(n, p->line);
   
         switch (n->type) {          switch (n->type) {
         case ROFFT_TEXT:          case ROFFT_TEXT:
                 /*                  /*
Line 985  out:
Line 975  out:
             ! (p->flags & (TERMP_NOBREAK | TERMP_NONEWLINE)) &&              ! (p->flags & (TERMP_NOBREAK | TERMP_NONEWLINE)) &&
             (n->next == NULL || n->next->flags & NODE_LINE)) {              (n->next == NULL || n->next->flags & NODE_LINE)) {
                 p->flags |= TERMP_BRNEVER | TERMP_NOSPACE;                  p->flags |= TERMP_BRNEVER | TERMP_NOSPACE;
                   p->tcol->taboff = 0;
                 if (n->string != NULL && *n->string != '\0')                  if (n->string != NULL && *n->string != '\0')
                         term_flushln(p);                          term_flushln(p);
                 else                  else
Line 1031  print_man_foot(struct termp *p, const struct roff_meta
Line 1022  print_man_foot(struct termp *p, const struct roff_meta
          */           */
   
         if ( ! p->mdocstyle) {          if ( ! p->mdocstyle) {
                 if (meta->hasbody) {  
                         term_vspace(p);  
                         term_vspace(p);  
                 }  
                 mandoc_asprintf(&title, "%s(%s)",                  mandoc_asprintf(&title, "%s(%s)",
                     meta->title, meta->msec);                      meta->title, meta->msec);
         } else if (meta->os != NULL) {          } else if (meta->os != NULL) {
Line 1153  print_man_head(struct termp *p, const struct roff_meta
Line 1140  print_man_head(struct termp *p, const struct roff_meta
          */           */
   
         term_vspace(p);          term_vspace(p);
         if ( ! p->mdocstyle) {  
                 term_vspace(p);  
                 term_vspace(p);  
         }  
         free(title);          free(title);
 }  
   
 /*  
  * Skip leading whitespace, dashes, backslashes, and font escapes,  
  * then create a tag if the first following byte is a letter.  
  * Priority is high unless whitespace is present.  
  */  
 static void  
 tag_man(struct termp *p, struct roff_node *n)  
 {  
         const char      *cp, *arg;  
         int              prio, sz;  
   
         assert(n->type == ROFFT_TEXT);  
         cp = n->string;  
         prio = TAG_STRONG;  
         for (;;) {  
                 switch (*cp) {  
                 case ' ':  
                 case '\t':  
                         prio = TAG_WEAK;  
                         /* FALLTHROUGH */  
                 case '-':  
                         cp++;  
                         break;  
                 case '\\':  
                         cp++;  
                         switch (mandoc_escape(&cp, &arg, &sz)) {  
                         case ESCAPE_FONT:  
                         case ESCAPE_FONTROMAN:  
                         case ESCAPE_FONTITALIC:  
                         case ESCAPE_FONTBOLD:  
                         case ESCAPE_FONTPREV:  
                         case ESCAPE_FONTBI:  
                                 break;  
                         case ESCAPE_SPECIAL:  
                                 if (sz != 1)  
                                         return;  
                                 switch (*arg) {  
                                 case '&':  
                                 case '-':  
                                 case 'e':  
                                         break;  
                                 default:  
                                         return;  
                                 }  
                                 break;  
                         default:  
                                 return;  
                         }  
                         break;  
                 default:  
                         if (isalpha((unsigned char)*cp))  
                                 tag_put(cp, prio, p->line);  
                         return;  
                 }  
         }  
 }  }

Legend:
Removed from v.1.234  
changed lines
  Added in v.1.238

CVSweb