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

Diff for /mandoc/term.c between version 1.109 and 1.121

version 1.109, 2009/10/22 18:19:36 version 1.121, 2009/11/05 07:21:02
Line 15 
Line 15 
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #include <assert.h>  #include <assert.h>
 #include <err.h>  
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
   #include <time.h>
   
 #include "chars.h"  #include "chars.h"
 #include "out.h"  #include "out.h"
Line 76  term_alloc(enum termenc enc)
Line 76  term_alloc(enum termenc enc)
 {  {
         struct termp *p;          struct termp *p;
   
         if (NULL == (p = malloc(sizeof(struct termp))))          p = calloc(1, sizeof(struct termp));
                 return(NULL);          if (NULL == p) {
         bzero(p, sizeof(struct termp));                  perror(NULL);
                   exit(EXIT_FAILURE);
           }
         p->maxrmargin = 78;          p->maxrmargin = 78;
         p->enc = enc;          p->enc = enc;
         return(p);          return(p);
Line 119  term_alloc(enum termenc enc)
Line 121  term_alloc(enum termenc enc)
  *  If TERMP_NOBREAK is specified and the line overruns the right   *  If TERMP_NOBREAK is specified and the line overruns the right
  *  margin, it will break and pad-right to the right margin after   *  margin, it will break and pad-right to the right margin after
  *  writing.  If maxrmargin is violated, it will break and continue   *  writing.  If maxrmargin is violated, it will break and continue
  *  writing from the right-margin, which will lead to the above   *  writing from the right-margin, which will lead to the above scenario
  *  scenario upon exit.   *  upon exit.  Otherwise, the line will break at the right margin.
  *  
  *  Otherwise, the line will break at the right margin.  Extremely long  
  *  lines will cause the system to emit a warning (TODO: hyphenate, if  
  *  possible).  
  */   */
 void  void
 term_flushln(struct termp *p)  term_flushln(struct termp *p)
 {  {
         int              i, j;          int              i;     /* current input position in p->buf */
         size_t           vbl, vsz, vis, maxvis, mmax, bp, os;          size_t           vis;   /* current visual position on output */
           size_t           vbl;   /* number of blanks to prepend to output */
           size_t           vsz;   /* visual characters to write to output */
           size_t           bp;    /* visual right border position */
           int              j;     /* temporary loop index */
           size_t           maxvis, mmax;
         static int       overstep = 0;          static int       overstep = 0;
   
         /*          /*
          * First, establish the maximum columns of "visible" content.           * First, establish the maximum columns of "visible" content.
          * This is usually the difference between the right-margin and           * This is usually the difference between the right-margin and
          * an indentation, but can be, for tagged lists or columns, a           * an indentation, but can be, for tagged lists or columns, a
          * small set of values.           * small set of values.
          */           */
   
         assert(p->offset < p->rmargin);          assert(p->offset < p->rmargin);
         assert((int)(p->rmargin - p->offset) - overstep > 0);  
   
         /* Save the overstep. */          maxvis = (int)(p->rmargin - p->offset) - overstep < 0 ?
         os = (size_t)overstep;                  /* LINTED */
                   0 : p->rmargin - p->offset - overstep;
           mmax = (int)(p->maxrmargin - p->offset) - overstep < 0 ?
                   /* LINTED */
                   0 : p->maxrmargin - p->offset - overstep;
   
         maxvis = /* LINTED */  
                 p->rmargin - p->offset - overstep;  
         mmax = /* LINTED */  
                 p->maxrmargin - p->offset - overstep;  
   
         bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;          bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
   
           /*
            * FIXME: if bp is zero, we still output the first word before
            * breaking the line.
            */
   
         vis = 0;          vis = 0;
         overstep = 0;  
   
         /*          /*
          * If in the standard case (left-justified), then begin with our           * If in the standard case (left-justified), then begin with our
Line 208  term_flushln(struct termp *p)
Line 214  term_flushln(struct termp *p)
                                 vis = 0;                                  vis = 0;
                         }                          }
                         /* Remove the overstep width. */                          /* Remove the overstep width. */
                         bp += os;                          bp += (int)/* LINTED */
                         os = 0;                                  overstep;
                           overstep = 0;
                 } else {                  } else {
                         for (j = 0; j < (int)vbl; j++)                          for (j = 0; j < (int)vbl; j++)
                                 putchar(' ');                                  putchar(' ');
Line 222  term_flushln(struct termp *p)
Line 229  term_flushln(struct termp *p)
                 for ( ; i < (int)p->col; i++) {                  for ( ; i < (int)p->col; i++) {
                         if (' ' == p->buf[i])                          if (' ' == p->buf[i])
                                 break;                                  break;
                         putchar(p->buf[i]);  
                           /* The unit sep. is a non-breaking space. */
                           if (31 == p->buf[i])
                                   putchar(' ');
                           else
                                   putchar(p->buf[i]);
                 }                  }
                 vis += vsz;                  vis += vsz;
         }          }
   
         p->col = 0;          p->col = 0;
           overstep = 0;
   
         if ( ! (TERMP_NOBREAK & p->flags)) {          if ( ! (TERMP_NOBREAK & p->flags)) {
                 putchar('\n');                  putchar('\n');
Line 535  buffer(struct termp *p, char c)
Line 549  buffer(struct termp *p, char c)
                         p->maxcols = 256;                          p->maxcols = 256;
                 s = p->maxcols * 2;                  s = p->maxcols * 2;
                 p->buf = realloc(p->buf, s);                  p->buf = realloc(p->buf, s);
                 if (NULL == p->buf)                  if (NULL == p->buf) {
                         err(1, "realloc"); /* FIXME: shouldn't be here! */                          perror(NULL);
                           exit(EXIT_FAILURE);
                   }
                 p->maxcols = s;                  p->maxcols = s;
         }          }
         p->buf[(int)(p->col)++] = c;          p->buf[(int)(p->col)++] = c;

Legend:
Removed from v.1.109  
changed lines
  Added in v.1.121

CVSweb