16d38604fSBaptiste Daroussin /* $OpenBSD: mandoc_msg.c,v 1.8 2020/01/19 17:59:01 schwarze Exp $ */
27295610fSBaptiste Daroussin /*
3*80c12959SAlexander Ziaee * Copyright (c) 2014-2022, 2025 Ingo Schwarze <schwarze@openbsd.org>
47295610fSBaptiste Daroussin * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
57295610fSBaptiste Daroussin *
67295610fSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any
77295610fSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above
87295610fSBaptiste Daroussin * copyright notice and this permission notice appear in all copies.
97295610fSBaptiste Daroussin *
107295610fSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
117295610fSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
127295610fSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
137295610fSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
147295610fSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
157295610fSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
167295610fSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
176d38604fSBaptiste Daroussin *
186d38604fSBaptiste Daroussin * Implementation of warning and error messages for mandoc(1).
197295610fSBaptiste Daroussin */
207295610fSBaptiste Daroussin #include "config.h"
217295610fSBaptiste Daroussin
227295610fSBaptiste Daroussin #include <stdarg.h>
237295610fSBaptiste Daroussin #include <stdio.h>
247295610fSBaptiste Daroussin #include <stdlib.h>
257295610fSBaptiste Daroussin
267295610fSBaptiste Daroussin #include "mandoc.h"
277295610fSBaptiste Daroussin
287295610fSBaptiste Daroussin static const enum mandocerr lowest_type[MANDOCLEVEL_MAX] = {
297295610fSBaptiste Daroussin MANDOCERR_OK,
307295610fSBaptiste Daroussin MANDOCERR_OK,
317295610fSBaptiste Daroussin MANDOCERR_WARNING,
327295610fSBaptiste Daroussin MANDOCERR_ERROR,
337295610fSBaptiste Daroussin MANDOCERR_UNSUPP,
3445a5aec3SBaptiste Daroussin MANDOCERR_BADARG,
3545a5aec3SBaptiste Daroussin MANDOCERR_SYSERR
367295610fSBaptiste Daroussin };
377295610fSBaptiste Daroussin
387295610fSBaptiste Daroussin static const char *const level_name[MANDOCLEVEL_MAX] = {
397295610fSBaptiste Daroussin "SUCCESS",
407295610fSBaptiste Daroussin "STYLE",
417295610fSBaptiste Daroussin "WARNING",
427295610fSBaptiste Daroussin "ERROR",
437295610fSBaptiste Daroussin "UNSUPP",
447295610fSBaptiste Daroussin "BADARG",
457295610fSBaptiste Daroussin "SYSERR"
467295610fSBaptiste Daroussin };
477295610fSBaptiste Daroussin
487295610fSBaptiste Daroussin static const char *const type_message[MANDOCERR_MAX] = {
497295610fSBaptiste Daroussin "ok",
507295610fSBaptiste Daroussin
517295610fSBaptiste Daroussin "base system convention",
527295610fSBaptiste Daroussin
537295610fSBaptiste Daroussin "Mdocdate found",
547295610fSBaptiste Daroussin "Mdocdate missing",
557295610fSBaptiste Daroussin "unknown architecture",
567295610fSBaptiste Daroussin "operating system explicitly specified",
577295610fSBaptiste Daroussin "RCS id missing",
587295610fSBaptiste Daroussin
597295610fSBaptiste Daroussin "generic style suggestion",
607295610fSBaptiste Daroussin
617295610fSBaptiste Daroussin "legacy man(7) date format",
627295610fSBaptiste Daroussin "normalizing date format to",
637295610fSBaptiste Daroussin "lower case character in document title",
647295610fSBaptiste Daroussin "duplicate RCS id",
657295610fSBaptiste Daroussin "possible typo in section name",
667295610fSBaptiste Daroussin "unterminated quoted argument",
677295610fSBaptiste Daroussin "useless macro",
687295610fSBaptiste Daroussin "consider using OS macro",
697295610fSBaptiste Daroussin "errnos out of order",
707295610fSBaptiste Daroussin "duplicate errno",
716d38604fSBaptiste Daroussin "referenced manual not found",
727295610fSBaptiste Daroussin "trailing delimiter",
737295610fSBaptiste Daroussin "no blank before trailing delimiter",
747295610fSBaptiste Daroussin "fill mode already enabled, skipping",
757295610fSBaptiste Daroussin "fill mode already disabled, skipping",
766d38604fSBaptiste Daroussin "input text line longer than 80 bytes",
777295610fSBaptiste Daroussin "verbatim \"--\", maybe consider using \\(em",
787295610fSBaptiste Daroussin "function name without markup",
797295610fSBaptiste Daroussin "whitespace at end of input line",
807295610fSBaptiste Daroussin "bad comment style",
817295610fSBaptiste Daroussin
827295610fSBaptiste Daroussin "generic warning",
837295610fSBaptiste Daroussin
847295610fSBaptiste Daroussin /* related to the prologue */
857295610fSBaptiste Daroussin "missing manual title, using UNTITLED",
867295610fSBaptiste Daroussin "missing manual title, using \"\"",
877295610fSBaptiste Daroussin "missing manual section, using \"\"",
887295610fSBaptiste Daroussin "unknown manual section",
896d38604fSBaptiste Daroussin "filename/section mismatch",
906d38604fSBaptiste Daroussin "missing date, using \"\"",
917295610fSBaptiste Daroussin "cannot parse date, using it verbatim",
927295610fSBaptiste Daroussin "date in the future, using it anyway",
937295610fSBaptiste Daroussin "missing Os macro, using \"\"",
947295610fSBaptiste Daroussin "late prologue macro",
957295610fSBaptiste Daroussin "prologue macros out of order",
967295610fSBaptiste Daroussin
977295610fSBaptiste Daroussin /* related to document structure */
987295610fSBaptiste Daroussin ".so is fragile, better use ln(1)",
997295610fSBaptiste Daroussin "no document body",
1007295610fSBaptiste Daroussin "content before first section header",
1017295610fSBaptiste Daroussin "first section is not \"NAME\"",
1027295610fSBaptiste Daroussin "NAME section without Nm before Nd",
1037295610fSBaptiste Daroussin "NAME section without description",
1047295610fSBaptiste Daroussin "description not at the end of NAME",
1057295610fSBaptiste Daroussin "bad NAME section content",
1067295610fSBaptiste Daroussin "missing comma before name",
1077295610fSBaptiste Daroussin "missing description line, using \"\"",
1087295610fSBaptiste Daroussin "description line outside NAME section",
1097295610fSBaptiste Daroussin "sections out of conventional order",
1107295610fSBaptiste Daroussin "duplicate section title",
1117295610fSBaptiste Daroussin "unexpected section",
1127295610fSBaptiste Daroussin "cross reference to self",
1137295610fSBaptiste Daroussin "unusual Xr order",
1147295610fSBaptiste Daroussin "unusual Xr punctuation",
1157295610fSBaptiste Daroussin "AUTHORS section without An macro",
1167295610fSBaptiste Daroussin
1177295610fSBaptiste Daroussin /* related to macros and nesting */
1187295610fSBaptiste Daroussin "obsolete macro",
1197295610fSBaptiste Daroussin "macro neither callable nor escaped",
1207295610fSBaptiste Daroussin "skipping paragraph macro",
1217295610fSBaptiste Daroussin "moving paragraph macro out of list",
1227295610fSBaptiste Daroussin "skipping no-space macro",
1237295610fSBaptiste Daroussin "blocks badly nested",
1247295610fSBaptiste Daroussin "nested displays are not portable",
1257295610fSBaptiste Daroussin "moving content out of list",
1267295610fSBaptiste Daroussin "first macro on line",
1277295610fSBaptiste Daroussin "line scope broken",
1287295610fSBaptiste Daroussin "skipping blank line in line scope",
1297295610fSBaptiste Daroussin
1307295610fSBaptiste Daroussin /* related to missing macro arguments */
1317295610fSBaptiste Daroussin "skipping empty request",
1327295610fSBaptiste Daroussin "conditional request controls empty scope",
1337295610fSBaptiste Daroussin "skipping empty macro",
1347295610fSBaptiste Daroussin "empty block",
1357295610fSBaptiste Daroussin "empty argument, using 0n",
1367295610fSBaptiste Daroussin "missing display type, using -ragged",
1377295610fSBaptiste Daroussin "list type is not the first argument",
1387295610fSBaptiste Daroussin "missing -width in -tag list, using 6n",
1397295610fSBaptiste Daroussin "missing utility name, using \"\"",
1407295610fSBaptiste Daroussin "missing function name, using \"\"",
1417295610fSBaptiste Daroussin "empty head in list item",
1427295610fSBaptiste Daroussin "empty list item",
1437295610fSBaptiste Daroussin "missing argument, using next line",
1447295610fSBaptiste Daroussin "missing font type, using \\fR",
1457295610fSBaptiste Daroussin "unknown font type, using \\fR",
1467295610fSBaptiste Daroussin "nothing follows prefix",
1477295610fSBaptiste Daroussin "empty reference block",
1487295610fSBaptiste Daroussin "missing section argument",
1497295610fSBaptiste Daroussin "missing -std argument, adding it",
1507295610fSBaptiste Daroussin "missing option string, using \"\"",
1517295610fSBaptiste Daroussin "missing resource identifier, using \"\"",
1527295610fSBaptiste Daroussin "missing eqn box, using \"\"",
1537295610fSBaptiste Daroussin
1547295610fSBaptiste Daroussin /* related to bad macro arguments */
1557295610fSBaptiste Daroussin "duplicate argument",
1567295610fSBaptiste Daroussin "skipping duplicate argument",
1577295610fSBaptiste Daroussin "skipping duplicate display type",
1587295610fSBaptiste Daroussin "skipping duplicate list type",
1597295610fSBaptiste Daroussin "skipping -width argument",
1607295610fSBaptiste Daroussin "wrong number of cells",
1617295610fSBaptiste Daroussin "unknown AT&T UNIX version",
1627295610fSBaptiste Daroussin "comma in function argument",
1637295610fSBaptiste Daroussin "parenthesis in function name",
1647295610fSBaptiste Daroussin "unknown library name",
1657295610fSBaptiste Daroussin "invalid content in Rs block",
1667295610fSBaptiste Daroussin "invalid Boolean argument",
1677295610fSBaptiste Daroussin "argument contains two font escapes",
1687295610fSBaptiste Daroussin "unknown font, skipping request",
169c1c95addSBrooks Davis "ignoring distance argument",
1707295610fSBaptiste Daroussin "odd number of characters in request",
1717295610fSBaptiste Daroussin
1727295610fSBaptiste Daroussin /* related to plain text */
1737295610fSBaptiste Daroussin "blank line in fill mode, using .sp",
1747295610fSBaptiste Daroussin "tab in filled text",
1757295610fSBaptiste Daroussin "new sentence, new line",
176c1c95addSBrooks Davis "invalid escape sequence argument",
1777295610fSBaptiste Daroussin "undefined escape, printing literally",
1787295610fSBaptiste Daroussin "undefined string, using \"\"",
1797295610fSBaptiste Daroussin
1807295610fSBaptiste Daroussin /* related to tables */
1817295610fSBaptiste Daroussin "tbl line starts with span",
1827295610fSBaptiste Daroussin "tbl column starts with span",
1837295610fSBaptiste Daroussin "skipping vertical bar in tbl layout",
1847295610fSBaptiste Daroussin
1857295610fSBaptiste Daroussin "generic error",
1867295610fSBaptiste Daroussin
1877295610fSBaptiste Daroussin /* related to tables */
1887295610fSBaptiste Daroussin "non-alphabetic character in tbl options",
1897295610fSBaptiste Daroussin "skipping unknown tbl option",
1907295610fSBaptiste Daroussin "missing tbl option argument",
1917295610fSBaptiste Daroussin "wrong tbl option argument size",
1927295610fSBaptiste Daroussin "empty tbl layout",
1937295610fSBaptiste Daroussin "invalid character in tbl layout",
1947295610fSBaptiste Daroussin "unmatched parenthesis in tbl layout",
195*80c12959SAlexander Ziaee "ignoring invalid column width in tbl layout",
1966d38604fSBaptiste Daroussin "ignoring excessive spacing in tbl layout",
1977295610fSBaptiste Daroussin "tbl without any data cells",
1987295610fSBaptiste Daroussin "ignoring data in spanned tbl cell",
1997295610fSBaptiste Daroussin "ignoring extra tbl data cells",
2007295610fSBaptiste Daroussin "data block open at end of tbl",
2017295610fSBaptiste Daroussin
2027295610fSBaptiste Daroussin /* related to document structure and macros */
2037295610fSBaptiste Daroussin "duplicate prologue macro",
2047295610fSBaptiste Daroussin "skipping late title macro",
2057295610fSBaptiste Daroussin "input stack limit exceeded, infinite loop?",
2067295610fSBaptiste Daroussin "skipping bad character",
2077295610fSBaptiste Daroussin "skipping unknown macro",
2087295610fSBaptiste Daroussin "ignoring request outside macro",
2097295610fSBaptiste Daroussin "skipping insecure request",
2107295610fSBaptiste Daroussin "skipping item outside list",
2117295610fSBaptiste Daroussin "skipping column outside column list",
2127295610fSBaptiste Daroussin "skipping end of block that is not open",
2137295610fSBaptiste Daroussin "fewer RS blocks open, skipping",
2147295610fSBaptiste Daroussin "inserting missing end of block",
2157295610fSBaptiste Daroussin "appending missing end of block",
2167295610fSBaptiste Daroussin
2177295610fSBaptiste Daroussin /* related to request and macro arguments */
2187295610fSBaptiste Daroussin "escaped character not allowed in a name",
2197295610fSBaptiste Daroussin "using macro argument outside macro",
2207295610fSBaptiste Daroussin "argument number is not numeric",
221c1c95addSBrooks Davis "negative argument, using 0",
2227295610fSBaptiste Daroussin "NOT IMPLEMENTED: Bd -file",
2237295610fSBaptiste Daroussin "skipping display without arguments",
2247295610fSBaptiste Daroussin "missing list type, using -item",
2257295610fSBaptiste Daroussin "argument is not numeric, using 1",
2267295610fSBaptiste Daroussin "argument is not a character",
227c1c95addSBrooks Davis "skipping unusable escape sequence",
2287295610fSBaptiste Daroussin "missing manual name, using \"\"",
2297295610fSBaptiste Daroussin "uname(3) system call failed, using UNKNOWN",
2307295610fSBaptiste Daroussin "unknown standard specifier",
2317295610fSBaptiste Daroussin "skipping request without numeric argument",
2327295610fSBaptiste Daroussin "excessive shift",
2337295610fSBaptiste Daroussin "NOT IMPLEMENTED: .so with absolute path or \"..\"",
2347295610fSBaptiste Daroussin ".so request failed",
2356d38604fSBaptiste Daroussin "skipping tag containing whitespace",
2367295610fSBaptiste Daroussin "skipping all arguments",
2377295610fSBaptiste Daroussin "skipping excess arguments",
2387295610fSBaptiste Daroussin "divide by zero",
2397295610fSBaptiste Daroussin
240c1c95addSBrooks Davis /* related to escape sequences */
241c1c95addSBrooks Davis "incomplete escape sequence",
242c1c95addSBrooks Davis "invalid special character",
243c1c95addSBrooks Davis "unknown special character",
244c1c95addSBrooks Davis "invalid escape argument delimiter",
245c1c95addSBrooks Davis
2467295610fSBaptiste Daroussin "unsupported feature",
2477295610fSBaptiste Daroussin "input too large",
2487295610fSBaptiste Daroussin "unsupported control character",
2497295610fSBaptiste Daroussin "unsupported escape sequence",
2507295610fSBaptiste Daroussin "unsupported roff request",
2517295610fSBaptiste Daroussin "nested .while loops",
2527295610fSBaptiste Daroussin "end of scope with open .while loop",
2537295610fSBaptiste Daroussin "end of .while loop in inner scope",
2547295610fSBaptiste Daroussin "cannot continue this .while loop",
2557295610fSBaptiste Daroussin "eqn delim option in tbl",
2567295610fSBaptiste Daroussin "unsupported tbl layout modifier",
2577295610fSBaptiste Daroussin "ignoring macro in table",
2586d38604fSBaptiste Daroussin "skipping tbl in -Tman mode",
2596d38604fSBaptiste Daroussin "skipping eqn in -Tman mode",
26045a5aec3SBaptiste Daroussin
26145a5aec3SBaptiste Daroussin /* bad command line arguments */
26245a5aec3SBaptiste Daroussin NULL,
26345a5aec3SBaptiste Daroussin "bad command line argument",
26445a5aec3SBaptiste Daroussin "duplicate command line argument",
26545a5aec3SBaptiste Daroussin "option has a superfluous value",
26645a5aec3SBaptiste Daroussin "missing option value",
26745a5aec3SBaptiste Daroussin "bad option value",
26845a5aec3SBaptiste Daroussin "duplicate option value",
26945a5aec3SBaptiste Daroussin "no such tag",
2706d38604fSBaptiste Daroussin "-Tmarkdown unsupported for man(7) input",
27145a5aec3SBaptiste Daroussin
27245a5aec3SBaptiste Daroussin /* system errors */
27345a5aec3SBaptiste Daroussin NULL,
27445a5aec3SBaptiste Daroussin "dup",
27545a5aec3SBaptiste Daroussin "exec",
27645a5aec3SBaptiste Daroussin "fdopen",
27745a5aec3SBaptiste Daroussin "fflush",
27845a5aec3SBaptiste Daroussin "fork",
27945a5aec3SBaptiste Daroussin "fstat",
28045a5aec3SBaptiste Daroussin "getline",
28145a5aec3SBaptiste Daroussin "glob",
28245a5aec3SBaptiste Daroussin "gzclose",
28345a5aec3SBaptiste Daroussin "gzdopen",
28445a5aec3SBaptiste Daroussin "mkstemp",
28545a5aec3SBaptiste Daroussin "open",
28645a5aec3SBaptiste Daroussin "pledge",
28745a5aec3SBaptiste Daroussin "read",
28845a5aec3SBaptiste Daroussin "wait",
28945a5aec3SBaptiste Daroussin "write",
2907295610fSBaptiste Daroussin };
2917295610fSBaptiste Daroussin
2927295610fSBaptiste Daroussin static FILE *fileptr = NULL;
2937295610fSBaptiste Daroussin static const char *filename = NULL;
29445a5aec3SBaptiste Daroussin static enum mandocerr min_type = MANDOCERR_BADARG;
2957295610fSBaptiste Daroussin static enum mandoclevel rc = MANDOCLEVEL_OK;
2967295610fSBaptiste Daroussin
2977295610fSBaptiste Daroussin
2987295610fSBaptiste Daroussin void
mandoc_msg_setoutfile(FILE * fp)2997295610fSBaptiste Daroussin mandoc_msg_setoutfile(FILE *fp)
3007295610fSBaptiste Daroussin {
3017295610fSBaptiste Daroussin fileptr = fp;
3027295610fSBaptiste Daroussin }
3037295610fSBaptiste Daroussin
3047295610fSBaptiste Daroussin const char *
mandoc_msg_getinfilename(void)3057295610fSBaptiste Daroussin mandoc_msg_getinfilename(void)
3067295610fSBaptiste Daroussin {
3077295610fSBaptiste Daroussin return filename;
3087295610fSBaptiste Daroussin }
3097295610fSBaptiste Daroussin
3107295610fSBaptiste Daroussin void
mandoc_msg_setinfilename(const char * fn)3117295610fSBaptiste Daroussin mandoc_msg_setinfilename(const char *fn)
3127295610fSBaptiste Daroussin {
3137295610fSBaptiste Daroussin filename = fn;
3147295610fSBaptiste Daroussin }
3157295610fSBaptiste Daroussin
3167295610fSBaptiste Daroussin enum mandocerr
mandoc_msg_getmin(void)3177295610fSBaptiste Daroussin mandoc_msg_getmin(void)
3187295610fSBaptiste Daroussin {
3197295610fSBaptiste Daroussin return min_type;
3207295610fSBaptiste Daroussin }
3217295610fSBaptiste Daroussin
3227295610fSBaptiste Daroussin void
mandoc_msg_setmin(enum mandocerr t)3237295610fSBaptiste Daroussin mandoc_msg_setmin(enum mandocerr t)
3247295610fSBaptiste Daroussin {
3257295610fSBaptiste Daroussin min_type = t;
3267295610fSBaptiste Daroussin }
3277295610fSBaptiste Daroussin
3287295610fSBaptiste Daroussin enum mandoclevel
mandoc_msg_getrc(void)3297295610fSBaptiste Daroussin mandoc_msg_getrc(void)
3307295610fSBaptiste Daroussin {
3317295610fSBaptiste Daroussin return rc;
3327295610fSBaptiste Daroussin }
3337295610fSBaptiste Daroussin
3347295610fSBaptiste Daroussin void
mandoc_msg_setrc(enum mandoclevel level)3357295610fSBaptiste Daroussin mandoc_msg_setrc(enum mandoclevel level)
3367295610fSBaptiste Daroussin {
3377295610fSBaptiste Daroussin if (rc < level)
3387295610fSBaptiste Daroussin rc = level;
3397295610fSBaptiste Daroussin }
3407295610fSBaptiste Daroussin
3417295610fSBaptiste Daroussin void
mandoc_msg(enum mandocerr t,int line,int col,const char * fmt,...)3427295610fSBaptiste Daroussin mandoc_msg(enum mandocerr t, int line, int col, const char *fmt, ...)
3437295610fSBaptiste Daroussin {
3447295610fSBaptiste Daroussin va_list ap;
3457295610fSBaptiste Daroussin enum mandoclevel level;
3467295610fSBaptiste Daroussin
34745a5aec3SBaptiste Daroussin if (t < min_type)
3487295610fSBaptiste Daroussin return;
3497295610fSBaptiste Daroussin
35045a5aec3SBaptiste Daroussin level = MANDOCLEVEL_SYSERR;
3517295610fSBaptiste Daroussin while (t < lowest_type[level])
3527295610fSBaptiste Daroussin level--;
3537295610fSBaptiste Daroussin mandoc_msg_setrc(level);
3547295610fSBaptiste Daroussin
3557295610fSBaptiste Daroussin if (fileptr == NULL)
3567295610fSBaptiste Daroussin return;
3577295610fSBaptiste Daroussin
3587295610fSBaptiste Daroussin fprintf(fileptr, "%s:", getprogname());
3597295610fSBaptiste Daroussin if (filename != NULL)
3607295610fSBaptiste Daroussin fprintf(fileptr, " %s:", filename);
3617295610fSBaptiste Daroussin
3627295610fSBaptiste Daroussin if (line > 0)
3637295610fSBaptiste Daroussin fprintf(fileptr, "%d:%d:", line, col + 1);
3647295610fSBaptiste Daroussin
3657295610fSBaptiste Daroussin fprintf(fileptr, " %s", level_name[level]);
3667295610fSBaptiste Daroussin if (type_message[t] != NULL)
3677295610fSBaptiste Daroussin fprintf(fileptr, ": %s", type_message[t]);
3687295610fSBaptiste Daroussin
3697295610fSBaptiste Daroussin if (fmt != NULL) {
3707295610fSBaptiste Daroussin fprintf(fileptr, ": ");
3717295610fSBaptiste Daroussin va_start(ap, fmt);
3727295610fSBaptiste Daroussin vfprintf(fileptr, fmt, ap);
3737295610fSBaptiste Daroussin va_end(ap);
3747295610fSBaptiste Daroussin }
3757295610fSBaptiste Daroussin fputc('\n', fileptr);
3767295610fSBaptiste Daroussin }
37745a5aec3SBaptiste Daroussin
37845a5aec3SBaptiste Daroussin void
mandoc_msg_summary(void)37945a5aec3SBaptiste Daroussin mandoc_msg_summary(void)
38045a5aec3SBaptiste Daroussin {
38145a5aec3SBaptiste Daroussin if (fileptr != NULL && rc != MANDOCLEVEL_OK)
38245a5aec3SBaptiste Daroussin fprintf(fileptr,
38345a5aec3SBaptiste Daroussin "%s: see above the output for %s messages\n",
38445a5aec3SBaptiste Daroussin getprogname(), level_name[rc]);
38545a5aec3SBaptiste Daroussin }
386