From e4a7a2efc2737e64ac0cf42b148f06566718c1d7 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Mon, 26 Jan 2015 13:03:48 +0000 Subject: More improvements regarding tbl(7) options. * Treat "allbox" as an alias for "box" for now. * Parse and ignore the GNU tbl "nowarn" option. * For separation, allow spaces, tabs, and commas only. * Mark eqn(7) within tbl(7) as unsupported. * Simplify the option table. * Improve and sort documentation. --- mandoc.1 | 6 ++++- mandoc.h | 4 ++- read.c | 3 ++- tbl.7 | 82 ++++++++++++++++++++++++++++++++------------------------------ tbl_opts.c | 82 ++++++++++++++++++++++++-------------------------------------- 5 files changed, 84 insertions(+), 93 deletions(-) diff --git a/mandoc.1 b/mandoc.1 index d110181b..736b2ae7 100644 --- a/mandoc.1 +++ b/mandoc.1 @@ -1,4 +1,4 @@ -.\" $Id: mandoc.1,v 1.136 2015/01/26 00:57:22 schwarze Exp $ +.\" $Id: mandoc.1,v 1.137 2015/01/26 13:03:48 schwarze Exp $ .\" .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons .\" Copyright (c) 2012, 2014, 2015 Ingo Schwarze @@ -1609,6 +1609,10 @@ and it is likely that this will cause information loss or considerable misformatting. .It Sy "unsupported table layout" .It Sy "ignoring macro in table" +.It Sy "eqn in tbl" +.Pq eqn , tbl +The options line of a table defines equation delimiters. +Any equation source code contained in the table will be printed unformatted. .El .Sh COMPATIBILITY This section summarises diff --git a/mandoc.h b/mandoc.h index c0979ee0..40f2bdea 100644 --- a/mandoc.h +++ b/mandoc.h @@ -1,4 +1,4 @@ -/* $Id: mandoc.h,v 1.187 2015/01/26 00:57:22 schwarze Exp $ */ +/* $Id: mandoc.h,v 1.188 2015/01/26 13:03:48 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze @@ -181,6 +181,7 @@ enum mandocerr { MANDOCERR_REQ_UNSUPP, /* unsupported roff request: request */ MANDOCERR_TBLLAYOUT, /* unsupported table layout */ MANDOCERR_TBLMACRO, /* ignoring macro in table: macro */ + MANDOCERR_TBLEQN, /* eqn in tbl */ MANDOCERR_MAX }; @@ -196,6 +197,7 @@ struct tbl_opts { #define TBL_OPT_ALLBOX (1 << 4) #define TBL_OPT_NOKEEP (1 << 5) #define TBL_OPT_NOSPACE (1 << 6) +#define TBL_OPT_NOWARN (1 << 7) int cols; /* number of columns */ }; diff --git a/read.c b/read.c index 090f5261..5f381584 100644 --- a/read.c +++ b/read.c @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.116 2015/01/26 00:57:22 schwarze Exp $ */ +/* $Id: read.c,v 1.117 2015/01/26 13:03:48 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze @@ -224,6 +224,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "unsupported roff request", "unsupported table layout", "ignoring macro in table", + "eqn in tbl", }; static const char * const mandoclevels[MANDOCLEVEL_MAX] = { diff --git a/tbl.7 b/tbl.7 index 1b38b6ed..7417d208 100644 --- a/tbl.7 +++ b/tbl.7 @@ -1,7 +1,7 @@ -.\" $Id: tbl.7,v 1.22 2015/01/20 19:39:34 schwarze Exp $ +.\" $Id: tbl.7,v 1.23 2015/01/26 13:03:48 schwarze Exp $ .\" .\" Copyright (c) 2010, 2011 Kristaps Dzonsons -.\" Copyright (c) 2014 Ingo Schwarze +.\" Copyright (c) 2014, 2015 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: January 20 2015 $ +.Dd $Mdocdate: January 26 2015 $ .Dt TBL 7 .Os .Sh NAME @@ -133,58 +133,60 @@ c c c. in the case of .Xr man 7 . .Ss Options -The first line of a table consists of space-separated option keys and -modifiers terminated by a semicolon. -For GNU compatibility, option keys can also be separated by commas. +The first line of a table may contain options separated by spaces, tabs, +or commas and terminated by a semicolon. If the first line does not have a terminating semicolon, it is assumed that no options are specified and instead a .Sx Layout is processed. -Some options accept arguments enclosed by parenthesis. +Some options require arguments enclosed by parentheses. The following case-insensitive options are available: .Bl -tag -width Ds -.It Cm center -This option is not supported by -.Xr mandoc 1 . -This may also be invoked with -.Cm centre . -.It Cm delim -Accepts a two-character argument. -This option is not supported by -.Xr mandoc 1 . -.It Cm expand -This option is not supported by -.Xr mandoc 1 . +.It Cm allbox +Draw a single-line box around each table cell. +Currently treated as a synonym for +.Cm box . .It Cm box Draw a single-line box around the table. -This may also be invoked with +For GNU compatibility, this may also be invoked with .Cm frame . +.It Cm center +Center the table instead of left-adjusting it. +Currently ignored. +For GNU compatibility, this may also be invoked with +.Cm centre . +.It Cm decimalpoint +Use the single-character argument as the decimal point with the +.Cm n +layout key. +This is a GNU extension. +.It Cm delim +Use the two characters of the argument as +.Xr eqn 7 +delimiters. +Currently unsupported. .It Cm doublebox Draw a double-line box around the table. -This may also be invoked with +For GNU compatibility, this may also be invoked with .Cm doubleframe . -.It Cm allbox -This option is not supported by -.Xr mandoc 1 . -.It Cm tab -Accepts a single-character argument. -This character is used as a delimiter between data cells, which otherwise -defaults to the tab character. +.It Cm expand +Increase the width of the table to the current line length. +Currently ignored. .It Cm linesize -Accepts a natural number (all digits). -This option is not supported by -.Xr mandoc 1 . +Draw lines with the point size given by the unsigned integer argument. +Currently ignored. .It Cm nokeep -This option is not supported by -.Xr mandoc 1 . -.It Cm decimalpoint -Accepts a single-character argument. -This character will be used as the decimal point with the -.Cm n -layout key. +Allow page breaks within the table. +This is a GNU extension and currently ignored. .It Cm nospaces -This option is not supported by -.Xr mandoc 1 . +Ignore leading and trailing spaces in data cells. +This is a GNU extension and currently ignored. +.It Cm nowarn +Suppress warnings about tables exceeding the current line length. +This is a GNU extension and currently ignored. +.It Cm tab +Use the single-character argument as a delimiter between data cells. +By default, the tab character is used. .El .Ss Layout The table layout follows diff --git a/tbl_opts.c b/tbl_opts.c index 3193d143..ae1df965 100644 --- a/tbl_opts.c +++ b/tbl_opts.c @@ -1,4 +1,4 @@ -/* $Id: tbl_opts.c,v 1.17 2015/01/26 00:57:22 schwarze Exp $ */ +/* $Id: tbl_opts.c,v 1.18 2015/01/26 13:03:48 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2015 Ingo Schwarze @@ -28,60 +28,45 @@ #include "libmandoc.h" #include "libroff.h" -enum tbl_ident { - KEY_CENTRE = 0, - KEY_DELIM, - KEY_EXPAND, - KEY_BOX, - KEY_DBOX, - KEY_ALLBOX, - KEY_TAB, - KEY_LINESIZE, - KEY_NOKEEP, - KEY_DPOINT, - KEY_NOSPACE, - KEY_FRAME, - KEY_DFRAME, - KEY_MAX -}; +#define KEY_DPOINT 0 +#define KEY_DELIM 1 +#define KEY_LINESIZE 2 +#define KEY_TAB 3 struct tbl_phrase { const char *name; int key; - enum tbl_ident ident; }; -/* Handle Commonwealth/American spellings. */ -#define KEY_MAXKEYS 14 - -static const struct tbl_phrase keys[KEY_MAXKEYS] = { - { "center", TBL_OPT_CENTRE, KEY_CENTRE}, - { "centre", TBL_OPT_CENTRE, KEY_CENTRE}, - { "delim", 0, KEY_DELIM}, - { "expand", TBL_OPT_EXPAND, KEY_EXPAND}, - { "box", TBL_OPT_BOX, KEY_BOX}, - { "doublebox", TBL_OPT_DBOX, KEY_DBOX}, - { "allbox", TBL_OPT_ALLBOX, KEY_ALLBOX}, - { "frame", TBL_OPT_BOX, KEY_FRAME}, - { "doubleframe", TBL_OPT_DBOX, KEY_DFRAME}, - { "tab", 0, KEY_TAB}, - { "linesize", 0, KEY_LINESIZE}, - { "nokeep", TBL_OPT_NOKEEP, KEY_NOKEEP}, - { "decimalpoint", 0, KEY_DPOINT}, - { "nospaces", TBL_OPT_NOSPACE, KEY_NOSPACE}, +static const struct tbl_phrase keys[] = { + {"decimalpoint", 0}, + {"delim", 0}, + {"linesize", 0}, + {"tab", 0}, + {"allbox", TBL_OPT_ALLBOX | TBL_OPT_BOX}, + {"box", TBL_OPT_BOX}, + {"frame", TBL_OPT_BOX}, + {"center", TBL_OPT_CENTRE}, + {"centre", TBL_OPT_CENTRE}, + {"doublebox", TBL_OPT_DBOX}, + {"doubleframe", TBL_OPT_DBOX}, + {"expand", TBL_OPT_EXPAND}, + {"nokeep", TBL_OPT_NOKEEP}, + {"nospaces", TBL_OPT_NOSPACE}, + {"nowarn", TBL_OPT_NOWARN}, }; -static void arg(struct tbl_node *, int, - const char *, int *, enum tbl_ident); +#define KEY_MAXKEYS ((int)(sizeof(keys)/sizeof(keys[0]))) + +static void arg(struct tbl_node *, int, const char *, int *, int); static void -arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key) +arg(struct tbl_node *tbl, int ln, const char *p, int *pos, int key) { - const char *optname; int len, want; - while (isspace((unsigned char)p[*pos])) + while (p[*pos] == ' ' || p[*pos] == '\t') (*pos)++; /* Arguments are enclosed in parentheses. */ @@ -95,21 +80,18 @@ arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key) switch (key) { case KEY_DELIM: - optname = "delim"; + mandoc_msg(MANDOCERR_TBLEQN, tbl->parse, ln, *pos, NULL); want = 2; break; case KEY_TAB: - optname = "tab"; want = 1; if (len == want) tbl->opts.tab = p[*pos]; break; case KEY_LINESIZE: - optname = "linesize"; want = 0; break; case KEY_DPOINT: - optname = "decimalpoint"; want = 1; if (len == want) tbl->opts.decimal = p[*pos]; @@ -121,11 +103,11 @@ arg(struct tbl_node *tbl, int ln, const char *p, int *pos, enum tbl_ident key) if (len == 0) mandoc_msg(MANDOCERR_TBLOPT_NOARG, - tbl->parse, ln, *pos, optname); + tbl->parse, ln, *pos, keys[key].name); else if (want && len != want) mandoc_vmsg(MANDOCERR_TBLOPT_ARGSZ, - tbl->parse, ln, *pos, - "%s want %d have %d", optname, want, len); + tbl->parse, ln, *pos, "%s want %d have %d", + keys[key].name, want, len); *pos += len; if (p[*pos] == ')') @@ -144,7 +126,7 @@ tbl_option(struct tbl_node *tbl, int ln, const char *p) pos = 0; for (;;) { - while (isspace((unsigned char)p[pos]) || p[pos] == ',') + while (p[pos] == ' ' || p[pos] == '\t' || p[pos] == ',') pos++; if (p[pos] == ';') @@ -184,6 +166,6 @@ tbl_option(struct tbl_node *tbl, int ln, const char *p) if (keys[i].key) tbl->opts.opts |= keys[i].key; else - arg(tbl, ln, p, &pos, keys[i].ident); + arg(tbl, ln, p, &pos, i); } } -- cgit v1.2.3