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

Diff for /mandoc/term.c between version 1.126 and 1.130

version 1.126, 2009/11/12 05:58:30 version 1.130, 2010/04/03 12:46:35
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
   #ifdef HAVE_CONFIG_H
   #include "config.h"
   #endif
   
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
Line 79  term_alloc(enum termenc enc)
Line 83  term_alloc(enum termenc enc)
                 perror(NULL);                  perror(NULL);
                 exit(EXIT_FAILURE);                  exit(EXIT_FAILURE);
         }          }
         p->maxrmargin = 78;  
         p->enc = enc;          p->enc = enc;
         return(p);          return(p);
 }  }
Line 89  term_alloc(enum termenc enc)
Line 92  term_alloc(enum termenc enc)
  * Flush a line of text.  A "line" is loosely defined as being something   * Flush a line of text.  A "line" is loosely defined as being something
  * that should be followed by a newline, regardless of whether it's   * that should be followed by a newline, regardless of whether it's
  * broken apart by newlines getting there.  A line can also be a   * broken apart by newlines getting there.  A line can also be a
  * fragment of a columnar list.   * fragment of a columnar list (`Bl -tag' or `Bl -column'), which does
    * not have a trailing newline.
  *   *
  * Specifically, a line is whatever's in p->buf of length p->col, which   * The following flags may be specified:
  * is zeroed after this function returns.  
  *   *
  * The usage of termp:flags is as follows:  
  *  
  *  - TERMP_NOLPAD: when beginning to write the line, don't left-pad the   *  - TERMP_NOLPAD: when beginning to write the line, don't left-pad the
  *    offset value.  This is useful when doing columnar lists where the   *    offset value.  This is useful when doing columnar lists where the
  *    prior column has right-padded.   *    prior column has right-padded.
Line 130  term_flushln(struct termp *p)
Line 131  term_flushln(struct termp *p)
         size_t           vbl;   /* number of blanks to prepend to output */          size_t           vbl;   /* number of blanks to prepend to output */
         size_t           vsz;   /* visual characters to write to output */          size_t           vsz;   /* visual characters to write to output */
         size_t           bp;    /* visual right border position */          size_t           bp;    /* visual right border position */
           size_t           hyph;  /* visible position of hyphen */
         int              j;     /* temporary loop index */          int              j;     /* temporary loop index */
         size_t           maxvis, mmax;          size_t           maxvis, mmax;
         static int       overstep = 0;  
   
         /*          /*
          * First, establish the maximum columns of "visible" content.           * First, establish the maximum columns of "visible" content.
Line 143  term_flushln(struct termp *p)
Line 144  term_flushln(struct termp *p)
   
         assert(p->offset < p->rmargin);          assert(p->offset < p->rmargin);
   
         maxvis = (int)(p->rmargin - p->offset) - overstep < 0 ?          maxvis = (int)(p->rmargin - p->offset) - p->overstep < 0 ?
                 /* LINTED */                  /* LINTED */
                 0 : p->rmargin - p->offset - overstep;                  0 : p->rmargin - p->offset - p->overstep;
         mmax = (int)(p->maxrmargin - p->offset) - overstep < 0 ?          mmax = (int)(p->maxrmargin - p->offset) - p->overstep < 0 ?
                 /* LINTED */                  /* LINTED */
                 0 : p->maxrmargin - p->offset - overstep;                  0 : p->maxrmargin - p->offset - p->overstep;
   
         bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;          bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
   
Line 176  term_flushln(struct termp *p)
Line 177  term_flushln(struct termp *p)
                  * (starting with the CSI) aren't counted.  A space                   * (starting with the CSI) aren't counted.  A space
                  * generates a non-printing word, which is valid (the                   * generates a non-printing word, which is valid (the
                  * space is printed according to regular spacing rules).                   * space is printed according to regular spacing rules).
                    * Collect the number of printable characters until the
                    * first hyphen, if found.  Hyphens aren't included if
                    * they're the first character (so `Fl' doesn't break)
                    * or second consecutive character (`Fl -').
                  */                   */
   
                 /* LINTED */                  /* LINTED */
                 for (j = i, vsz = 0; j < (int)p->col; j++) {                  for (j = i, vsz = 0, hyph = 0; j < (int)p->col; j++) {
                         if (j && ' ' == p->buf[j])                          if (j && ' ' == p->buf[j])
                                 break;                                  break;
                         else if (8 == p->buf[j])                          if (8 == p->buf[j])
                                 vsz--;                                  vsz--;
                         else                          else
                                 vsz++;                                  vsz++;
                           if (j > i && '-' == p->buf[j] && 0 == hyph)
                                  if ('-' != p->buf[j - 1])
                                           hyph = vsz;
                 }                  }
   
                 /*                  /*
Line 193  term_flushln(struct termp *p)
Line 201  term_flushln(struct termp *p)
                  * beginning of a line, one between words -- but do not                   * beginning of a line, one between words -- but do not
                  * actually write them yet.                   * actually write them yet.
                  */                   */
   
                 vbl = (size_t)(0 == vis ? 0 : 1);                  vbl = (size_t)(0 == vis ? 0 : 1);
   
                 /*                  /*
                  * Find out whether we would exceed the right margin.                   * Find out whether we would exceed the right margin.
                  * If so, break to the next line.  (TODO: hyphenate)                   * If so, break to the next line, possibly after
                  * Otherwise, write the chosen number of blanks now.                   * emittign character up to a hyphen.  Otherwise, write
                    * the chosen number of blanks.
                  */                   */
   
                 if (vis && vis + vbl + vsz > bp) {                  if (vis && vis + vbl + vsz > bp) {
                           /*
                            * Has a hyphen been found before the breakpoint
                            * that we can use?
                            */
                           if (hyph && vis + vbl + hyph <= bp) {
                                   /* First prepend blanks. */
                                   for (j = 0; j < (int)vbl; j++)
                                           putchar(' ');
   
                                   /* Emit up to the character. */
                                   do {
                                           if (31 == p->buf[i])
                                                   putchar(' ');
                                           else
                                                   putchar(p->buf[i]);
                                           if (8 != p->buf[i])
                                                   vsz--;
                                   } while ('-' != p->buf[i++]);
   
                                   /* Emit trailing decoration. */
                                   if (8 == p->buf[i]) {
                                           putchar(p->buf[i]);
                                           putchar(p->buf[i + 1]);
                                   }
                           }
   
                         putchar('\n');                          putchar('\n');
                         if (TERMP_NOBREAK & p->flags) {                          if (TERMP_NOBREAK & p->flags) {
                                 for (j = 0; j < (int)p->rmargin; j++)                                  for (j = 0; j < (int)p->rmargin; j++)
Line 211  term_flushln(struct termp *p)
Line 248  term_flushln(struct termp *p)
                                         putchar(' ');                                          putchar(' ');
                                 vis = 0;                                  vis = 0;
                         }                          }
                         /* Remove the overstep width. */  
                           /* Remove the p->overstep width. */
   
                         bp += (int)/* LINTED */                          bp += (int)/* LINTED */
                                 overstep;                                  p->overstep;
                         overstep = 0;                          p->overstep = 0;
                 } else {                  } else {
                         for (j = 0; j < (int)vbl; j++)                          for (j = 0; j < (int)vbl; j++)
                                 putchar(' ');                                  putchar(' ');
                         vis += vbl;                          vis += vbl;
                 }                  }
   
                 /*                  /* Write out the [remaining] word. */
                  * Finally, write out the word.                  for ( ; i < (int)p->col; i++)
                  */  
                 for ( ; i < (int)p->col; i++) {  
                         if (' ' == p->buf[i])                          if (' ' == p->buf[i])
                                 break;                                  break;
                           else if (31 == p->buf[i])
                         /* The unit sep. is a non-breaking space. */  
                         if (31 == p->buf[i])  
                                 putchar(' ');                                  putchar(' ');
                         else                          else
                                 putchar(p->buf[i]);                                  putchar(p->buf[i]);
                 }  
                 vis += vsz;                  vis += vsz;
         }          }
   
         p->col = 0;          p->col = 0;
         overstep = 0;          p->overstep = 0;
   
         if ( ! (TERMP_NOBREAK & p->flags)) {          if ( ! (TERMP_NOBREAK & p->flags)) {
                 putchar('\n');                  putchar('\n');
Line 247  term_flushln(struct termp *p)
Line 282  term_flushln(struct termp *p)
   
         if (TERMP_HANG & p->flags) {          if (TERMP_HANG & p->flags) {
                 /* We need one blank after the tag. */                  /* We need one blank after the tag. */
                 overstep = /* LINTED */                  p->overstep = /* LINTED */
                         vis - maxvis + 1;                          vis - maxvis + 1;
   
                 /*                  /*
Line 260  term_flushln(struct termp *p)
Line 295  term_flushln(struct termp *p)
                  * move it one step LEFT and flag the rest of the line                   * move it one step LEFT and flag the rest of the line
                  * to be longer.                   * to be longer.
                  */                   */
                 if (overstep >= -1) {                  if (p->overstep >= -1) {
                         assert((int)maxvis + overstep >= 0);                          assert((int)maxvis + p->overstep >= 0);
                         /* LINTED */                          /* LINTED */
                         maxvis += overstep;                          maxvis += p->overstep;
                 } else                  } else
                         overstep = 0;                          p->overstep = 0;
   
         } else if (TERMP_DANGLE & p->flags)          } else if (TERMP_DANGLE & p->flags)
                 return;                  return;
Line 438  term_word(struct termp *p, const char *word)
Line 473  term_word(struct termp *p, const char *word)
                 case(')'):                  case(')'):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case(']'):                  case(']'):
                         /* FALLTHROUGH */  
                 case('}'):  
                         if ( ! (TERMP_IGNDELIM & p->flags))                          if ( ! (TERMP_IGNDELIM & p->flags))
                                 p->flags |= TERMP_NOSPACE;                                  p->flags |= TERMP_NOSPACE;
                         break;                          break;
Line 487  term_word(struct termp *p, const char *word)
Line 520  term_word(struct termp *p, const char *word)
                 default:                  default:
                         break;                          break;
                 }                  }
   
                 word += sz;                  word += sz;
                   if (DECO_NOSPACE == deco && '\0' == *word)
                           p->flags |= TERMP_NOSPACE;
         }          }
   
         if (sv[0] && 0 == sv[1])          if (sv[0] && 0 == sv[1])
                 switch (sv[0]) {                  switch (sv[0]) {
                   case('|'):
                           /* FALLTHROUGH */
                 case('('):                  case('('):
                         /* FALLTHROUGH */                          /* FALLTHROUGH */
                 case('['):                  case('['):
                         /* FALLTHROUGH */  
                 case('{'):  
                         p->flags |= TERMP_NOSPACE;                          p->flags |= TERMP_NOSPACE;
                         break;                          break;
                 default:                  default:

Legend:
Removed from v.1.126  
changed lines
  Added in v.1.130

CVSweb