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

Diff for /mandoc/term.c between version 1.285 and 1.288

version 1.285, 2022/01/10 18:01:35 version 1.288, 2022/08/15 13:04:43
Line 157  term_flushln(struct termp *p)
Line 157  term_flushln(struct termp *p)
                 /* Finally, print the field content. */                  /* Finally, print the field content. */
   
                 term_field(p, vbl, nbr);                  term_field(p, vbl, nbr);
                   p->tcol->taboff += vbr + (*p->width)(p, ' ');
   
                 /*                  /*
                  * If there is no text left in the field, exit the loop.                   * If there is no text left in the field, exit the loop.
Line 268  term_fill(struct termp *p, size_t *nbr, size_t *vbr, s
Line 269  term_fill(struct termp *p, size_t *nbr, size_t *vbr, s
                         vis -= (*p->width)(p, p->tcol->buf[ic - 1]);                          vis -= (*p->width)(p, p->tcol->buf[ic - 1]);
                         continue;                          continue;
   
                 case '\t':  /* Normal ASCII whitespace. */  
                 case ' ':                  case ' ':
                 case ASCII_BREAK:  /* Escape \: (breakpoint). */                  case ASCII_BREAK:  /* Escape \: (breakpoint). */
                         switch (p->tcol->buf[ic]) {                          vn = vis;
                         case '\t':                          if (p->tcol->buf[ic] == ' ')
                                 vn = term_tab_next(vis);                                  vn += (*p->width)(p, ' ');
                                 break;  
                         case ' ':  
                                 vn = vis + (*p->width)(p, ' ');  
                                 break;  
                         case ASCII_BREAK:  
                                 vn = vis;  
                                 break;  
                         default:  
                                 abort();  
                         }  
                         /* Can break at the end of a word. */                          /* Can break at the end of a word. */
                         if (breakline || vn > vtarget)                          if (breakline || vn > vtarget)
                                 break;                                  break;
Line 317  term_fill(struct termp *p, size_t *nbr, size_t *vbr, s
Line 307  term_fill(struct termp *p, size_t *nbr, size_t *vbr, s
                         *vbr = vis;                          *vbr = vis;
                         continue;                          continue;
   
                 case ASCII_NBRSP:  /* Non-breakable space. */                  default:
                         p->tcol->buf[ic] = ' ';                          switch (p->tcol->buf[ic]) {
                         /* FALLTHROUGH */                          case '\t':
                 default:  /* Printable character. */                                  vis += p->tcol->taboff;
                                   vis = term_tab_next(vis);
                                   vis -= p->tcol->taboff;
                                   break;
                           case ASCII_NBRSP:  /* Non-breakable space. */
                                   p->tcol->buf[ic] = ' ';
                                   /* FALLTHROUGH */
                           default:  /* Printable character. */
                                   vis += (*p->width)(p, p->tcol->buf[ic]);
                                   break;
                           }
                         graph = 1;                          graph = 1;
                         vis += (*p->width)(p, p->tcol->buf[ic]);  
                         if (vis > vtarget && *nbr > 0)                          if (vis > vtarget && *nbr > 0)
                                 return;                                  return;
                         continue;                          continue;
Line 352  term_field(struct termp *p, size_t vbl, size_t nbr)
Line 351  term_field(struct termp *p, size_t vbl, size_t nbr)
 {  {
         size_t   ic;    /* Character position in the input buffer. */          size_t   ic;    /* Character position in the input buffer. */
         size_t   vis;   /* Visual position of the current character. */          size_t   vis;   /* Visual position of the current character. */
           size_t   vt;    /* Visual position including tab offset. */
         size_t   dv;    /* Visual width of the current character. */          size_t   dv;    /* Visual width of the current character. */
         size_t   vn;    /* Visual position of the next character. */  
   
         vis = 0;          vis = 0;
         for (ic = p->tcol->col; ic < nbr; ic++) {          for (ic = p->tcol->col; ic < nbr; ic++) {
Line 368  term_field(struct termp *p, size_t vbl, size_t nbr)
Line 367  term_field(struct termp *p, size_t vbl, size_t nbr)
                 case ASCII_BREAK:                  case ASCII_BREAK:
                         continue;                          continue;
                 case '\t':                  case '\t':
                         vn = term_tab_next(vis);  
                         vbl += vn - vis;  
                         vis = vn;  
                         continue;  
                 case ' ':                  case ' ':
                 case ASCII_NBRSP:                  case ASCII_NBRSP:
                         dv = (*p->width)(p, ' ');                          if (p->tcol->buf[ic] == '\t') {
                                   vt = p->tcol->taboff + vis;
                                   dv = term_tab_next(vt) - vt;
                           } else
                                   dv = (*p->width)(p, ' ');
                         vbl += dv;                          vbl += dv;
                         vis += dv;                          vis += dv;
                         continue;                          continue;
Line 436  endline(struct termp *p)
Line 435  endline(struct termp *p)
 void  void
 term_newln(struct termp *p)  term_newln(struct termp *p)
 {  {
           p->tcol->taboff = 0;
         p->flags |= TERMP_NOSPACE;          p->flags |= TERMP_NOSPACE;
         if (p->tcol->lastcol || p->viscol)          if (p->tcol->lastcol || p->viscol)
                 term_flushln(p);                  term_flushln(p);
Line 628  term_word(struct termp *p, const char *word)
Line 627  term_word(struct termp *p, const char *word)
                                 encode(p, "utf8", 4);                                  encode(p, "utf8", 4);
                         continue;                          continue;
                 case ESCAPE_HORIZ:                  case ESCAPE_HORIZ:
                           if (p->flags & TERMP_BACKAFTER) {
                                   p->flags &= ~TERMP_BACKAFTER;
                                   continue;
                           }
                         if (*seq == '|') {                          if (*seq == '|') {
                                 seq++;                                  seq++;
                                 uc = -p->col;                                  uc = -p->col;
Line 636  term_word(struct termp *p, const char *word)
Line 639  term_word(struct termp *p, const char *word)
                         if (a2roffsu(seq, &su, SCALE_EM) == NULL)                          if (a2roffsu(seq, &su, SCALE_EM) == NULL)
                                 continue;                                  continue;
                         uc += term_hen(p, &su);                          uc += term_hen(p, &su);
                         if (uc > 0) {                          if (uc >= 0) {
                                 while (uc > 0) {                                  while (uc > 0) {
                                         bufferc(p, ASCII_NBRSP);  
                                         uc -= term_len(p, 1);                                          uc -= term_len(p, 1);
                                           if (p->flags & TERMP_BACKBEFORE)
                                                   p->flags &= ~TERMP_BACKBEFORE;
                                           else
                                                   bufferc(p, ASCII_NBRSP);
                                 }                                  }
                         } else if (p->col > (size_t)(-uc)) {                                  continue;
                           }
                           if (p->flags & TERMP_BACKBEFORE) {
                                   p->flags &= ~TERMP_BACKBEFORE;
                                   assert(p->col > 0);
                                   p->col--;
                           }
                           if (p->col >= (size_t)(-uc)) {
                                 p->col += uc;                                  p->col += uc;
                         } else {                          } else {
                                 uc += p->col;                                  uc += p->col;

Legend:
Removed from v.1.285  
changed lines
  Added in v.1.288

CVSweb