[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.34 and 1.46

version 1.34, 2015/01/28 15:03:45 version 1.46, 2018/12/13 02:06:07
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2012, 2014, 2015, 2017 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 20 
Line 20 
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <ctype.h>  #include <ctype.h>
   #include <stdint.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <time.h>  #include <time.h>
   
 #include "mandoc.h"  
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
   #include "mandoc.h"
   #include "tbl.h"
 #include "libmandoc.h"  #include "libmandoc.h"
 #include "libroff.h"  #include "tbl_int.h"
   
 struct  tbl_phrase {  struct  tbl_phrase {
         char             name;          char             name;
Line 62  mods(struct tbl_node *tbl, struct tbl_cell *cp,
Line 64  mods(struct tbl_node *tbl, struct tbl_cell *cp,
                 int ln, const char *p, int *pos)                  int ln, const char *p, int *pos)
 {  {
         char            *endptr;          char            *endptr;
           size_t           sz;
   
 mod:  mod:
         while (p[*pos] == ' ' || p[*pos] == '\t')          while (p[*pos] == ' ' || p[*pos] == '\t')
Line 97  mod:
Line 100  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 110  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");
                 goto mod;                  goto mod;
         case 'p':          case 'p':
                 /* FALLTHROUGH */  
         case 'v':          case 'v':
                 if (p[*pos] == '-' || p[*pos] == '+')                  if (p[*pos] == '-' || p[*pos] == '+')
                         (*pos)++;                          (*pos)++;
Line 129  mod:
Line 130  mod:
         case 'u':          case 'u':
                 cp->flags |= TBL_CELL_UP;                  cp->flags |= TBL_CELL_UP;
                 goto mod;                  goto mod;
         case 'w':  /* XXX for now, ignore minimal column width */          case 'w':
                   sz = 0;
                   if (p[*pos] == '(') {
                           (*pos)++;
                           while (p[*pos + sz] != '\0' && p[*pos + sz] != ')')
                                   sz++;
                   } else
                           while (isdigit((unsigned char)p[*pos + sz]))
                                   sz++;
                   if (sz) {
                           free(cp->wstr);
                           cp->wstr = mandoc_strndup(p + *pos, sz);
                           *pos += sz;
                           if (p[*pos] == ')')
                                   (*pos)++;
                   }
                 goto mod;                  goto mod;
         case 'x':          case 'x':
                 cp->flags |= TBL_CELL_WMAX;                  cp->flags |= TBL_CELL_WMAX;
Line 150  mod:
Line 166  mod:
                 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 */          case 'B':
         case 'b':  
                 cp->flags |= TBL_CELL_BOLD;                  cp->flags |= TBL_CELL_BOLD;
                 goto mod;                  goto mod;
         case '2':          case '2':
                 /* FALLTHROUGH */          case 'I':
         case 'i':  
                 cp->flags |= TBL_CELL_ITALIC;                  cp->flags |= TBL_CELL_ITALIC;
                 goto mod;                  goto mod;
         case '1':          case '1':
                 /* 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 262  tbl_layout(struct tbl_node *tbl, int ln, const char *p
Line 292  tbl_layout(struct tbl_node *tbl, int ln, const char *p
                          */                           */
   
                         if (tbl->first_row == NULL) {                          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,                                  mandoc_msg(MANDOCERR_TBLLAYOUT_NONE,
                                     tbl->parse, ln, pos, NULL);                                      tbl->parse, ln, pos, NULL);
                                 rp = mandoc_calloc(1, sizeof(*rp));                                  cell_alloc(tbl, tbl->first_row,
                                 cell_alloc(tbl, rp, TBL_CELL_LEFT);                                      TBL_CELL_LEFT);
                                 tbl->first_row = tbl->last_row = rp;                                  if (tbl->opts.lvert < tbl->first_row->vert)
                                           tbl->opts.lvert = tbl->first_row->vert;
                                 return;                                  return;
                         }                          }
   
Line 279  tbl_layout(struct tbl_node *tbl, int ln, const char *p
Line 314  tbl_layout(struct tbl_node *tbl, int ln, const char *p
                                 if (tbl->opts.lvert < rp->vert)                                  if (tbl->opts.lvert < rp->vert)
                                         tbl->opts.lvert = rp->vert;                                          tbl->opts.lvert = rp->vert;
                                 if (rp->last != NULL &&                                  if (rp->last != NULL &&
                                     rp->last->head == tbl->last_head &&                                      rp->last->col + 1 == tbl->opts.cols &&
                                     tbl->opts.rvert < rp->last->vert)                                      tbl->opts.rvert < rp->last->vert)
                                         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);
         }          }
Line 304  static struct tbl_cell *
Line 357  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)
 {  {
         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->spacing = SIZE_MAX;
           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)
                   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++;  
   
         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.34  
changed lines
  Added in v.1.46

CVSweb