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

Diff for /mandoc/term_ps.c between version 1.64 and 1.65

version 1.64, 2014/08/13 20:34:29 version 1.65, 2014/08/24 23:43:13
Line 67  struct termp_ps {
Line 67  struct termp_ps {
         size_t            psmargcur;    /* cur index in margin buf */          size_t            psmargcur;    /* cur index in margin buf */
         char              last;         /* character buffer */          char              last;         /* character buffer */
         enum termfont     lastf;        /* last set font */          enum termfont     lastf;        /* last set font */
           enum termfont     nextf;        /* building next font here */
         size_t            scale;        /* font scaling factor */          size_t            scale;        /* font scaling factor */
         size_t            pages;        /* number of pages shown */          size_t            pages;        /* number of pages shown */
         size_t            lineheight;   /* line height (AFM units) */          size_t            lineheight;   /* line height (AFM units) */
Line 406  static const struct font fonts[TERMFONT__MAX] = {
Line 407  static const struct font fonts[TERMFONT__MAX] = {
                 {  400 },                  {  400 },
                 {  541 },                  {  541 },
         } },          } },
           { "Times-BoldItalic", {
                   {  250 },
                   {  389 },
                   {  555 },
                   {  500 },
                   {  500 },
                   {  833 },
                   {  778 },
                   {  333 },
                   {  333 },
                   {  333 },
                   {  500 },
                   {  570 },
                   {  250 },
                   {  333 },
                   {  250 },
                   {  278 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  333 },
                   {  333 },
                   {  570 },
                   {  570 },
                   {  570 },
                   {  500 },
                   {  832 },
                   {  667 },
                   {  667 },
                   {  667 },
                   {  722 },
                   {  667 },
                   {  667 },
                   {  722 },
                   {  778 },
                   {  389 },
                   {  500 },
                   {  667 },
                   {  611 },
                   {  889 },
                   {  722 },
                   {  722 },
                   {  611 },
                   {  722 },
                   {  667 },
                   {  556 },
                   {  611 },
                   {  722 },
                   {  667 },
                   {  889 },
                   {  667 },
                   {  611 },
                   {  611 },
                   {  333 },
                   {  278 },
                   {  333 },
                   {  570 },
                   {  500 },
                   {  333 },
                   {  500 },
                   {  500 },
                   {  444 },
                   {  500 },
                   {  444 },
                   {  333 },
                   {  500 },
                   {  556 },
                   {  278 },
                   {  278 },
                   {  500 },
                   {  278 },
                   {  778 },
                   {  556 },
                   {  500 },
                   {  500 },
                   {  500 },
                   {  389 },
                   {  389 },
                   {  278 },
                   {  556 },
                   {  444 },
                   {  667 },
                   {  500 },
                   {  444 },
                   {  389 },
                   {  348 },
                   {  220 },
                   {  348 },
                   {  570 },
           } },
 };  };
   
 void *  void *
Line 953  ps_fclose(struct termp *p)
Line 1051  ps_fclose(struct termp *p)
          * Following this, close out any scope that's open.           * Following this, close out any scope that's open.
          */           */
   
         if ('\0' != p->ps->last) {          if (p->ps->last != '\0') {
                 if (p->ps->lastf != TERMFONT_NONE) {                  assert(p->ps->last != 8);
                   if (p->ps->nextf != p->ps->lastf) {
                         ps_pclose(p);                          ps_pclose(p);
                         ps_setfont(p, TERMFONT_NONE);                          ps_setfont(p, p->ps->nextf);
                 }                  }
                   p->ps->nextf = TERMFONT_NONE;
                 ps_pletter(p, p->ps->last);                  ps_pletter(p, p->ps->last);
                 p->ps->last = '\0';                  p->ps->last = '\0';
         }          }
Line 971  ps_fclose(struct termp *p)
Line 1071  ps_fclose(struct termp *p)
 static void  static void
 ps_letter(struct termp *p, int arg)  ps_letter(struct termp *p, int arg)
 {  {
         char            cc, c;          char            c;
   
         c = arg >= 128 || arg <= 0 ? '?' : arg;          c = arg >= 128 || arg <= 0 ? '?' : arg;
   
         /*          /*
          * State machine dictates whether to buffer the last character           * When receiving an initial character, merely buffer it,
          * or not.  Basically, encoded words are detected by checking if           * because a backspace might follow to specify formatting.
          * we're an "8" and switching on the buffer.  Then we put "8" in           * When receiving a backspace, use the buffered character
          * our buffer, and on the next charater, flush both character           * to build the font instruction and clear the buffer.
          * and buffer.  Thus, "regular" words are detected by having a           * Only when there are two non-backspace characters in a row,
          * regular character and a regular buffer character.           * activate the font built so far and print the first of them;
            * the second, again, merely gets buffered.
            * The final character will get printed from ps_fclose().
          */           */
   
         if ('\0' == p->ps->last) {          if (c == 8) {
                 assert(8 != c);                  assert(p->ps->last != '\0');
                 p->ps->last = c;                  assert(p->ps->last != 8);
                 return;  
         } else if (8 == p->ps->last) {  
                 assert(8 != c);  
                 p->ps->last = '\0';  
         } else if (8 == c) {  
                 assert(8 != p->ps->last);  
                 if ('_' == p->ps->last) {                  if ('_' == p->ps->last) {
                         if (p->ps->lastf != TERMFONT_UNDER) {                          switch (p->ps->nextf) {
                                 ps_pclose(p);                          case TERMFONT_BI:
                                 ps_setfont(p, TERMFONT_UNDER);                                  break;
                           case TERMFONT_BOLD:
                                   p->ps->nextf = TERMFONT_BI;
                                   break;
                           default:
                                   p->ps->nextf = TERMFONT_UNDER;
                         }                          }
                 } else if (p->ps->lastf != TERMFONT_BOLD) {                  } else {
                         ps_pclose(p);                          switch (p->ps->nextf) {
                         ps_setfont(p, TERMFONT_BOLD);                          case TERMFONT_BI:
                                   break;
                           case TERMFONT_UNDER:
                                   p->ps->nextf = TERMFONT_BI;
                                   break;
                           default:
                                   p->ps->nextf = TERMFONT_BOLD;
                           }
                 }                  }
                 p->ps->last = c;          } else if (p->ps->last != '\0' && p->ps->last != 8) {
                 return;                  if (p->ps->nextf != p->ps->lastf) {
         } else {  
                 if (p->ps->lastf != TERMFONT_NONE) {  
                         ps_pclose(p);                          ps_pclose(p);
                         ps_setfont(p, TERMFONT_NONE);                          ps_setfont(p, p->ps->nextf);
                 }                  }
                 cc = p->ps->last;                  p->ps->nextf = TERMFONT_NONE;
                 p->ps->last = c;                  ps_pletter(p, p->ps->last);
                 c = cc;  
         }          }
           p->ps->last = c;
         ps_pletter(p, c);  
 }  }
   
 static void  static void

Legend:
Removed from v.1.64  
changed lines
  Added in v.1.65

CVSweb