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

Diff for /mandoc/term.c between version 1.32 and 1.38

version 1.32, 2009/03/01 23:14:15 version 1.38, 2009/03/03 22:28:21
Line 25 
Line 25 
   
 #include "term.h"  #include "term.h"
   
 #define INDENT            6  
   
 /*  /*
  * Performs actions on nodes of the abstract syntax tree.  Both pre- and   * Performs actions on nodes of the abstract syntax tree.  Both pre- and
  * post-fix operations are defined here.   * post-fix operations are defined here.
  */   */
   
 /* FIXME: indent/tab. */  
 /* FIXME: macro arguments can be escaped. */  /* FIXME: macro arguments can be escaped. */
   
 #define TTYPE_PROG        0  #define TTYPE_PROG        0
Line 53 
Line 50 
 #define TTYPE_INCLUDE     15  #define TTYPE_INCLUDE     15
 #define TTYPE_SYMB        16  #define TTYPE_SYMB        16
 #define TTYPE_SYMBOL      17  #define TTYPE_SYMBOL      17
 #define TTYPE_NMAX        18  #define TTYPE_DIAG        18
   #define TTYPE_NMAX        19
   
 /*  /*
  * These define "styles" for element types, like command arguments or   * These define "styles" for element types, like command arguments or
Line 61 
Line 59 
  * the same thing (like .Ex -std cmd and .Nm cmd).   * the same thing (like .Ex -std cmd and .Nm cmd).
  */   */
   
   /* TODO: abstract this into mdocterm.c. */
   
 const   int ttypes[TTYPE_NMAX] = {  const   int ttypes[TTYPE_NMAX] = {
         TERMP_BOLD,             /* TTYPE_PROG */          TERMP_BOLD,             /* TTYPE_PROG */
         TERMP_BOLD,             /* TTYPE_CMD_FLAG */          TERMP_BOLD,             /* TTYPE_CMD_FLAG */
Line 79  const int ttypes[TTYPE_NMAX] = {
Line 79  const int ttypes[TTYPE_NMAX] = {
         TERMP_BOLD,             /* TTYPE_CMD */          TERMP_BOLD,             /* TTYPE_CMD */
         TERMP_BOLD,             /* TTYPE_INCLUDE */          TERMP_BOLD,             /* TTYPE_INCLUDE */
         TERMP_BOLD,             /* TTYPE_SYMB */          TERMP_BOLD,             /* TTYPE_SYMB */
         TERMP_BOLD              /* TTYPE_SYMBOL */          TERMP_BOLD,             /* TTYPE_SYMBOL */
           TERMP_BOLD              /* TTYPE_DIAG */
 };  };
   
 static  int               arg_hasattr(int, size_t,  static  int               arg_hasattr(int, size_t,
Line 416  termp_it_pre(DECL_ARGS)
Line 417  termp_it_pre(DECL_ARGS)
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case (MDOC_Tag):                  case (MDOC_Tag):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                   case (MDOC_Inset):
                           /* FALLTHROUGH */
                   case (MDOC_Diag):
                           /* FALLTHROUGH */
                 case (MDOC_Ohang):                  case (MDOC_Ohang):
                         type = bl->argv[i].arg;                          type = bl->argv[i].arg;
                         i = (int)bl->argc;                          i = (int)bl->argc;
Line 450  termp_it_pre(DECL_ARGS)
Line 455  termp_it_pre(DECL_ARGS)
         case (MDOC_Enum):          case (MDOC_Enum):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Hyphen):          case (MDOC_Hyphen):
                 width = width > 6 ? width : 6;                  width = width > 4 ? width : 4;
                 break;                  break;
         case (MDOC_Tag):          case (MDOC_Tag):
                 /* FIXME: auto-size. */  
                 if (0 == width)                  if (0 == width)
                         errx(1, "need non-zero -width");                          errx(1, "need non-zero -width");
                 break;                  break;
Line 463  termp_it_pre(DECL_ARGS)
Line 467  termp_it_pre(DECL_ARGS)
   
         /* Word-wrap control. */          /* Word-wrap control. */
   
         p->flags |= TERMP_NOSPACE;  
   
         switch (type) {          switch (type) {
           case (MDOC_Diag):
                   /* XXX - ignore child macros!? */
                   if (MDOC_HEAD == node->type)
                           TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_DIAG]);
                   /* FALLTHROUGH */
           case (MDOC_Inset):
                   if (MDOC_HEAD == node->type)
                           p->flags |= TERMP_NOSPACE;
                   break;
         case (MDOC_Bullet):          case (MDOC_Bullet):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Dash):          case (MDOC_Dash):
Line 475  termp_it_pre(DECL_ARGS)
Line 486  termp_it_pre(DECL_ARGS)
         case (MDOC_Hyphen):          case (MDOC_Hyphen):
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (MDOC_Tag):          case (MDOC_Tag):
                   p->flags |= TERMP_NOSPACE;
                 if (MDOC_HEAD == node->type)                  if (MDOC_HEAD == node->type)
                         p->flags |= TERMP_NOBREAK;                          p->flags |= TERMP_NOBREAK;
                 else if (MDOC_BODY == node->type)                  else if (MDOC_BODY == node->type)
Line 541  termp_it_pre(DECL_ARGS)
Line 553  termp_it_pre(DECL_ARGS)
 static void  static void
 termp_it_post(DECL_ARGS)  termp_it_post(DECL_ARGS)
 {  {
           int                type, i;
           struct mdoc_block *bl;
   
         if (MDOC_BODY != node->type && MDOC_HEAD != node->type)          if (MDOC_BODY != node->type && MDOC_HEAD != node->type)
                 return;                  return;
   
         flushln(p);          assert(MDOC_BLOCK == node->parent->parent->parent->type);
           assert(MDOC_Bl == node->parent->parent->parent->tok);
           bl = &node->parent->parent->parent->data.block;
   
           for (type = -1, i = 0; i < (int)bl->argc; i++)
                   switch (bl->argv[i].arg) {
                   case (MDOC_Bullet):
                           /* FALLTHROUGH */
                   case (MDOC_Dash):
                           /* FALLTHROUGH */
                   case (MDOC_Enum):
                           /* FALLTHROUGH */
                   case (MDOC_Hyphen):
                           /* FALLTHROUGH */
                   case (MDOC_Tag):
                           /* FALLTHROUGH */
                   case (MDOC_Diag):
                           /* FALLTHROUGH */
                   case (MDOC_Inset):
                           /* FALLTHROUGH */
                   case (MDOC_Ohang):
                           type = bl->argv[i].arg;
                           i = (int)bl->argc;
                           break;
                   default:
                           errx(1, "list type not supported");
                           /* NOTREACHED */
                   }
   
   
           switch (type) {
           case (MDOC_Diag):
                   /* FALLTHROUGH */
           case (MDOC_Inset):
                   break;
           default:
                   flushln(p);
                   break;
           }
   
         p->offset = pair->offset;          p->offset = pair->offset;
         p->rmargin = pair->rmargin;          p->rmargin = pair->rmargin;
   
         if (MDOC_HEAD == node->type)          switch (type) {
                 p->flags &= ~TERMP_NOBREAK;          case (MDOC_Inset):
         else if (MDOC_BODY == node->type)                  break;
                 p->flags &= ~TERMP_NOLPAD;          default:
                   if (MDOC_HEAD == node->type)
                           p->flags &= ~TERMP_NOBREAK;
                   else if (MDOC_BODY == node->type)
                           p->flags &= ~TERMP_NOLPAD;
                   break;
           }
 }  }
   
   
Line 934  static int
Line 992  static int
 termp_ft_pre(DECL_ARGS)  termp_ft_pre(DECL_ARGS)
 {  {
   
           if (SEC_SYNOPSIS == node->sec)
                   if (node->prev && MDOC_Fo == node->prev->tok)
                           vspace(p);
         TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_TYPE]);          TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_TYPE]);
         return(1);          return(1);
 }  }
Line 944  static void
Line 1005  static void
 termp_ft_post(DECL_ARGS)  termp_ft_post(DECL_ARGS)
 {  {
   
         if (node->sec == SEC_SYNOPSIS)          if (SEC_SYNOPSIS == node->sec)
                 newln(p);                  newln(p);
 }  }
   
Line 1050  static int
Line 1111  static int
 termp_bd_pre(DECL_ARGS)  termp_bd_pre(DECL_ARGS)
 {  {
         const struct mdoc_block *bl;          const struct mdoc_block *bl;
         const struct mdoc_node *n;          const struct mdoc_node  *n;
         int              i;          int              i, type;
   
         if (MDOC_BLOCK == node->type) {          if (MDOC_BLOCK == node->type) {
                 if (node->prev)                  if (node->prev)
Line 1060  termp_bd_pre(DECL_ARGS)
Line 1121  termp_bd_pre(DECL_ARGS)
         } else if (MDOC_BODY != node->type)          } else if (MDOC_BODY != node->type)
                 return(1);                  return(1);
   
         assert(MDOC_BLOCK == node->parent->type);  
         pair->offset = p->offset;          pair->offset = p->offset;
   
         bl = &node->parent->data.block;          bl = &node->parent->data.block;
   
           for (type = -1, i = 0; i < (int)bl->argc; i++) {
                   switch (bl->argv[i].arg) {
                   case (MDOC_Ragged):
                           /* FALLTHROUGH */
                   case (MDOC_Filled):
                           /* FALLTHROUGH */
                   case (MDOC_Unfilled):
                           /* FALLTHROUGH */
                   case (MDOC_Literal):
                           type = bl->argv[i].arg;
                           i = (int)bl->argc;
                           break;
                   default:
                           errx(1, "display type not supported");
                   }
           }
   
           assert(-1 != type);
   
         i = arg_getattr(MDOC_Offset, bl->argc, bl->argv);          i = arg_getattr(MDOC_Offset, bl->argc, bl->argv);
         if (-1 != i) {          if (-1 != i) {
                 assert(1 == bl->argv[i].sz);                  assert(1 == bl->argv[i].sz);
                 p->offset += arg_offset(&bl->argv[i]);                  p->offset += arg_offset(&bl->argv[i]);
         }          }
   
   
           switch (type) {
           case (MDOC_Literal):
                   /* FALLTHROUGH */
           case (MDOC_Unfilled):
                   break;
           default:
                   return(1);
           }
   
         p->flags |= TERMP_LITERAL;          p->flags |= TERMP_LITERAL;
   
         for (n = node->child; n; n = n->next) {          for (n = node->child; n; n = n->next) {
                 if (MDOC_TEXT != n->type)                  if (MDOC_TEXT != n->type) {
                         errx(1, "non-text displays unsupported");                          warnx("non-text children not yet allowed");
                 if ((*n->data.text.string)) {                          continue;
                         word(p, n->data.text.string);                  }
                         flushln(p);                  word(p, n->data.text.string);
                 } else                  flushln(p);
                         vspace(p);  
   
         }          }
   
         p->flags &= ~TERMP_LITERAL;  
         return(0);          return(0);
 }  }
   
Line 1096  termp_bd_post(DECL_ARGS)
Line 1181  termp_bd_post(DECL_ARGS)
   
         if (MDOC_BODY != node->type)          if (MDOC_BODY != node->type)
                 return;                  return;
         newln(p);  
           if ( ! (p->flags & TERMP_LITERAL))
                   flushln(p);
   
           p->flags &= ~TERMP_LITERAL;
         p->offset = pair->offset;          p->offset = pair->offset;
 }  }
   
Line 1141  static void
Line 1230  static void
 termp_bx_post(DECL_ARGS)  termp_bx_post(DECL_ARGS)
 {  {
   
         p->flags |= TERMP_NOSPACE;          if (node->child)
                   p->flags |= TERMP_NOSPACE;
         word(p, "BSD");          word(p, "BSD");
 }  }
   
Line 1292  termp_cd_pre(DECL_ARGS)
Line 1382  termp_cd_pre(DECL_ARGS)
 {  {
   
         TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CONFIG]);          TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CONFIG]);
           newln(p);
         return(1);          return(1);
 }  }
   

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.38

CVSweb