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

Diff for /mandoc/out.c between version 1.57 and 1.58

version 1.57, 2014/12/23 13:48:57 version 1.58, 2015/01/28 02:23:49
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, 2014 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2011, 2014, 2015 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 107  void
Line 107  void
 tblcalc(struct rofftbl *tbl, const struct tbl_span *sp,  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp,
         size_t totalwidth)          size_t totalwidth)
 {  {
           const struct tbl_opts   *opts;
         const struct tbl_dat    *dp;          const struct tbl_dat    *dp;
         struct roffcol          *col;          struct roffcol          *col;
         size_t                   ewidth, xwidth;          size_t                   ewidth, xwidth;
         int                      spans;          int                      spans;
         int                      icol, maxcol, necol, nxcol;          int                      icol, maxcol, necol, nxcol, quirkcol;
   
         /*          /*
          * Allocate the master column specifiers.  These will hold the           * Allocate the master column specifiers.  These will hold the
Line 122  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
Line 123  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
         assert(NULL == tbl->cols);          assert(NULL == tbl->cols);
         tbl->cols = mandoc_calloc((size_t)sp->opts->cols,          tbl->cols = mandoc_calloc((size_t)sp->opts->cols,
             sizeof(struct roffcol));              sizeof(struct roffcol));
           opts = sp->opts;
   
         for (maxcol = -1; sp; sp = sp->next) {          for (maxcol = -1; sp; sp = sp->next) {
                 if (TBL_SPAN_DATA != sp->pos)                  if (TBL_SPAN_DATA != sp->pos)
Line 145  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
Line 147  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
                         col->flags |= dp->layout->flags;                          col->flags |= dp->layout->flags;
                         if (dp->layout->flags & TBL_CELL_WIGN)                          if (dp->layout->flags & TBL_CELL_WIGN)
                                 continue;                                  continue;
                         tblcalc_data(tbl, col, sp->opts, dp);                          tblcalc_data(tbl, col, opts, dp);
                 }                  }
         }          }
   
Line 195  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
Line 197  tblcalc(struct rofftbl *tbl, const struct tbl_span *sp
          */           */
   
         if (nxcol && totalwidth) {          if (nxcol && totalwidth) {
                 xwidth = totalwidth - 3*maxcol - xwidth;                  xwidth = totalwidth - xwidth - 3*maxcol -
                       (opts->opts & (TBL_OPT_BOX | TBL_OPT_DBOX) ?
                        2 : !!opts->lvert + !!opts->rvert);
   
                   /*
                    * Emulate a bug in GNU tbl width calculation that
                    * manifests itself for large numbers of x-columns.
                    * Emulating it for 5 x-columns gives identical
                    * behaviour for up to 6 x-columns.
                    */
   
                   if (nxcol == 5) {
                           quirkcol = xwidth % nxcol + 2;
                           if (quirkcol != 3 && quirkcol != 4)
                                   quirkcol = -1;
                   } else
                           quirkcol = -1;
   
                   necol = 0;
                   ewidth = 0;
                 for (icol = 0; icol <= maxcol; icol++) {                  for (icol = 0; icol <= maxcol; icol++) {
                         col = tbl->cols + icol;                          col = tbl->cols + icol;
                         if ( ! (col->flags & TBL_CELL_WMAX))                          if ( ! (col->flags & TBL_CELL_WMAX))
                                 continue;                                  continue;
                         col->width = xwidth / nxcol--;                          col->width = (double)xwidth * ++necol / nxcol
                         xwidth -= col->width;                              - ewidth + 0.4995;
                           if (necol == quirkcol)
                                   col->width--;
                           ewidth += col->width;
                 }                  }
         }          }
 }  }

Legend:
Removed from v.1.57  
changed lines
  Added in v.1.58

CVSweb