[Midnightbsd-cvs] src [12057] trunk/usr.bin: add vgrind

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Thu Sep 20 09:28:23 EDT 2018


Revision: 12057
          http://svnweb.midnightbsd.org/src/?rev=12057
Author:   laffer1
Date:     2018-09-20 09:28:22 -0400 (Thu, 20 Sep 2018)
Log Message:
-----------
add vgrind

Modified Paths:
--------------
    trunk/usr.bin/Makefile

Added Paths:
-----------
    trunk/usr.bin/vgrind/
    trunk/usr.bin/vgrind/Makefile
    trunk/usr.bin/vgrind/Makefile.depend
    trunk/usr.bin/vgrind/extern.h
    trunk/usr.bin/vgrind/pathnames.h
    trunk/usr.bin/vgrind/regexp.c
    trunk/usr.bin/vgrind/tmac.vgrind
    trunk/usr.bin/vgrind/vfontedpr.c
    trunk/usr.bin/vgrind/vgrind.1
    trunk/usr.bin/vgrind/vgrind.sh
    trunk/usr.bin/vgrind/vgrindefs.5
    trunk/usr.bin/vgrind/vgrindefs.src

Modified: trunk/usr.bin/Makefile
===================================================================
--- trunk/usr.bin/Makefile	2018-09-19 12:54:03 UTC (rev 12056)
+++ trunk/usr.bin/Makefile	2018-09-20 13:28:22 UTC (rev 12057)
@@ -192,6 +192,7 @@
 	unvis \
 	uudecode \
 	uuencode \
+	vgrind \
 	vi \
 	vis \
 	vmstat \

Added: trunk/usr.bin/vgrind/Makefile
===================================================================
--- trunk/usr.bin/vgrind/Makefile	                        (rev 0)
+++ trunk/usr.bin/vgrind/Makefile	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,26 @@
+#	@(#)Makefile	8.1 (Berkeley) 6/9/93
+# $MidnightBSD$
+
+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>
+
+vgrindefs.src.db: vgrindefs.src
+	cap_mkdb ${CAP_MKDB_ENDIAN} -f vgrindefs.src ${.ALLSRC}
+
+.include <bsd.prog.mk>


Property changes on: trunk/usr.bin/vgrind/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/Makefile.depend
===================================================================
--- trunk/usr.bin/vgrind/Makefile.depend	                        (rev 0)
+++ trunk/usr.bin/vgrind/Makefile.depend	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,17 @@
+# $MidnightBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+	gnu/lib/csu \
+	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


Property changes on: trunk/usr.bin/vgrind/Makefile.depend
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/extern.h
===================================================================
--- trunk/usr.bin/vgrind/extern.h	                        (rev 0)
+++ trunk/usr.bin/vgrind/extern.h	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,62 @@
+/*-
+ * 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.h	8.1 (Berkeley) 6/6/93
+ * $MidnightBSD$
+ */
+
+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
+


Property changes on: trunk/usr.bin/vgrind/extern.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/pathnames.h
===================================================================
--- trunk/usr.bin/vgrind/pathnames.h	                        (rev 0)
+++ trunk/usr.bin/vgrind/pathnames.h	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,36 @@
+/*-
+ * 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.
+ *
+ * $MidnightBSD$
+ *
+ *	@(#)pathnames.h	8.1 (Berkeley) 6/6/93
+ */
+
+#define	_PATH_VGRINDEFS	"/usr/share/misc/vgrindefs"


Property changes on: trunk/usr.bin/vgrind/pathnames.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/regexp.c
===================================================================
--- trunk/usr.bin/vgrind/regexp.c	                        (rev 0)
+++ trunk/usr.bin/vgrind/regexp.c	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,598 @@
+/*-
+ * 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/cdefs.h>
+
+__FBSDID("$MidnightBSD$");
+
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1980, 1993\n\
+	The Regents of the University of California.  All rights reserved.\n";
+#endif
+
+#ifndef lint
+static const char sccsid[] = "@(#)regexp.c	8.1 (Berkeley) 6/6/93";
+#endif
+
+#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);
+}


Property changes on: trunk/usr.bin/vgrind/regexp.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/tmac.vgrind
===================================================================
--- trunk/usr.bin/vgrind/tmac.vgrind	                        (rev 0)
+++ trunk/usr.bin/vgrind/tmac.vgrind	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,72 @@
+.\" $MidnightBSD$
+.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


Property changes on: trunk/usr.bin/vgrind/tmac.vgrind
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: trunk/usr.bin/vgrind/vfontedpr.c
===================================================================
--- trunk/usr.bin/vgrind/vfontedpr.c	                        (rev 0)
+++ trunk/usr.bin/vgrind/vfontedpr.c	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,718 @@
+/*-
+ * 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/cdefs.h>
+
+__FBSDID("$MidnightBSD$");
+
+#ifndef lint
+static const char copyright[] =
+"@(#) Copyright (c) 1980, 1993\n\
+	The Regents of the University of California.  All rights reserved.\n";
+#endif
+
+#ifndef lint
+static const char sccsid[] = "@(#)vfontedpr.c	8.1 (Berkeley) 6/6/93";
+#endif
+
+#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);
+}


Property changes on: trunk/usr.bin/vgrind/vfontedpr.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/vgrind.1
===================================================================
--- trunk/usr.bin/vgrind/vgrind.1	                        (rev 0)
+++ trunk/usr.bin/vgrind/vgrind.1	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,242 @@
+.\" 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.
+.\"
+.\"     @(#)vgrind.1	8.1 (Berkeley) 6/6/93
+.\" $MidnightBSD$
+.\"
+.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 .
+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
+for output.
+There need be no particular ordering with
+.Xr eqn 1
+or
+.Xr tbl 1 .
+.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
+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?)


Property changes on: trunk/usr.bin/vgrind/vgrind.1
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/vgrind.sh
===================================================================
--- trunk/usr.bin/vgrind/vgrind.sh	                        (rev 0)
+++ trunk/usr.bin/vgrind/vgrind.sh	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,133 @@
+#!/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.
+#
+#       @(#)vgrind.sh	8.1 (Berkeley) 6/6/93
+#
+# $MidnightBSD$
+#
+
+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


Property changes on: trunk/usr.bin/vgrind/vgrind.sh
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/vgrindefs.5
===================================================================
--- trunk/usr.bin/vgrind/vgrindefs.5	                        (rev 0)
+++ trunk/usr.bin/vgrind/vgrindefs.5	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,170 @@
+.\" 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.
+.\"
+.\"     @(#)vgrindefs.5	8.1 (Berkeley) 6/6/93
+.\" $MidnightBSD$
+.\"
+.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 ,
+.Xr vgrind 1
+.Sh HISTORY
+The
+.Nm
+file format appeared in
+.Bx 4.2 .


Property changes on: trunk/usr.bin/vgrind/vgrindefs.5
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/vgrind/vgrindefs.src
===================================================================
--- trunk/usr.bin/vgrind/vgrindefs.src	                        (rev 0)
+++ trunk/usr.bin/vgrind/vgrindefs.src	2018-09-20 13:28:22 UTC (rev 12057)
@@ -0,0 +1,157 @@
+# 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.
+#
+# $MidnightBSD$
+#
+#	@(#)vgrindefs.src	8.1 (Berkeley) 6/6/93
+#
+
+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:


Property changes on: trunk/usr.bin/vgrind/vgrindefs.src
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property


More information about the Midnightbsd-cvs mailing list