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

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

version 1.129, 2010/03/23 12:42:22 version 1.130, 2010/04/03 12:46:35
Line 92  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 133  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;
   
Line 178  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 195  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 213  term_flushln(struct termp *p)
Line 248  term_flushln(struct termp *p)
                                         putchar(' ');                                          putchar(' ');
                                 vis = 0;                                  vis = 0;
                         }                          }
   
                         /* Remove the p->overstep width. */                          /* Remove the p->overstep width. */
   
                         bp += (int)/* LINTED */                          bp += (int)/* LINTED */
                                 p->overstep;                                  p->overstep;
                         p->overstep = 0;                          p->overstep = 0;
Line 223  term_flushln(struct termp *p)
Line 260  term_flushln(struct termp *p)
                         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;
         }          }
   
Line 440  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 497  term_word(struct termp *p, const char *word)
Line 528  term_word(struct termp *p, const char *word)
   
         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.129  
changed lines
  Added in v.1.130

CVSweb