[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.135

version 1.129, 2010/03/23 12:42:22 version 1.135, 2010/05/16 01:35:37
Line 34 
Line 34 
 #include "mdoc.h"  #include "mdoc.h"
 #include "main.h"  #include "main.h"
   
 static  struct termp     *term_alloc(enum termenc);  static  struct termp     *term_alloc(enum termenc, size_t);
 static  void              term_free(struct termp *);  static  void              term_free(struct termp *);
 static  void              spec(struct termp *, const char *, size_t);  static  void              spec(struct termp *, const char *, size_t);
 static  void              res(struct termp *, const char *, size_t);  static  void              res(struct termp *, const char *, size_t);
Line 45  static void    encode(struct termp *, const char *, si
Line 45  static void    encode(struct termp *, const char *, si
   
   
 void *  void *
 ascii_alloc(void)  ascii_alloc(size_t width)
 {  {
   
         return(term_alloc(TERMENC_ASCII));          return(term_alloc(TERMENC_ASCII, width));
 }  }
   
   
Line 74  term_free(struct termp *p)
Line 74  term_free(struct termp *p)
   
   
 static struct termp *  static struct termp *
 term_alloc(enum termenc enc)  term_alloc(enum termenc enc, size_t width)
 {  {
         struct termp *p;          struct termp *p;
   
Line 84  term_alloc(enum termenc enc)
Line 84  term_alloc(enum termenc enc)
                 exit(EXIT_FAILURE);                  exit(EXIT_FAILURE);
         }          }
         p->enc = enc;          p->enc = enc;
           /* Enforce some lower boundary. */
           if (width < 60)
                   width = 60;
           p->defrmargin = width - 2;
         return(p);          return(p);
 }  }
   
Line 92  term_alloc(enum termenc enc)
Line 96  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 184  term_flushln(struct termp *p)
Line 186  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 195  term_flushln(struct termp *p)
Line 197  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 213  term_flushln(struct termp *p)
Line 217  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 229  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 (ASCII_NBRSP == 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 442  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 449  term_word(struct termp *p, const char *word)
Line 449  term_word(struct termp *p, const char *word)
                         break;                          break;
                 }                  }
   
         if ( ! (TERMP_NOSPACE & p->flags))          if ( ! (TERMP_NOSPACE & p->flags)) {
                 bufferc(p, ' ');                  bufferc(p, ' ');
                   if (TERMP_SENTENCE & p->flags)
                           bufferc(p, ' ');
           }
   
         if ( ! (p->flags & TERMP_NONOSPACE))          if ( ! (p->flags & TERMP_NONOSPACE))
                 p->flags &= ~TERMP_NOSPACE;                  p->flags &= ~TERMP_NOSPACE;
   
           p->flags &= ~TERMP_SENTENCE;
   
         /* FIXME: use strcspn. */          /* FIXME: use strcspn. */
   
         while (*word) {          while (*word) {
Line 495  term_word(struct termp *p, const char *word)
Line 500  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.129  
changed lines
  Added in v.1.135

CVSweb