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

Diff for /mandoc/term.c between version 1.232 and 1.233

version 1.232, 2014/10/28 18:49:33 version 1.233, 2014/10/29 00:17:43
Line 391  term_word(struct termp *p, const char *word)
Line 391  term_word(struct termp *p, const char *word)
 {  {
         const char       nbrsp[2] = { ASCII_NBRSP, 0 };          const char       nbrsp[2] = { ASCII_NBRSP, 0 };
         const char      *seq, *cp;          const char      *seq, *cp;
         char             c;  
         int              sz, uc;          int              sz, uc;
         size_t           ssz;          size_t           ssz;
         enum mandoc_esc  esc;          enum mandoc_esc  esc;
Line 443  term_word(struct termp *p, const char *word)
Line 442  term_word(struct termp *p, const char *word)
                 switch (esc) {                  switch (esc) {
                 case ESCAPE_UNICODE:                  case ESCAPE_UNICODE:
                         uc = mchars_num2uc(seq + 1, sz - 1);                          uc = mchars_num2uc(seq + 1, sz - 1);
                         if (p->enc == TERMENC_ASCII) {  
                                 cp = ascii_uc2str(uc);  
                                 encode(p, cp, strlen(cp));  
                         } else  
                                 encode1(p, uc);  
                         break;                          break;
                 case ESCAPE_NUMBERED:                  case ESCAPE_NUMBERED:
                         c = mchars_num2char(seq, sz);                          uc = mchars_num2char(seq, sz);
                         if ('\0' != c)                          if (uc < 0)
                                 encode(p, &c, 1);                                  continue;
                         break;                          break;
                 case ESCAPE_SPECIAL:                  case ESCAPE_SPECIAL:
                         if (p->enc == TERMENC_ASCII) {                          if (p->enc == TERMENC_ASCII) {
Line 465  term_word(struct termp *p, const char *word)
Line 459  term_word(struct termp *p, const char *word)
                                 if (uc > 0)                                  if (uc > 0)
                                         encode1(p, uc);                                          encode1(p, uc);
                         }                          }
                         break;                          continue;
                 case ESCAPE_FONTBOLD:                  case ESCAPE_FONTBOLD:
                         term_fontrepl(p, TERMFONT_BOLD);                          term_fontrepl(p, TERMFONT_BOLD);
                         break;                          continue;
                 case ESCAPE_FONTITALIC:                  case ESCAPE_FONTITALIC:
                         term_fontrepl(p, TERMFONT_UNDER);                          term_fontrepl(p, TERMFONT_UNDER);
                         break;                          continue;
                 case ESCAPE_FONTBI:                  case ESCAPE_FONTBI:
                         term_fontrepl(p, TERMFONT_BI);                          term_fontrepl(p, TERMFONT_BI);
                         break;                          continue;
                 case ESCAPE_FONT:                  case ESCAPE_FONT:
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case ESCAPE_FONTROMAN:                  case ESCAPE_FONTROMAN:
                         term_fontrepl(p, TERMFONT_NONE);                          term_fontrepl(p, TERMFONT_NONE);
                         break;                          continue;
                 case ESCAPE_FONTPREV:                  case ESCAPE_FONTPREV:
                         term_fontlast(p);                          term_fontlast(p);
                         break;                          continue;
                 case ESCAPE_NOSPACE:                  case ESCAPE_NOSPACE:
                         if (TERMP_SKIPCHAR & p->flags)                          if (TERMP_SKIPCHAR & p->flags)
                                 p->flags &= ~TERMP_SKIPCHAR;                                  p->flags &= ~TERMP_SKIPCHAR;
                         else if ('\0' == *word)                          else if ('\0' == *word)
                                 p->flags |= TERMP_NOSPACE;                                  p->flags |= TERMP_NOSPACE;
                         break;                          continue;
                 case ESCAPE_SKIPCHAR:                  case ESCAPE_SKIPCHAR:
                         p->flags |= TERMP_SKIPCHAR;                          p->flags |= TERMP_SKIPCHAR;
                         break;                          continue;
                 default:                  default:
                         break;                          continue;
                 }                  }
   
                   /*
                    * Common handling for Unicode and numbered
                    * character escape sequences.
                    */
   
                   if (p->enc == TERMENC_ASCII) {
                           cp = ascii_uc2str(uc);
                           encode(p, cp, strlen(cp));
                   } else {
                           if ((uc < 0x20 && uc != 0x09) ||
                               (uc > 0x7E && uc < 0xA0))
                                   uc = 0xFFFD;
                           encode1(p, uc);
                   }
         }          }
         p->flags &= ~TERMP_NBRWORD;          p->flags &= ~TERMP_NBRWORD;
 }  }
Line 645  size_t
Line 654  size_t
 term_strlen(const struct termp *p, const char *cp)  term_strlen(const struct termp *p, const char *cp)
 {  {
         size_t           sz, rsz, i;          size_t           sz, rsz, i;
         int              ssz, skip, c;          int              ssz, skip, uc;
         const char      *seq, *rhs;          const char      *seq, *rhs;
         enum mandoc_esc  esc;          enum mandoc_esc  esc;
         static const char rej[] = { '\\', ASCII_NBRSP, ASCII_HYPH,          static const char rej[] = { '\\', ASCII_NBRSP, ASCII_HYPH,
Line 675  term_strlen(const struct termp *p, const char *cp)
Line 684  term_strlen(const struct termp *p, const char *cp)
   
                         switch (esc) {                          switch (esc) {
                         case ESCAPE_UNICODE:                          case ESCAPE_UNICODE:
                                 c = mchars_num2uc(seq + 1, sz - 1);                                  uc = mchars_num2uc(seq + 1, sz - 1);
                                 if (p->enc == TERMENC_ASCII) {  
                                         rhs = ascii_uc2str(c);  
                                         rsz = strlen(rhs);  
                                 } else  
                                         sz += cond_width(p, c, &skip);  
                                 break;                                  break;
                         case ESCAPE_NUMBERED:                          case ESCAPE_NUMBERED:
                                 c = mchars_num2char(seq, ssz);                                  uc = mchars_num2char(seq, ssz);
                                 if ('\0' != c)                                  if (uc < 0)
                                         sz += cond_width(p, c, &skip);                                          continue;
                                 break;                                  break;
                         case ESCAPE_SPECIAL:                          case ESCAPE_SPECIAL:
                                 if (p->enc == TERMENC_ASCII)                                  if (p->enc == TERMENC_ASCII) {
                                         rhs = mchars_spec2str(p->symtab,                                          rhs = mchars_spec2str(p->symtab,
                                             seq, ssz, &rsz);                                              seq, ssz, &rsz);
                                 else {                                          if (rhs != NULL)
                                         c = mchars_spec2cp(p->symtab,                                                  break;
                                   } else {
                                           uc = mchars_spec2cp(p->symtab,
                                             seq, ssz);                                              seq, ssz);
                                         if (c > 0)                                          if (uc > 0)
                                                 sz += cond_width(p, c, &skip);                                                  sz += cond_width(p, uc, &skip);
                                 }                                  }
                                 break;                                  continue;
                         case ESCAPE_SKIPCHAR:                          case ESCAPE_SKIPCHAR:
                                 skip = 1;                                  skip = 1;
                                 break;                                  continue;
                         default:                          default:
                                 break;                                  continue;
                         }                          }
   
                         if (NULL == rhs)                          /*
                                 break;                           * Common handling for Unicode and numbered
                            * character escape sequences.
                            */
   
                           if (rhs == NULL) {
                                   if (p->enc == TERMENC_ASCII) {
                                           rhs = ascii_uc2str(uc);
                                           rsz = strlen(rhs);
                                   } else {
                                           if ((uc < 0x20 && uc != 0x09) ||
                                               (uc > 0x7E && uc < 0xA0))
                                                   uc = 0xFFFD;
                                           sz += cond_width(p, uc, &skip);
                                           continue;
                                   }
                           }
   
                         if (skip) {                          if (skip) {
                                 skip = 0;                                  skip = 0;
                                 break;                                  break;
                         }                          }
   
                           /*
                            * Common handling for all escape sequences
                            * printing more than one character.
                            */
   
                         for (i = 0; i < rsz; i++)                          for (i = 0; i < rsz; i++)
                                 sz += (*p->width)(p, *rhs++);                                  sz += (*p->width)(p, *rhs++);

Legend:
Removed from v.1.232  
changed lines
  Added in v.1.233

CVSweb