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

Diff for /mandoc/out.c between version 1.46 and 1.52

version 1.46, 2013/10/05 20:30:05 version 1.52, 2014/10/14 02:16:06
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 15 
Line 15 
  * 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"  #include "config.h"
 #endif  
   
 #include <sys/types.h>  #include <sys/types.h>
   
Line 28 
Line 26 
 #include <string.h>  #include <string.h>
 #include <time.h>  #include <time.h>
   
   #include "mandoc_aux.h"
 #include "mandoc.h"  #include "mandoc.h"
 #include "out.h"  #include "out.h"
   
Line 38  static void tblcalc_literal(struct rofftbl *, struct r
Line 37  static void tblcalc_literal(struct rofftbl *, struct r
 static  void    tblcalc_number(struct rofftbl *, struct roffcol *,  static  void    tblcalc_number(struct rofftbl *, struct roffcol *,
                         const struct tbl_opts *, const struct tbl_dat *);                          const struct tbl_opts *, const struct tbl_dat *);
   
 /*  
   /*
  * Convert a `scaling unit' to a consistent form, or fail.  Scaling   * Convert a `scaling unit' to a consistent form, or fail.  Scaling
  * units are documented in groff.7, mdoc.7, man.7.   * units are documented in groff.7, mdoc.7, man.7.
  */   */
Line 55  a2roffsu(const char *src, struct roffsu *dst, enum rof
Line 55  a2roffsu(const char *src, struct roffsu *dst, enum rof
         i = hasd = 0;          i = hasd = 0;
   
         switch (*src) {          switch (*src) {
         case ('+'):          case '+':
                 src++;                  src++;
                 break;                  break;
         case ('-'):          case '-':
                 buf[i++] = *src++;                  buf[i++] = *src++;
                 break;                  break;
         default:          default:
Line 86  a2roffsu(const char *src, struct roffsu *dst, enum rof
Line 86  a2roffsu(const char *src, struct roffsu *dst, enum rof
         buf[i] = '\0';          buf[i] = '\0';
   
         switch (*src) {          switch (*src) {
         case ('c'):          case 'c':
                 unit = SCALE_CM;                  unit = SCALE_CM;
                 break;                  break;
         case ('i'):          case 'i':
                 unit = SCALE_IN;                  unit = SCALE_IN;
                 break;                  break;
         case ('P'):          case 'P':
                 unit = SCALE_PC;                  unit = SCALE_PC;
                 break;                  break;
         case ('p'):          case 'p':
                 unit = SCALE_PT;                  unit = SCALE_PT;
                 break;                  break;
         case ('f'):          case 'f':
                 unit = SCALE_FS;                  unit = SCALE_FS;
                 break;                  break;
         case ('v'):          case 'v':
                 unit = SCALE_VS;                  unit = SCALE_VS;
                 break;                  break;
         case ('m'):          case 'm':
                 unit = SCALE_EM;                  unit = SCALE_EM;
                 break;                  break;
         case ('\0'):          case '\0':
                 if (SCALE_MAX == def)                  if (SCALE_MAX == def)
                         return(0);                          return(0);
                 unit = SCALE_BU;                  unit = SCALE_EN;
                 break;                  break;
         case ('u'):          case 'u':
                 unit = SCALE_BU;                  unit = SCALE_BU;
                 break;                  break;
         case ('M'):          case 'M':
                 unit = SCALE_MM;                  unit = SCALE_MM;
                 break;                  break;
         case ('n'):          case 'n':
                 unit = SCALE_EN;                  unit = SCALE_EN;
                 break;                  break;
         default:          default:
Line 126  a2roffsu(const char *src, struct roffsu *dst, enum rof
Line 126  a2roffsu(const char *src, struct roffsu *dst, enum rof
         }          }
   
         /* FIXME: do this in the caller. */          /* FIXME: do this in the caller. */
         if ((dst->scale = atof(buf)) < 0)          if ((dst->scale = atof(buf)) < 0.0)
                 dst->scale = 0;                  dst->scale = 0.0;
         dst->unit = unit;          dst->unit = unit;
         return(1);          return(1);
 }  }
Line 139  a2roffsu(const char *src, struct roffsu *dst, enum rof
Line 139  a2roffsu(const char *src, struct roffsu *dst, enum rof
  * used for the actual width calculations.   * used for the actual width calculations.
  */   */
 void  void
 tblcalc(struct rofftbl *tbl, const struct tbl_span *sp)  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp,
           size_t totalwidth)
 {  {
         const struct tbl_dat    *dp;          const struct tbl_dat    *dp;
         struct roffcol          *col;          struct roffcol          *col;
           size_t                   ewidth, xwidth;
         int                      spans;          int                      spans;
           int                      icol, maxcol, necol, nxcol;
   
         /*          /*
          * Allocate the master column specifiers.  These will hold the           * Allocate the master column specifiers.  These will hold the
Line 152  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
Line 155  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
          */           */
   
         assert(NULL == tbl->cols);          assert(NULL == tbl->cols);
         tbl->cols = mandoc_calloc          tbl->cols = mandoc_calloc((size_t)sp->opts->cols,
                 ((size_t)sp->opts->cols, sizeof(struct roffcol));              sizeof(struct roffcol));
   
         for ( ; sp; sp = sp->next) {          for (maxcol = 0; sp; sp = sp->next) {
                 if (TBL_SPAN_DATA != sp->pos)                  if (TBL_SPAN_DATA != sp->pos)
                         continue;                          continue;
                 spans = 1;                  spans = 1;
Line 170  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
Line 173  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
                         spans = dp->spans;                          spans = dp->spans;
                         if (1 < spans)                          if (1 < spans)
                                 continue;                                  continue;
                         assert(dp->layout);                          icol = dp->layout->head->ident;
                         col = &tbl->cols[dp->layout->head->ident];                          if (maxcol < icol)
                                   maxcol = icol;
                           col = tbl->cols + icol;
                           col->flags |= dp->layout->flags;
                           if (dp->layout->flags & TBL_CELL_WIGN)
                                   continue;
                         tblcalc_data(tbl, col, sp->opts, dp);                          tblcalc_data(tbl, col, sp->opts, dp);
                 }                  }
         }          }
   
           /*
            * Count columns to equalize and columns to maximize.
            * Find maximum width of the columns to equalize.
            * Find total width of the columns *not* to maximize.
            */
   
           necol = nxcol = 0;
           ewidth = xwidth = 0;
           for (icol = 0; icol <= maxcol; icol++) {
                   col = tbl->cols + icol;
                   if (col->flags & TBL_CELL_EQUAL) {
                           necol++;
                           if (ewidth < col->width)
                                   ewidth = col->width;
                   }
                   if (col->flags & TBL_CELL_WMAX)
                           nxcol++;
                   else
                           xwidth += col->width;
           }
   
           /*
            * Equalize columns, if requested for any of them.
            * Update total width of the columns not to maximize.
            */
   
           if (necol) {
                   for (icol = 0; icol <= maxcol; icol++) {
                           col = tbl->cols + icol;
                           if ( ! (col->flags & TBL_CELL_EQUAL))
                                   continue;
                           if (col->width == ewidth)
                                   continue;
                           if (nxcol && totalwidth)
                                   xwidth += ewidth - col->width;
                           col->width = ewidth;
                   }
           }
   
           /*
            * If there are any columns to maximize, find the total
            * available width, deducting 3n margins between columns.
            * Distribute the available width evenly.
            */
   
           if (nxcol && totalwidth) {
                   xwidth = totalwidth - 3*maxcol - xwidth;
                   for (icol = 0; icol <= maxcol; icol++) {
                           col = tbl->cols + icol;
                           if ( ! (col->flags & TBL_CELL_WMAX))
                                   continue;
                           col->width = xwidth / nxcol--;
                           xwidth -= col->width;
                   }
           }
 }  }
   
 static void  static void
Line 186  tblcalc_data(struct rofftbl *tbl, struct roffcol *col,
Line 250  tblcalc_data(struct rofftbl *tbl, struct roffcol *col,
         /* Branch down into data sub-types. */          /* Branch down into data sub-types. */
   
         switch (dp->layout->pos) {          switch (dp->layout->pos) {
         case (TBL_CELL_HORIZ):          case TBL_CELL_HORIZ:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (TBL_CELL_DHORIZ):          case TBL_CELL_DHORIZ:
                 sz = (*tbl->len)(1, tbl->arg);                  sz = (*tbl->len)(1, tbl->arg);
                 if (col->width < sz)                  if (col->width < sz)
                         col->width = sz;                          col->width = sz;
                 break;                  break;
         case (TBL_CELL_LONG):          case TBL_CELL_LONG:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (TBL_CELL_CENTRE):          case TBL_CELL_CENTRE:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (TBL_CELL_LEFT):          case TBL_CELL_LEFT:
                 /* FALLTHROUGH */                  /* FALLTHROUGH */
         case (TBL_CELL_RIGHT):          case TBL_CELL_RIGHT:
                 tblcalc_literal(tbl, col, dp);                  tblcalc_literal(tbl, col, dp);
                 break;                  break;
         case (TBL_CELL_NUMBER):          case TBL_CELL_NUMBER:
                 tblcalc_number(tbl, col, opts, dp);                  tblcalc_number(tbl, col, opts, dp);
                 break;                  break;
         case (TBL_CELL_DOWN):          case TBL_CELL_DOWN:
                 break;                  break;
         default:          default:
                 abort();                  abort();
Line 231  static void
Line 295  static void
 tblcalc_number(struct rofftbl *tbl, struct roffcol *col,  tblcalc_number(struct rofftbl *tbl, struct roffcol *col,
                 const struct tbl_opts *opts, const struct tbl_dat *dp)                  const struct tbl_opts *opts, const struct tbl_dat *dp)
 {  {
         int              i;          int              i;
         size_t           sz, psz, ssz, d;          size_t           sz, psz, ssz, d;
         const char      *str;          const char      *str;
         char            *cp;          char            *cp;

Legend:
Removed from v.1.46  
changed lines
  Added in v.1.52

CVSweb