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

Diff for /mandoc/tbl_data.c between version 1.53 and 1.59

version 1.53, 2020/01/11 20:48:18 version 1.59, 2021/09/10 13:24:38
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) 2011,2015,2017,2018,2019 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011,2015,2017-2019,2021 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 46  getdata(struct tbl_node *tbl, struct tbl_span *dp,
Line 46  getdata(struct tbl_node *tbl, struct tbl_span *dp,
         struct tbl_dat  *dat, *pdat;          struct tbl_dat  *dat, *pdat;
         struct tbl_cell *cp;          struct tbl_cell *cp;
         struct tbl_span *pdp;          struct tbl_span *pdp;
         int              sv;          const char      *ccp;
           int              startpos, endpos;
   
         /*          /*
          * Determine the length of the string in the cell           * Determine the length of the string in the cell
          * and advance the parse point to the end of the cell.           * and advance the parse point to the end of the cell.
          */           */
   
         sv = *pos;          startpos = *pos;
         while (p[*pos] != '\0' && p[*pos] != tbl->opts.tab)          ccp = p + startpos;
                 (*pos)++;          while (*ccp != '\0' && *ccp != tbl->opts.tab)
                   if (*ccp++ == '\\')
                           mandoc_escape(&ccp, NULL, NULL);
           *pos = ccp - p;
   
         /* Advance to the next layout cell, skipping spanners. */          /* Advance to the next layout cell, skipping spanners. */
   
Line 74  getdata(struct tbl_node *tbl, struct tbl_span *dp,
Line 78  getdata(struct tbl_node *tbl, struct tbl_span *dp,
                 if (dp->layout->last->col + 1 < dp->opts->cols) {                  if (dp->layout->last->col + 1 < dp->opts->cols) {
                         cp = mandoc_calloc(1, sizeof(*cp));                          cp = mandoc_calloc(1, sizeof(*cp));
                         cp->pos = TBL_CELL_LEFT;                          cp->pos = TBL_CELL_LEFT;
                           cp->font = ESCAPE_FONTROMAN;
                         cp->spacing = SIZE_MAX;                          cp->spacing = SIZE_MAX;
                         dp->layout->last->next = cp;                          dp->layout->last->next = cp;
                         cp->col = dp->layout->last->col + 1;                          cp->col = dp->layout->last->col + 1;
                         dp->layout->last = cp;                          dp->layout->last = cp;
                 } else {                  } else {
                         mandoc_msg(MANDOCERR_TBLDATA_EXTRA,                          mandoc_msg(MANDOCERR_TBLDATA_EXTRA,
                             ln, sv, "%s", p + sv);                              ln, startpos, "%s", p + startpos);
                         while (p[*pos] != '\0')                          while (p[*pos] != '\0')
                                 (*pos)++;                                  (*pos)++;
                         return;                          return;
Line 105  getdata(struct tbl_node *tbl, struct tbl_span *dp,
Line 110  getdata(struct tbl_node *tbl, struct tbl_span *dp,
          */           */
   
         if (cp->pos == TBL_CELL_DOWN ||          if (cp->pos == TBL_CELL_DOWN ||
             (*pos - sv == 2 && p[sv] == '\\' && p[sv + 1] == '^')) {              (*pos - startpos == 2 &&
                p[startpos] == '\\' && p[startpos + 1] == '^')) {
                 pdp = dp;                  pdp = dp;
                 while ((pdp = pdp->prev) != NULL) {                  while ((pdp = pdp->prev) != NULL) {
                         pdat = pdp->first;                          pdat = pdp->first;
Line 141  getdata(struct tbl_node *tbl, struct tbl_span *dp,
Line 147  getdata(struct tbl_node *tbl, struct tbl_span *dp,
                 dp->last->next = dat;                  dp->last->next = dat;
         dp->last = dat;          dp->last = dat;
   
           /* Strip leading and trailing spaces, if requested. */
   
           endpos = *pos;
           if (dp->opts->opts & TBL_OPT_NOSPACE) {
                   while (p[startpos] == ' ')
                           startpos++;
                   while (endpos > startpos && p[endpos - 1] == ' ')
                           endpos--;
           }
   
         /*          /*
          * Check for a continued-data scope opening.  This consists of a           * Check for a continued-data scope opening.  This consists of a
          * trailing `T{' at the end of the line.  Subsequent lines,           * trailing `T{' at the end of the line.  Subsequent lines,
          * until a standalone `T}', are included in our cell.           * until a standalone `T}', are included in our cell.
          */           */
   
         if (*pos - sv == 2 && p[sv] == 'T' && p[sv + 1] == '{') {          if (endpos - startpos == 2 &&
               p[startpos] == 'T' && p[startpos + 1] == '{') {
                 tbl->part = TBL_PART_CDATA;                  tbl->part = TBL_PART_CDATA;
                 return;                  return;
         }          }
   
         dat->string = mandoc_strndup(p + sv, *pos - sv);          dat->string = mandoc_strndup(p + startpos, endpos - startpos);
   
         if (p[*pos] != '\0')          if (p[*pos] != '\0')
                 (*pos)++;                  (*pos)++;
Line 173  getdata(struct tbl_node *tbl, struct tbl_span *dp,
Line 190  getdata(struct tbl_node *tbl, struct tbl_span *dp,
             dat->layout->pos == TBL_CELL_DOWN) &&              dat->layout->pos == TBL_CELL_DOWN) &&
             dat->pos == TBL_DATA_DATA && *dat->string != '\0')              dat->pos == TBL_DATA_DATA && *dat->string != '\0')
                 mandoc_msg(MANDOCERR_TBLDATA_SPAN,                  mandoc_msg(MANDOCERR_TBLDATA_SPAN,
                     ln, sv, "%s", dat->string);                      ln, startpos, "%s", dat->string);
 }  }
   
 void  void
Line 186  tbl_cdata(struct tbl_node *tbl, int ln, const char *p,
Line 203  tbl_cdata(struct tbl_node *tbl, int ln, const char *p,
   
         if (p[pos] == 'T' && p[pos + 1] == '}') {          if (p[pos] == 'T' && p[pos + 1] == '}') {
                 pos += 2;                  pos += 2;
                   if (tbl->opts.opts & TBL_OPT_NOSPACE)
                           while (p[pos] == ' ')
                                   pos++;
                 if (p[pos] == tbl->opts.tab) {                  if (p[pos] == tbl->opts.tab) {
                         tbl->part = TBL_PART_DATA;                          tbl->part = TBL_PART_DATA;
                         pos++;                          pos++;
Line 244  tbl_data(struct tbl_node *tbl, int ln, const char *p, 
Line 264  tbl_data(struct tbl_node *tbl, int ln, const char *p, 
         struct tbl_cell *cp;          struct tbl_cell *cp;
         struct tbl_span *sp;          struct tbl_span *sp;
   
         rp = (sp = tbl->last_span) == NULL ? tbl->first_row :          for (sp = tbl->last_span; sp != NULL; sp = sp->prev)
             sp->pos == TBL_SPAN_DATA && sp->layout->next != NULL ?                  if (sp->pos == TBL_SPAN_DATA)
             sp->layout->next : sp->layout;                          break;
           rp = sp == NULL ? tbl->first_row :
               sp->layout->next == NULL ? sp->layout : sp->layout->next;
         assert(rp != NULL);          assert(rp != NULL);
   
         if (p[1] == '\0') {          if (p[1] == '\0') {

Legend:
Removed from v.1.53  
changed lines
  Added in v.1.59

CVSweb