/* $Id: out.c,v 1.62 2015/10/12 00:08:16 schwarze Exp $ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "config.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mandoc_aux.h"
#include "mandoc.h"
#include "out.h"
const struct tbl_dat *);
/*
* Parse the *src string and store a scaling unit into *dst.
* If the string doesn't specify the unit, use the default.
* If no default is specified, fail.
* Return 2 on complete success, 1 when a conversion was done,
* but there was trailing garbage, and 0 on total failure.
*/
int
{
char *endptr;
return 0;
switch (*endptr++) {
case 'c':
break;
case 'i':
break;
case 'f':
break;
case 'M':
break;
case 'm':
break;
case 'n':
break;
case 'P':
break;
case 'p':
break;
case 'u':
break;
case 'v':
break;
case '\0':
endptr--;
/* FALLTHROUGH */
default:
return 0;
break;
}
}
/*
* Calculate the abstract widths and decimal positions of columns in a
* table. This routine allocates the columns structures then runs over
* all rows and cells in the table. The function pointers in "tbl" are
* used for the actual width calculations.
*/
void
{
int spans;
/*
* Allocate the master column specifiers. These will hold the
* widths and decimal positions for all cells in the column. It
* must be freed and nullified by the caller.
*/
sizeof(struct roffcol));
continue;
spans = 1;
/*
* Account for the data cells in the layout, matching it
* to data cells in the data section.
*/
/* Do not used spanned cells in the calculation. */
if (0 < --spans)
continue;
if (1 < spans)
continue;
continue;
}
}
/*
* 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++;
else
}
/*
* Equalize columns, if requested for any of them.
* Update total width of the columns not to maximize.
*/
if (necol) {
continue;
continue;
if (nxcol && totalwidth)
}
}
/*
* 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) {
/*
* 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 = -1;
} else
quirkcol = -1;
necol = 0;
ewidth = 0;
continue;
- ewidth + 0.4995;
}
}
}
static void
{
/* Branch down into data sub-types. */
case TBL_CELL_HORIZ:
case TBL_CELL_DHORIZ:
break;
case TBL_CELL_LONG:
case TBL_CELL_CENTRE:
case TBL_CELL_LEFT:
case TBL_CELL_RIGHT:
break;
case TBL_CELL_NUMBER:
break;
case TBL_CELL_DOWN:
break;
default:
abort();
}
}
static void
{
const char *str;
}
static void
{
int i;
const char *str;
char *cp;
/*
* First calculate number width and decimal place (last + 1 for
* non-decimal numbers). If the stored decimal is subsequent to
* ours, make our size longer by that difference
* (right-"shifting"); similarly, if ours is subsequent the
* stored, then extend the stored size by the difference.
* Finally, re-assign the stored values.
*/
/* FIXME: TBL_DATA_HORIZ et al.? */
}
} else
/* Adjust the settings for this column. */
} else
}