003 File Manager
Current Path:
/usr/src/contrib/mandoc
usr
/
src
/
contrib
/
mandoc
/
📁
..
📄
INSTALL
(6.86 KB)
📄
LICENSE
(2.46 KB)
📄
Makefile
(15.29 KB)
📄
Makefile.depend
(5.65 KB)
📄
NEWS
(60.04 KB)
📄
TODO
(23.98 KB)
📄
apropos.1
(10.66 KB)
📄
arch.c
(1.94 KB)
📄
att.c
(1.62 KB)
📄
catman.8
(4.49 KB)
📄
catman.c
(5.52 KB)
📄
cgi.c
(27.06 KB)
📄
cgi.h.example
(220 B)
📄
chars.c
(13.24 KB)
📄
compat_err.c
(2.68 KB)
📄
compat_fts.c
(17.42 KB)
📄
compat_fts.h
(4.09 KB)
📄
compat_getline.c
(1.59 KB)
📄
compat_getsubopt.c
(2.89 KB)
📄
compat_isblank.c
(986 B)
📄
compat_mkdtemp.c
(1.59 KB)
📄
compat_ohash.c
(6.82 KB)
📄
compat_ohash.h
(2.63 KB)
📄
compat_progname.c
(1.05 KB)
📄
compat_reallocarray.c
(1.49 KB)
📄
compat_recallocarray.c
(2.88 KB)
📄
compat_strcasestr.c
(2.38 KB)
📄
compat_stringlist.c
(2.71 KB)
📄
compat_stringlist.h
(1.73 KB)
📄
compat_strlcat.c
(1.71 KB)
📄
compat_strlcpy.c
(1.59 KB)
📄
compat_strndup.c
(1.3 KB)
📄
compat_strsep.c
(2.55 KB)
📄
compat_strtonum.c
(1.88 KB)
📄
compat_vasprintf.c
(1.55 KB)
📄
config.h
(1.33 KB)
📄
configure
(17.5 KB)
📄
configure.local.example
(11.37 KB)
📄
dba.c
(13.02 KB)
📄
dba.h
(1.73 KB)
📄
dba_array.c
(4.23 KB)
📄
dba_array.h
(2 KB)
📄
dba_read.c
(2.33 KB)
📄
dba_write.c
(2.42 KB)
📄
dba_write.h
(1.23 KB)
📄
dbm.c
(9.28 KB)
📄
dbm.h
(1.94 KB)
📄
dbm_map.c
(4.67 KB)
📄
dbm_map.h
(1.2 KB)
📄
demandoc.1
(2.64 KB)
📄
demandoc.c
(5.21 KB)
📄
eqn.7
(12.07 KB)
📄
eqn.c
(27.21 KB)
📄
eqn.h
(2.19 KB)
📄
eqn_html.c
(5.91 KB)
📄
eqn_parse.h
(1.96 KB)
📄
eqn_term.c
(4.83 KB)
📄
gmdiff
(1.74 KB)
📄
html.c
(19.34 KB)
📄
html.h
(3.86 KB)
📄
lib.c
(1.07 KB)
📄
lib.in
(8.96 KB)
📄
libman.h
(1.66 KB)
📄
libmandoc.h
(3.21 KB)
📄
libmdoc.h
(2.97 KB)
📄
main.c
(28.93 KB)
📄
main.h
(2.06 KB)
📄
makewhatis.8
(4.78 KB)
📄
man-cgi.css
(464 B)
📄
man.1
(9.33 KB)
📄
man.7
(16.8 KB)
📄
man.c
(8.62 KB)
📄
man.cgi.3
(7.83 KB)
📄
man.cgi.8
(11.02 KB)
📄
man.conf.5
(3.92 KB)
📄
man.h
(991 B)
📄
man.options.1
(21.05 KB)
📄
man_html.c
(13.39 KB)
📄
man_macro.c
(11.4 KB)
📄
man_term.c
(25.6 KB)
📄
man_validate.c
(11.84 KB)
📄
manconf.h
(1.56 KB)
📄
mandoc.1
(54.89 KB)
📄
mandoc.3
(12.5 KB)
📄
mandoc.c
(12.41 KB)
📄
mandoc.css
(8.63 KB)
📄
mandoc.db.5
(5.74 KB)
📄
mandoc.h
(14.92 KB)
📄
mandoc_aux.c
(2.42 KB)
📄
mandoc_aux.h
(1.31 KB)
📄
mandoc_char.7
(29.23 KB)
📄
mandoc_escape.3
(9.33 KB)
📄
mandoc_headers.3
(12.41 KB)
📄
mandoc_html.3
(7.42 KB)
📄
mandoc_malloc.3
(4.46 KB)
📄
mandoc_msg.c
(8.92 KB)
📄
mandoc_ohash.c
(1.58 KB)
📄
mandoc_ohash.h
(1004 B)
📄
mandoc_parse.h
(1.82 KB)
📄
mandoc_xr.c
(2.75 KB)
📄
mandoc_xr.h
(1.17 KB)
📄
mandocd.8
(4.59 KB)
📄
mandocd.c
(5.98 KB)
📄
mandocdb.c
(55.16 KB)
📄
manpath.c
(7.73 KB)
📄
manpath.h
(1.22 KB)
📄
mansearch.3
(3.26 KB)
📄
mansearch.c
(18.99 KB)
📄
mansearch.h
(4.03 KB)
📄
mchars_alloc.3
(5.24 KB)
📄
mdoc.7
(73.34 KB)
📄
mdoc.c
(9.99 KB)
📄
mdoc.h
(3.96 KB)
📄
mdoc_argv.c
(16.19 KB)
📄
mdoc_html.c
(36.48 KB)
📄
mdoc_macro.c
(39.55 KB)
📄
mdoc_man.c
(37.07 KB)
📄
mdoc_markdown.c
(33.41 KB)
📄
mdoc_state.c
(5.24 KB)
📄
mdoc_term.c
(43.69 KB)
📄
mdoc_validate.c
(61.85 KB)
📄
msec.c
(1.09 KB)
📄
msec.in
(1.48 KB)
📄
out.c
(13.61 KB)
📄
out.h
(2.26 KB)
📄
preconv.c
(3.84 KB)
📄
predefs.in
(2.05 KB)
📄
read.c
(16.44 KB)
📄
roff.7
(61.96 KB)
📄
roff.c
(98.93 KB)
📄
roff.h
(8.85 KB)
📄
roff_html.c
(2.92 KB)
📄
roff_int.h
(4.08 KB)
📄
roff_term.c
(5.36 KB)
📄
roff_validate.c
(3.41 KB)
📄
soelim.1
(2.6 KB)
📄
soelim.c
(3.76 KB)
📄
st.c
(4.33 KB)
📄
tag.c
(6.65 KB)
📄
tag.h
(1.09 KB)
📄
tbl.3
(6.9 KB)
📄
tbl.7
(10.91 KB)
📄
tbl.c
(3.89 KB)
📄
tbl.h
(4.43 KB)
📄
tbl_data.c
(7.3 KB)
📄
tbl_html.c
(5.74 KB)
📄
tbl_int.h
(2.09 KB)
📄
tbl_layout.c
(8.06 KB)
📄
tbl_opts.c
(3.77 KB)
📄
tbl_parse.h
(1.31 KB)
📄
tbl_term.c
(24.42 KB)
📄
term.c
(24.4 KB)
📄
term.h
(6.14 KB)
📄
term_ascii.c
(9.88 KB)
📄
term_ps.c
(27.41 KB)
📄
term_tab.c
(3 KB)
📄
test-EFTYPE.c
(56 B)
📄
test-O_DIRECTORY.c
(88 B)
📄
test-PATH_MAX.c
(1.02 KB)
📄
test-be32toh.c
(147 B)
📄
test-cmsg.c
(174 B)
📄
test-dirent-namlen.c
(124 B)
📄
test-err.c
(994 B)
📄
test-fgetln.c
(147 B)
📄
test-fts.c
(964 B)
📄
test-getline.c
(186 B)
📄
test-getsubopt.c
(1.31 KB)
📄
test-isblank.c
(96 B)
📄
test-mkdtemp.c
(175 B)
📄
test-nanosleep.c
(239 B)
📄
test-noop.c
(30 B)
📄
test-ntohl.c
(91 B)
📄
test-ohash.c
(585 B)
📄
test-pledge.c
(73 B)
📄
test-progname.c
(118 B)
📄
test-reallocarray.c
(75 B)
📄
test-recallocarray.c
(132 B)
📄
test-recvmsg.c
(100 B)
📄
test-rewb-bsd.c
(618 B)
📄
test-rewb-sysv.c
(610 B)
📄
test-sandbox_init.c
(186 B)
📄
test-strcasestr.c
(131 B)
📄
test-stringlist.c
(1.14 KB)
📄
test-strlcat.c
(166 B)
📄
test-strlcpy.c
(148 B)
📄
test-strndup.c
(141 B)
📄
test-strptime.c
(212 B)
📄
test-strsep.c
(183 B)
📄
test-strtonum.c
(1.25 KB)
📄
test-vasprintf.c
(1.25 KB)
📄
test-wchar.c
(1.58 KB)
📄
tree.c
(8.17 KB)
Editing: man_validate.c
/* $Id: man_validate.c,v 1.149 2019/06/27 15:07:30 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010, 2012-2018 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 * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "config.h" #include <sys/types.h> #include <assert.h> #include <ctype.h> #include <errno.h> #include <limits.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "mandoc_aux.h" #include "mandoc.h" #include "roff.h" #include "man.h" #include "libmandoc.h" #include "roff_int.h" #include "libman.h" #define CHKARGS struct roff_man *man, struct roff_node *n typedef void (*v_check)(CHKARGS); static void check_abort(CHKARGS) __attribute__((__noreturn__)); static void check_par(CHKARGS); static void check_part(CHKARGS); static void check_root(CHKARGS); static void check_text(CHKARGS); static void post_AT(CHKARGS); static void post_EE(CHKARGS); static void post_EX(CHKARGS); static void post_IP(CHKARGS); static void post_OP(CHKARGS); static void post_SH(CHKARGS); static void post_TH(CHKARGS); static void post_UC(CHKARGS); static void post_UR(CHKARGS); static void post_in(CHKARGS); static const v_check man_valids[MAN_MAX - MAN_TH] = { post_TH, /* TH */ post_SH, /* SH */ post_SH, /* SS */ NULL, /* TP */ NULL, /* TQ */ check_abort,/* LP */ check_par, /* PP */ check_abort,/* P */ post_IP, /* IP */ NULL, /* HP */ NULL, /* SM */ NULL, /* SB */ NULL, /* BI */ NULL, /* IB */ NULL, /* BR */ NULL, /* RB */ NULL, /* R */ NULL, /* B */ NULL, /* I */ NULL, /* IR */ NULL, /* RI */ NULL, /* RE */ check_part, /* RS */ NULL, /* DT */ post_UC, /* UC */ NULL, /* PD */ post_AT, /* AT */ post_in, /* in */ NULL, /* SY */ NULL, /* YS */ post_OP, /* OP */ post_EX, /* EX */ post_EE, /* EE */ post_UR, /* UR */ NULL, /* UE */ post_UR, /* MT */ NULL, /* ME */ }; /* Validate the subtree rooted at man->last. */ void man_validate(struct roff_man *man) { struct roff_node *n; const v_check *cp; /* * Translate obsolete macros such that later code * does not need to look for them. */ n = man->last; switch (n->tok) { case MAN_LP: case MAN_P: n->tok = MAN_PP; break; default: break; } /* * Iterate over all children, recursing into each one * in turn, depth-first. */ man->last = man->last->child; while (man->last != NULL) { man_validate(man); if (man->last == n) man->last = man->last->child; else man->last = man->last->next; } /* Finally validate the macro itself. */ man->last = n; man->next = ROFF_NEXT_SIBLING; switch (n->type) { case ROFFT_TEXT: check_text(man, n); break; case ROFFT_ROOT: check_root(man, n); break; case ROFFT_COMMENT: case ROFFT_EQN: case ROFFT_TBL: break; default: if (n->tok < ROFF_MAX) { roff_validate(man); break; } assert(n->tok >= MAN_TH && n->tok < MAN_MAX); cp = man_valids + (n->tok - MAN_TH); if (*cp) (*cp)(man, n); if (man->last == n) n->flags |= NODE_VALID; break; } } static void check_root(CHKARGS) { assert((man->flags & (MAN_BLINE | MAN_ELINE)) == 0); if (n->last == NULL || n->last->type == ROFFT_COMMENT) mandoc_msg(MANDOCERR_DOC_EMPTY, n->line, n->pos, NULL); else man->meta.hasbody = 1; if (NULL == man->meta.title) { mandoc_msg(MANDOCERR_TH_NOTITLE, n->line, n->pos, NULL); /* * If a title hasn't been set, do so now (by * implication, date and section also aren't set). */ man->meta.title = mandoc_strdup(""); man->meta.msec = mandoc_strdup(""); man->meta.date = mandoc_normdate(man, NULL, n->line, n->pos); } if (man->meta.os_e && (man->meta.rcsids & (1 << man->meta.os_e)) == 0) mandoc_msg(MANDOCERR_RCS_MISSING, 0, 0, man->meta.os_e == MANDOC_OS_OPENBSD ? "(OpenBSD)" : "(NetBSD)"); } static void check_abort(CHKARGS) { abort(); } static void check_text(CHKARGS) { char *cp, *p; if (n->flags & NODE_NOFILL) return; cp = n->string; for (p = cp; NULL != (p = strchr(p, '\t')); p++) mandoc_msg(MANDOCERR_FI_TAB, n->line, n->pos + (int)(p - cp), NULL); } static void post_EE(CHKARGS) { if ((n->flags & NODE_NOFILL) == 0) mandoc_msg(MANDOCERR_FI_SKIP, n->line, n->pos, "EE"); } static void post_EX(CHKARGS) { if (n->flags & NODE_NOFILL) mandoc_msg(MANDOCERR_NF_SKIP, n->line, n->pos, "EX"); } static void post_OP(CHKARGS) { if (n->child == NULL) mandoc_msg(MANDOCERR_OP_EMPTY, n->line, n->pos, "OP"); else if (n->child->next != NULL && n->child->next->next != NULL) { n = n->child->next->next; mandoc_msg(MANDOCERR_ARG_EXCESS, n->line, n->pos, "OP ... %s", n->string); } } static void post_SH(CHKARGS) { struct roff_node *nc; if (n->type != ROFFT_BODY || (nc = n->child) == NULL) return; if (nc->tok == MAN_PP && nc->body->child != NULL) { while (nc->body->last != NULL) { man->next = ROFF_NEXT_CHILD; roff_node_relink(man, nc->body->last); man->last = n; } } if (nc->tok == MAN_PP || nc->tok == ROFF_sp || nc->tok == ROFF_br) { mandoc_msg(MANDOCERR_PAR_SKIP, nc->line, nc->pos, "%s after %s", roff_name[nc->tok], roff_name[n->tok]); roff_node_delete(man, nc); } /* * Trailing PP is empty, so it is deleted by check_par(). * Trailing sp is significant. */ if ((nc = n->last) != NULL && nc->tok == ROFF_br) { mandoc_msg(MANDOCERR_PAR_SKIP, nc->line, nc->pos, "%s at the end of %s", roff_name[nc->tok], roff_name[n->tok]); roff_node_delete(man, nc); } } static void post_UR(CHKARGS) { if (n->type == ROFFT_HEAD && n->child == NULL) mandoc_msg(MANDOCERR_UR_NOHEAD, n->line, n->pos, "%s", roff_name[n->tok]); check_part(man, n); } static void check_part(CHKARGS) { if (n->type == ROFFT_BODY && n->child == NULL) mandoc_msg(MANDOCERR_BLK_EMPTY, n->line, n->pos, "%s", roff_name[n->tok]); } static void check_par(CHKARGS) { switch (n->type) { case ROFFT_BLOCK: if (n->body->child == NULL) roff_node_delete(man, n); break; case ROFFT_BODY: if (n->child != NULL && (n->child->tok == ROFF_sp || n->child->tok == ROFF_br)) { mandoc_msg(MANDOCERR_PAR_SKIP, n->child->line, n->child->pos, "%s after %s", roff_name[n->child->tok], roff_name[n->tok]); roff_node_delete(man, n->child); } if (n->child == NULL) mandoc_msg(MANDOCERR_PAR_SKIP, n->line, n->pos, "%s empty", roff_name[n->tok]); break; case ROFFT_HEAD: if (n->child != NULL) mandoc_msg(MANDOCERR_ARG_SKIP, n->line, n->pos, "%s %s%s", roff_name[n->tok], n->child->string, n->child->next != NULL ? " ..." : ""); break; default: break; } } static void post_IP(CHKARGS) { switch (n->type) { case ROFFT_BLOCK: if (n->head->child == NULL && n->body->child == NULL) roff_node_delete(man, n); break; case ROFFT_BODY: if (n->parent->head->child == NULL && n->child == NULL) mandoc_msg(MANDOCERR_PAR_SKIP, n->line, n->pos, "%s empty", roff_name[n->tok]); break; default: break; } } static void post_TH(CHKARGS) { struct roff_node *nb; const char *p; free(man->meta.title); free(man->meta.vol); free(man->meta.os); free(man->meta.msec); free(man->meta.date); man->meta.title = man->meta.vol = man->meta.date = man->meta.msec = man->meta.os = NULL; nb = n; /* ->TITLE<- MSEC DATE OS VOL */ n = n->child; if (n != NULL && n->string != NULL) { for (p = n->string; *p != '\0'; p++) { /* Only warn about this once... */ if (isalpha((unsigned char)*p) && ! isupper((unsigned char)*p)) { mandoc_msg(MANDOCERR_TITLE_CASE, n->line, n->pos + (int)(p - n->string), "TH %s", n->string); break; } } man->meta.title = mandoc_strdup(n->string); } else { man->meta.title = mandoc_strdup(""); mandoc_msg(MANDOCERR_TH_NOTITLE, nb->line, nb->pos, "TH"); } /* TITLE ->MSEC<- DATE OS VOL */ if (n != NULL) n = n->next; if (n != NULL && n->string != NULL) man->meta.msec = mandoc_strdup(n->string); else { man->meta.msec = mandoc_strdup(""); mandoc_msg(MANDOCERR_MSEC_MISSING, nb->line, nb->pos, "TH %s", man->meta.title); } /* TITLE MSEC ->DATE<- OS VOL */ if (n != NULL) n = n->next; if (n != NULL && n->string != NULL && n->string[0] != '\0') man->meta.date = mandoc_normdate(man, n->string, n->line, n->pos); else { man->meta.date = mandoc_strdup(""); mandoc_msg(MANDOCERR_DATE_MISSING, n == NULL ? nb->line : n->line, n == NULL ? nb->pos : n->pos, "TH"); } /* TITLE MSEC DATE ->OS<- VOL */ if (n && (n = n->next)) man->meta.os = mandoc_strdup(n->string); 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. */ if (n && (n = n->next)) man->meta.vol = mandoc_strdup(n->string); else if ('\0' != man->meta.msec[0] && (NULL != (p = mandoc_a2msec(man->meta.msec)))) man->meta.vol = mandoc_strdup(p); if (n != NULL && (n = n->next) != NULL) mandoc_msg(MANDOCERR_ARG_EXCESS, n->line, n->pos, "TH ... %s", n->string); /* * Remove the `TH' node after we've processed it for our * meta-data. */ roff_node_delete(man, man->last); } static void post_UC(CHKARGS) { static const char * const bsd_versions[] = { "3rd Berkeley Distribution", "4th Berkeley Distribution", "4.2 Berkeley Distribution", "4.3 Berkeley Distribution", "4.4 Berkeley Distribution", }; const char *p, *s; n = n->child; if (n == NULL || n->type != ROFFT_TEXT) p = bsd_versions[0]; else { s = n->string; if (0 == strcmp(s, "3")) p = bsd_versions[0]; else if (0 == strcmp(s, "4")) p = bsd_versions[1]; else if (0 == strcmp(s, "5")) p = bsd_versions[2]; else if (0 == strcmp(s, "6")) p = bsd_versions[3]; else if (0 == strcmp(s, "7")) p = bsd_versions[4]; else p = bsd_versions[0]; } free(man->meta.os); man->meta.os = mandoc_strdup(p); } static void post_AT(CHKARGS) { static const char * const unix_versions[] = { "7th Edition", "System III", "System V", "System V Release 2", }; struct roff_node *nn; const char *p, *s; n = n->child; if (n == NULL || n->type != ROFFT_TEXT) p = unix_versions[0]; else { s = n->string; if (0 == strcmp(s, "3")) p = unix_versions[0]; else if (0 == strcmp(s, "4")) p = unix_versions[1]; else if (0 == strcmp(s, "5")) { nn = n->next; if (nn != NULL && nn->type == ROFFT_TEXT && nn->string[0] != '\0') p = unix_versions[3]; else p = unix_versions[2]; } else p = unix_versions[0]; } free(man->meta.os); man->meta.os = mandoc_strdup(p); } static void post_in(CHKARGS) { char *s; if (n->parent->tok != MAN_TP || n->parent->type != ROFFT_HEAD || n->child == NULL || *n->child->string == '+' || *n->child->string == '-') return; mandoc_asprintf(&s, "+%s", n->child->string); free(n->child->string); n->child->string = s; }
Upload File
Create Folder