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

Diff for /mandoc/tbl_layout.c between version 1.32 and 1.33

version 1.32, 2015/01/26 18:42:30 version 1.33, 2015/01/27 05:21:45
Line 54  static void   mods(struct tbl_node *, struct tbl_cell 
Line 54  static void   mods(struct tbl_node *, struct tbl_cell 
 static  void             cell(struct tbl_node *, struct tbl_row *,  static  void             cell(struct tbl_node *, struct tbl_row *,
                                 int, const char *, int *);                                  int, const char *, int *);
 static  struct tbl_cell *cell_alloc(struct tbl_node *, struct tbl_row *,  static  struct tbl_cell *cell_alloc(struct tbl_node *, struct tbl_row *,
                                 enum tbl_cellt, int vert);                                  enum tbl_cellt);
   
   
 static void  static void
Line 69  mod:
Line 69  mod:
   
         /* Row delimiters and cell specifiers end modifier lists. */          /* Row delimiters and cell specifiers end modifier lists. */
   
         if (strchr(".,-=^_ACLNRSaclnrs|", p[*pos]) != NULL)          if (strchr(".,-=^_ACLNRSaclnrs", p[*pos]) != NULL)
                 return;                  return;
   
         /* Throw away parenthesised expression. */          /* Throw away parenthesised expression. */
Line 137  mod:
Line 137  mod:
         case 'z':          case 'z':
                 cp->flags |= TBL_CELL_WIGN;                  cp->flags |= TBL_CELL_WIGN;
                 goto mod;                  goto mod;
           case '|':
                   if (cp->vert < 2)
                           cp->vert++;
                   else
                           mandoc_msg(MANDOCERR_TBLLAYOUT_VERT,
                               tbl->parse, ln, *pos - 1, NULL);
                   goto mod;
         default:          default:
                 mandoc_vmsg(MANDOCERR_TBLLAYOUT_CHAR, tbl->parse,                  mandoc_vmsg(MANDOCERR_TBLLAYOUT_CHAR, tbl->parse,
                     ln, *pos - 1, "%c", p[*pos - 1]);                      ln, *pos - 1, "%c", p[*pos - 1]);
Line 169  static void
Line 176  static void
 cell(struct tbl_node *tbl, struct tbl_row *rp,  cell(struct tbl_node *tbl, struct tbl_row *rp,
                 int ln, const char *p, int *pos)                  int ln, const char *p, int *pos)
 {  {
         int              vert, i;          int              i;
         enum tbl_cellt   c;          enum tbl_cellt   c;
   
         /* Handle vertical lines. */          /* Handle leading vertical lines */
   
         vert = 0;  
 again:  
         while (p[*pos] == ' ' || p[*pos] == '\t' || p[*pos] == '|') {          while (p[*pos] == ' ' || p[*pos] == '\t' || p[*pos] == '|') {
                 if (p[*pos] == '|') {                  if (p[*pos] == '|') {
                         if (vert < 2)                          if (rp->vert < 2)
                                 vert++;                                  rp->vert++;
                         else                          else
                                 mandoc_msg(MANDOCERR_TBLLAYOUT_VERT,                                  mandoc_msg(MANDOCERR_TBLLAYOUT_VERT,
                                     tbl->parse, ln, *pos, NULL);                                      tbl->parse, ln, *pos, NULL);
Line 187  again:
Line 192  again:
                 (*pos)++;                  (*pos)++;
         }          }
   
         /* Handle trailing vertical lines */  again:
           while (p[*pos] == ' ' || p[*pos] == '\t')
                   (*pos)++;
   
         if ('.' == p[*pos] || '\0' == p[*pos]) {          if (p[*pos] == '.' || p[*pos] == '\0')
                 rp->vert = vert;  
                 return;                  return;
         }  
   
         /* Parse the column position (`c', `l', `r', ...). */          /* Parse the column position (`c', `l', `r', ...). */
   
Line 225  again:
Line 230  again:
   
         /* Allocate cell then parse its modifiers. */          /* Allocate cell then parse its modifiers. */
   
         mods(tbl, cell_alloc(tbl, rp, c, vert), ln, p, pos);          mods(tbl, cell_alloc(tbl, rp, c), ln, p, pos);
 }  }
   
 void  void
Line 253  tbl_layout(struct tbl_node *tbl, int ln, const char *p
Line 258  tbl_layout(struct tbl_node *tbl, int ln, const char *p
                 case '.':  /* End of layout. */                  case '.':  /* End of layout. */
                         pos++;                          pos++;
                         tbl->part = TBL_PART_DATA;                          tbl->part = TBL_PART_DATA;
                         if (tbl->first_row != NULL)  
                           /*
                            * When the layout is completely empty,
                            * default to one left-justified column.
                            */
   
                           if (tbl->first_row == NULL) {
                                   mandoc_msg(MANDOCERR_TBLLAYOUT_NONE,
                                       tbl->parse, ln, pos, NULL);
                                   rp = mandoc_calloc(1, sizeof(*rp));
                                   cell_alloc(tbl, rp, TBL_CELL_LEFT);
                                   tbl->first_row = tbl->last_row = rp;
                                 return;                                  return;
                         mandoc_msg(MANDOCERR_TBLLAYOUT_NONE,                          }
                             tbl->parse, ln, pos, NULL);  
                         rp = mandoc_calloc(1, sizeof(*rp));                          /*
                         cell_alloc(tbl, rp, TBL_CELL_LEFT, 0);                           * Search for the widest line
                         tbl->first_row = tbl->last_row = rp;                           * along the left and right margins.
                            */
   
                           for (rp = tbl->first_row; rp; rp = rp->next) {
                                   if (tbl->opts.lvert < rp->vert)
                                           tbl->opts.lvert = rp->vert;
                                   if (rp->last != NULL &&
                                       rp->last->head == tbl->last_head &&
                                       tbl->opts.rvert < rp->last->vert)
                                           tbl->opts.rvert = rp->last->vert;
                           }
                         return;                          return;
                 default:  /* Cell. */                  default:  /* Cell. */
                         break;                          break;
Line 278  tbl_layout(struct tbl_node *tbl, int ln, const char *p
Line 304  tbl_layout(struct tbl_node *tbl, int ln, const char *p
 }  }
   
 static struct tbl_cell *  static struct tbl_cell *
 cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos,  cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos)
                 int vert)  
 {  {
         struct tbl_cell *p, *pp;          struct tbl_cell *p, *pp;
         struct tbl_head *h, *hp;          struct tbl_head *h, *hp;
Line 296  cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e
Line 321  cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e
         rp->last = p;          rp->last = p;
   
         p->pos = pos;          p->pos = pos;
         p->vert = vert;  
   
         /* Re-use header. */          /* Re-use header. */
   
Line 307  cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e
Line 331  cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e
   
         hp = mandoc_calloc(1, sizeof(struct tbl_head));          hp = mandoc_calloc(1, sizeof(struct tbl_head));
         hp->ident = tbl->opts.cols++;          hp->ident = tbl->opts.cols++;
         hp->vert = vert;  
   
         if (tbl->last_head) {          if (tbl->last_head) {
                 hp->prev = tbl->last_head;                  hp->prev = tbl->last_head;

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

CVSweb