[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.40

version 1.32, 2015/01/26 18:42:30 version 1.40, 2015/10/06 18:32:20
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 97  mod:
Line 97  mod:
   
         switch (tolower((unsigned char)p[(*pos)++])) {          switch (tolower((unsigned char)p[(*pos)++])) {
         case 'b':          case 'b':
                 /* FALLTHROUGH */                  cp->flags |= TBL_CELL_BOLD;
         case 'i':                  goto mod;
                 /* FALLTHROUGH */  
         case 'r':  
                 (*pos)--;  
                 break;  
         case 'd':          case 'd':
                 cp->flags |= TBL_CELL_BALIGN;                  cp->flags |= TBL_CELL_BALIGN;
                 goto mod;                  goto mod;
Line 111  mod:
Line 107  mod:
                 goto mod;                  goto mod;
         case 'f':          case 'f':
                 break;                  break;
           case 'i':
                   cp->flags |= TBL_CELL_ITALIC;
                   goto mod;
         case 'm':          case 'm':
                 mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, tbl->parse,                  mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, tbl->parse,
                     ln, *pos, "m");                      ln, *pos, "m");
Line 137  mod:
Line 136  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]);
                 goto mod;                  goto mod;
         }          }
   
         switch (tolower((unsigned char)p[(*pos)++])) {          /* Ignore parenthised font names for now. */
   
           if (p[*pos] == '(')
                   goto mod;
   
           /* Support only one-character font-names for now. */
   
           if (p[*pos] == '\0' || (p[*pos + 1] != ' ' && p[*pos + 1] != '.')) {
                   mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse,
                       ln, *pos, "TS %s", p + *pos - 1);
                   if (p[*pos] != '\0')
                           (*pos)++;
                   if (p[*pos] != '\0')
                           (*pos)++;
                   goto mod;
           }
   
           switch (p[(*pos)++]) {
         case '3':          case '3':
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case 'b':          case 'B':
                 cp->flags |= TBL_CELL_BOLD;                  cp->flags |= TBL_CELL_BOLD;
                 goto mod;                  goto mod;
         case '2':          case '2':
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case 'i':          case 'I':
                 cp->flags |= TBL_CELL_ITALIC;                  cp->flags |= TBL_CELL_ITALIC;
                 goto mod;                  goto mod;
         case '1':          case '1':
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case 'r':          case 'R':
                 goto mod;                  goto mod;
         default:          default:
                 mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse,                  mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse,
Line 169  static void
Line 192  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 208  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 246  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
 tbl_layout(struct tbl_node *tbl, int ln, const char *p)  tbl_layout(struct tbl_node *tbl, int ln, const char *p, int pos)
 {  {
         struct tbl_row  *rp;          struct tbl_row  *rp;
         int              pos;  
   
         pos = 0;  
         rp = NULL;          rp = NULL;
   
         for (;;) {          for (;;) {
                 /* Skip whitespace before and after each cell. */                  /* Skip whitespace before and after each cell. */
   
Line 253  tbl_layout(struct tbl_node *tbl, int ln, const char *p
Line 271  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) {
                                   tbl->first_row = tbl->last_row =
                                       mandoc_calloc(1, sizeof(*rp));
                           }
                           if (tbl->first_row->first == NULL) {
                                   mandoc_msg(MANDOCERR_TBLLAYOUT_NONE,
                                       tbl->parse, ln, pos, NULL);
                                   cell_alloc(tbl, tbl->first_row,
                                       TBL_CELL_LEFT);
                                 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->col + 1 == tbl->opts.cols &&
                                       tbl->opts.rvert < rp->last->vert)
                                           tbl->opts.rvert = rp->last->vert;
   
                                   /* If the last line is empty, drop it. */
   
                                   if (rp->next != NULL &&
                                       rp->next->first == NULL) {
                                           free(rp->next);
                                           rp->next = NULL;
                                           tbl->last_row = rp;
                                   }
                           }
                         return;                          return;
                 default:  /* Cell. */                  default:  /* Cell. */
                         break;                          break;
                 }                  }
   
                 if (rp == NULL) {  /* First cell on this line. */                  /*
                         rp = mandoc_calloc(1, sizeof(*rp));                   * If the last line had at least one cell,
                         if (tbl->last_row)                   * start a new one; otherwise, continue it.
                                 tbl->last_row->next = rp;                   */
                         else  
                                 tbl->first_row = rp;                  if (rp == NULL) {
                         tbl->last_row = rp;                          if (tbl->last_row == NULL ||
                               tbl->last_row->first != NULL) {
                                   rp = mandoc_calloc(1, sizeof(*rp));
                                   if (tbl->last_row)
                                           tbl->last_row->next = rp;
                                   else
                                           tbl->first_row = rp;
                                   tbl->last_row = rp;
                           } else
                                   rp = tbl->last_row;
                 }                  }
                 cell(tbl, rp, ln, p, &pos);                  cell(tbl, rp, ln, p, &pos);
         }          }
 }  }
   
 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;  
   
         p = mandoc_calloc(1, sizeof(struct tbl_cell));          p = mandoc_calloc(1, sizeof(*p));
           p->pos = pos;
   
         if (NULL != (pp = rp->last)) {          if ((pp = rp->last) != NULL) {
                 pp->next = p;                  pp->next = p;
                 h = pp->head->next;                  p->col = pp->col + 1;
         } else {          } else
                 rp->first = p;                  rp->first = p;
                 h = tbl->first_head;  
         }  
         rp->last = p;          rp->last = p;
   
         p->pos = pos;          if (tbl->opts.cols <= p->col)
         p->vert = vert;                  tbl->opts.cols = p->col + 1;
   
         /* Re-use header. */          return p;
   
         if (h) {  
                 p->head = h;  
                 return(p);  
         }  
   
         hp = mandoc_calloc(1, sizeof(struct tbl_head));  
         hp->ident = tbl->opts.cols++;  
         hp->vert = vert;  
   
         if (tbl->last_head) {  
                 hp->prev = tbl->last_head;  
                 tbl->last_head->next = hp;  
         } else  
                 tbl->first_head = hp;  
         tbl->last_head = hp;  
   
         p->head = hp;  
         return(p);  
 }  }

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

CVSweb