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.c
/* $Id: man.c,v 1.187 2019/01/05 00:36:50 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2011 Joerg Sonnenberger <joerg@netbsd.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 <stdarg.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include "mandoc_aux.h" #include "mandoc.h" #include "roff.h" #include "man.h" #include "libmandoc.h" #include "roff_int.h" #include "libman.h" static char *man_hasc(char *); static int man_ptext(struct roff_man *, int, char *, int); static int man_pmacro(struct roff_man *, int, char *, int); int man_parseln(struct roff_man *man, int ln, char *buf, int offs) { if (man->last->type != ROFFT_EQN || ln > man->last->line) man->flags |= MAN_NEWLINE; return roff_getcontrol(man->roff, buf, &offs) ? man_pmacro(man, ln, buf, offs) : man_ptext(man, ln, buf, offs); } /* * If the string ends with \c, return a pointer to the backslash. * Otherwise, return NULL. */ static char * man_hasc(char *start) { char *cp, *ep; ep = strchr(start, '\0') - 2; if (ep < start || ep[0] != '\\' || ep[1] != 'c') return NULL; for (cp = ep; cp > start; cp--) if (cp[-1] != '\\') break; return (ep - cp) % 2 ? NULL : ep; } void man_descope(struct roff_man *man, int line, int offs, char *start) { /* Trailing \c keeps next-line scope open. */ if (start != NULL && man_hasc(start) != NULL) return; /* * Co-ordinate what happens with having a next-line scope open: * first close out the element scopes (if applicable), * then close out the block scope (also if applicable). */ if (man->flags & MAN_ELINE) { while (man->last->parent->type != ROFFT_ROOT && man_macro(man->last->parent->tok)->flags & MAN_ESCOPED) man_unscope(man, man->last->parent); man->flags &= ~MAN_ELINE; } if ( ! (man->flags & MAN_BLINE)) return; man_unscope(man, man->last->parent); roff_body_alloc(man, line, offs, man->last->tok); man->flags &= ~(MAN_BLINE | ROFF_NONOFILL); } static int man_ptext(struct roff_man *man, int line, char *buf, int offs) { int i; char *ep; /* In no-fill mode, whitespace is preserved on text lines. */ if (man->flags & ROFF_NOFILL) { roff_word_alloc(man, line, offs, buf + offs); man_descope(man, line, offs, buf + offs); return 1; } for (i = offs; buf[i] == ' '; i++) /* Skip leading whitespace. */ ; /* * Blank lines are ignored in next line scope * and right after headings and cancel preceding \c, * but add a single vertical space elsewhere. */ if (buf[i] == '\0') { if (man->flags & (MAN_ELINE | MAN_BLINE)) { mandoc_msg(MANDOCERR_BLK_BLANK, line, 0, NULL); return 1; } if (man->last->tok == MAN_SH || man->last->tok == MAN_SS) return 1; if (man->last->type == ROFFT_TEXT && ((ep = man_hasc(man->last->string)) != NULL)) { *ep = '\0'; return 1; } roff_elem_alloc(man, line, offs, ROFF_sp); man->next = ROFF_NEXT_SIBLING; return 1; } /* * Warn if the last un-escaped character is whitespace. Then * strip away the remaining spaces (tabs stay!). */ i = (int)strlen(buf); assert(i); if (' ' == buf[i - 1] || '\t' == buf[i - 1]) { if (i > 1 && '\\' != buf[i - 2]) mandoc_msg(MANDOCERR_SPACE_EOL, line, i - 1, NULL); for (--i; i && ' ' == buf[i]; i--) /* Spin back to non-space. */ ; /* Jump ahead of escaped whitespace. */ i += '\\' == buf[i] ? 2 : 1; buf[i] = '\0'; } roff_word_alloc(man, line, offs, buf + offs); /* * End-of-sentence check. If the last character is an unescaped * EOS character, then flag the node as being the end of a * sentence. The front-end will know how to interpret this. */ assert(i); if (mandoc_eos(buf, (size_t)i)) man->last->flags |= NODE_EOS; man_descope(man, line, offs, buf + offs); return 1; } static int man_pmacro(struct roff_man *man, int ln, char *buf, int offs) { struct roff_node *n; const char *cp; size_t sz; enum roff_tok tok; int ppos; int bline; /* Determine the line macro. */ ppos = offs; tok = TOKEN_NONE; for (sz = 0; sz < 4 && strchr(" \t\\", buf[offs]) == NULL; sz++) offs++; if (sz > 0 && sz < 4) tok = roffhash_find(man->manmac, buf + ppos, sz); if (tok == TOKEN_NONE) { mandoc_msg(MANDOCERR_MACRO, ln, ppos, "%s", buf + ppos - 1); return 1; } /* Skip a leading escape sequence or tab. */ switch (buf[offs]) { case '\\': cp = buf + offs + 1; mandoc_escape(&cp, NULL, NULL); offs = cp - buf; break; case '\t': offs++; break; default: break; } /* Jump to the next non-whitespace word. */ while (buf[offs] == ' ') offs++; /* * Trailing whitespace. Note that tabs are allowed to be passed * into the parser as "text", so we only warn about spaces here. */ if (buf[offs] == '\0' && buf[offs - 1] == ' ') mandoc_msg(MANDOCERR_SPACE_EOL, ln, offs - 1, NULL); /* * Some macros break next-line scopes; otherwise, remember * whether we are in next-line scope for a block head. */ man_breakscope(man, tok); bline = man->flags & MAN_BLINE; /* * If the line in next-line scope ends with \c, keep the * next-line scope open for the subsequent input line. * That is not at all portable, only groff >= 1.22.4 * does it, but *if* this weird idiom occurs in a manual * page, that's very likely what the author intended. */ if (bline && man_hasc(buf + offs)) bline = 0; /* Call to handler... */ (*man_macro(tok)->fp)(man, tok, ln, ppos, &offs, buf); /* In quick mode (for mandocdb), abort after the NAME section. */ if (man->quick && tok == MAN_SH) { n = man->last; if (n->type == ROFFT_BODY && strcmp(n->prev->child->string, "NAME")) return 2; } /* * If we are in a next-line scope for a block head, * close it out now and switch to the body, * unless the next-line scope is allowed to continue. */ if (bline == 0 || (man->flags & MAN_BLINE) == 0 || man->flags & MAN_ELINE || man_macro(tok)->flags & MAN_NSCOPED) return 1; man_unscope(man, man->last->parent); roff_body_alloc(man, ln, ppos, man->last->tok); man->flags &= ~(MAN_BLINE | ROFF_NONOFILL); return 1; } void man_breakscope(struct roff_man *man, int tok) { struct roff_node *n; /* * An element next line scope is open, * and the new macro is not allowed inside elements. * Delete the element that is being broken. */ if (man->flags & MAN_ELINE && (tok < MAN_TH || (man_macro(tok)->flags & MAN_NSCOPED) == 0)) { n = man->last; if (n->type == ROFFT_TEXT) n = n->parent; if (n->tok < MAN_TH || (man_macro(n->tok)->flags & (MAN_NSCOPED | MAN_ESCOPED)) == MAN_NSCOPED) n = n->parent; mandoc_msg(MANDOCERR_BLK_LINE, n->line, n->pos, "%s breaks %s", roff_name[tok], roff_name[n->tok]); roff_node_delete(man, n); man->flags &= ~MAN_ELINE; } /* * Weird special case: * Switching fill mode closes section headers. */ if (man->flags & MAN_BLINE && (tok == ROFF_nf || tok == ROFF_fi) && (man->last->tok == MAN_SH || man->last->tok == MAN_SS)) { n = man->last; man_unscope(man, n); roff_body_alloc(man, n->line, n->pos, n->tok); man->flags &= ~(MAN_BLINE | ROFF_NONOFILL); } /* * A block header next line scope is open, * and the new macro is not allowed inside block headers. * Delete the block that is being broken. */ if (man->flags & MAN_BLINE && tok != ROFF_nf && tok != ROFF_fi && (tok < MAN_TH || man_macro(tok)->flags & MAN_XSCOPE)) { n = man->last; if (n->type == ROFFT_TEXT) n = n->parent; if (n->tok < MAN_TH || (man_macro(n->tok)->flags & MAN_XSCOPE) == 0) n = n->parent; assert(n->type == ROFFT_HEAD); n = n->parent; assert(n->type == ROFFT_BLOCK); assert(man_macro(n->tok)->flags & MAN_BSCOPED); mandoc_msg(MANDOCERR_BLK_LINE, n->line, n->pos, "%s breaks %s", roff_name[tok], roff_name[n->tok]); roff_node_delete(man, n); man->flags &= ~(MAN_BLINE | ROFF_NONOFILL); } }
Upload File
Create Folder