summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--att.c1
-rw-r--r--cgi.c2
-rw-r--r--demandoc.c5
-rw-r--r--lib.c1
-rw-r--r--main.c67
-rw-r--r--man_html.c1
-rw-r--r--man_validate.c18
-rw-r--r--mandoc.197
-rw-r--r--mandoc.333
-rw-r--r--mandoc.h16
-rw-r--r--mandoc_headers.37
-rw-r--r--mandocd.c2
-rw-r--r--mandocdb.c3
-rw-r--r--mdoc_html.c1
-rw-r--r--mdoc_validate.c34
-rw-r--r--read.c28
-rw-r--r--roff.c10
-rw-r--r--roff.h12
-rw-r--r--roff_html.c1
-rw-r--r--roff_term.c1
-rw-r--r--st.c1
21 files changed, 222 insertions, 119 deletions
diff --git a/att.c b/att.c
index 23eb88c3..495bdc49 100644
--- a/att.c
+++ b/att.c
@@ -19,6 +19,7 @@
#include <sys/types.h>
#include <string.h>
+#include "mandoc.h"
#include "roff.h"
#include "mdoc.h"
#include "libmdoc.h"
diff --git a/cgi.c b/cgi.c
index c32b8c03..071dae93 100644
--- a/cgi.c
+++ b/cgi.c
@@ -832,7 +832,7 @@ resp_format(const struct req *req, const char *file)
mchars_alloc();
mp = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1,
- MANDOCLEVEL_BADARG, NULL, req->q.manpath);
+ MANDOCERR_MAX, NULL, MANDOC_OS_OTHER, req->q.manpath);
mparse_readfd(mp, fd, file);
close(fd);
diff --git a/demandoc.c b/demandoc.c
index 345a96f6..4f57b0d0 100644
--- a/demandoc.c
+++ b/demandoc.c
@@ -25,10 +25,10 @@
#include <string.h>
#include <unistd.h>
+#include "mandoc.h"
#include "roff.h"
#include "man.h"
#include "mdoc.h"
-#include "mandoc.h"
static void pline(int, int *, int *, int);
static void pman(const struct roff_node *, int *, int *, int);
@@ -78,7 +78,8 @@ main(int argc, char *argv[])
argv += optind;
mchars_alloc();
- mp = mparse_alloc(MPARSE_SO, MANDOCLEVEL_BADARG, NULL, NULL);
+ mp = mparse_alloc(MPARSE_SO, MANDOCERR_MAX, NULL,
+ MANDOC_OS_OTHER, NULL);
assert(mp);
if (argc < 1)
diff --git a/lib.c b/lib.c
index e8130528..e3258eb8 100644
--- a/lib.c
+++ b/lib.c
@@ -20,6 +20,7 @@
#include <string.h>
+#include "mandoc.h"
#include "roff.h"
#include "mdoc.h"
#include "libmdoc.h"
diff --git a/main.c b/main.c
index 90162ad9..f028f93c 100644
--- a/main.c
+++ b/main.c
@@ -74,11 +74,13 @@ enum outt {
struct curparse {
struct mparse *mp;
- enum mandoclevel wlevel; /* ignore messages below this */
+ struct manoutput *outopts; /* output options */
+ void *outdata; /* data for output */
+ char *os_s; /* operating system for display */
int wstop; /* stop after a file with a warning */
+ enum mandocerr mmin; /* ignore messages below this */
+ enum mandoc_os os_e; /* check base system conventions */
enum outt outtype; /* which output to use */
- void *outdata; /* data for output */
- struct manoutput *outopts; /* output options */
};
@@ -119,7 +121,7 @@ main(int argc, char *argv[])
struct manpage *res, *resp;
const char *progname, *sec, *thisarg;
char *conf_file, *defpaths, *auxpaths;
- char *defos, *oarg;
+ char *oarg;
unsigned char *uc;
size_t i, sz;
int prio, best_prio;
@@ -183,10 +185,9 @@ main(int argc, char *argv[])
memset(&curp, 0, sizeof(struct curparse));
curp.outtype = OUTT_LOCALE;
- curp.wlevel = MANDOCLEVEL_BADARG;
+ curp.mmin = MANDOCERR_MAX;
curp.outopts = &conf.output;
options = MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1;
- defos = NULL;
use_pager = 1;
tag_files = NULL;
@@ -222,11 +223,11 @@ main(int argc, char *argv[])
warnx("-I %s: Bad argument", optarg);
return (int)MANDOCLEVEL_BADARG;
}
- if (defos) {
+ if (curp.os_s != NULL) {
warnx("-I %s: Duplicate argument", optarg);
return (int)MANDOCLEVEL_BADARG;
}
- defos = mandoc_strdup(optarg + 3);
+ curp.os_s = mandoc_strdup(optarg + 3);
break;
case 'K':
if ( ! koptions(&options, optarg))
@@ -446,7 +447,8 @@ main(int argc, char *argv[])
moptions(&options, auxpaths);
mchars_alloc();
- curp.mp = mparse_alloc(options, curp.wlevel, mmsg, defos);
+ curp.mp = mparse_alloc(options, curp.mmin, mmsg,
+ curp.os_e, curp.os_s);
/*
* Conditionally start up the lookaside buffer before parsing.
@@ -524,7 +526,7 @@ out:
mansearch_free(res, sz);
}
- free(defos);
+ free(curp.os_s);
/*
* When using a pager, finish writing both temporary files,
@@ -937,7 +939,7 @@ toptions(struct curparse *curp, char *arg)
curp->outtype = OUTT_ASCII;
else if (0 == strcmp(arg, "lint")) {
curp->outtype = OUTT_LINT;
- curp->wlevel = MANDOCLEVEL_STYLE;
+ curp->mmin = MANDOCERR_BASE;
} else if (0 == strcmp(arg, "tree"))
curp->outtype = OUTT_TREE;
else if (0 == strcmp(arg, "man"))
@@ -966,16 +968,19 @@ static int
woptions(struct curparse *curp, char *arg)
{
char *v, *o;
- const char *toks[8];
+ const char *toks[11];
toks[0] = "stop";
toks[1] = "all";
- toks[2] = "style";
- toks[3] = "warning";
- toks[4] = "error";
- toks[5] = "unsupp";
- toks[6] = "fatal";
- toks[7] = NULL;
+ toks[2] = "base";
+ toks[3] = "style";
+ toks[4] = "warning";
+ toks[5] = "error";
+ toks[6] = "unsupp";
+ toks[7] = "fatal";
+ toks[8] = "openbsd";
+ toks[9] = "netbsd";
+ toks[10] = NULL;
while (*arg) {
o = arg;
@@ -985,19 +990,30 @@ woptions(struct curparse *curp, char *arg)
break;
case 1:
case 2:
- curp->wlevel = MANDOCLEVEL_STYLE;
+ curp->mmin = MANDOCERR_BASE;
break;
case 3:
- curp->wlevel = MANDOCLEVEL_WARNING;
+ curp->mmin = MANDOCERR_STYLE;
break;
case 4:
- curp->wlevel = MANDOCLEVEL_ERROR;
+ curp->mmin = MANDOCERR_WARNING;
break;
case 5:
- curp->wlevel = MANDOCLEVEL_UNSUPP;
+ curp->mmin = MANDOCERR_ERROR;
break;
case 6:
- curp->wlevel = MANDOCLEVEL_BADARG;
+ curp->mmin = MANDOCERR_UNSUPP;
+ break;
+ case 7:
+ curp->mmin = MANDOCERR_MAX;
+ break;
+ case 8:
+ curp->mmin = MANDOCERR_BASE;
+ curp->os_e = MANDOC_OS_OPENBSD;
+ break;
+ case 9:
+ curp->mmin = MANDOCERR_BASE;
+ curp->os_e = MANDOC_OS_NETBSD;
break;
default:
warnx("-W %s: Bad argument", o);
@@ -1019,9 +1035,10 @@ mmsg(enum mandocerr t, enum mandoclevel lvl,
if (line)
fprintf(stderr, "%d:%d:", line, col + 1);
- fprintf(stderr, " %s", mparse_strlevel(lvl));
+ fprintf(stderr, " %s",
+ t < MANDOCERR_STYLE ? "BASE" : mparse_strlevel(lvl));
- if (NULL != (mparse_msg = mparse_strerror(t)))
+ if ((mparse_msg = mparse_strerror(t)) != NULL)
fprintf(stderr, ": %s", mparse_msg);
if (msg)
diff --git a/man_html.c b/man_html.c
index 030558d7..50df1580 100644
--- a/man_html.c
+++ b/man_html.c
@@ -26,6 +26,7 @@
#include <string.h>
#include "mandoc_aux.h"
+#include "mandoc.h"
#include "roff.h"
#include "man.h"
#include "out.h"
diff --git a/man_validate.c b/man_validate.c
index 7426bfbb..e874cabb 100644
--- a/man_validate.c
+++ b/man_validate.c
@@ -173,7 +173,9 @@ check_root(CHKARGS)
if (man->meta.os_e &&
(man->meta.rcsids & (1 << man->meta.os_e)) == 0)
- mandoc_msg(MANDOCERR_RCS_MISSING, man->parse, 0, 0, NULL);
+ mandoc_msg(MANDOCERR_RCS_MISSING, man->parse, 0, 0,
+ man->meta.os_e == MANDOC_OS_OPENBSD ?
+ "(OpenBSD)" : "(NetBSD)");
}
static void
@@ -340,12 +342,14 @@ post_TH(CHKARGS)
if (n && (n = n->next))
man->meta.os = mandoc_strdup(n->string);
- else if (man->defos != NULL)
- man->meta.os = mandoc_strdup(man->defos);
- man->meta.os_e = man->meta.os == NULL ? MDOC_OS_OTHER :
- strstr(man->meta.os, "OpenBSD") != NULL ? MDOC_OS_OPENBSD :
- strstr(man->meta.os, "NetBSD") != NULL ? MDOC_OS_NETBSD :
- MDOC_OS_OTHER;
+ else if (man->os_s != NULL)
+ man->meta.os = mandoc_strdup(man->os_s);
+ if (man->meta.os_e == MANDOC_OS_OTHER && man->meta.os != NULL) {
+ if (strstr(man->meta.os, "OpenBSD") != NULL)
+ man->meta.os_e = MANDOC_OS_OPENBSD;
+ else if (strstr(man->meta.os, "NetBSD") != NULL)
+ man->meta.os_e = MANDOC_OS_NETBSD;
+ }
/* TITLE MSEC DATE OS ->VOL<- */
/* If missing, use the default VOL name for MSEC. */
diff --git a/mandoc.1 b/mandoc.1
index ac49d4ab..11ac4ac3 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -75,11 +75,6 @@ and for the
.Xr man 7
.Ic \&TH
macro.
-This can also be used to perform style checks according to the
-conventions of one operating system while running on a different
-operating system; see
-.Sx Style messages
-for details.
.It Fl K Ar encoding
Specify the input encoding.
The supported
@@ -151,14 +146,33 @@ to be reported on the standard error output and to affect the exit status.
The
.Ar level
can be
+.Cm base ,
.Cm style ,
.Cm warning ,
.Cm error ,
or
-.Cm unsupp ;
+.Cm unsupp .
+The
+.Cm base
+level automatically derives the operating system from the contents of the
+.Ic \&Os
+macro, from the
+.Fl Ios
+command line option, or from the
+.Xr uname 3
+return value.
+The levels
+.Cm openbsd
+and
+.Cm netbsd
+are variants of
+.Cm base
+that bypass autodetection and request validation of base system
+conventions for a particular operating system.
+The level
.Cm all
is an alias for
-.Cm style .
+.Cm base .
By default,
.Nm
is silent.
@@ -224,7 +238,7 @@ See
.It Fl T Cm lint
Parse only: produce no output.
Implies
-.Fl W Cm style .
+.Fl W Cm all .
.It Fl T Cm locale
Encode output using the current locale.
This is the default.
@@ -596,19 +610,23 @@ option:
.Pp
.Bl -tag -width Ds -compact
.It 0
-No style suggestions, warnings or errors occurred, or those that
-did were ignored because they were lower than the requested
+No base system convention violations, style suggestions, warnings,
+or errors occurred, or those that did were ignored because they
+were lower than the requested
.Ar level .
.It 1
-At least one style suggestion occurred, but no warning or error, and
+At least one base system convention violation or style suggestion
+occurred, but no warning or error, and
+.Fl W Cm base
+or
.Fl W Cm style
was specified.
.It 2
At least one warning occurred, but no error, and
.Fl W Cm warning
-or
-.Fl W Cm style
-was specified.
+or a lower
+.Ar level
+was requested.
.It 3
At least one parsing error occurred,
but no unsupported feature was encountered, and
@@ -636,7 +654,7 @@ to exit at once, possibly in the middle of parsing or formatting a file.
Note that selecting
.Fl T Cm lint
output mode implies
-.Fl W Cm style .
+.Fl W Cm all .
.Sh EXAMPLES
To page manuals to the terminal:
.Pp
@@ -669,12 +687,19 @@ parser:
Messages displayed by
.Nm
follow this format:
-.Pp
-.D1 Nm Ns : Ar file : Ns Ar line : Ns Ar column : level : message : macro args
+.Bd -ragged -offset indent
+.Nm Ns :
+.Ar file : Ns Ar line : Ns Ar column : level : message : macro args
+.Pq Ar os
+.Ed
.Pp
Line and column numbers start at 1.
Both are omitted for messages referring to an input file as a whole.
Macro names and arguments are omitted where meaningless.
+The
+.Ar os
+operating system specifier is omitted for messages that are relevant
+for all operating systems.
Fatal messages about invalid command line arguments
or operating system errors, for example when memory is exhausted,
may also omit the
@@ -732,9 +757,15 @@ so it may occasionally issue bogus suggestions.
Please use your good judgement to decide whether any particular
.Cm style
suggestion really justifies a change to the input file.
+.It Cm base
+A convertion used in the base system of a specific operating system
+is not adhered to.
+These are not markup mistakes, and neither the quality of formatting
+nor portability are in danger.
.El
.Pp
Messages of the
+.Cm base ,
.Cm style ,
.Cm warning ,
.Cm error ,
@@ -746,9 +777,15 @@ are hidden unless their level, or a lower level, is requested using a
option or
.Fl T Cm lint
output mode.
-.Ss Style messages
-As indicated below, some style checks are only performed if a
-specific operating system name occurs in the arguments of the
+.Pp
+As indicated below, all
+.Cm base
+and some
+.Cm style
+checks are only performed if a specific operating system name occurs
+in the arguments of the
+.Fl W
+command line option, of the
.Ic \&Os
macro, of the
.Fl Ios
@@ -756,6 +793,7 @@ command line option, or, if neither are present, in the return value
of the
.Xr uname 3
function.
+.Ss Conventions for base system manuals
.Bl -ohang
.It Sy "Mdocdate found"
.Pq mdoc , Nx
@@ -778,6 +816,17 @@ macro does not use CVS
keyword substitution, but using it is conventionally expected in the
.Ox
base system.
+.It Sy "RCS id missing"
+.Pq Ox , Nx
+The manual page lacks the comment line with the RCS identifier
+generated by CVS
+.Ic OpenBSD
+or
+.Ic NetBSD
+keyword substitution as conventionally used in these operating systems.
+.El
+.Ss Style suggestions
+.Bl -ohang
.It Sy "legacy man(7) date format"
.Pq mdoc
The
@@ -791,14 +840,6 @@ Consider using the conventional
date format
.Dq "Month dd, yyyy"
instead.
-.It Sy "RCS id missing"
-.Pq Ox , Nx
-The manual page lacks the comment line with the RCS identifier
-generated by CVS
-.Ic OpenBSD
-or
-.Ic NetBSD
-keyword substitution as conventionally used in these operating systems.
.It Sy "duplicate RCS id"
A single manual page contains two copies of the RCS identifier for
the same operating system.
diff --git a/mandoc.3 b/mandoc.3
index c66185bd..ebd84574 100644
--- a/mandoc.3
+++ b/mandoc.3
@@ -47,9 +47,10 @@
.Ft struct mparse *
.Fo mparse_alloc
.Fa "int options"
-.Fa "enum mandoclevel wlevel"
+.Fa "enum mandocerr mmin"
.Fa "mandocmsg mmsg"
-.Fa "char *defos"
+.Fa "enum mandoc_os oe_e"
+.Fa "char *os_s"
.Fc
.Ft void
.Fo (*mandocmsg)
@@ -304,12 +305,15 @@ This is for example useful in
.Xr makewhatis 8
.Fl Q
to quickly build minimal databases.
-.It Ar wlevel
+.It Ar mmin
Can be set to
-.Dv MANDOCLEVEL_BADARG ,
-.Dv MANDOCLEVEL_ERROR ,
+.Dv MANDOCERR_BASE ,
+.Dv MANDOCERR_STYLE ,
+.Dv MANDOCERR_WARNING ,
+.Dv MANDOCERR_ERROR ,
+.Dv MANDOCERR_UNSUPP ,
or
-.Dv MANDOCLEVEL_WARNING .
+.Dv MANDOCERR_MAX .
Messages below the selected level will be suppressed.
.It Ar mmsg
A callback function to handle errors and warnings.
@@ -319,10 +323,19 @@ for an example.
If printing of error messages is not desired,
.Dv NULL
may be passed.
-.It Ar defos
+.It Ar os_e
+Operating system to check base system conventions for.
+If
+.Dv MANDOC_OS_OTHER ,
+the system is automatically detected from
+.Ic \&Os ,
+.Fl Ios ,
+or
+.Xr uname 3 .
+.It Ar os_s
A default string for the
.Xr mdoc 7
-.Sq \&Os
+.Ic \&Os
macro, overriding the
.Dv OSNAME
preprocessor definition and the results of
@@ -650,10 +663,10 @@ TEXT end
.Ed
.Pp
Here, the formatting of the
-.Sq \&Ao
+.Ic \&Ao
block extends from TEXT ao to TEXT ac,
while the formatting of the
-.Sq \&Bo
+.Ic \&Bo
block extends from TEXT bo to TEXT bc.
It renders as follows in
.Fl T Ns Cm ascii
diff --git a/mandoc.h b/mandoc.h
index ad4b4fb5..166483b3 100644
--- a/mandoc.h
+++ b/mandoc.h
@@ -44,12 +44,15 @@ enum mandoclevel {
enum mandocerr {
MANDOCERR_OK,
- MANDOCERR_STYLE, /* ===== start of style suggestions ===== */
+ MANDOCERR_BASE, /* ===== start of base system conventions ===== */
MANDOCERR_MDOCDATE, /* Mdocdate found: Dd ... */
MANDOCERR_MDOCDATE_MISSING, /* Mdocdate missing: Dd ... */
- MANDOCERR_DATE_LEGACY, /* legacy man(7) date format: Dd ... */
MANDOCERR_RCS_MISSING, /* RCS id missing */
+
+ MANDOCERR_STYLE, /* ===== start of style suggestions ===== */
+
+ MANDOCERR_DATE_LEGACY, /* legacy man(7) date format: Dd ... */
MANDOCERR_RCS_REP, /* duplicate RCS id: ... */
MANDOCERR_MACRO_USELESS, /* useless macro: macro */
MANDOCERR_BX, /* consider using OS macro: macro */
@@ -413,6 +416,12 @@ struct eqn {
#define MPARSE_UTF8 16 /* accept UTF-8 input */
#define MPARSE_LATIN1 32 /* accept ISO-LATIN-1 input */
+enum mandoc_os {
+ MANDOC_OS_OTHER = 0,
+ MANDOC_OS_NETBSD,
+ MANDOC_OS_OPENBSD
+};
+
enum mandoc_esc {
ESCAPE_ERROR = 0, /* bail! unparsable escape */
ESCAPE_IGNORE, /* escape to be ignored */
@@ -448,7 +457,8 @@ const char *mchars_uc2str(int);
int mchars_num2uc(const char *, size_t);
int mchars_spec2cp(const char *, size_t);
const char *mchars_spec2str(const char *, size_t, size_t *);
-struct mparse *mparse_alloc(int, enum mandoclevel, mandocmsg, const char *);
+struct mparse *mparse_alloc(int, enum mandocerr, mandocmsg,
+ enum mandoc_os, const char *);
void mparse_free(struct mparse *);
void mparse_keep(struct mparse *);
int mparse_open(struct mparse *, const char *);
diff --git a/mandoc_headers.3 b/mandoc_headers.3
index f061332c..ecc98e2e 100644
--- a/mandoc_headers.3
+++ b/mandoc_headers.3
@@ -87,6 +87,7 @@ Provides
.Vt enum mandoc_esc ,
.Vt enum mandocerr ,
.Vt enum mandoclevel ,
+.Vt enum mandoc_os ,
.Vt enum tbl_cellt ,
.Vt enum tbl_datt ,
.Vt enum tbl_spant ,
@@ -126,7 +127,11 @@ as an opaque type for function prototypes.
Requires
.Qq Pa mandoc_ohash.h
for
-.Vt struct ohash .
+.Vt struct ohash
+and
+.Qq Pa mandoc.h
+for
+.Vt enum mandoc_os .
.Pp
Provides
.Vt enum mdoc_endbody ,
diff --git a/mandocd.c b/mandocd.c
index b4fb484d..0feb9bb9 100644
--- a/mandocd.c
+++ b/mandocd.c
@@ -171,7 +171,7 @@ main(int argc, char *argv[])
mchars_alloc();
parser = mparse_alloc(MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1,
- MANDOCLEVEL_BADARG, NULL, defos);
+ MANDOCERR_MAX, NULL, MANDOC_OS_OTHER, defos);
memset(&options, 0, sizeof(options));
switch (outtype) {
diff --git a/mandocdb.c b/mandocdb.c
index b74c31bd..75a874d9 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -420,7 +420,8 @@ mandocdb(int argc, char *argv[])
exitcode = (int)MANDOCLEVEL_OK;
mchars_alloc();
- mp = mparse_alloc(mparse_options, MANDOCLEVEL_BADARG, NULL, NULL);
+ mp = mparse_alloc(mparse_options, MANDOCLEVEL_BADARG, NULL,
+ MANDOC_OS_OTHER, NULL);
mandoc_ohash_init(&mpages, 6, offsetof(struct mpage, inodev));
mandoc_ohash_init(&mlinks, 6, offsetof(struct mlink, file));
diff --git a/mdoc_html.c b/mdoc_html.c
index 5e08ab85..a79cc0d3 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -27,6 +27,7 @@
#include <unistd.h>
#include "mandoc_aux.h"
+#include "mandoc.h"
#include "roff.h"
#include "mdoc.h"
#include "out.h"
diff --git a/mdoc_validate.c b/mdoc_validate.c
index efa80e27..731b63c6 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1709,7 +1709,7 @@ post_bl(POST_ARGS)
nchild = nnext;
}
- if (mdoc->meta.os_e != MDOC_OS_NETBSD)
+ if (mdoc->meta.os_e != MANDOC_OS_NETBSD)
return;
prev_Er = NULL;
@@ -1728,11 +1728,12 @@ post_bl(POST_ARGS)
if (order > 0)
mandoc_vmsg(MANDOCERR_ER_ORDER,
mdoc->parse, nnext->line, nnext->pos,
- "Er %s %s", prev_Er, nnext->string);
+ "Er %s %s (NetBSD)",
+ prev_Er, nnext->string);
else if (order == 0)
mandoc_vmsg(MANDOCERR_ER_REP,
mdoc->parse, nnext->line, nnext->pos,
- "Er %s", prev_Er);
+ "Er %s (NetBSD)", prev_Er);
}
prev_Er = nnext->string;
}
@@ -1808,8 +1809,9 @@ post_root(POST_ARGS)
mdoc->meta.os = mandoc_strdup("");
} else if (mdoc->meta.os_e &&
(mdoc->meta.rcsids & (1 << mdoc->meta.os_e)) == 0)
- mandoc_msg(MANDOCERR_RCS_MISSING,
- mdoc->parse, 0, 0, NULL);
+ mandoc_msg(MANDOCERR_RCS_MISSING, mdoc->parse, 0, 0,
+ mdoc->meta.os_e == MANDOC_OS_OPENBSD ?
+ "(OpenBSD)" : "(NetBSD)");
/* Check that we begin with a proper `Sh'. */
@@ -2548,8 +2550,8 @@ post_os(POST_ARGS)
if (mdoc->meta.os)
goto out;
- if (mdoc->defos) {
- mdoc->meta.os = mandoc_strdup(mdoc->defos);
+ if (mdoc->os_s != NULL) {
+ mdoc->meta.os = mandoc_strdup(mdoc->os_s);
goto out;
}
@@ -2568,9 +2570,13 @@ post_os(POST_ARGS)
mdoc->meta.os = mandoc_strdup(defbuf);
#endif /*!OSNAME*/
-out: mdoc->meta.os_e = strstr(mdoc->meta.os, "OpenBSD") != NULL ?
- MDOC_OS_OPENBSD : strstr(mdoc->meta.os, "NetBSD") != NULL ?
- MDOC_OS_NETBSD : MDOC_OS_OTHER;
+out:
+ if (mdoc->meta.os_e == MANDOC_OS_OTHER) {
+ if (strstr(mdoc->meta.os, "OpenBSD") != NULL)
+ mdoc->meta.os_e = MANDOC_OS_OPENBSD;
+ else if (strstr(mdoc->meta.os, "NetBSD") != NULL)
+ mdoc->meta.os_e = MANDOC_OS_NETBSD;
+ }
/*
* This is the earliest point where we can check
@@ -2584,15 +2590,15 @@ out: mdoc->meta.os_e = strstr(mdoc->meta.os, "OpenBSD") != NULL ?
if ((n = n->child) == NULL)
return;
if (strncmp(n->string, "$" "Mdocdate", 9)) {
- if (mdoc->meta.os_e == MDOC_OS_OPENBSD)
+ if (mdoc->meta.os_e == MANDOC_OS_OPENBSD)
mandoc_vmsg(MANDOCERR_MDOCDATE_MISSING,
mdoc->parse, n->line, n->pos,
- "Dd %s", n->string);
+ "Dd %s (OpenBSD)", n->string);
} else {
- if (mdoc->meta.os_e == MDOC_OS_NETBSD)
+ if (mdoc->meta.os_e == MANDOC_OS_NETBSD)
mandoc_vmsg(MANDOCERR_MDOCDATE,
mdoc->parse, n->line, n->pos,
- "Dd %s", n->string);
+ "Dd %s (NetBSD)", n->string);
}
}
diff --git a/read.c b/read.c
index 94dffc06..061995b9 100644
--- a/read.c
+++ b/read.c
@@ -53,10 +53,10 @@ struct mparse {
const char *file; /* filename of current input file */
struct buf *primary; /* buffer currently being parsed */
struct buf *secondary; /* preprocessed copy of input */
- const char *defos; /* default operating system */
+ const char *os_s; /* default operating system */
mandocmsg mmsg; /* warning/error message handler */
enum mandoclevel file_status; /* status of current parse */
- enum mandoclevel wlevel; /* ignore messages below this */
+ enum mandocerr mmin; /* ignore messages below this */
int options; /* parser options */
int gzip; /* current input file is gzipped */
int filenc; /* encoding of the current file */
@@ -86,12 +86,15 @@ static const enum mandocerr mandoclimits[MANDOCLEVEL_MAX] = {
static const char * const mandocerrs[MANDOCERR_MAX] = {
"ok",
- "generic style suggestion",
+ "base system convention",
"Mdocdate found",
"Mdocdate missing",
- "legacy man(7) date format",
"RCS id missing",
+
+ "generic style suggestion",
+
+ "legacy man(7) date format",
"duplicate RCS id",
"useless macro",
"consider using OS macro",
@@ -755,20 +758,20 @@ mparse_open(struct mparse *curp, const char *file)
}
struct mparse *
-mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg,
- const char *defos)
+mparse_alloc(int options, enum mandocerr mmin, mandocmsg mmsg,
+ enum mandoc_os os_e, const char *os_s)
{
struct mparse *curp;
curp = mandoc_calloc(1, sizeof(struct mparse));
curp->options = options;
- curp->wlevel = wlevel;
+ curp->mmin = mmin;
curp->mmsg = mmsg;
- curp->defos = defos;
+ curp->os_s = os_s;
curp->roff = roff_alloc(curp, options);
- curp->man = roff_man_alloc( curp->roff, curp, curp->defos,
+ curp->man = roff_man_alloc(curp->roff, curp, curp->os_s,
curp->options & MPARSE_QUICK ? 1 : 0);
if (curp->options & MPARSE_MDOC) {
curp->man->macroset = MACROSET_MDOC;
@@ -780,6 +783,7 @@ mparse_alloc(int options, enum mandoclevel wlevel, mandocmsg mmsg,
curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX);
}
curp->man->first->tok = TOKEN_NONE;
+ curp->man->meta.os_e = os_e;
return curp;
}
@@ -855,13 +859,13 @@ mandoc_msg(enum mandocerr er, struct mparse *m,
{
enum mandoclevel level;
+ if (er < m->mmin && er != MANDOCERR_FILE)
+ return;
+
level = MANDOCLEVEL_UNSUPP;
while (er < mandoclimits[level])
level--;
- if (level < m->wlevel && er != MANDOCERR_FILE)
- return;
-
if (m->mmsg)
(*m->mmsg)(er, level, m->file, ln, col, msg);
diff --git a/roff.c b/roff.c
index 7a5fc1da..7e773d22 100644
--- a/roff.c
+++ b/roff.c
@@ -819,14 +819,14 @@ roff_man_free(struct roff_man *man)
struct roff_man *
roff_man_alloc(struct roff *roff, struct mparse *parse,
- const char *defos, int quick)
+ const char *os_s, int quick)
{
struct roff_man *man;
man = mandoc_calloc(1, sizeof(*man));
man->parse = parse;
man->roff = roff;
- man->defos = defos;
+ man->os_s = os_s;
man->quick = quick;
roff_man_alloc1(man);
roff->man = man;
@@ -1138,7 +1138,7 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
size_t maxl; /* expected length of the escape name */
size_t naml; /* actual length of the escape name */
enum mandoc_esc esc; /* type of the escape sequence */
- enum mdoc_os os_e; /* kind of RCS id seen */
+ enum mandoc_os os_e; /* kind of RCS id seen */
int inaml; /* length returned from mandoc_escape() */
int expand_count; /* to avoid infinite loops */
int npos; /* position in numeric expression */
@@ -1161,10 +1161,10 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
/* Comment found, look for RCS id. */
if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) {
- os_e = MDOC_OS_OPENBSD;
+ os_e = MANDOC_OS_OPENBSD;
cp += 8;
} else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) {
- os_e = MDOC_OS_NETBSD;
+ os_e = MANDOC_OS_NETBSD;
cp += 7;
}
if (cp != NULL &&
diff --git a/roff.h b/roff.h
index f153f854..c2b12ff6 100644
--- a/roff.h
+++ b/roff.h
@@ -26,12 +26,6 @@ enum roff_macroset {
MACROSET_MAN
};
-enum mdoc_os {
- MDOC_OS_OTHER = 0,
- MDOC_OS_NETBSD,
- MDOC_OS_OPENBSD
-};
-
enum roff_sec {
SEC_NONE = 0,
SEC_NAME,
@@ -534,8 +528,8 @@ struct roff_meta {
char *name; /* Leading manual name. */
char *date; /* Normalized date. */
int hasbody; /* Document is not empty. */
- int rcsids; /* Bits indexed by enum mdoc_os. */
- enum mdoc_os os_e; /* Operating system. */
+ int rcsids; /* Bits indexed by enum mandoc_os. */
+ enum mandoc_os os_e; /* Operating system. */
};
struct roff_man {
@@ -544,7 +538,7 @@ struct roff_man {
struct roff *roff; /* Roff parser state data. */
struct ohash *mdocmac; /* Mdoc macro lookup table. */
struct ohash *manmac; /* Man macro lookup table. */
- const char *defos; /* Default operating system. */
+ const char *os_s; /* Default operating system. */
struct roff_node *first; /* The first node parsed. */
struct roff_node *last; /* The last node parsed. */
struct roff_node *last_es; /* The most recent Es node. */
diff --git a/roff_html.c b/roff_html.c
index 1ce83659..630f91af 100644
--- a/roff_html.c
+++ b/roff_html.c
@@ -20,6 +20,7 @@
#include <assert.h>
#include <stddef.h>
+#include "mandoc.h"
#include "roff.h"
#include "out.h"
#include "html.h"
diff --git a/roff_term.c b/roff_term.c
index 5a838ea2..f0a2ca93 100644
--- a/roff_term.c
+++ b/roff_term.c
@@ -19,6 +19,7 @@
#include <assert.h>
#include <stddef.h>
+#include "mandoc.h"
#include "roff.h"
#include "out.h"
#include "term.h"
diff --git a/st.c b/st.c
index 2f899fea..e3812911 100644
--- a/st.c
+++ b/st.c
@@ -20,6 +20,7 @@
#include <string.h>
+#include "mandoc.h"
#include "roff.h"
#include "mdoc.h"
#include "libmdoc.h"