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

Diff for /mandoc/term.c between version 1.128 and 1.132

version 1.128, 2010/01/01 17:14:30 version 1.132, 2010/05/07 04:50:44
Line 83  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 93  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 136  term_flushln(struct termp *p)
Line 133  term_flushln(struct termp *p)
         size_t           bp;    /* visual right border position */          size_t           bp;    /* visual right border position */
         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 147  term_flushln(struct termp *p)
Line 143  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 186  term_flushln(struct termp *p)
Line 182  term_flushln(struct termp *p)
                 for (j = i, vsz = 0; j < (int)p->col; j++) {                  for (j = i, vsz = 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++;
Line 197  term_flushln(struct termp *p)
Line 193  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.  Otherwise, write the chosen
                  * Otherwise, write the chosen number of blanks now.                   * number of blanks.
                  */                   */
   
                 if (vis && vis + vbl + vsz > bp) {                  if (vis && vis + vbl + vsz > bp) {
                         putchar('\n');                          putchar('\n');
                         if (TERMP_NOBREAK & p->flags) {                          if (TERMP_NOBREAK & p->flags) {
Line 215  term_flushln(struct termp *p)
Line 213  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 251  term_flushln(struct termp *p)
Line 247  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 264  term_flushln(struct termp *p)
Line 260  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 442  term_word(struct termp *p, const char *word)
Line 438  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 491  term_word(struct termp *p, const char *word)
                         p->flags |= TERMP_NOSPACE;                          p->flags |= TERMP_NOSPACE;
         }          }
   
           /*
            * Note that we don't process the pipe: the parser sees it as
            * punctuation, but we don't in terms of typography.
            */
         if (sv[0] && 0 == sv[1])          if (sv[0] && 0 == sv[1])
                 switch (sv[0]) {                  switch (sv[0]) {
                 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.128  
changed lines
  Added in v.1.132

CVSweb