mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
vgrind: Tear down vgrind support
vgrind has been disconnected from the build for a while. Remove from the build, and gc vgrid support in the few remaining places. Reviewed by: jhb Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D57648
This commit is contained in:
1 parent
e985c628a0
commit
198637a686
21 files changed
+5
-2210
No files matched your search
@@ -46,7 +46,6 @@ PRINTERDEVICE?= ascii
|
||||
|
||||
BIB?= bib
|
||||
GREMLIN?= grn
|
||||
GRIND?= vgrind -f
|
||||
INDXBIB?= indxbib
|
||||
PIC?= pic
|
||||
REFER?= refer
|
||||
|
||||
@@ -362,7 +362,6 @@ DIRDEPS+= \
|
||||
usr.bin/usbhidctl \
|
||||
usr.bin/users \
|
||||
usr.bin/vacation \
|
||||
usr.bin/vgrind \
|
||||
usr.bin/vi \
|
||||
usr.bin/vi/catalog \
|
||||
usr.bin/vis \
|
||||
|
||||
@@ -110,21 +110,6 @@ Beware: this option is implemented in a way which is rather
|
||||
slow; it is usually faster to simply rebuild the
|
||||
.Pa tags
|
||||
file.
|
||||
.It Fl v
|
||||
An index of the form expected by
|
||||
.Xr vgrind 1
|
||||
is produced on the standard output.
|
||||
This listing
|
||||
contains the object name, file name, and page number (assuming 64
|
||||
line pages).
|
||||
Since the output will be sorted into lexicographic order,
|
||||
it may be desired to run the output through
|
||||
.Xr sort 1 .
|
||||
Sample use:
|
||||
.Bd -literal -offset indent
|
||||
ctags -v files | sort -f > index
|
||||
vgrind -x index
|
||||
.Ed
|
||||
.It Fl w
|
||||
Suppress warning diagnostics.
|
||||
.It Fl x
|
||||
|
||||
@@ -62,7 +62,6 @@ long lineftell; /* ftell after getc( inf ) == '\n' */
|
||||
int lineno; /* line number of current line */
|
||||
int dflag; /* -d: non-macro defines */
|
||||
int tflag; /* -t: create tags for typedefs */
|
||||
int vflag; /* -v: vgrind style index output */
|
||||
int wflag; /* -w: suppress warnings */
|
||||
int xflag; /* -x: cxref style output */
|
||||
|
||||
@@ -88,7 +87,7 @@ main(int argc, char **argv)
|
||||
|
||||
aflag = uflag = false;
|
||||
tflag = true;
|
||||
while ((ch = getopt(argc, argv, "BFTadf:tuwvx")) != -1)
|
||||
while ((ch = getopt(argc, argv, "BFTadf:tuwx")) != -1)
|
||||
switch(ch) {
|
||||
case 'B':
|
||||
searchar = '?';
|
||||
@@ -117,8 +116,6 @@ main(int argc, char **argv)
|
||||
case 'w':
|
||||
wflag++;
|
||||
break;
|
||||
case 'v':
|
||||
vflag++;
|
||||
case 'x':
|
||||
xflag++;
|
||||
break;
|
||||
|
||||
@@ -72,7 +72,6 @@ extern long lineftell; /* ftell after getc( inf ) == '\n' */
|
||||
extern int lineno; /* line number of current line */
|
||||
extern int dflag; /* -d: non-macro defines */
|
||||
extern int tflag; /* -t: create tags for typedefs */
|
||||
extern int vflag; /* -v: vgrind style index output */
|
||||
extern int wflag; /* -w: suppress warnings */
|
||||
extern int xflag; /* -x: cxref style output */
|
||||
extern bool _wht[], _etk[], _itk[], _btk[], _gd[];
|
||||
|
||||
@@ -93,10 +93,7 @@ put_entries(NODE *node)
|
||||
|
||||
if (node->left)
|
||||
put_entries(node->left);
|
||||
if (vflag)
|
||||
printf("%s %s %d\n",
|
||||
node->entry, node->file, (node->lno + 63) / 64);
|
||||
else if (xflag)
|
||||
if (xflag)
|
||||
printf("%-16s %4d %-16s %s\n",
|
||||
node->entry, node->lno, node->file, node->pat);
|
||||
else
|
||||
|
||||
@@ -190,8 +190,6 @@ Valid preprocessors arguments:
|
||||
.Xr refer 1 Pq Pa ports/textproc/groff
|
||||
.It Cm t
|
||||
.Xr tbl 1 Pq Pa ports/textproc/groff
|
||||
.It Cm v
|
||||
.Xr vgrind 1
|
||||
.El
|
||||
.Pp
|
||||
Overrides the
|
||||
|
||||
@@ -76,7 +76,6 @@ display is supported via the following definitions:
|
||||
.It TBL Ns _ Ns Va LANG
|
||||
.It TROFF Ns _ Ns Va LANG
|
||||
.It REFER Ns _ Ns Va LANG
|
||||
.It VGRIND Ns _ Ns Va LANG
|
||||
.El
|
||||
.Pp
|
||||
See the
|
||||
|
||||
+2
-4
@@ -418,7 +418,7 @@ man_display_page() {
|
||||
# Usage: man_display_page_groff
|
||||
# Display the manpage using groff
|
||||
man_display_page_groff() {
|
||||
local EQN NROFF PIC TBL TROFF REFER VGRIND
|
||||
local EQN NROFF PIC TBL TROFF REFER
|
||||
local IFS l nroff_dev pipeline preproc_arg tool
|
||||
|
||||
# So, we really do need to parse the manpage. First, figure out the
|
||||
@@ -456,7 +456,7 @@ man_display_page_groff() {
|
||||
# Allow language specific calls to override the default
|
||||
# set of utilities.
|
||||
l=$(echo $man_lang | tr [:lower:] [:upper:])
|
||||
for tool in EQN NROFF PIC TBL TROFF REFER VGRIND; do
|
||||
for tool in EQN NROFF PIC TBL TROFF REFER; do
|
||||
eval "$tool=\${${tool}_$l:-\$$tool}"
|
||||
done
|
||||
;;
|
||||
@@ -483,7 +483,6 @@ man_display_page_groff() {
|
||||
p) pipeline="$pipeline | $PIC" ;;
|
||||
r) pipeline="$pipeline | $REFER" ;;
|
||||
t) pipeline="$pipeline | $TBL" ;;
|
||||
v) pipeline="$pipeline | $VGRIND" ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
done
|
||||
@@ -1129,7 +1128,6 @@ PIC=pic
|
||||
REFER=refer
|
||||
TBL=tbl
|
||||
TROFF='groff -S -mandoc'
|
||||
VGRIND=vgrind
|
||||
|
||||
LOCALE=/usr/bin/locale
|
||||
STTY=/bin/stty
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
PROG= vfontedpr
|
||||
SRCS= regexp.c vfontedpr.c
|
||||
SCRIPTS=vgrind.sh
|
||||
FILES= vgrindefs.src vgrindefs.src.db tmac.vgrind
|
||||
FILESNAME_vgrindefs.src= vgrindefs
|
||||
FILESNAME_vgrindefs.src.db= vgrindefs.db
|
||||
FILESDIR= ${SHAREDIR}/misc
|
||||
FILESDIR_tmac.vgrind= ${SHAREDIR}/tmac
|
||||
MAN= vgrind.1 vgrindefs.5
|
||||
|
||||
WARNS?= 3
|
||||
|
||||
BINDIR= ${LIBEXECDIR}
|
||||
SCRIPTSDIR=/usr/bin
|
||||
|
||||
CLEANFILES= vgrindefs.src.db
|
||||
|
||||
.include <bsd.endian.mk>
|
||||
.include <src.tools.mk>
|
||||
|
||||
vgrindefs.src.db: vgrindefs.src
|
||||
${CAP_MKDB_CMD} ${CAP_MKDB_ENDIAN} -f vgrindefs.src ${.ALLSRC}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
@@ -1,15 +0,0 @@
|
||||
# Autogenerated - do NOT edit!
|
||||
|
||||
DIRDEPS = \
|
||||
include \
|
||||
include/xlocale \
|
||||
lib/${CSU_DIR} \
|
||||
lib/libc \
|
||||
lib/libcompiler_rt \
|
||||
|
||||
|
||||
.include <dirdeps.mk>
|
||||
|
||||
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
|
||||
# local dependencies - needed for -jN in clean tree
|
||||
.endif
|
||||
@@ -1,59 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Copyright (c) 1980, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
extern bool _escaped; /* if last character was an escape */
|
||||
extern char *s_start; /* start of the current string */
|
||||
extern char *l_acmbeg; /* string introducing a comment */
|
||||
extern char *l_acmend; /* string ending a comment */
|
||||
extern char *l_blkbeg; /* string beginning of a block */
|
||||
extern char *l_blkend; /* string ending a block */
|
||||
extern char *l_chrbeg; /* delimiter for character constant */
|
||||
extern char *l_chrend; /* delimiter for character constant */
|
||||
extern char *l_combeg; /* string introducing a comment */
|
||||
extern char *l_comend; /* string ending a comment */
|
||||
extern char l_escape; /* character used to escape characters */
|
||||
extern char *l_keywds[]; /* keyword table address */
|
||||
extern bool l_onecase; /* upper and lower case are equivalent */
|
||||
extern char *l_prcbeg; /* regular expr for procedure begin */
|
||||
extern char *l_strbeg; /* delimiter for string constant */
|
||||
extern char *l_strend; /* delimiter for string constant */
|
||||
extern bool l_toplex; /* procedures only defined at top lex level */
|
||||
extern const char *language; /* the language indicator */
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int STRNCMP(char *, char *, int);
|
||||
extern char *convexp(char *);
|
||||
extern char *expmatch(char *, char *, char *);
|
||||
__END_DECLS
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Copyright (c) 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define _PATH_VGRINDEFS "/usr/share/misc/vgrindefs"
|
||||
@@ -1,584 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Copyright (c) 1980, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
static void expconv(void);
|
||||
|
||||
bool _escaped; /* true if we are currently x_escaped */
|
||||
char *s_start; /* start of string */
|
||||
bool l_onecase; /* true if upper and lower equivalent */
|
||||
|
||||
#define makelower(c) (isupper((c)) ? tolower((c)) : (c))
|
||||
|
||||
/* STRNCMP - like strncmp except that we convert the
|
||||
* first string to lower case before comparing
|
||||
* if l_onecase is set.
|
||||
*/
|
||||
|
||||
int
|
||||
STRNCMP(register char *s1, register char *s2, register int len)
|
||||
{
|
||||
if (l_onecase) {
|
||||
do
|
||||
if (*s2 - makelower(*s1))
|
||||
return (*s2 - makelower(*s1));
|
||||
else {
|
||||
s2++;
|
||||
s1++;
|
||||
}
|
||||
while (--len);
|
||||
} else {
|
||||
do
|
||||
if (*s2 - *s1)
|
||||
return (*s2 - *s1);
|
||||
else {
|
||||
s2++;
|
||||
s1++;
|
||||
}
|
||||
while (--len);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* The following routine converts an irregular expression to
|
||||
* internal format.
|
||||
*
|
||||
* Either meta symbols (\a \d or \p) or character strings or
|
||||
* operations ( alternation or parenthesizing ) can be
|
||||
* specified. Each starts with a descriptor byte. The descriptor
|
||||
* byte has STR set for strings, META set for meta symbols
|
||||
* and OPER set for operations.
|
||||
* The descriptor byte can also have the OPT bit set if the object
|
||||
* defined is optional. Also ALT can be set to indicate an alternation.
|
||||
*
|
||||
* For metasymbols the byte following the descriptor byte identities
|
||||
* the meta symbol (containing an ascii 'a', 'd', 'p', '|', or '('). For
|
||||
* strings the byte after the descriptor is a character count for
|
||||
* the string:
|
||||
*
|
||||
* meta symbols := descriptor
|
||||
* symbol
|
||||
*
|
||||
* strings := descriptor
|
||||
* character count
|
||||
* the string
|
||||
*
|
||||
* operations := descriptor
|
||||
* symbol
|
||||
* character count
|
||||
*/
|
||||
|
||||
/*
|
||||
* handy macros for accessing parts of match blocks
|
||||
*/
|
||||
#define MSYM(A) (*(A+1)) /* symbol in a meta symbol block */
|
||||
#define MNEXT(A) (A+2) /* character following a metasymbol block */
|
||||
|
||||
#define OSYM(A) (*(A+1)) /* symbol in an operation block */
|
||||
#define OCNT(A) (*(A+2)) /* character count */
|
||||
#define ONEXT(A) (A+3) /* next character after the operation */
|
||||
#define OPTR(A) (A+*(A+2)) /* place pointed to by the operator */
|
||||
|
||||
#define SCNT(A) (*(A+1)) /* byte count of a string */
|
||||
#define SSTR(A) (A+2) /* address of the string */
|
||||
#define SNEXT(A) (A+2+*(A+1)) /* character following the string */
|
||||
|
||||
/*
|
||||
* bit flags in the descriptor
|
||||
*/
|
||||
#define OPT 1
|
||||
#define STR 2
|
||||
#define META 4
|
||||
#define ALT 8
|
||||
#define OPER 16
|
||||
|
||||
static char *ccre; /* pointer to current position in converted exp*/
|
||||
static char *ure; /* pointer current position in unconverted exp */
|
||||
|
||||
/* re: unconverted irregular expression */
|
||||
char *
|
||||
convexp(char *re)
|
||||
{
|
||||
register char *cre; /* pointer to converted regular expression */
|
||||
|
||||
/* allocate room for the converted expression */
|
||||
if (re == NULL)
|
||||
return (NULL);
|
||||
if (*re == '\0')
|
||||
return (NULL);
|
||||
cre = malloc(4 * strlen(re) + 3);
|
||||
ccre = cre;
|
||||
ure = re;
|
||||
|
||||
/* start the conversion with a \a */
|
||||
*cre = META | OPT;
|
||||
MSYM(cre) = 'a';
|
||||
ccre = MNEXT(cre);
|
||||
|
||||
/* start the conversion (its recursive) */
|
||||
expconv ();
|
||||
*ccre = 0;
|
||||
return (cre);
|
||||
}
|
||||
|
||||
static void
|
||||
expconv()
|
||||
{
|
||||
register char *cs; /* pointer to current symbol in converted exp */
|
||||
register char c; /* character being processed */
|
||||
register char *acs; /* pinter to last alternate */
|
||||
register int temp;
|
||||
|
||||
/* let the conversion begin */
|
||||
acs = NULL;
|
||||
cs = NULL;
|
||||
while (*ure) {
|
||||
switch (c = *ure++) {
|
||||
|
||||
case '\\':
|
||||
switch (c = *ure++) {
|
||||
|
||||
/* escaped characters are just characters */
|
||||
default:
|
||||
if (cs == NULL || (*cs & STR) == 0) {
|
||||
cs = ccre;
|
||||
*cs = STR;
|
||||
SCNT(cs) = 1;
|
||||
ccre += 2;
|
||||
} else
|
||||
SCNT(cs)++;
|
||||
*ccre++ = c;
|
||||
break;
|
||||
|
||||
/* normal(?) metacharacters */
|
||||
case 'a':
|
||||
case 'd':
|
||||
case 'e':
|
||||
case 'p':
|
||||
if (acs != NULL && acs != cs) {
|
||||
do {
|
||||
temp = OCNT(acs);
|
||||
OCNT(acs) = ccre - acs;
|
||||
acs -= temp;
|
||||
} while (temp != 0);
|
||||
acs = NULL;
|
||||
}
|
||||
cs = ccre;
|
||||
*cs = META;
|
||||
MSYM(cs) = c;
|
||||
ccre = MNEXT(cs);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
/* just put the symbol in */
|
||||
case '^':
|
||||
case '$':
|
||||
if (acs != NULL && acs != cs) {
|
||||
do {
|
||||
temp = OCNT(acs);
|
||||
OCNT(acs) = ccre - acs;
|
||||
acs -= temp;
|
||||
} while (temp != 0);
|
||||
acs = NULL;
|
||||
}
|
||||
cs = ccre;
|
||||
*cs = META;
|
||||
MSYM(cs) = c;
|
||||
ccre = MNEXT(cs);
|
||||
break;
|
||||
|
||||
/* mark the last match sequence as optional */
|
||||
case '?':
|
||||
if (cs)
|
||||
*cs = *cs | OPT;
|
||||
break;
|
||||
|
||||
/* recurse and define a subexpression */
|
||||
case '(':
|
||||
if (acs != NULL && acs != cs) {
|
||||
do {
|
||||
temp = OCNT(acs);
|
||||
OCNT(acs) = ccre - acs;
|
||||
acs -= temp;
|
||||
} while (temp != 0);
|
||||
acs = NULL;
|
||||
}
|
||||
cs = ccre;
|
||||
*cs = OPER;
|
||||
OSYM(cs) = '(';
|
||||
ccre = ONEXT(cs);
|
||||
expconv();
|
||||
OCNT(cs) = ccre - cs; /* offset to next symbol */
|
||||
break;
|
||||
|
||||
/* return from a recursion */
|
||||
case ')':
|
||||
if (acs != NULL) {
|
||||
do {
|
||||
temp = OCNT(acs);
|
||||
OCNT(acs) = ccre - acs;
|
||||
acs -= temp;
|
||||
} while (temp != 0);
|
||||
acs = NULL;
|
||||
}
|
||||
cs = ccre;
|
||||
*cs = META;
|
||||
MSYM(cs) = c;
|
||||
ccre = MNEXT(cs);
|
||||
return;
|
||||
|
||||
/* mark the last match sequence as having an alternate */
|
||||
/* the third byte will contain an offset to jump over the */
|
||||
/* alternate match in case the first did not fail */
|
||||
case '|':
|
||||
if (acs != NULL && acs != cs)
|
||||
OCNT(ccre) = ccre - acs; /* make a back pointer */
|
||||
else
|
||||
OCNT(ccre) = 0;
|
||||
*cs |= ALT;
|
||||
cs = ccre;
|
||||
*cs = OPER;
|
||||
OSYM(cs) = '|';
|
||||
ccre = ONEXT(cs);
|
||||
acs = cs; /* remember that the pointer is to be filles */
|
||||
break;
|
||||
|
||||
/* if its not a metasymbol just build a scharacter string */
|
||||
default:
|
||||
if (cs == NULL || (*cs & STR) == 0) {
|
||||
cs = ccre;
|
||||
*cs = STR;
|
||||
SCNT(cs) = 1;
|
||||
ccre = SSTR(cs);
|
||||
} else
|
||||
SCNT(cs)++;
|
||||
*ccre++ = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (acs != NULL) {
|
||||
do {
|
||||
temp = OCNT(acs);
|
||||
OCNT(acs) = ccre - acs;
|
||||
acs -= temp;
|
||||
} while (temp != 0);
|
||||
acs = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
/* end of convertre */
|
||||
|
||||
|
||||
/*
|
||||
* The following routine recognises an irregular expression
|
||||
* with the following special characters:
|
||||
*
|
||||
* \? - means last match was optional
|
||||
* \a - matches any number of characters
|
||||
* \d - matches any number of spaces and tabs
|
||||
* \p - matches any number of alphanumeric
|
||||
* characters. The
|
||||
* characters matched will be copied into
|
||||
* the area pointed to by 'name'.
|
||||
* \| - alternation
|
||||
* \( \) - grouping used mostly for alternation and
|
||||
* optionality
|
||||
*
|
||||
* The irregular expression must be translated to internal form
|
||||
* prior to calling this routine
|
||||
*
|
||||
* The value returned is the pointer to the first non \a
|
||||
* character matched.
|
||||
*/
|
||||
|
||||
/*
|
||||
* s: string to check for a match in
|
||||
* re: a converted irregular expression
|
||||
* mstring: where to put whatever matches a \p
|
||||
*/
|
||||
char *
|
||||
expmatch (register char *s, register char *re, register char *mstring)
|
||||
{
|
||||
register char *cs; /* the current symbol */
|
||||
register char *ptr,*s1; /* temporary pointer */
|
||||
bool matched; /* a temporary bool */
|
||||
|
||||
/* initial conditions */
|
||||
if (re == NULL)
|
||||
return (NULL);
|
||||
cs = re;
|
||||
matched = false;
|
||||
|
||||
/* loop till expression string is exhausted (or at least pretty tired) */
|
||||
while (*cs) {
|
||||
switch (*cs & (OPER | STR | META)) {
|
||||
|
||||
/* try to match a string */
|
||||
case STR:
|
||||
matched = !STRNCMP (s, SSTR(cs), SCNT(cs));
|
||||
if (matched) {
|
||||
|
||||
/* hoorah it matches */
|
||||
s += SCNT(cs);
|
||||
cs = SNEXT(cs);
|
||||
} else if (*cs & ALT) {
|
||||
|
||||
/* alternation, skip to next expression */
|
||||
cs = SNEXT(cs);
|
||||
} else if (*cs & OPT) {
|
||||
|
||||
/* the match is optional */
|
||||
cs = SNEXT(cs);
|
||||
matched = 1; /* indicate a successful match */
|
||||
} else {
|
||||
|
||||
/* no match, error return */
|
||||
return (NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
/* an operator, do something fancy */
|
||||
case OPER:
|
||||
switch (OSYM(cs)) {
|
||||
|
||||
/* this is an alternation */
|
||||
case '|':
|
||||
if (matched)
|
||||
|
||||
/* last thing in the alternation was a match, skip ahead */
|
||||
cs = OPTR(cs);
|
||||
else
|
||||
|
||||
/* no match, keep trying */
|
||||
cs = ONEXT(cs);
|
||||
break;
|
||||
|
||||
/* this is a grouping, recurse */
|
||||
case '(':
|
||||
ptr = expmatch(s, ONEXT(cs), mstring);
|
||||
if (ptr != NULL) {
|
||||
|
||||
/* the subexpression matched */
|
||||
matched = 1;
|
||||
s = ptr;
|
||||
} else if (*cs & ALT) {
|
||||
|
||||
/* alternation, skip to next expression */
|
||||
matched = 0;
|
||||
} else if (*cs & OPT) {
|
||||
|
||||
/* the match is optional */
|
||||
matched = 1; /* indicate a successful match */
|
||||
} else {
|
||||
|
||||
/* no match, error return */
|
||||
return (NULL);
|
||||
}
|
||||
cs = OPTR(cs);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
/* try to match a metasymbol */
|
||||
case META:
|
||||
switch (MSYM(cs)) {
|
||||
|
||||
/* try to match anything and remember what was matched */
|
||||
case 'p':
|
||||
/*
|
||||
* This is really the same as trying the match the
|
||||
* remaining parts of the expression to any subset
|
||||
* of the string.
|
||||
*/
|
||||
s1 = s;
|
||||
do {
|
||||
ptr = expmatch(s1, MNEXT(cs), mstring);
|
||||
if (ptr != NULL && s1 != s) {
|
||||
|
||||
/* we have a match, remember the match */
|
||||
strncpy (mstring, s, s1 - s);
|
||||
mstring[s1 - s] = '\0';
|
||||
return (ptr);
|
||||
} else if (ptr != NULL && (*cs & OPT)) {
|
||||
|
||||
/* it was aoptional so no match is ok */
|
||||
return (ptr);
|
||||
} else if (ptr != NULL) {
|
||||
|
||||
/* not optional and we still matched */
|
||||
return (NULL);
|
||||
}
|
||||
if (!(isalnum(*s1) || *s1 == '_' ||
|
||||
/* C++ destructor */
|
||||
*s1 == '~' ||
|
||||
/* C++ scope operator */
|
||||
(strlen(s1) > 1 && *s1 == ':' && s1[1] == ':' &&
|
||||
(s1++, true))))
|
||||
return (NULL);
|
||||
if (*s1 == '\\')
|
||||
_escaped = _escaped ? false : true;
|
||||
else
|
||||
_escaped = false;
|
||||
} while (*s1++);
|
||||
return (NULL);
|
||||
|
||||
/* try to match anything */
|
||||
case 'a':
|
||||
/*
|
||||
* This is really the same as trying the match the
|
||||
* remaining parts of the expression to any subset
|
||||
* of the string.
|
||||
*/
|
||||
s1 = s;
|
||||
do {
|
||||
ptr = expmatch(s1, MNEXT(cs), mstring);
|
||||
if (ptr != NULL && s1 != s) {
|
||||
|
||||
/* we have a match */
|
||||
return (ptr);
|
||||
} else if (ptr != NULL && (*cs & OPT)) {
|
||||
|
||||
/* it was aoptional so no match is ok */
|
||||
return (ptr);
|
||||
} else if (ptr != NULL) {
|
||||
|
||||
/* not optional and we still matched */
|
||||
return (NULL);
|
||||
}
|
||||
if (*s1 == '\\')
|
||||
_escaped = _escaped ? false : true;
|
||||
else
|
||||
_escaped = false;
|
||||
} while (*s1++);
|
||||
return (NULL);
|
||||
|
||||
/* fail if we are currently _escaped */
|
||||
case 'e':
|
||||
if (_escaped)
|
||||
return(NULL);
|
||||
cs = MNEXT(cs);
|
||||
break;
|
||||
|
||||
/* match any number of tabs and spaces */
|
||||
case 'd':
|
||||
ptr = s;
|
||||
while (*s == ' ' || *s == '\t')
|
||||
s++;
|
||||
if (s != ptr || s == s_start) {
|
||||
|
||||
/* match, be happy */
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*s == '\n' || *s == '\0') {
|
||||
|
||||
/* match, be happy */
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*cs & ALT) {
|
||||
|
||||
/* try the next part */
|
||||
matched = 0;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*cs & OPT) {
|
||||
|
||||
/* doesn't matter */
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else
|
||||
|
||||
/* no match, error return */
|
||||
return (NULL);
|
||||
break;
|
||||
|
||||
/* check for end of line */
|
||||
case '$':
|
||||
if (*s == '\0' || *s == '\n') {
|
||||
|
||||
/* match, be happy */
|
||||
s++;
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*cs & ALT) {
|
||||
|
||||
/* try the next part */
|
||||
matched = 0;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*cs & OPT) {
|
||||
|
||||
/* doesn't matter */
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else
|
||||
|
||||
/* no match, error return */
|
||||
return (NULL);
|
||||
break;
|
||||
|
||||
/* check for start of line */
|
||||
case '^':
|
||||
if (s == s_start) {
|
||||
|
||||
/* match, be happy */
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*cs & ALT) {
|
||||
|
||||
/* try the next part */
|
||||
matched = 0;
|
||||
cs = MNEXT(cs);
|
||||
} else if (*cs & OPT) {
|
||||
|
||||
/* doesn't matter */
|
||||
matched = 1;
|
||||
cs = MNEXT(cs);
|
||||
} else
|
||||
|
||||
/* no match, error return */
|
||||
return (NULL);
|
||||
break;
|
||||
|
||||
/* end of a subexpression, return success */
|
||||
case ')':
|
||||
return (s);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (s);
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
.am vS
|
||||
..
|
||||
.am vE
|
||||
..
|
||||
'ss 23
|
||||
'ds _ \d\(mi\u
|
||||
'ps 9z
|
||||
'vs 10p
|
||||
'ds - \(mi
|
||||
'ds / \\h'\\w' 'u-\\w'/'u'/
|
||||
'ds /* \\h'\\w' 'u-\\w'/'u'/*
|
||||
'bd B 3
|
||||
'bd S B 3
|
||||
'nr cm 0
|
||||
'nf
|
||||
'de vH
|
||||
'ev 2
|
||||
'ft 1
|
||||
'sp .35i
|
||||
'tl '\s14\f3\\*(=F\fP\s0'\\*(=H'\f3\s14\\*(=F\fP\s0'
|
||||
'sp .25i
|
||||
'ft 1
|
||||
\f2\s12\h'\\n(.lu-\w'\\*(=f'u'\\*(=f\fP\s0\h'|0u'
|
||||
.sp .05i
|
||||
'ev
|
||||
'ds =G \\*(=F
|
||||
..
|
||||
'de vF
|
||||
'ev 2
|
||||
'sp .35i
|
||||
'ie o 'tl '\f2\\*(=M''Page % of \\*(=G\fP'
|
||||
'el 'tl '\f2Page % of \\*(=G''\\*(=M\fP'
|
||||
'bp
|
||||
'ev
|
||||
'ft 1
|
||||
'if \\n(cm=1 'ft 2
|
||||
..
|
||||
'de ()
|
||||
'pn 1
|
||||
..
|
||||
'de +C
|
||||
'nr cm 1
|
||||
'ft 2
|
||||
'ds +K
|
||||
'ds -K
|
||||
..
|
||||
'de -C
|
||||
'nr cm 0
|
||||
'ft 1
|
||||
'ds +K \f3
|
||||
'ds -K \fP
|
||||
..
|
||||
'+C
|
||||
'-C
|
||||
'am +C
|
||||
'ne 3
|
||||
..
|
||||
'de FN
|
||||
\f2\s14\h'\\n(.lu-\w'\\$1'u'\\$1\fP\s0\h'|0u'\c
|
||||
.if r x .if \\nx .if d =F .tm \\$1 \\*(=F \\n%
|
||||
'ds =f \&...\\$1
|
||||
..
|
||||
'de FC
|
||||
.if r x .if \\nx .if d =F .tm \\$1 \\*(=F \\n%
|
||||
'ds =f \&...\\$1
|
||||
..
|
||||
'de -F
|
||||
'rm =f
|
||||
..
|
||||
'ft 1
|
||||
'lg 0
|
||||
@@ -1,704 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*
|
||||
* Copyright (c) 1980, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include "pathnames.h"
|
||||
#include "extern.h"
|
||||
|
||||
#define STANDARD 0
|
||||
#define ALTERNATE 1
|
||||
|
||||
/*
|
||||
* Vfontedpr.
|
||||
*
|
||||
* Dave Presotto 1/12/81 (adapted from an earlier version by Bill Joy)
|
||||
*
|
||||
*/
|
||||
|
||||
#define STRLEN 10 /* length of strings introducing things */
|
||||
#define PNAMELEN 40 /* length of a function/procedure name */
|
||||
#define PSMAX 20 /* size of procedure name stacking */
|
||||
|
||||
static int iskw(char *);
|
||||
static bool isproc(char *);
|
||||
static void putKcp(char *, char *, bool);
|
||||
static void putScp(char *);
|
||||
static void putcp(int);
|
||||
static int tabs(char *, char *);
|
||||
static int width(char *, char *);
|
||||
|
||||
/*
|
||||
* The state variables
|
||||
*/
|
||||
|
||||
static bool filter = false; /* act as a filter (like eqn) */
|
||||
static bool inchr; /* in a string constant */
|
||||
static bool incomm; /* in a comment of the primary type */
|
||||
static bool idx = false; /* form an index */
|
||||
static bool instr; /* in a string constant */
|
||||
static bool nokeyw = false; /* no keywords being flagged */
|
||||
static bool pass = false; /*
|
||||
* when acting as a filter, pass indicates
|
||||
* whether we are currently processing
|
||||
* input.
|
||||
*/
|
||||
|
||||
static int blklevel; /* current nesting level */
|
||||
static int comtype; /* type of comment */
|
||||
static char * defsfile[2] = { _PATH_VGRINDEFS, 0 };
|
||||
/* name of language definitions file */
|
||||
static int margin;
|
||||
static int plstack[PSMAX]; /* the procedure nesting level stack */
|
||||
static char pname[BUFSIZ+1];
|
||||
static bool prccont; /* continue last procedure */
|
||||
static int psptr; /* the stack index of the current procedure */
|
||||
static char pstack[PSMAX][PNAMELEN+1]; /* the procedure name stack */
|
||||
|
||||
/*
|
||||
* The language specific globals
|
||||
*/
|
||||
|
||||
char *l_acmbeg; /* string introducing a comment */
|
||||
char *l_acmend; /* string ending a comment */
|
||||
char *l_blkbeg; /* string beginning of a block */
|
||||
char *l_blkend; /* string ending a block */
|
||||
char *l_chrbeg; /* delimiter for character constant */
|
||||
char *l_chrend; /* delimiter for character constant */
|
||||
char *l_combeg; /* string introducing a comment */
|
||||
char *l_comend; /* string ending a comment */
|
||||
char l_escape; /* character used to escape characters */
|
||||
char *l_keywds[BUFSIZ/2]; /* keyword table address */
|
||||
char *l_nocom; /* regexp for non-comments */
|
||||
char *l_prcbeg; /* regular expr for procedure begin */
|
||||
char *l_strbeg; /* delimiter for string constant */
|
||||
char *l_strend; /* delimiter for string constant */
|
||||
bool l_toplex; /* procedures only defined at top lex level */
|
||||
const char *language = "c"; /* the language indicator */
|
||||
|
||||
#define ps(x) printf("%s", x)
|
||||
static char minus[] = "-";
|
||||
static char minusn[] = "-n";
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
const char *fname = "";
|
||||
struct stat stbuf;
|
||||
char buf[BUFSIZ];
|
||||
char *defs;
|
||||
int needbp = 0;
|
||||
|
||||
argc--, argv++;
|
||||
do {
|
||||
char *cp;
|
||||
int i;
|
||||
|
||||
if (argc > 0) {
|
||||
if (!strcmp(argv[0], "-h")) {
|
||||
if (argc == 1) {
|
||||
printf("'ds =H\n");
|
||||
argc = 0;
|
||||
goto rest;
|
||||
}
|
||||
printf("'ds =H %s\n", argv[1]);
|
||||
argc--, argv++;
|
||||
argc--, argv++;
|
||||
if (argc > 0)
|
||||
continue;
|
||||
goto rest;
|
||||
}
|
||||
|
||||
/* act as a filter like eqn */
|
||||
if (!strcmp(argv[0], "-f")) {
|
||||
filter = true;
|
||||
argv[0] = argv[argc-1];
|
||||
argv[argc-1] = minus;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* take input from the standard place */
|
||||
if (!strcmp(argv[0], "-")) {
|
||||
argc = 0;
|
||||
goto rest;
|
||||
}
|
||||
|
||||
/* build an index */
|
||||
if (!strcmp(argv[0], "-x")) {
|
||||
idx = true;
|
||||
argv[0] = minusn;
|
||||
}
|
||||
|
||||
/* indicate no keywords */
|
||||
if (!strcmp(argv[0], "-n")) {
|
||||
nokeyw = true;
|
||||
argc--, argv++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* specify the font size */
|
||||
if (!strncmp(argv[0], "-s", 2)) {
|
||||
i = 0;
|
||||
cp = argv[0] + 2;
|
||||
while (*cp)
|
||||
i = i * 10 + (*cp++ - '0');
|
||||
printf("'ps %d\n'vs %d\n", i, i+1);
|
||||
argc--, argv++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* specify the language */
|
||||
if (!strncmp(argv[0], "-l", 2)) {
|
||||
language = argv[0]+2;
|
||||
argc--, argv++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* specify the language description file */
|
||||
if (!strncmp(argv[0], "-d", 2)) {
|
||||
defsfile[0] = argv[1];
|
||||
argc--, argv++;
|
||||
argc--, argv++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* open the file for input */
|
||||
if (freopen(argv[0], "r", stdin) == NULL)
|
||||
err(1, "%s", argv[0]);
|
||||
if (idx)
|
||||
printf("'ta 4i 4.25i 5.5iR\n'in .5i\n");
|
||||
fname = argv[0];
|
||||
argc--, argv++;
|
||||
}
|
||||
rest:
|
||||
|
||||
/*
|
||||
* get the language definition from the defs file
|
||||
*/
|
||||
i = cgetent(&defs, defsfile, language);
|
||||
if (i == -1) {
|
||||
fprintf (stderr, "no entry for language %s\n", language);
|
||||
exit(0);
|
||||
} else if (i == -2) { fprintf(stderr,
|
||||
"cannot find vgrindefs file %s\n", defsfile[0]);
|
||||
exit(0);
|
||||
} else if (i == -3) { fprintf(stderr,
|
||||
"potential reference loop detected in vgrindefs file %s\n",
|
||||
defsfile[0]);
|
||||
exit(0);
|
||||
}
|
||||
if (cgetustr(defs, "kw", &cp) == -1)
|
||||
nokeyw = true;
|
||||
else {
|
||||
char **cpp;
|
||||
|
||||
cpp = l_keywds;
|
||||
while (*cp) {
|
||||
while (*cp == ' ' || *cp =='\t')
|
||||
*cp++ = '\0';
|
||||
if (*cp)
|
||||
*cpp++ = cp;
|
||||
while (*cp != ' ' && *cp != '\t' && *cp)
|
||||
cp++;
|
||||
}
|
||||
*cpp = NULL;
|
||||
}
|
||||
cgetustr(defs, "pb", &cp);
|
||||
l_prcbeg = convexp(cp);
|
||||
cgetustr(defs, "cb", &cp);
|
||||
l_combeg = convexp(cp);
|
||||
cgetustr(defs, "ce", &cp);
|
||||
l_comend = convexp(cp);
|
||||
cgetustr(defs, "ab", &cp);
|
||||
l_acmbeg = convexp(cp);
|
||||
cgetustr(defs, "ae", &cp);
|
||||
l_acmend = convexp(cp);
|
||||
cgetustr(defs, "sb", &cp);
|
||||
l_strbeg = convexp(cp);
|
||||
cgetustr(defs, "se", &cp);
|
||||
l_strend = convexp(cp);
|
||||
cgetustr(defs, "bb", &cp);
|
||||
l_blkbeg = convexp(cp);
|
||||
cgetustr(defs, "be", &cp);
|
||||
l_blkend = convexp(cp);
|
||||
cgetustr(defs, "lb", &cp);
|
||||
l_chrbeg = convexp(cp);
|
||||
cgetustr(defs, "le", &cp);
|
||||
l_chrend = convexp(cp);
|
||||
if (cgetustr(defs, "nc", &cp) >= 0)
|
||||
l_nocom = convexp(cp);
|
||||
l_escape = '\\';
|
||||
l_onecase = (cgetcap(defs, "oc", ':') != NULL);
|
||||
l_toplex = (cgetcap(defs, "tl", ':') != NULL);
|
||||
|
||||
/* initialize the program */
|
||||
|
||||
incomm = false;
|
||||
instr = false;
|
||||
inchr = false;
|
||||
_escaped = false;
|
||||
blklevel = 0;
|
||||
for (psptr=0; psptr<PSMAX; psptr++) {
|
||||
pstack[psptr][0] = '\0';
|
||||
plstack[psptr] = 0;
|
||||
}
|
||||
psptr = -1;
|
||||
ps("'-F\n");
|
||||
if (!filter) {
|
||||
printf(".ds =F %s\n", fname);
|
||||
ps("'wh 0 vH\n");
|
||||
ps("'wh -1i vF\n");
|
||||
}
|
||||
if (needbp) {
|
||||
needbp = 0;
|
||||
printf(".()\n");
|
||||
printf(".bp\n");
|
||||
}
|
||||
if (!filter) {
|
||||
fstat(fileno(stdin), &stbuf);
|
||||
cp = ctime(&stbuf.st_mtime);
|
||||
cp[16] = '\0';
|
||||
cp[24] = '\0';
|
||||
printf(".ds =M %s %s\n", cp+4, cp+20);
|
||||
}
|
||||
|
||||
/*
|
||||
* MAIN LOOP!!!
|
||||
*/
|
||||
while (fgets(buf, sizeof buf, stdin) != NULL) {
|
||||
if (buf[0] == '\f') {
|
||||
printf(".bp\n");
|
||||
}
|
||||
if (buf[0] == '.') {
|
||||
printf("%s", buf);
|
||||
if (!strncmp (buf+1, "vS", 2))
|
||||
pass = true;
|
||||
if (!strncmp (buf+1, "vE", 2))
|
||||
pass = false;
|
||||
continue;
|
||||
}
|
||||
prccont = false;
|
||||
if (!filter || pass)
|
||||
putScp(buf);
|
||||
else
|
||||
printf("%s", buf);
|
||||
if (prccont && (psptr >= 0)) {
|
||||
ps("'FC ");
|
||||
ps(pstack[psptr]);
|
||||
ps("\n");
|
||||
}
|
||||
#ifdef DEBUG
|
||||
printf ("com %o str %o chr %o ptr %d\n", incomm, instr, inchr, psptr);
|
||||
#endif
|
||||
margin = 0;
|
||||
}
|
||||
needbp = 1;
|
||||
} while (argc > 0);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#define isidchr(c) (isalnum(c) || (c) == '_')
|
||||
|
||||
static void
|
||||
putScp(char *os)
|
||||
{
|
||||
register char *s = os; /* pointer to unmatched string */
|
||||
char dummy[BUFSIZ]; /* dummy to be used by expmatch */
|
||||
char *comptr; /* end of a comment delimiter */
|
||||
char *acmptr; /* end of a comment delimiter */
|
||||
char *strptr; /* end of a string delimiter */
|
||||
char *chrptr; /* end of a character const delimiter */
|
||||
char *blksptr; /* end of a lexical block start */
|
||||
char *blkeptr; /* end of a lexical block end */
|
||||
char *nocomptr; /* end of a non-comment delimiter */
|
||||
|
||||
s_start = os; /* remember the start for expmatch */
|
||||
_escaped = false;
|
||||
if (nokeyw || incomm || instr)
|
||||
goto skip;
|
||||
if (isproc(s)) {
|
||||
ps("'FN ");
|
||||
ps(pname);
|
||||
ps("\n");
|
||||
if (psptr < PSMAX) {
|
||||
++psptr;
|
||||
strncpy (pstack[psptr], pname, PNAMELEN);
|
||||
pstack[psptr][PNAMELEN] = '\0';
|
||||
plstack[psptr] = blklevel;
|
||||
}
|
||||
}
|
||||
skip:
|
||||
do {
|
||||
/* check for string, comment, blockstart, etc */
|
||||
if (!incomm && !instr && !inchr) {
|
||||
|
||||
blkeptr = expmatch(s, l_blkend, dummy);
|
||||
blksptr = expmatch(s, l_blkbeg, dummy);
|
||||
comptr = expmatch(s, l_combeg, dummy);
|
||||
acmptr = expmatch(s, l_acmbeg, dummy);
|
||||
strptr = expmatch(s, l_strbeg, dummy);
|
||||
chrptr = expmatch(s, l_chrbeg, dummy);
|
||||
nocomptr = expmatch (s, l_nocom, dummy);
|
||||
|
||||
/* start of non-comment? */
|
||||
if (nocomptr != NULL)
|
||||
if ((nocomptr <= comptr || comptr == NULL)
|
||||
&& (nocomptr <= acmptr || acmptr == NULL)) {
|
||||
/* continue after non-comment */
|
||||
putKcp (s, nocomptr-1, false);
|
||||
s = nocomptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* start of a comment? */
|
||||
if (comptr != NULL)
|
||||
if ((comptr < strptr || strptr == NULL)
|
||||
&& (comptr < acmptr || acmptr == NULL)
|
||||
&& (comptr < chrptr || chrptr == NULL)
|
||||
&& (comptr < blksptr || blksptr == NULL)
|
||||
&& (comptr < blkeptr || blkeptr == NULL)) {
|
||||
putKcp(s, comptr-1, false);
|
||||
s = comptr;
|
||||
incomm = true;
|
||||
comtype = STANDARD;
|
||||
if (s != os)
|
||||
ps("\\c");
|
||||
ps("\\c\n'+C\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* start of a comment? */
|
||||
if (acmptr != NULL)
|
||||
if ((acmptr < strptr || strptr == NULL)
|
||||
&& (acmptr < chrptr || chrptr == NULL)
|
||||
&& (acmptr < blksptr || blksptr == NULL)
|
||||
&& (acmptr < blkeptr || blkeptr == NULL)) {
|
||||
putKcp(s, acmptr-1, false);
|
||||
s = acmptr;
|
||||
incomm = true;
|
||||
comtype = ALTERNATE;
|
||||
if (s != os)
|
||||
ps("\\c");
|
||||
ps("\\c\n'+C\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* start of a string? */
|
||||
if (strptr != NULL)
|
||||
if ((strptr < chrptr || chrptr == NULL)
|
||||
&& (strptr < blksptr || blksptr == NULL)
|
||||
&& (strptr < blkeptr || blkeptr == NULL)) {
|
||||
putKcp(s, strptr-1, false);
|
||||
s = strptr;
|
||||
instr = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* start of a character string? */
|
||||
if (chrptr != NULL)
|
||||
if ((chrptr < blksptr || blksptr == NULL)
|
||||
&& (chrptr < blkeptr || blkeptr == NULL)) {
|
||||
putKcp(s, chrptr-1, false);
|
||||
s = chrptr;
|
||||
inchr = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* end of a lexical block */
|
||||
if (blkeptr != NULL) {
|
||||
if (blkeptr < blksptr || blksptr == NULL) {
|
||||
putKcp(s, blkeptr - 1, false);
|
||||
s = blkeptr;
|
||||
if (blklevel > 0 /* sanity */)
|
||||
blklevel--;
|
||||
if (psptr >= 0 && plstack[psptr] >= blklevel) {
|
||||
|
||||
/* end of current procedure */
|
||||
if (s != os)
|
||||
ps("\\c");
|
||||
ps("\\c\n'-F\n");
|
||||
blklevel = plstack[psptr];
|
||||
|
||||
/* see if we should print the last proc name */
|
||||
if (--psptr >= 0)
|
||||
prccont = true;
|
||||
else
|
||||
psptr = -1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* start of a lexical block */
|
||||
if (blksptr != NULL) {
|
||||
putKcp(s, blksptr - 1, false);
|
||||
s = blksptr;
|
||||
blklevel++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* check for end of comment */
|
||||
} else if (incomm) {
|
||||
comptr = expmatch(s, l_comend, dummy);
|
||||
acmptr = expmatch(s, l_acmend, dummy);
|
||||
if (((comtype == STANDARD) && (comptr != NULL)) ||
|
||||
((comtype == ALTERNATE) && (acmptr != NULL))) {
|
||||
if (comtype == STANDARD) {
|
||||
putKcp(s, comptr-1, true);
|
||||
s = comptr;
|
||||
} else {
|
||||
putKcp(s, acmptr-1, true);
|
||||
s = acmptr;
|
||||
}
|
||||
incomm = false;
|
||||
ps("\\c\n'-C\n");
|
||||
continue;
|
||||
} else {
|
||||
putKcp(s, s + strlen(s) -1, true);
|
||||
s = s + strlen(s);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* check for end of string */
|
||||
} else if (instr) {
|
||||
if ((strptr = expmatch(s, l_strend, dummy)) != NULL) {
|
||||
putKcp(s, strptr-1, true);
|
||||
s = strptr;
|
||||
instr = false;
|
||||
continue;
|
||||
} else {
|
||||
putKcp(s, s+strlen(s)-1, true);
|
||||
s = s + strlen(s);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* check for end of character string */
|
||||
} else if (inchr) {
|
||||
if ((chrptr = expmatch(s, l_chrend, dummy)) != NULL) {
|
||||
putKcp(s, chrptr-1, true);
|
||||
s = chrptr;
|
||||
inchr = false;
|
||||
continue;
|
||||
} else {
|
||||
putKcp(s, s+strlen(s)-1, true);
|
||||
s = s + strlen(s);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* print out the line */
|
||||
putKcp(s, s + strlen(s) -1, false);
|
||||
s = s + strlen(s);
|
||||
} while (*s);
|
||||
}
|
||||
|
||||
/*
|
||||
* start: start of string to write
|
||||
* end: end of string to write
|
||||
* force: true if we should force nokeyw
|
||||
*/
|
||||
static void
|
||||
putKcp(char *start, char *end, bool force)
|
||||
{
|
||||
int i;
|
||||
int xfld = 0;
|
||||
|
||||
while (start <= end) {
|
||||
if (idx) {
|
||||
if (*start == ' ' || *start == '\t') {
|
||||
if (xfld == 0)
|
||||
printf("\001");
|
||||
printf("\t");
|
||||
xfld = 1;
|
||||
while (*start == ' ' || *start == '\t')
|
||||
start++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* take care of nice tab stops */
|
||||
if (*start == '\t') {
|
||||
while (*start == '\t')
|
||||
start++;
|
||||
i = tabs(s_start, start) - margin / 8;
|
||||
printf("\\h'|%dn'", i * 10 + 1 - margin % 8);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!nokeyw && !force)
|
||||
if ((*start == '#' || isidchr(*start))
|
||||
&& (start == s_start || !isidchr(start[-1]))) {
|
||||
i = iskw(start);
|
||||
if (i > 0) {
|
||||
ps("\\*(+K");
|
||||
do
|
||||
putcp((unsigned char)*start++);
|
||||
while (--i > 0);
|
||||
ps("\\*(-K");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
putcp((unsigned char)*start++);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
tabs(char *s, char *os)
|
||||
{
|
||||
|
||||
return (width(s, os) / 8);
|
||||
}
|
||||
|
||||
static int
|
||||
width(register char *s, register char *os)
|
||||
{
|
||||
register int i = 0;
|
||||
|
||||
while (s < os) {
|
||||
if (*s == '\t') {
|
||||
i = (i + 8) &~ 7;
|
||||
s++;
|
||||
continue;
|
||||
}
|
||||
if (*s < ' ')
|
||||
i += 2;
|
||||
else
|
||||
i++;
|
||||
s++;
|
||||
}
|
||||
return (i);
|
||||
}
|
||||
|
||||
static void
|
||||
putcp(register int c)
|
||||
{
|
||||
|
||||
switch(c) {
|
||||
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case '\f':
|
||||
break;
|
||||
|
||||
case '\r':
|
||||
break;
|
||||
|
||||
case '{':
|
||||
ps("\\*(+K{\\*(-K");
|
||||
break;
|
||||
|
||||
case '}':
|
||||
ps("\\*(+K}\\*(-K");
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
ps("\\e");
|
||||
break;
|
||||
|
||||
case '_':
|
||||
ps("\\*_");
|
||||
break;
|
||||
|
||||
case '-':
|
||||
ps("\\*-");
|
||||
break;
|
||||
|
||||
case '`':
|
||||
ps("\\`");
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
ps("\\'");
|
||||
break;
|
||||
|
||||
case '.':
|
||||
ps("\\&.");
|
||||
break;
|
||||
|
||||
case '*':
|
||||
ps("\\fI*\\fP");
|
||||
break;
|
||||
|
||||
case '/':
|
||||
ps("\\fI\\h'\\w' 'u-\\w'/'u'/\\fP");
|
||||
break;
|
||||
|
||||
default:
|
||||
if (c < 040)
|
||||
putchar('^'), c |= '@';
|
||||
case '\t':
|
||||
case '\n':
|
||||
putchar(c);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* look for a process beginning on this line
|
||||
*/
|
||||
static bool
|
||||
isproc(char *s)
|
||||
{
|
||||
pname[0] = '\0';
|
||||
if (!l_toplex || blklevel == 0)
|
||||
if (expmatch(s, l_prcbeg, pname) != NULL) {
|
||||
return (true);
|
||||
}
|
||||
return (false);
|
||||
}
|
||||
|
||||
|
||||
/* iskw - check to see if the next word is a keyword
|
||||
*/
|
||||
|
||||
static int
|
||||
iskw(register char *s)
|
||||
{
|
||||
register char **ss = l_keywds;
|
||||
register int i = 1;
|
||||
register char *cp = s;
|
||||
|
||||
while (++cp, isidchr(*cp))
|
||||
i++;
|
||||
while ((cp = *ss++))
|
||||
if (!STRNCMP(s,cp,i) && !isidchr(cp[i]))
|
||||
return (i);
|
||||
return (0);
|
||||
}
|
||||
@@ -1,239 +0,0 @@
|
||||
.\" Copyright (c) 1980, 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd August 29, 2006
|
||||
.Dt VGRIND 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm vgrind
|
||||
.Nd grind nice listings of programs
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl
|
||||
.Op Fl W
|
||||
.Op Fl d Ar file
|
||||
.Op Fl f
|
||||
.Op Fl h Ar header
|
||||
.Op Fl l Ns Ar language
|
||||
.Op Fl n
|
||||
.Op Fl p Ar postproc
|
||||
.Op Fl s Ar pointsize
|
||||
.Op Fl t
|
||||
.Op Fl x
|
||||
.Ar name Ar ...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility formats the program sources specified as arguments
|
||||
on the command line in a nice style using
|
||||
.Xr troff 1 Pq Pa ports/textproc/groff .
|
||||
Comments are placed in italics, keywords in bold face,
|
||||
and the name of the current function is listed down the margin of each
|
||||
page as it is encountered.
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
utility runs in two basic modes, filter mode (see the
|
||||
.Fl f
|
||||
option) or regular mode.
|
||||
In filter mode
|
||||
.Nm
|
||||
acts as a filter in a manner similar to
|
||||
.Xr tbl 1 .
|
||||
The standard input is passed directly to the standard output except
|
||||
for lines bracketed by the
|
||||
.Em troff-like
|
||||
macros:
|
||||
.Bl -tag -width Ds
|
||||
.It \&.vS
|
||||
starts processing
|
||||
.It \&.vE
|
||||
ends processing
|
||||
.El
|
||||
.Pp
|
||||
These lines are formatted as described above.
|
||||
The output from this
|
||||
filter can be passed to
|
||||
.Xr troff 1 Pq Pa ports/textproc/groff
|
||||
for output.
|
||||
There need be no particular ordering with
|
||||
.Xr eqn 1 Pq Pa ports/textproc/groff
|
||||
or
|
||||
.Xr tbl 1 Pq Pa ports/textproc/groff .
|
||||
.Pp
|
||||
In regular mode
|
||||
.Nm
|
||||
accepts input files, processes them, and passes them to the postprocessor
|
||||
for output,
|
||||
.Xr psroff 1
|
||||
by default.
|
||||
.Pp
|
||||
In both modes
|
||||
.Nm
|
||||
passes any lines beginning with a decimal point without conversion.
|
||||
.Pp
|
||||
The options are:
|
||||
.Bl -tag -width Ar
|
||||
.It Fl
|
||||
forces input to be taken from standard input (default if
|
||||
.Fl f
|
||||
is specified)
|
||||
.It Fl W
|
||||
forces output to the (wide) Versatec printer rather than the (narrow)
|
||||
Varian
|
||||
.It Fl d Ar file
|
||||
specifies an alternate language definitions
|
||||
file (default is
|
||||
.Pa /usr/share/misc/vgrindefs )
|
||||
.It Fl f
|
||||
forces filter mode
|
||||
.It Fl h Ar header
|
||||
specifies a particular header to put on every output page (default is
|
||||
the file name)
|
||||
.It Fl l
|
||||
specifies the language to use.
|
||||
Currently known are
|
||||
.Tn PASCAL
|
||||
.Pq Fl l Ns Ar p ,
|
||||
.Tn MODEL
|
||||
.Pq Fl l Ns Ar m ,
|
||||
C
|
||||
.Pf ( Fl l Ns Ar c
|
||||
or the default),
|
||||
.Tn C++
|
||||
.Pq Fl l Ns Ar c++ ,
|
||||
.Tn CSH
|
||||
.Pq Fl l Ns Ar csh ,
|
||||
.Tn SHELL
|
||||
.Pq Fl l Ns Ar sh ,
|
||||
.Tn RATFOR
|
||||
.Pq Fl l Ns Ar r ,
|
||||
.Tn MODULA2
|
||||
.Pq Fl l Ns Ar mod2 ,
|
||||
.Tn YACC
|
||||
.Pq Fl l Ns Ar yacc ,
|
||||
.Tn LISP
|
||||
.Pq Fl l Ns Ar isp ,
|
||||
.Tn ICON
|
||||
.Pq Fl l Ns Ar I ,
|
||||
and
|
||||
.Tn PERL
|
||||
.Pq Fl l Ns Ar perl .
|
||||
.It Fl n
|
||||
forces no keyword bolding
|
||||
.It Fl p Ar postproc
|
||||
use
|
||||
.Ar postproc
|
||||
to post-process the output,
|
||||
.Xr psroff 1
|
||||
by default.
|
||||
.It Fl s Ar pointsize
|
||||
specifies a point size to use on output (exactly the same as the argument
|
||||
of a .ps)
|
||||
.It Fl t
|
||||
similar to the same option in
|
||||
.Xr troff 1 Pq Pa ports/textproc/groff
|
||||
causing formatted text to go to the standard output
|
||||
.It Fl x
|
||||
outputs the index file in a ``pretty'' format.
|
||||
The index file itself is produced whenever
|
||||
.Nm
|
||||
is run with a file called
|
||||
.Pa index
|
||||
in the current directory.
|
||||
The index of function
|
||||
definitions can then be run off by giving
|
||||
.Nm
|
||||
the
|
||||
.Fl x
|
||||
option and the file
|
||||
.Pa index
|
||||
as argument.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width /usr/share/misc/vgrindefsxx -compact
|
||||
.It Pa index
|
||||
file where source for index is created
|
||||
.It Pa /usr/share/tmac/tmac.vgrind
|
||||
macro package
|
||||
.It Pa /usr/libexec/vfontedpr
|
||||
preprocessor
|
||||
.It Pa /usr/share/misc/vgrindefs
|
||||
language descriptions
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr getcap 3 ,
|
||||
.Xr vgrindefs 5
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
command appeared in
|
||||
.Bx 3.0 .
|
||||
.Sh BUGS
|
||||
The vfontedpr preprocessor assumes that a certain programming style is
|
||||
followed:
|
||||
.Pp
|
||||
For
|
||||
.Tn C
|
||||
\- function names can be preceded on a line only by spaces, tabs, or an
|
||||
asterisk.
|
||||
The parenthesized arguments must also be on the same line.
|
||||
.Pp
|
||||
For
|
||||
.Tn PASCAL
|
||||
\- function names need to appear on the same line as the keywords
|
||||
.Em function
|
||||
or
|
||||
.Em procedure .
|
||||
.Pp
|
||||
For
|
||||
.Tn MODEL
|
||||
\- function names need to appear on the same line as the keywords
|
||||
.Em is beginproc .
|
||||
.Pp
|
||||
If these conventions are not followed, the indexing and marginal function
|
||||
name comment mechanisms will fail.
|
||||
.Pp
|
||||
More generally, arbitrary formatting styles for programs mostly look bad.
|
||||
The use of spaces to align source code fails miserably; if you plan to
|
||||
.Nm
|
||||
your program you should use tabs.
|
||||
This is somewhat inevitable since the
|
||||
font used by
|
||||
.Nm
|
||||
is variable width.
|
||||
.Pp
|
||||
The mechanism of
|
||||
.Xr ctags 1
|
||||
in recognizing functions should be used here.
|
||||
.Pp
|
||||
Filter mode does not work in documents using the
|
||||
.Fl me
|
||||
or
|
||||
.Fl ms
|
||||
macros.
|
||||
(So what use is it anyway?)
|
||||
@@ -1,128 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#
|
||||
# Copyright (c) 1980, 1993
|
||||
# The Regents of the University of California. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the University nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
|
||||
voptions=""
|
||||
options=""
|
||||
files=""
|
||||
f=""
|
||||
head=""
|
||||
vf="/usr/libexec/vfontedpr"
|
||||
tm="/usr/share/tmac"
|
||||
postproc="psroff"
|
||||
|
||||
# Parse args
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
-f)
|
||||
f="filter"
|
||||
options="$options -f"
|
||||
;;
|
||||
-t)
|
||||
voptions="$voptions -t"
|
||||
;;
|
||||
-o*)
|
||||
voptions="$voptions $1"
|
||||
;;
|
||||
-W)
|
||||
voptions="$voptions -W"
|
||||
;;
|
||||
-d)
|
||||
if test $# -lt 2; then
|
||||
echo "$0: option $1 must have argument" >&2
|
||||
exit 1
|
||||
fi
|
||||
options="$options $1 $2"
|
||||
shift
|
||||
;;
|
||||
-h)
|
||||
if test $# -lt 2; then
|
||||
echo "$0: option $1 must have argument" >&2
|
||||
exit 1
|
||||
fi
|
||||
head="$2"
|
||||
shift
|
||||
;;
|
||||
-p)
|
||||
if test $# -lt 2; then
|
||||
echo "$0: option $1 must have argument" >&2
|
||||
exit 1
|
||||
fi
|
||||
postproc="$2"
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
options="$options $1"
|
||||
;;
|
||||
*)
|
||||
files="$files $1"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test -r index; then
|
||||
echo > nindex
|
||||
for i in $files; do
|
||||
# make up a sed delete command for filenames
|
||||
# being careful about slashes.
|
||||
echo "? $i ?d" | sed -e "s:/:\\/:g" -e "s:?:/:g" >> nindex
|
||||
done
|
||||
sed -f nindex index > xindex
|
||||
if test "x$f" = xfilter; then
|
||||
if test "x$head" != x; then
|
||||
$vf $options -h "$head" $files
|
||||
else
|
||||
$vf $options $files
|
||||
fi | cat $tm/tmac.vgrind -
|
||||
else
|
||||
if test "x$head" != x; then
|
||||
$vf $options -h "$head" $files
|
||||
else
|
||||
$vf $options $files
|
||||
fi | sh -c "$postproc -rx1 $voptions -i -mvgrind 2>> xindex"
|
||||
fi
|
||||
sort -df -k 1,2 xindex > index
|
||||
rm nindex xindex
|
||||
else
|
||||
if test "x$f" = xfilter; then
|
||||
if test "x$head" != x; then
|
||||
$vf $options -h "$head" $files
|
||||
else
|
||||
$vf $options $files
|
||||
fi | cat $tm/tmac.vgrind -
|
||||
else
|
||||
if test "x$head" != x; then
|
||||
$vf $options -h "$head" $files
|
||||
else
|
||||
$vf $options $files
|
||||
fi | $postproc -i $voptions -mvgrind
|
||||
fi
|
||||
fi
|
||||
@@ -1,167 +0,0 @@
|
||||
.\" Copyright (c) 1989, 1991, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd June 6, 1993
|
||||
.Dt VGRINDEFS 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm vgrindefs
|
||||
.Nd language definition data base for
|
||||
.Xr vgrind 1
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
file
|
||||
contains all language definitions for
|
||||
.Xr vgrind 1 .
|
||||
The data base is
|
||||
very similar to
|
||||
.Xr termcap 5 .
|
||||
.Sh FIELDS
|
||||
The following table names and describes each field.
|
||||
.Bl -column Namexxx Tpexxx
|
||||
.It Sy "Name Type Description"
|
||||
.It "ab str regular expression for the start of an alternate comment"
|
||||
.It "ae str regular expression for the end of an alternate comment"
|
||||
.It "pb str regular expression for start of a procedure"
|
||||
.It "bb str regular expression for start of a lexical block"
|
||||
.It "be str regular expression for the end of a lexical block"
|
||||
.It "cb str regular expression for the start of a comment"
|
||||
.It "ce str regular expression for the end of a comment"
|
||||
.It "sb str regular expression for the start of a string"
|
||||
.It "se str regular expression for the end of a string"
|
||||
.It "lb str regular expression for the start of a character constant"
|
||||
.It "le str regular expression for the end of a character constant"
|
||||
.It "nc str regular expression for a non-comment (see below)"
|
||||
.It "tl bool present means procedures are only defined at the top lexical level"
|
||||
.It "oc bool present means upper and lower case are equivalent"
|
||||
.It "kw str a list of keywords separated by spaces"
|
||||
.El
|
||||
.Pp
|
||||
Non-comments are required to describe a certain context where a
|
||||
sequence that would normally start a comment loses its special
|
||||
meaning.
|
||||
A typical example for this can be found in Perl, where
|
||||
comments are normally starting with
|
||||
.Ql # ,
|
||||
while the string
|
||||
.Ql $#
|
||||
is an operator on an array.
|
||||
.Sh REGULAR EXPRESSIONS
|
||||
.Nm Vgrindefs
|
||||
uses regular expression which are very similar to those of
|
||||
.Xr ex 1
|
||||
and
|
||||
.Xr lex 1 .
|
||||
The characters `^', `$', `:' and `\e'
|
||||
are reserved characters and must be
|
||||
"quoted" with a preceding
|
||||
.Ql \e
|
||||
if they
|
||||
are to be included as normal characters.
|
||||
The metasymbols and their meanings are:
|
||||
.Bl -tag -width indent
|
||||
.It $
|
||||
the end of a line
|
||||
.It \&^
|
||||
the beginning of a line
|
||||
.It \ed
|
||||
a delimiter (space, tab, newline, start of line)
|
||||
.It \ea
|
||||
matches any string of symbols (like .* in lex)
|
||||
.It \ep
|
||||
matches any alphanumeric name.
|
||||
In a procedure definition (pb) the string
|
||||
that matches this symbol is used as the procedure name.
|
||||
.It ()
|
||||
grouping
|
||||
.It \&|
|
||||
alternation
|
||||
.It ?
|
||||
last item is optional
|
||||
.It \ee
|
||||
preceding any string means that the string will not match an
|
||||
input string if the input string is preceded by an escape character (\e).
|
||||
This is typically used for languages (like C) which can include the
|
||||
string delimiter in a string by escaping it.
|
||||
.El
|
||||
.Pp
|
||||
Unlike other regular expressions in the system, these match words
|
||||
and not characters.
|
||||
Hence something like "(tramp|steamer)flies?"
|
||||
would match "tramp", "steamer", "trampflies", or "steamerflies".
|
||||
.Sh KEYWORD LIST
|
||||
The keyword list is just a list of keywords in the language separated
|
||||
by spaces.
|
||||
If the "oc" boolean is specified, indicating that upper
|
||||
and lower case are equivalent, then all the keywords should be
|
||||
specified in lower case.
|
||||
.Sh FILES
|
||||
.Bl -tag -width /usr/share/misc/vgrindefs -compact
|
||||
.It Pa /usr/share/misc/vgrindefs
|
||||
File containing terminal descriptions.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
The following entry, which describes the C language, is
|
||||
typical of a language entry.
|
||||
.Bd -literal
|
||||
C|c:\
|
||||
:pb=^\ed?*?\ed?\ep\ed?\e(\ea?\e):bb={:be=}:cb=/*:ce=*/:sb=":se=\ee":\e
|
||||
:lb=':le=\ee':tl:\e
|
||||
:kw=asm auto break case char continue default do double else enum\e
|
||||
extern float for fortran goto if int long register return short\e
|
||||
sizeof static struct switch typedef union unsigned while #define\e
|
||||
#else #endif #if #ifdef #ifndef #include #undef # define else endif\e
|
||||
if ifdef ifndef include undef:
|
||||
.Ed
|
||||
.Pp
|
||||
Note that the first field is just the language name (and any variants
|
||||
of it).
|
||||
Thus the C language could be specified to
|
||||
.Xr vgrind 1
|
||||
as "c" or "C".
|
||||
.Pp
|
||||
Entries may continue onto multiple lines by giving a \e as the last
|
||||
character of a line.
|
||||
Capabilities in
|
||||
.Nm
|
||||
are of two types:
|
||||
Boolean capabilities which indicate that the language has
|
||||
some particular feature
|
||||
and string
|
||||
capabilities which give a regular expression or
|
||||
keyword list.
|
||||
.Sh SEE ALSO
|
||||
.Xr troff 1 Pq Pa ports/textproc/groff ,
|
||||
.Xr vgrind 1
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
file format appeared in
|
||||
.Bx 4.2 .
|
||||
@@ -1,153 +0,0 @@
|
||||
# Copyright (c) 1987, 1993
|
||||
# The Regents of the University of California. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the University nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
#
|
||||
|
||||
C|c:\
|
||||
:pb=^\a?\d?*?\d?\p\d?\(\a?\)(\d|{):\
|
||||
:bb={:be=}:cb=/*:ce=*/:sb=":se=\e":lb=':\
|
||||
:le=\e':tl:\
|
||||
:kw=asm auto break case char continue default do double else enum\
|
||||
extern float for fortran goto if int long register return short\
|
||||
sizeof static struct switch typedef union unsigned void while #define\
|
||||
#else #endif #if #ifdef #ifndef #include #undef # define else endif\
|
||||
if ifdef ifndef include undef:
|
||||
model|mod|m:\
|
||||
:pb=^\d(space\d\p\drep)|(\p\dis|inline|public\dbeginproc):\
|
||||
:bb=\dbeginproc|space|case\d:be=\dendproc|end\d|;:\
|
||||
:cb=\$:ce=\$|$:sb=":se=":lb=':le=\a|$:\
|
||||
:kw=abs and array beginproc boolean by case cdnl char copied dispose\
|
||||
div do dynamic else elsif end endproc entry external FALSE false\
|
||||
fi file for formal fortran global if iff ift\
|
||||
in integer include inline is lbnd\
|
||||
max min mod new NIL nil noresult not notin od of or procedure public\
|
||||
read readln readonly record recursive rem rep repeat res\
|
||||
result return set\
|
||||
space string subscript such then TRUE true type ubnd union until\
|
||||
varies while width:
|
||||
pascal|pasc|p:\
|
||||
:pb=(^\d?procedure|function|program\d\p\d|\(|;|\:)|(=\d?record\d):\
|
||||
:bb=\dcase|begin\d:be=\dend|forward\d|;:\
|
||||
:cb={:ce=}:\
|
||||
:ab=\(*:ae=*\):\
|
||||
:sb=':se=':\
|
||||
:kw=and array assert begin case const div do downto else end file for\
|
||||
forward function goto if in label mod nil not of or packed procedure\
|
||||
program record repeat set then to type until var while with oct hex\
|
||||
external:
|
||||
ISP|isp|i:\
|
||||
:cb=!:ce=!|$:oc:\
|
||||
:kw=and begin decode define end eql eqv geq gtr if leave leq lss mod\
|
||||
neq next not or otherwise repeat restart resume sr0 sr1 srd srr sl0 sl1\
|
||||
sld slr tst xor:
|
||||
SH|sh:\
|
||||
:bb={:be=}:cb=#:ce=$:sb=":se=\e":lb=':\
|
||||
:le=\e':tl:\
|
||||
:kw=break case cd continue do done \
|
||||
elif else esac eval exec exit export \
|
||||
fi for if in then while until \
|
||||
read readonly set shift test trap umask wait:
|
||||
CSH|csh:\
|
||||
:bb={:be=}:cb=#:ce=$:sb=":se=\e":lb=':\
|
||||
:le=\e':tl:\
|
||||
:kw=alias alloc break breaksw case cd chdir continue default\
|
||||
echo else end endif endsw exec exit foreach \
|
||||
glob goto history if logout nice nohup onintr repeat set\
|
||||
setenv shift source switch then time \
|
||||
while umask unalias unset wait while @ env \
|
||||
argv child home ignoreeof noclobber noglob \
|
||||
nomatch path prompt shell status verbose :
|
||||
ldl|LDL:\
|
||||
:pb=^\p\::bb=\::be=;:cb=/*:ce=*/:sb=":se=\e":\
|
||||
:kw=constant functions grammar reswords tokens add1 addste\
|
||||
car cdr check colno cond cons copy defun divide empty enter\
|
||||
eq equal findattr firstchild ge getattr getfield gt hash label\
|
||||
lambda lastchild le leftsibling lookone lookup lt minus name ne\
|
||||
newnode nextcom nil null parent plus precnl prevcom prog progn\
|
||||
quote reglob return rightsibling self set setattr setfield setq\
|
||||
stjoin sub1 t times tnull tokno ttype:
|
||||
Icon|icon|I:\
|
||||
:pb=^\d?procedure\d\p\d?\(\a?\):\
|
||||
:bb=(^\d?procedure\d\p\d?\(\a?\))|{:be=}|(^\d?end\d?$):\
|
||||
:cb=#:ce=$:\
|
||||
:sb=":se=\e":lb=':le=\e':tl:\
|
||||
:kw=break by case create default do dynamic else end every external\
|
||||
fail global if initial local next not of procedure record\
|
||||
repeat return static suspend then to until using while\
|
||||
&ascii &clock &cset &date &dateline &errout &fail &host &input\
|
||||
&lcase &level &main &null &output &pos &random &source &subject\
|
||||
&time &trace &ucase &version:
|
||||
ratfor|rat|r:\
|
||||
:pb=(subroutine|function)\d\p\d?\(\a?\):\
|
||||
:bb=(subroutine|function)\d\p\d?\(\a?\):be=^\d?end:\
|
||||
:cb=#:ce=$:\
|
||||
:sb=":se=\e":lb=':le=\e':oc:\
|
||||
:kw=DRETURN DRIVER arith break case character default define do\
|
||||
else elsedef enddef filedes for function goto if ifdef ifelse\
|
||||
ifnotdef include incr integer linepointer next opeq pointer\
|
||||
real repeat return select string subroutine substr until:
|
||||
modula2|mod2|m2:\
|
||||
:pb=(^\d?(procedure|function|module)\d\p\d|\(|;|\:):\
|
||||
:bb=\d(begin|case|for|if|loop|record|repeat|while|with)\d:\
|
||||
:be=\dend|;:\
|
||||
:cb={:ce=}:\
|
||||
:ab=\(*:ae=*\):\
|
||||
:sb=":se=":\
|
||||
:oc:\
|
||||
:kw=and array begin by case const\
|
||||
definition div do else elsif end exit export\
|
||||
for from if implementation import in\
|
||||
loop mod module not of or pointer procedure qualified\
|
||||
record repeat return set then to type\
|
||||
until var while with:
|
||||
yacc|Yacc|y:\
|
||||
:cb=/*:ce=*/:sb=":se=\e":lb=':le=\e':tl:\
|
||||
:kw=%{ %} %% %union %token %type\
|
||||
#else #endif #if #ifdef #ifndef #include #undef # define else endif\
|
||||
if ifdef ifndef include undef:
|
||||
C++|c++:\
|
||||
:pb=^\a?\d?*?\d?\p\d?\(\a?\)(\d|{):\
|
||||
:bb={:be=}:cb=/*:ce=*/:ab=//:\
|
||||
:ae=$:sb=":se=\e":lb=':\
|
||||
:le=\e':tl:\
|
||||
:kw=asm auto break case char continue default do double else enum\
|
||||
extern float for fortran goto if int long register return short\
|
||||
sizeof static struct switch typedef union unsigned while void #define\
|
||||
#else #endif #if #ifdef #ifndef #include #undef # define endif\
|
||||
ifdef ifndef include undef defined\
|
||||
class const delete friend inline new operator overload private\
|
||||
protected public virtual:
|
||||
#
|
||||
# Hack alert: defining function calls as `alternate comments' (ab/ae) seems
|
||||
# to be the only way to avoid major confusion inside vfontedpr for calls like:
|
||||
# &packagename'function;
|
||||
#
|
||||
Perl|perl|pl:\
|
||||
:pb=sub\d\p\d:bb={:be=}:cb=#:ce=$:nc=\$#:tl:\
|
||||
:ab=&:ae=(;|\d|,):\
|
||||
:sb=":se=(\e"|$):lb=':le=(\e'|$):\
|
||||
:kw=do if unless while until else elsif for foreach continue\
|
||||
next redo sub last goto return die exit require:
|
||||
@@ -49,7 +49,7 @@ progs renice rev rlogin rpcgen rpcinfo rsh rup ruptime rusers rwall rwho
|
||||
progs script sed showmount size soelim split strings strip su tail talk
|
||||
progs tcopy tee telnet tftp time tip tn3270 touch tput tr true tset tsort
|
||||
progs tty ul uname unexpand unifdef uniq units unvis users uudecode uuencode
|
||||
progs vacation vgrind vi vis vmstat w wall wc what whatis whereis who
|
||||
progs vacation vi vis vmstat w wall wc what whatis whereis who
|
||||
progs whois window write xargs xinstall xstr yacc yes ypcat ypmatch ypwhich
|
||||
|
||||
# shell scripts: lorder mkdep which
|
||||
|
||||
Reference in new issue
Block a user