diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2015-01-26 13:02:54 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2015-01-26 13:02:54 +0000 |
commit | 9cbba45f313461e4e99905ca586623b84eae1631 (patch) | |
tree | 5ad8e430aaaf0ec3fb94d53dbfb0ecf883a9fec2 | |
parent | aafbfd546cc379bad2d21c246effe54de0b9de92 (diff) |
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.
-rw-r--r-- | regress/usr.bin/mandoc/tbl/opt.in | 2 | ||||
-rw-r--r-- | regress/usr.bin/mandoc/tbl/opt.out_lint | 1 | ||||
-rw-r--r-- | share/man/man7/tbl.7 | 82 | ||||
-rw-r--r-- | usr.bin/mandoc/mandoc.h | 4 | ||||
-rw-r--r-- | usr.bin/mandoc/read.c | 3 | ||||
-rw-r--r-- | usr.bin/mandoc/tbl_opts.c | 82 |
6 files changed, 81 insertions, 93 deletions
diff --git a/regress/usr.bin/mandoc/tbl/opt.in b/regress/usr.bin/mandoc/tbl/opt.in index e21a9b687ef..24b2fdfd7d4 100644 --- a/regress/usr.bin/mandoc/tbl/opt.in +++ b/regress/usr.bin/mandoc/tbl/opt.in @@ -12,7 +12,7 @@ n n . .PP normal text .TS - , box,tab(:); l l . + , box,tab(:) delim($$); l l . a:b .TE .PP diff --git a/regress/usr.bin/mandoc/tbl/opt.out_lint b/regress/usr.bin/mandoc/tbl/opt.out_lint index 85ba35cf7c4..1f217d0b82e 100644 --- a/regress/usr.bin/mandoc/tbl/opt.out_lint +++ b/regress/usr.bin/mandoc/tbl/opt.out_lint @@ -2,3 +2,4 @@ mandoc: opt.in:7:5: ERROR: missing tbl option argument: tab mandoc: opt.in:7:19: ERROR: wrong tbl option argument size: decimalpoint want 1 have 2 mandoc: opt.in:7:23: ERROR: non-alphabetic character in tbl options: % mandoc: opt.in:7:24: ERROR: skipping unknown tbl option: foo +mandoc: opt.in:15:21: UNSUPP: eqn in tbl diff --git a/share/man/man7/tbl.7 b/share/man/man7/tbl.7 index 06eaa07151a..e911d69dccd 100644 --- a/share/man/man7/tbl.7 +++ b/share/man/man7/tbl.7 @@ -1,7 +1,7 @@ -.\" $OpenBSD: tbl.7,v 1.10 2015/01/20 19:23:32 jmc Exp $ +.\" $OpenBSD: tbl.7,v 1.11 2015/01/26 13:02:53 schwarze Exp $ .\" .\" Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> -.\" Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org> +.\" Copyright (c) 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 @@ -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/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h index 23ccbfa1301..639dd6ac36e 100644 --- a/usr.bin/mandoc/mandoc.h +++ b/usr.bin/mandoc/mandoc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mandoc.h,v 1.129 2015/01/26 00:54:09 schwarze Exp $ */ +/* $OpenBSD: mandoc.h,v 1.130 2015/01/26 13:02:53 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org> @@ -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/usr.bin/mandoc/read.c b/usr.bin/mandoc/read.c index f2b4d96d28d..f38fbc62083 100644 --- a/usr.bin/mandoc/read.c +++ b/usr.bin/mandoc/read.c @@ -1,4 +1,4 @@ -/* $OpenBSD: read.c,v 1.91 2015/01/26 00:54:09 schwarze Exp $ */ +/* $OpenBSD: read.c,v 1.92 2015/01/26 13:02:53 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org> @@ -219,6 +219,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/usr.bin/mandoc/tbl_opts.c b/usr.bin/mandoc/tbl_opts.c index 1593e7add36..5dab47f24b1 100644 --- a/usr.bin/mandoc/tbl_opts.c +++ b/usr.bin/mandoc/tbl_opts.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tbl_opts.c,v 1.9 2015/01/26 00:54:09 schwarze Exp $ */ +/* $OpenBSD: tbl_opts.c,v 1.10 2015/01/26 13:02:53 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org> @@ -26,60 +26,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. */ @@ -93,21 +78,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]; @@ -119,11 +101,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] == ')') @@ -142,7 +124,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] == ';') @@ -182,6 +164,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); } } |