mandoc: Vendor import of upstream at 2025-09-26

Interesting changes:
+ mandoc db: Improve case sorting, found by our very own markj
+ history: Add macros for version 8 and 10 AT&T Unix
+ linter: Warn on blank lines in man(7) like mdoc(7)
+ manuals: Improve precision, man(7) syntax table, and roff(7) specifics
+ manuals: Fix PDF/PS footer regression detailed in our PR: 289786

PR:		289786
MFC after:	3 days
This commit is contained in:
Alexander Ziaee 2025-09-29 13:31:38 -04:00
commit 59fc2b0166
No known key found for this signature in database
GPG key ID: 0A8F850BCDEF4511
9 changed files with 84 additions and 74 deletions

View file

@ -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.
VERSION = 1.14.6s20250727
VERSION = 1.14.6s20250926
# === LIST OF FILES ====================================================

View file

@ -1,6 +1,6 @@
/* $Id: dba.c,v 1.10 2017/02/17 14:43:54 schwarze Exp $ */
/* $Id: dba.c,v 1.11 2025/09/24 13:13:30 schwarze Exp $ */
/*
* Copyright (c) 2016, 2017 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2016, 2017, 2025 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
@ -318,7 +318,8 @@ compare_names(const void *vp1, const void *vp2)
cp1 = *(const char * const *)vp1;
cp2 = *(const char * const *)vp2;
return (diff = *cp2 - *cp1) ? diff :
strcasecmp(cp1 + 1, cp2 + 1);
(diff = strcasecmp(cp1 + 1, cp2 + 1)) ? diff :
strcmp(cp1 + 1, cp2 + 1);
}
static int

View file

@ -1,6 +1,6 @@
/* $Id: main.c,v 1.361 2022/04/14 16:43:43 schwarze Exp $ */
/* $Id: main.c,v 1.364 2025/09/24 21:30:20 schwarze Exp $ */
/*
* Copyright (c) 2010-2012, 2014-2021 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2010-2012,2014-2021,2025 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
*
@ -109,7 +109,7 @@ static void parse(struct mparse *, int, const char *,
struct outstate *, struct manconf *);
static void passthrough(int, int);
static void process_onefile(struct mparse *, struct manpage *,
int, struct outstate *, struct manconf *);
struct outstate *, struct manconf *);
static void run_pager(struct outstate *, char *);
static pid_t spawn_pager(struct outstate *, char *);
static void usage(enum argmode) __attribute__((__noreturn__));
@ -144,7 +144,6 @@ main(int argc, char *argv[])
int options; /* Parser options. */
int show_usage; /* Invalid argument: give up. */
int prio, best_prio;
int startdir;
int c;
enum mandoc_os os_e; /* Check base system conventions. */
enum outmode outmode; /* According to command line. */
@ -514,7 +513,7 @@ main(int argc, char *argv[])
if (resnsz == 0)
(void)fs_search(&search, &conf.manpath,
*argv, &resn, &resnsz);
if (resnsz == 0 && strchr(*argv, '/') == NULL) {
if (resnsz == 0) {
if (search.arch != NULL &&
arch_valid(search.arch, OSENUM) == 0)
warnx("Unknown architecture \"%s\".",
@ -529,20 +528,6 @@ main(int argc, char *argv[])
mandoc_msg_setrc(MANDOCLEVEL_BADARG);
continue;
}
if (resnsz == 0) {
if (access(*argv, R_OK) == -1) {
mandoc_msg_setinfilename(*argv);
mandoc_msg(MANDOCERR_BADARG_BAD,
0, 0, "%s", strerror(errno));
mandoc_msg_setinfilename(NULL);
continue;
}
resnsz = 1;
resn = mandoc_calloc(resnsz, sizeof(*res));
resn->file = mandoc_strdup(*argv);
resn->ipath = SIZE_MAX;
resn->form = FORM_SRC;
}
if (outmode != OUTMODE_ONE || resnsz == 1) {
res = mandoc_reallocarray(res,
ressz + resnsz, sizeof(*res));
@ -559,7 +544,8 @@ main(int argc, char *argv[])
best_prio = 40;
for (ib = i = 0; i < resnsz; i++) {
sec = resn[i].file;
sec = resn[i].file +
strlen(conf.manpath.paths[resn[i].ipath]);
sec += strcspn(sec, "123456789");
if (sec[0] == '\0')
continue; /* No section at all. */
@ -647,23 +633,13 @@ main(int argc, char *argv[])
mchars_alloc();
mp = mparse_alloc(options, os_e, os_s);
/*
* Remember the original working directory, if possible.
* This will be needed if some names on the command line
* are page names and some are relative file names.
* Do not error out if the current directory is not
* readable: Maybe it won't be needed after all.
*/
startdir = open(".", O_RDONLY | O_DIRECTORY);
for (i = 0; i < ressz; i++) {
process_onefile(mp, res + i, startdir, &outst, &conf);
if (i > 0)
mparse_reset(mp);
process_onefile(mp, res + i, &outst, &conf);
if (outst.wstop && mandoc_msg_getrc() != MANDOCLEVEL_OK)
break;
}
if (startdir != -1) {
(void)fchdir(startdir);
close(startdir);
}
if (conf.output.tag != NULL && conf.output.tag_found == 0) {
mandoc_msg(MANDOCERR_TAG, 0, 0, "%s", conf.output.tag);
conf.output.tag = NULL;
@ -909,7 +885,7 @@ fs_search(const struct mansearch *cfg, const struct manpaths *paths,
}
static void
process_onefile(struct mparse *mp, struct manpage *resp, int startdir,
process_onefile(struct mparse *mp, struct manpage *resp,
struct outstate *outst, struct manconf *conf)
{
int fd;
@ -921,8 +897,6 @@ process_onefile(struct mparse *mp, struct manpage *resp, int startdir,
*/
if (resp->ipath != SIZE_MAX)
(void)chdir(conf->manpath.paths[resp->ipath]);
else if (startdir != -1)
(void)fchdir(startdir);
mandoc_msg_setinfilename(resp->file);
if (resp->file != NULL) {
@ -982,18 +956,12 @@ parse(struct mparse *mp, int fd, const char *file,
struct outstate *outst, struct manconf *conf)
{
static struct manpaths basepaths;
static int previous;
struct roff_meta *meta;
assert(fd >= 0);
if (file == NULL)
file = "<stdin>";
if (previous)
mparse_reset(mp);
else
previous = 1;
mparse_readfd(mp, fd, file);
if (fd != STDIN_FILENO)
close(fd);

View file

@ -1,4 +1,4 @@
/* $Id: man.c,v 1.189 2022/08/16 23:01:09 schwarze Exp $ */
/* $Id: man.c,v 1.190 2025/08/22 13:17:06 schwarze Exp $ */
/*
* Copyright (c) 2013-2015,2017-2019,2022 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@ -134,6 +134,7 @@ man_ptext(struct roff_man *man, int line, char *buf, int offs)
*ep = '\0';
return 1;
}
mandoc_msg(MANDOCERR_FI_BLANK, line, i, NULL);
roff_elem_alloc(man, line, offs, ROFF_sp);
man->next = ROFF_NEXT_SIBLING;
return 1;

View file

@ -1,4 +1,4 @@
.\" $Id: man.options.1,v 1.8 2025/06/30 00:11:06 schwarze Exp $
.\" $Id: man.options.1,v 1.9 2025/08/28 13:46:57 schwarze Exp $
.\"
.\" Copyright (c) 2017, 2025 Ingo Schwarze <schwarze@openbsd.org>
.\"
@ -14,7 +14,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: June 30 2025 $
.Dd $Mdocdate: August 28 2025 $
.Dt MAN.OPTIONS 1
.Os
.Sh NAME
@ -39,9 +39,18 @@
.de At5
.At V Pq January 1983 \\$1
..
.de At8
.No Version 8 At Pq February 1985 \\$1
..
.de Bx43
.Bx 4.3 Pq June 1986 \\$1
..
.de At9
.No Version 9 At Pq September 1986 \\$1
..
.de At10
.No Version 10 At Pq October 1989 \\$1
..
.\" option was present in groff-1.01 as contained in 4.3BSD-Net/2
.\" and no mention of it could be found in the ChangeLog,
.\" so it's probably older than groff-0.4, where the log started
@ -49,7 +58,7 @@
.No probably before groff-0.4 Pq before July 14, 1990 \\$1
..
.de Eaton
.No Eaton Pq before July 7, 1993; 1990/91? \\$1
.No Eaton Pq before July 7, 1993; 1990/91?\& \\$1
..
.\" man-1.5e was released on July 11, 1998.
.de man15e
@ -399,6 +408,12 @@ do not feed out paper nor stop phototypesetter
.br
.Nm troff :
.At7
.Pp
.Bq superseded by Fl l
interpret arguments as file names
.br
.Nm man :
.At10
.It Fl G
preprocess with
.Xr grap 1
@ -549,6 +564,7 @@ mode
.br
.Nm man :
.Bx4 ,
.At10 ,
.Eaton ;
.No POSIX , Ox , Fx , Nx , No man-db , man-1.6 , illumos , Solaris 9-11
.br
@ -720,7 +736,9 @@ specify a page number for the first page
output mode
.br
.Nm man :
.At7
.At7 ,
.At8 ,
.At10
.Pp
do not create the
.Xr whatis 1
@ -852,6 +870,12 @@ invoke the simultaneous input-output mode of the .rd request
.Nm nroff , troff :
.At7
.Pp
quick mode: prefer preformatted page if available
.br
.Nm man :
.At8 ,
.At10
.Pp
issue no warnings
.br
.Nm manpath :
@ -1046,6 +1070,8 @@ output mode
.Bx 2 Pq May 10, 1979 ,
.At3 ,
.At5 ,
.At8 ,
.At10 ,
.Eaton ;
.Fx , No man-db , man-1.6 , illumos , Solaris 9-11
.br
@ -1162,6 +1188,7 @@ list pathnames
.At7 ,
.At3 ,
.At5 ,
.At8 ,
.Eaton ;
.Ox , Fx , Nx , No man-db , man-1.6
.br

View file

@ -1,4 +1,4 @@
.\" $Id: mandoc.1,v 1.272 2025/07/09 13:46:05 schwarze Exp $
.\" $Id: mandoc.1,v 1.273 2025/08/22 13:17:06 schwarze Exp $
.\"
.\" Copyright (c) 2012, 2014-2023, 2025 Ingo Schwarze <schwarze@openbsd.org>
.\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@ -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: July 9 2025 $
.Dd $Mdocdate: August 22 2025 $
.Dt MANDOC 1
.Os
.Sh NAME
@ -1002,14 +1002,14 @@ macro that could be represented using
or
.Ic \&Dx .
.It Sy "errnos out of order"
.Pq mdoc, Nx
.Pq mdoc , Nx
The
.Ic \&Er
items in a
.Ic \&Bl
list are not in alphabetical order.
.It Sy "duplicate errno"
.Pq mdoc, Nx
.Pq mdoc , Nx
A
.Ic \&Bl
list contains two consecutive
@ -1150,7 +1150,7 @@ The
argument is used as provided anyway.
Consider checking whether the file name or the argument need a correction.
.It Sy "missing date, using \(dq\(dq"
.Pq mdoc, man
.Pq mdoc , man
The document was parsed as
.Xr mdoc 7
and it has no
@ -1732,7 +1732,7 @@ or
macro contains an opening or closing parenthesis; that's probably wrong,
parentheses are added automatically.
.It Sy "unknown library name"
.Pq mdoc, not on Ox
.Pq mdoc , not on Ox
An
.Ic \&Lb
macro has an unknown name argument and will be rendered as
@ -1790,7 +1790,7 @@ The last character is mapped to the blank character.
.Ss "Warnings related to plain text"
.Bl -ohang
.It Sy "blank line in fill mode, using .sp"
.Pq mdoc
.Pq mdoc , man
The meaning of blank input lines is only well-defined in non-fill mode:
In fill mode, line breaks of text input lines are not supposed to be
significant.
@ -1800,6 +1800,8 @@ are formatted like
requests.
To request a paragraph break, use
.Ic \&Pp
or
.Ic \&PP
instead of a blank line.
.It Sy "tab in filled text"
.Pq mdoc , man

View file

@ -1,4 +1,4 @@
.\" $Id: mdoc.7,v 1.299 2025/06/13 16:18:28 schwarze Exp $
.\" $Id: mdoc.7,v 1.300 2025/08/19 14:08:59 schwarze Exp $
.\"
.\" Copyright (c) 2010-2021, 2024, 2025 Ingo Schwarze <schwarze@openbsd.org>
.\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@ -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: June 13 2025 $
.Dd $Mdocdate: August 19 2025 $
.Dt MDOC 7
.Os
.Sh NAME
@ -979,7 +979,7 @@ Unless the
.Fl compact
argument is specified, list entries are separated by vertical space.
.Pp
A list must specify one of the following list types:
The following list types are commonly used:
.Bl -tag -width 12n -offset indent
.It Fl bullet
No item heads can be specified, but a bullet will be printed at the head
@ -994,7 +994,14 @@ The
.Fl width
argument has no effect; instead, the string length of each argument
specifies the width of one column.
If the first line of the body of a
The width specification for the last column does not affect formatting.
.Pp
For two-column lists, using
.Fl tag
often results in simpler code, identical terminal output, and better HTML
output, especially when the first column contains short identifiers.
.Pp
For compatibility with legacy documents, if the first line of the body of a
.Fl column
list is not an
.Ic \&It
@ -1016,7 +1023,7 @@ Like
except that item heads are not parsed for macro invocations.
Most often used in the
.Em DIAGNOSTICS
section with error constants in the item heads.
section with error messages in the item heads.
.It Fl enum
A numbered list.
No item heads can be specified.
@ -1024,6 +1031,17 @@ Formatted like
.Fl bullet ,
except that ordinal numbers are used in place of bullets,
starting at 1.
.It Fl tag
Item bodies are indented according to the
.Fl width
argument.
When an item head fits inside the indentation, the item body follows
this head on the same output line.
Otherwise, the body starts on the output line following the head.
.El
.Pp
The following list types are rarely useful:
.Bl -tag -width 12n -offset indent
.It Fl hang
Like
.Fl tag ,
@ -1050,13 +1068,6 @@ Item bodies start on the line following item heads and are not indented.
The
.Fl width
argument is ignored.
.It Fl tag
Item bodies are indented according to the
.Fl width
argument.
When an item head fits inside the indentation, the item body follows
this head on the same output line.
Otherwise, the body starts on the output line following the head.
.El
.Pp
Lists may be nested within lists and displays.

View file

@ -1,4 +1,4 @@
/* $Id: roff_term.c,v 1.26 2025/07/16 14:33:08 schwarze Exp $ */
/* $Id: roff_term.c,v 1.27 2025/08/21 15:38:51 schwarze Exp $ */
/*
* Copyright (c) 2010, 2014, 2015, 2017-2021, 2025
* Ingo Schwarze <schwarze@openbsd.org>

View file

@ -1,4 +1,4 @@
/* $Id: term_ps.c,v 1.94 2025/07/18 15:47:18 schwarze Exp $ */
/* $Id: term_ps.c,v 1.95 2025/09/26 12:17:12 schwarze Exp $ */
/*
* Copyright (c) 2014-2017, 2020, 2025 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@ -1222,6 +1222,8 @@ ps_endline(struct termp *p)
ps_plast(p);
ps_pclose(p);
p->viscol = 0;
p->minbl = 0;
/*
* If we're in the margin, don't try to recalculate our current
@ -1235,8 +1237,6 @@ ps_endline(struct termp *p)
/* Left-justify. */
p->ps->pscol = p->ps->left;
p->viscol = 0;
p->minbl = 0;
/* If we haven't printed anything, return. */