xref: /freebsd/usr.bin/vgrind/vfontedpr.c (revision 0b8224d1)
18a16b7a1SPedro F. Giffuni /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
49b50d902SRodney W. Grimes  * Copyright (c) 1980, 1993
59b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
69b50d902SRodney W. Grimes  *
79b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
89b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
99b50d902SRodney W. Grimes  * are met:
109b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
129b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
139b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
149b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
169b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
179b50d902SRodney W. Grimes  *    without specific prior written permission.
189b50d902SRodney W. Grimes  *
199b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
209b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
239b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299b50d902SRodney W. Grimes  * SUCH DAMAGE.
309b50d902SRodney W. Grimes  */
319b50d902SRodney W. Grimes 
329b50d902SRodney W. Grimes #include <sys/types.h>
339b50d902SRodney W. Grimes #include <sys/stat.h>
349b50d902SRodney W. Grimes #include <ctype.h>
353e7ae69fSPhilippe Charnier #include <err.h>
363e7ae69fSPhilippe Charnier #include <stdio.h>
379b50d902SRodney W. Grimes #include <stdlib.h>
38179646ccSBaptiste Daroussin #include <stdbool.h>
399b50d902SRodney W. Grimes #include <string.h>
403e7ae69fSPhilippe Charnier #include <time.h>
419b50d902SRodney W. Grimes #include "pathnames.h"
429b50d902SRodney W. Grimes #include "extern.h"
439b50d902SRodney W. Grimes 
449b50d902SRodney W. Grimes #define STANDARD 0
459b50d902SRodney W. Grimes #define ALTERNATE 1
469b50d902SRodney W. Grimes 
479b50d902SRodney W. Grimes /*
489b50d902SRodney W. Grimes  * Vfontedpr.
499b50d902SRodney W. Grimes  *
509b50d902SRodney W. Grimes  * Dave Presotto 1/12/81 (adapted from an earlier version by Bill Joy)
519b50d902SRodney W. Grimes  *
529b50d902SRodney W. Grimes  */
539b50d902SRodney W. Grimes 
549b50d902SRodney W. Grimes #define STRLEN 10		/* length of strings introducing things */
559b50d902SRodney W. Grimes #define PNAMELEN 40		/* length of a function/procedure name */
569b50d902SRodney W. Grimes #define PSMAX 20		/* size of procedure name stacking */
579b50d902SRodney W. Grimes 
583f330d7dSWarner Losh static int       iskw(char *);
59179646ccSBaptiste Daroussin static bool      isproc(char *);
60179646ccSBaptiste Daroussin static void      putKcp(char *, char *, bool);
613f330d7dSWarner Losh static void      putScp(char *);
623f330d7dSWarner Losh static void      putcp(int);
633f330d7dSWarner Losh static int       tabs(char *, char *);
643f330d7dSWarner Losh static int       width(char *, char *);
659b50d902SRodney W. Grimes 
669b50d902SRodney W. Grimes /*
679b50d902SRodney W. Grimes  *	The state variables
689b50d902SRodney W. Grimes  */
699b50d902SRodney W. Grimes 
70179646ccSBaptiste Daroussin static bool	filter = false;	/* act as a filter (like eqn) */
71179646ccSBaptiste Daroussin static bool	inchr;		/* in a string constant */
72179646ccSBaptiste Daroussin static bool	incomm;		/* in a comment of the primary type */
73179646ccSBaptiste Daroussin static bool	idx = false;	/* form an index */
74179646ccSBaptiste Daroussin static bool	instr;		/* in a string constant */
75179646ccSBaptiste Daroussin static bool	nokeyw = false;	/* no keywords being flagged */
76179646ccSBaptiste Daroussin static bool	pass = false;	/*
779b50d902SRodney W. Grimes 				 * when acting as a filter, pass indicates
789b50d902SRodney W. Grimes 				 * whether we are currently processing
799b50d902SRodney W. Grimes 				 * input.
809b50d902SRodney W. Grimes 				 */
819b50d902SRodney W. Grimes 
829b50d902SRodney W. Grimes static int	blklevel;	/* current nesting level */
839b50d902SRodney W. Grimes static int	comtype;	/* type of comment */
84d75a18e3SPeter Wemm static char *	defsfile[2] = { _PATH_VGRINDEFS, 0 };
859b50d902SRodney W. Grimes 				/* name of language definitions file */
869b50d902SRodney W. Grimes static int	margin;
879b50d902SRodney W. Grimes static int	plstack[PSMAX];	/* the procedure nesting level stack */
889b50d902SRodney W. Grimes static char	pname[BUFSIZ+1];
89179646ccSBaptiste Daroussin static bool  prccont;	/* continue last procedure */
909b50d902SRodney W. Grimes static int	psptr;		/* the stack index of the current procedure */
919b50d902SRodney W. Grimes static char	pstack[PSMAX][PNAMELEN+1];	/* the procedure name stack */
929b50d902SRodney W. Grimes 
939b50d902SRodney W. Grimes /*
949b50d902SRodney W. Grimes  *	The language specific globals
959b50d902SRodney W. Grimes  */
969b50d902SRodney W. Grimes 
979b50d902SRodney W. Grimes char	*l_acmbeg;		/* string introducing a comment */
989b50d902SRodney W. Grimes char	*l_acmend;		/* string ending a comment */
99487ac9acSUlrich Spörlein char	*l_blkbeg;		/* string beginning of a block */
1009b50d902SRodney W. Grimes char	*l_blkend;		/* string ending a block */
1019b50d902SRodney W. Grimes char    *l_chrbeg;		/* delimiter for character constant */
1029b50d902SRodney W. Grimes char    *l_chrend;		/* delimiter for character constant */
1039b50d902SRodney W. Grimes char	*l_combeg;		/* string introducing a comment */
1049b50d902SRodney W. Grimes char	*l_comend;		/* string ending a comment */
1059b50d902SRodney W. Grimes char	 l_escape;		/* character used to  escape characters */
1069b50d902SRodney W. Grimes char	*l_keywds[BUFSIZ/2];	/* keyword table address */
10728445a63SJoerg Wunsch char	*l_nocom;		/* regexp for non-comments */
1089b50d902SRodney W. Grimes char	*l_prcbeg;		/* regular expr for procedure begin */
1099b50d902SRodney W. Grimes char    *l_strbeg;		/* delimiter for string constant */
1109b50d902SRodney W. Grimes char    *l_strend;		/* delimiter for string constant */
111179646ccSBaptiste Daroussin bool	 l_toplex;		/* procedures only defined at top lex level */
112573560d5SMark Murray const char *language = "c";	/* the language indicator */
1139b50d902SRodney W. Grimes 
1149b50d902SRodney W. Grimes #define	ps(x)	printf("%s", x)
115224c8257SBaptiste Daroussin static char minus[] = "-";
116224c8257SBaptiste Daroussin static char minusn[] = "-n";
1179b50d902SRodney W. Grimes 
11801492790SPhilippe Charnier int
main(int argc,char ** argv)119c78092e8SBaptiste Daroussin main(int argc, char **argv)
1209b50d902SRodney W. Grimes {
121573560d5SMark Murray     const char *fname = "";
1229b50d902SRodney W. Grimes     struct stat stbuf;
1239b50d902SRodney W. Grimes     char buf[BUFSIZ];
1249b50d902SRodney W. Grimes     char *defs;
1259b50d902SRodney W. Grimes     int needbp = 0;
1269b50d902SRodney W. Grimes 
1279b50d902SRodney W. Grimes     argc--, argv++;
1289b50d902SRodney W. Grimes     do {
1299b50d902SRodney W. Grimes 	char *cp;
1309b50d902SRodney W. Grimes 	int i;
1319b50d902SRodney W. Grimes 
1329b50d902SRodney W. Grimes 	if (argc > 0) {
1339b50d902SRodney W. Grimes 	    if (!strcmp(argv[0], "-h")) {
1349b50d902SRodney W. Grimes 		if (argc == 1) {
1359b50d902SRodney W. Grimes 		    printf("'ds =H\n");
1369b50d902SRodney W. Grimes 		    argc = 0;
1379b50d902SRodney W. Grimes 		    goto rest;
1389b50d902SRodney W. Grimes 		}
1399b50d902SRodney W. Grimes 		printf("'ds =H %s\n", argv[1]);
1409b50d902SRodney W. Grimes 		argc--, argv++;
1419b50d902SRodney W. Grimes 		argc--, argv++;
1429b50d902SRodney W. Grimes 		if (argc > 0)
1439b50d902SRodney W. Grimes 		    continue;
1449b50d902SRodney W. Grimes 		goto rest;
1459b50d902SRodney W. Grimes 	    }
1469b50d902SRodney W. Grimes 
1479b50d902SRodney W. Grimes 	    /* act as a filter like eqn */
1489b50d902SRodney W. Grimes 	    if (!strcmp(argv[0], "-f")) {
149179646ccSBaptiste Daroussin 		filter = true;
1509b50d902SRodney W. Grimes 		argv[0] = argv[argc-1];
151224c8257SBaptiste Daroussin 		argv[argc-1] = minus;
1529b50d902SRodney W. Grimes 		continue;
1539b50d902SRodney W. Grimes 	    }
1549b50d902SRodney W. Grimes 
1559b50d902SRodney W. Grimes 	    /* take input from the standard place */
1569b50d902SRodney W. Grimes 	    if (!strcmp(argv[0], "-")) {
1579b50d902SRodney W. Grimes 		argc = 0;
1589b50d902SRodney W. Grimes 		goto rest;
1599b50d902SRodney W. Grimes 	    }
1609b50d902SRodney W. Grimes 
1619b50d902SRodney W. Grimes 	    /* build an index */
1629b50d902SRodney W. Grimes 	    if (!strcmp(argv[0], "-x")) {
163179646ccSBaptiste Daroussin 		idx = true;
164224c8257SBaptiste Daroussin 		argv[0] = minusn;
1659b50d902SRodney W. Grimes 	    }
1669b50d902SRodney W. Grimes 
1679b50d902SRodney W. Grimes 	    /* indicate no keywords */
1689b50d902SRodney W. Grimes 	    if (!strcmp(argv[0], "-n")) {
169179646ccSBaptiste Daroussin 		nokeyw = true;
1709b50d902SRodney W. Grimes 		argc--, argv++;
1719b50d902SRodney W. Grimes 		continue;
1729b50d902SRodney W. Grimes 	    }
1739b50d902SRodney W. Grimes 
1749b50d902SRodney W. Grimes 	    /* specify the font size */
1759b50d902SRodney W. Grimes 	    if (!strncmp(argv[0], "-s", 2)) {
1769b50d902SRodney W. Grimes 		i = 0;
1779b50d902SRodney W. Grimes 		cp = argv[0] + 2;
1789b50d902SRodney W. Grimes 		while (*cp)
1799b50d902SRodney W. Grimes 		    i = i * 10 + (*cp++ - '0');
1809b50d902SRodney W. Grimes 		printf("'ps %d\n'vs %d\n", i, i+1);
1819b50d902SRodney W. Grimes 		argc--, argv++;
1829b50d902SRodney W. Grimes 		continue;
1839b50d902SRodney W. Grimes 	    }
1849b50d902SRodney W. Grimes 
1859b50d902SRodney W. Grimes 	    /* specify the language */
1869b50d902SRodney W. Grimes 	    if (!strncmp(argv[0], "-l", 2)) {
1879b50d902SRodney W. Grimes 		language = argv[0]+2;
1889b50d902SRodney W. Grimes 		argc--, argv++;
1899b50d902SRodney W. Grimes 		continue;
1909b50d902SRodney W. Grimes 	    }
1919b50d902SRodney W. Grimes 
1929b50d902SRodney W. Grimes 	    /* specify the language description file */
1939b50d902SRodney W. Grimes 	    if (!strncmp(argv[0], "-d", 2)) {
1949b50d902SRodney W. Grimes 		defsfile[0] = argv[1];
1959b50d902SRodney W. Grimes 		argc--, argv++;
1969b50d902SRodney W. Grimes 		argc--, argv++;
1979b50d902SRodney W. Grimes 		continue;
1989b50d902SRodney W. Grimes 	    }
1999b50d902SRodney W. Grimes 
2009b50d902SRodney W. Grimes 	    /* open the file for input */
2013e7ae69fSPhilippe Charnier 	    if (freopen(argv[0], "r", stdin) == NULL)
2023e7ae69fSPhilippe Charnier 		err(1, "%s", argv[0]);
2039b50d902SRodney W. Grimes 	    if (idx)
2049b50d902SRodney W. Grimes 		printf("'ta 4i 4.25i 5.5iR\n'in .5i\n");
2059b50d902SRodney W. Grimes 	    fname = argv[0];
2069b50d902SRodney W. Grimes 	    argc--, argv++;
2079b50d902SRodney W. Grimes 	}
2089b50d902SRodney W. Grimes     rest:
2099b50d902SRodney W. Grimes 
2109b50d902SRodney W. Grimes 	/*
2119b50d902SRodney W. Grimes 	 *  get the  language definition from the defs file
2129b50d902SRodney W. Grimes 	 */
2139b50d902SRodney W. Grimes 	i = cgetent(&defs, defsfile, language);
2149b50d902SRodney W. Grimes 	if (i == -1) {
2159b50d902SRodney W. Grimes 	    fprintf (stderr, "no entry for language %s\n", language);
2169b50d902SRodney W. Grimes 	    exit(0);
2179b50d902SRodney W. Grimes 	} else  if (i == -2) { fprintf(stderr,
2189b50d902SRodney W. Grimes 	    "cannot find vgrindefs file %s\n", defsfile[0]);
2199b50d902SRodney W. Grimes 	    exit(0);
2209b50d902SRodney W. Grimes 	} else if (i == -3) { fprintf(stderr,
2219b50d902SRodney W. Grimes 	    "potential reference loop detected in vgrindefs file %s\n",
2229b50d902SRodney W. Grimes             defsfile[0]);
2239b50d902SRodney W. Grimes 	    exit(0);
2249b50d902SRodney W. Grimes 	}
2259b50d902SRodney W. Grimes 	if (cgetustr(defs, "kw", &cp) == -1)
226179646ccSBaptiste Daroussin 	    nokeyw = true;
2279b50d902SRodney W. Grimes 	else  {
2289b50d902SRodney W. Grimes 	    char **cpp;
2299b50d902SRodney W. Grimes 
2309b50d902SRodney W. Grimes 	    cpp = l_keywds;
2319b50d902SRodney W. Grimes 	    while (*cp) {
2329b50d902SRodney W. Grimes 		while (*cp == ' ' || *cp =='\t')
233d030d2d2SPoul-Henning Kamp 		    *cp++ = '\0';
2349b50d902SRodney W. Grimes 		if (*cp)
2359b50d902SRodney W. Grimes 		    *cpp++ = cp;
2369b50d902SRodney W. Grimes 		while (*cp != ' ' && *cp  != '\t' && *cp)
2379b50d902SRodney W. Grimes 		    cp++;
2389b50d902SRodney W. Grimes 	    }
2391dd178d1SBaptiste Daroussin 	    *cpp = NULL;
2409b50d902SRodney W. Grimes 	}
2419b50d902SRodney W. Grimes 	cgetustr(defs, "pb", &cp);
2429b50d902SRodney W. Grimes 	l_prcbeg = convexp(cp);
2439b50d902SRodney W. Grimes 	cgetustr(defs, "cb", &cp);
2449b50d902SRodney W. Grimes 	l_combeg = convexp(cp);
2459b50d902SRodney W. Grimes 	cgetustr(defs, "ce", &cp);
2469b50d902SRodney W. Grimes 	l_comend = convexp(cp);
2479b50d902SRodney W. Grimes 	cgetustr(defs, "ab", &cp);
2489b50d902SRodney W. Grimes 	l_acmbeg = convexp(cp);
2499b50d902SRodney W. Grimes 	cgetustr(defs, "ae", &cp);
2509b50d902SRodney W. Grimes 	l_acmend = convexp(cp);
2519b50d902SRodney W. Grimes 	cgetustr(defs, "sb", &cp);
2529b50d902SRodney W. Grimes 	l_strbeg = convexp(cp);
2539b50d902SRodney W. Grimes 	cgetustr(defs, "se", &cp);
2549b50d902SRodney W. Grimes 	l_strend = convexp(cp);
2559b50d902SRodney W. Grimes 	cgetustr(defs, "bb", &cp);
2569b50d902SRodney W. Grimes 	l_blkbeg = convexp(cp);
2579b50d902SRodney W. Grimes 	cgetustr(defs, "be", &cp);
2589b50d902SRodney W. Grimes 	l_blkend = convexp(cp);
2599b50d902SRodney W. Grimes 	cgetustr(defs, "lb", &cp);
2609b50d902SRodney W. Grimes 	l_chrbeg = convexp(cp);
2619b50d902SRodney W. Grimes 	cgetustr(defs, "le", &cp);
2629b50d902SRodney W. Grimes 	l_chrend = convexp(cp);
263f98f97bbSJoerg Wunsch 	if (cgetustr(defs, "nc", &cp) >= 0)
26428445a63SJoerg Wunsch 		l_nocom = convexp(cp);
2659b50d902SRodney W. Grimes 	l_escape = '\\';
2669b50d902SRodney W. Grimes 	l_onecase = (cgetcap(defs, "oc", ':') != NULL);
2679b50d902SRodney W. Grimes 	l_toplex = (cgetcap(defs, "tl", ':') != NULL);
2689b50d902SRodney W. Grimes 
2699b50d902SRodney W. Grimes 	/* initialize the program */
2709b50d902SRodney W. Grimes 
271179646ccSBaptiste Daroussin 	incomm = false;
272179646ccSBaptiste Daroussin 	instr = false;
273179646ccSBaptiste Daroussin 	inchr = false;
274179646ccSBaptiste Daroussin 	_escaped = false;
2759b50d902SRodney W. Grimes 	blklevel = 0;
2769b50d902SRodney W. Grimes 	for (psptr=0; psptr<PSMAX; psptr++) {
277d030d2d2SPoul-Henning Kamp 	    pstack[psptr][0] = '\0';
2789b50d902SRodney W. Grimes 	    plstack[psptr] = 0;
2799b50d902SRodney W. Grimes 	}
2809b50d902SRodney W. Grimes 	psptr = -1;
2819b50d902SRodney W. Grimes 	ps("'-F\n");
2829b50d902SRodney W. Grimes 	if (!filter) {
2839b50d902SRodney W. Grimes 	    printf(".ds =F %s\n", fname);
2849b50d902SRodney W. Grimes 	    ps("'wh 0 vH\n");
2859b50d902SRodney W. Grimes 	    ps("'wh -1i vF\n");
2869b50d902SRodney W. Grimes 	}
2879b50d902SRodney W. Grimes 	if (needbp) {
2889b50d902SRodney W. Grimes 	    needbp = 0;
2899b50d902SRodney W. Grimes 	    printf(".()\n");
2909b50d902SRodney W. Grimes 	    printf(".bp\n");
2919b50d902SRodney W. Grimes 	}
2929b50d902SRodney W. Grimes 	if (!filter) {
2939b50d902SRodney W. Grimes 	    fstat(fileno(stdin), &stbuf);
2949b50d902SRodney W. Grimes 	    cp = ctime(&stbuf.st_mtime);
2959b50d902SRodney W. Grimes 	    cp[16] = '\0';
2969b50d902SRodney W. Grimes 	    cp[24] = '\0';
2979b50d902SRodney W. Grimes 	    printf(".ds =M %s %s\n", cp+4, cp+20);
2989b50d902SRodney W. Grimes 	}
2999b50d902SRodney W. Grimes 
3009b50d902SRodney W. Grimes 	/*
3019b50d902SRodney W. Grimes 	 *	MAIN LOOP!!!
3029b50d902SRodney W. Grimes 	 */
3039b50d902SRodney W. Grimes 	while (fgets(buf, sizeof buf, stdin) != NULL) {
3049b50d902SRodney W. Grimes 	    if (buf[0] == '\f') {
3059b50d902SRodney W. Grimes 		printf(".bp\n");
3069b50d902SRodney W. Grimes 	    }
3079b50d902SRodney W. Grimes 	    if (buf[0] == '.') {
3089b50d902SRodney W. Grimes 		printf("%s", buf);
3099b50d902SRodney W. Grimes 		if (!strncmp (buf+1, "vS", 2))
310179646ccSBaptiste Daroussin 		    pass = true;
3119b50d902SRodney W. Grimes 		if (!strncmp (buf+1, "vE", 2))
312179646ccSBaptiste Daroussin 		    pass = false;
3139b50d902SRodney W. Grimes 		continue;
3149b50d902SRodney W. Grimes 	    }
315179646ccSBaptiste Daroussin 	    prccont = false;
3169b50d902SRodney W. Grimes 	    if (!filter || pass)
3179b50d902SRodney W. Grimes 		putScp(buf);
3189b50d902SRodney W. Grimes 	    else
3199b50d902SRodney W. Grimes 		printf("%s", buf);
3209b50d902SRodney W. Grimes 	    if (prccont && (psptr >= 0)) {
3219b50d902SRodney W. Grimes 		ps("'FC ");
3229b50d902SRodney W. Grimes 		ps(pstack[psptr]);
3239b50d902SRodney W. Grimes 		ps("\n");
3249b50d902SRodney W. Grimes 	    }
3259b50d902SRodney W. Grimes #ifdef DEBUG
3269b50d902SRodney W. Grimes 	    printf ("com %o str %o chr %o ptr %d\n", incomm, instr, inchr, psptr);
3279b50d902SRodney W. Grimes #endif
3289b50d902SRodney W. Grimes 	    margin = 0;
3299b50d902SRodney W. Grimes 	}
3309b50d902SRodney W. Grimes 	needbp = 1;
3319b50d902SRodney W. Grimes     } while (argc > 0);
3329b50d902SRodney W. Grimes     exit(0);
3339b50d902SRodney W. Grimes }
3349b50d902SRodney W. Grimes 
3359b50d902SRodney W. Grimes #define isidchr(c) (isalnum(c) || (c) == '_')
3369b50d902SRodney W. Grimes 
3379b50d902SRodney W. Grimes static void
putScp(char * os)338c99acb73SBaptiste Daroussin putScp(char *os)
3399b50d902SRodney W. Grimes {
3409b50d902SRodney W. Grimes     register char *s = os;		/* pointer to unmatched string */
3419b50d902SRodney W. Grimes     char dummy[BUFSIZ];			/* dummy to be used by expmatch */
3429b50d902SRodney W. Grimes     char *comptr;			/* end of a comment delimiter */
3439b50d902SRodney W. Grimes     char *acmptr;			/* end of a comment delimiter */
3449b50d902SRodney W. Grimes     char *strptr;			/* end of a string delimiter */
3459b50d902SRodney W. Grimes     char *chrptr;			/* end of a character const delimiter */
3469b50d902SRodney W. Grimes     char *blksptr;			/* end of a lexical block start */
3479b50d902SRodney W. Grimes     char *blkeptr;			/* end of a lexical block end */
34828445a63SJoerg Wunsch     char *nocomptr;			/* end of a non-comment delimiter */
3499b50d902SRodney W. Grimes 
350429f4d13SJohn Birrell     s_start = os;			/* remember the start for expmatch */
351179646ccSBaptiste Daroussin     _escaped = false;
3529b50d902SRodney W. Grimes     if (nokeyw || incomm || instr)
3539b50d902SRodney W. Grimes 	goto skip;
3549b50d902SRodney W. Grimes     if (isproc(s)) {
3559b50d902SRodney W. Grimes 	ps("'FN ");
3569b50d902SRodney W. Grimes 	ps(pname);
3579b50d902SRodney W. Grimes         ps("\n");
3589b50d902SRodney W. Grimes 	if (psptr < PSMAX) {
3599b50d902SRodney W. Grimes 	    ++psptr;
3609b50d902SRodney W. Grimes 	    strncpy (pstack[psptr], pname, PNAMELEN);
36147a5f499SJohn-Mark Gurney 	    pstack[psptr][PNAMELEN] = '\0';
3629b50d902SRodney W. Grimes 	    plstack[psptr] = blklevel;
3639b50d902SRodney W. Grimes 	}
3649b50d902SRodney W. Grimes     }
3659b50d902SRodney W. Grimes skip:
3669b50d902SRodney W. Grimes     do {
3679b50d902SRodney W. Grimes 	/* check for string, comment, blockstart, etc */
3689b50d902SRodney W. Grimes 	if (!incomm && !instr && !inchr) {
3699b50d902SRodney W. Grimes 
3709b50d902SRodney W. Grimes 	    blkeptr = expmatch(s, l_blkend, dummy);
3719b50d902SRodney W. Grimes 	    blksptr = expmatch(s, l_blkbeg, dummy);
3729b50d902SRodney W. Grimes 	    comptr = expmatch(s, l_combeg, dummy);
3739b50d902SRodney W. Grimes 	    acmptr = expmatch(s, l_acmbeg, dummy);
3749b50d902SRodney W. Grimes 	    strptr = expmatch(s, l_strbeg, dummy);
3759b50d902SRodney W. Grimes 	    chrptr = expmatch(s, l_chrbeg, dummy);
37628445a63SJoerg Wunsch 	    nocomptr = expmatch (s, l_nocom, dummy);
37728445a63SJoerg Wunsch 
37828445a63SJoerg Wunsch 	    /* start of non-comment? */
3791dd178d1SBaptiste Daroussin 	    if (nocomptr != NULL)
3801dd178d1SBaptiste Daroussin 		if ((nocomptr <= comptr || comptr == NULL)
3811dd178d1SBaptiste Daroussin 		  && (nocomptr <= acmptr || acmptr == NULL)) {
38228445a63SJoerg Wunsch 		    /* continue after non-comment */
383179646ccSBaptiste Daroussin 		    putKcp (s, nocomptr-1, false);
38428445a63SJoerg Wunsch 		    s = nocomptr;
38528445a63SJoerg Wunsch 		    continue;
38628445a63SJoerg Wunsch 		}
3879b50d902SRodney W. Grimes 
3889b50d902SRodney W. Grimes 	    /* start of a comment? */
3891dd178d1SBaptiste Daroussin 	    if (comptr != NULL)
3901dd178d1SBaptiste Daroussin 		if ((comptr < strptr || strptr == NULL)
3911dd178d1SBaptiste Daroussin 		  && (comptr < acmptr || acmptr == NULL)
3921dd178d1SBaptiste Daroussin 		  && (comptr < chrptr || chrptr == NULL)
3931dd178d1SBaptiste Daroussin 		  && (comptr < blksptr || blksptr == NULL)
3941dd178d1SBaptiste Daroussin 		  && (comptr < blkeptr || blkeptr == NULL)) {
395179646ccSBaptiste Daroussin 		    putKcp(s, comptr-1, false);
3969b50d902SRodney W. Grimes 		    s = comptr;
397179646ccSBaptiste Daroussin 		    incomm = true;
3989b50d902SRodney W. Grimes 		    comtype = STANDARD;
3999b50d902SRodney W. Grimes 		    if (s != os)
4009b50d902SRodney W. Grimes 			ps("\\c");
4019b50d902SRodney W. Grimes 		    ps("\\c\n'+C\n");
4029b50d902SRodney W. Grimes 		    continue;
4039b50d902SRodney W. Grimes 		}
4049b50d902SRodney W. Grimes 
4059b50d902SRodney W. Grimes 	    /* start of a comment? */
4061dd178d1SBaptiste Daroussin 	    if (acmptr != NULL)
4071dd178d1SBaptiste Daroussin 		if ((acmptr < strptr || strptr == NULL)
4081dd178d1SBaptiste Daroussin 		  && (acmptr < chrptr || chrptr == NULL)
4091dd178d1SBaptiste Daroussin 		  && (acmptr < blksptr || blksptr == NULL)
4101dd178d1SBaptiste Daroussin 		  && (acmptr < blkeptr || blkeptr == NULL)) {
411179646ccSBaptiste Daroussin 		    putKcp(s, acmptr-1, false);
4129b50d902SRodney W. Grimes 		    s = acmptr;
413179646ccSBaptiste Daroussin 		    incomm = true;
4149b50d902SRodney W. Grimes 		    comtype = ALTERNATE;
4159b50d902SRodney W. Grimes 		    if (s != os)
4169b50d902SRodney W. Grimes 			ps("\\c");
4179b50d902SRodney W. Grimes 		    ps("\\c\n'+C\n");
4189b50d902SRodney W. Grimes 		    continue;
4199b50d902SRodney W. Grimes 		}
4209b50d902SRodney W. Grimes 
4219b50d902SRodney W. Grimes 	    /* start of a string? */
4221dd178d1SBaptiste Daroussin 	    if (strptr != NULL)
4231dd178d1SBaptiste Daroussin 		if ((strptr < chrptr || chrptr == NULL)
4241dd178d1SBaptiste Daroussin 		  && (strptr < blksptr || blksptr == NULL)
4251dd178d1SBaptiste Daroussin 		  && (strptr < blkeptr || blkeptr == NULL)) {
426179646ccSBaptiste Daroussin 		    putKcp(s, strptr-1, false);
4279b50d902SRodney W. Grimes 		    s = strptr;
428179646ccSBaptiste Daroussin 		    instr = true;
4299b50d902SRodney W. Grimes 		    continue;
4309b50d902SRodney W. Grimes 		}
4319b50d902SRodney W. Grimes 
4329b50d902SRodney W. Grimes 	    /* start of a character string? */
4331dd178d1SBaptiste Daroussin 	    if (chrptr != NULL)
4341dd178d1SBaptiste Daroussin 		if ((chrptr < blksptr || blksptr == NULL)
4351dd178d1SBaptiste Daroussin 		  && (chrptr < blkeptr || blkeptr == NULL)) {
436179646ccSBaptiste Daroussin 		    putKcp(s, chrptr-1, false);
4379b50d902SRodney W. Grimes 		    s = chrptr;
438179646ccSBaptiste Daroussin 		    inchr = true;
4399b50d902SRodney W. Grimes 		    continue;
4409b50d902SRodney W. Grimes 		}
4419b50d902SRodney W. Grimes 
4429b50d902SRodney W. Grimes 	    /* end of a lexical block */
4431dd178d1SBaptiste Daroussin 	    if (blkeptr != NULL) {
4441dd178d1SBaptiste Daroussin 		if (blkeptr < blksptr || blksptr == NULL) {
445179646ccSBaptiste Daroussin 		    putKcp(s, blkeptr - 1, false);
4469b50d902SRodney W. Grimes 		    s = blkeptr;
44728445a63SJoerg Wunsch 		    if (blklevel > 0 /* sanity */)
4489b50d902SRodney W. Grimes 			    blklevel--;
4499b50d902SRodney W. Grimes 		    if (psptr >= 0 && plstack[psptr] >= blklevel) {
4509b50d902SRodney W. Grimes 
4519b50d902SRodney W. Grimes 			/* end of current procedure */
4529b50d902SRodney W. Grimes 			if (s != os)
4539b50d902SRodney W. Grimes 			    ps("\\c");
4549b50d902SRodney W. Grimes 			ps("\\c\n'-F\n");
4559b50d902SRodney W. Grimes 			blklevel = plstack[psptr];
4569b50d902SRodney W. Grimes 
4579b50d902SRodney W. Grimes 			/* see if we should print the last proc name */
4589b50d902SRodney W. Grimes 			if (--psptr >= 0)
459179646ccSBaptiste Daroussin 			    prccont = true;
4609b50d902SRodney W. Grimes 			else
4619b50d902SRodney W. Grimes 			    psptr = -1;
4629b50d902SRodney W. Grimes 		    }
4639b50d902SRodney W. Grimes 		    continue;
4649b50d902SRodney W. Grimes 		}
4659b50d902SRodney W. Grimes 	    }
4669b50d902SRodney W. Grimes 
4679b50d902SRodney W. Grimes 	    /* start of a lexical block */
4681dd178d1SBaptiste Daroussin 	    if (blksptr != NULL) {
469179646ccSBaptiste Daroussin 		putKcp(s, blksptr - 1, false);
4709b50d902SRodney W. Grimes 		s = blksptr;
4719b50d902SRodney W. Grimes 		blklevel++;
4729b50d902SRodney W. Grimes 		continue;
4739b50d902SRodney W. Grimes 	    }
4749b50d902SRodney W. Grimes 
4759b50d902SRodney W. Grimes 	/* check for end of comment */
4769b50d902SRodney W. Grimes 	} else if (incomm) {
4779b50d902SRodney W. Grimes 	    comptr = expmatch(s, l_comend, dummy);
4789b50d902SRodney W. Grimes 	    acmptr = expmatch(s, l_acmend, dummy);
4791dd178d1SBaptiste Daroussin 	    if (((comtype == STANDARD) && (comptr != NULL)) ||
4801dd178d1SBaptiste Daroussin 	        ((comtype == ALTERNATE) && (acmptr != NULL))) {
4819b50d902SRodney W. Grimes 		if (comtype == STANDARD) {
482179646ccSBaptiste Daroussin 		    putKcp(s, comptr-1, true);
4839b50d902SRodney W. Grimes 		    s = comptr;
4849b50d902SRodney W. Grimes 		} else {
485179646ccSBaptiste Daroussin 		    putKcp(s, acmptr-1, true);
4869b50d902SRodney W. Grimes 		    s = acmptr;
4879b50d902SRodney W. Grimes 		}
488179646ccSBaptiste Daroussin 		incomm = false;
4899b50d902SRodney W. Grimes 		ps("\\c\n'-C\n");
4909b50d902SRodney W. Grimes 		continue;
4919b50d902SRodney W. Grimes 	    } else {
492179646ccSBaptiste Daroussin 		putKcp(s, s + strlen(s) -1, true);
4939b50d902SRodney W. Grimes 		s = s + strlen(s);
4949b50d902SRodney W. Grimes 		continue;
4959b50d902SRodney W. Grimes 	    }
4969b50d902SRodney W. Grimes 
4979b50d902SRodney W. Grimes 	/* check for end of string */
4989b50d902SRodney W. Grimes 	} else if (instr) {
4991dd178d1SBaptiste Daroussin 	    if ((strptr = expmatch(s, l_strend, dummy)) != NULL) {
500179646ccSBaptiste Daroussin 		putKcp(s, strptr-1, true);
5019b50d902SRodney W. Grimes 		s = strptr;
502179646ccSBaptiste Daroussin 		instr = false;
5039b50d902SRodney W. Grimes 		continue;
5049b50d902SRodney W. Grimes 	    } else {
505179646ccSBaptiste Daroussin 		putKcp(s, s+strlen(s)-1, true);
5069b50d902SRodney W. Grimes 		s = s + strlen(s);
5079b50d902SRodney W. Grimes 		continue;
5089b50d902SRodney W. Grimes 	    }
5099b50d902SRodney W. Grimes 
5109b50d902SRodney W. Grimes 	/* check for end of character string */
5119b50d902SRodney W. Grimes 	} else if (inchr) {
5121dd178d1SBaptiste Daroussin 	    if ((chrptr = expmatch(s, l_chrend, dummy)) != NULL) {
513179646ccSBaptiste Daroussin 		putKcp(s, chrptr-1, true);
5149b50d902SRodney W. Grimes 		s = chrptr;
515179646ccSBaptiste Daroussin 		inchr = false;
5169b50d902SRodney W. Grimes 		continue;
5179b50d902SRodney W. Grimes 	    } else {
518179646ccSBaptiste Daroussin 		putKcp(s, s+strlen(s)-1, true);
5199b50d902SRodney W. Grimes 		s = s + strlen(s);
5209b50d902SRodney W. Grimes 		continue;
5219b50d902SRodney W. Grimes 	    }
5229b50d902SRodney W. Grimes 	}
5239b50d902SRodney W. Grimes 
5249b50d902SRodney W. Grimes 	/* print out the line */
525179646ccSBaptiste Daroussin 	putKcp(s, s + strlen(s) -1, false);
5269b50d902SRodney W. Grimes 	s = s + strlen(s);
5279b50d902SRodney W. Grimes     } while (*s);
5289b50d902SRodney W. Grimes }
5299b50d902SRodney W. Grimes 
530b16000daSBaptiste Daroussin /*
531b16000daSBaptiste Daroussin  * start: start of string to write
532b16000daSBaptiste Daroussin  * end: end of string to write
533b16000daSBaptiste Daroussin  * force: true if we should force nokeyw
534b16000daSBaptiste Daroussin  */
5359b50d902SRodney W. Grimes static void
putKcp(char * start,char * end,bool force)536179646ccSBaptiste Daroussin putKcp(char *start, char *end, bool force)
5379b50d902SRodney W. Grimes {
5389b50d902SRodney W. Grimes     int i;
5399b50d902SRodney W. Grimes     int xfld = 0;
5409b50d902SRodney W. Grimes 
5419b50d902SRodney W. Grimes     while (start <= end) {
5429b50d902SRodney W. Grimes 	if (idx) {
5439b50d902SRodney W. Grimes 	    if (*start == ' ' || *start == '\t') {
5449b50d902SRodney W. Grimes 		if (xfld == 0)
5455edecbaeSPoul-Henning Kamp 		    printf("\001");
5469b50d902SRodney W. Grimes 		printf("\t");
5479b50d902SRodney W. Grimes 		xfld = 1;
5489b50d902SRodney W. Grimes 		while (*start == ' ' || *start == '\t')
5499b50d902SRodney W. Grimes 		    start++;
5509b50d902SRodney W. Grimes 		continue;
5519b50d902SRodney W. Grimes 	    }
5529b50d902SRodney W. Grimes 	}
5539b50d902SRodney W. Grimes 
5549b50d902SRodney W. Grimes 	/* take care of nice tab stops */
5559b50d902SRodney W. Grimes 	if (*start == '\t') {
5569b50d902SRodney W. Grimes 	    while (*start == '\t')
5579b50d902SRodney W. Grimes 		start++;
558429f4d13SJohn Birrell 	    i = tabs(s_start, start) - margin / 8;
5599b50d902SRodney W. Grimes 	    printf("\\h'|%dn'", i * 10 + 1 - margin % 8);
5609b50d902SRodney W. Grimes 	    continue;
5619b50d902SRodney W. Grimes 	}
5629b50d902SRodney W. Grimes 
5639b50d902SRodney W. Grimes 	if (!nokeyw && !force)
5649b50d902SRodney W. Grimes 	    if ((*start == '#' || isidchr(*start))
565429f4d13SJohn Birrell 	    && (start == s_start || !isidchr(start[-1]))) {
5669b50d902SRodney W. Grimes 		i = iskw(start);
5679b50d902SRodney W. Grimes 		if (i > 0) {
5689b50d902SRodney W. Grimes 		    ps("\\*(+K");
5699b50d902SRodney W. Grimes 		    do
57071503758SJoerg Wunsch 			putcp((unsigned char)*start++);
5719b50d902SRodney W. Grimes 		    while (--i > 0);
5729b50d902SRodney W. Grimes 		    ps("\\*(-K");
5739b50d902SRodney W. Grimes 		    continue;
5749b50d902SRodney W. Grimes 		}
5759b50d902SRodney W. Grimes 	    }
5769b50d902SRodney W. Grimes 
57771503758SJoerg Wunsch 	putcp((unsigned char)*start++);
5789b50d902SRodney W. Grimes     }
5799b50d902SRodney W. Grimes }
5809b50d902SRodney W. Grimes 
5819b50d902SRodney W. Grimes 
5829b50d902SRodney W. Grimes static int
tabs(char * s,char * os)583b16000daSBaptiste Daroussin tabs(char *s, char *os)
5849b50d902SRodney W. Grimes {
5859b50d902SRodney W. Grimes 
5869b50d902SRodney W. Grimes     return (width(s, os) / 8);
5879b50d902SRodney W. Grimes }
5889b50d902SRodney W. Grimes 
5899b50d902SRodney W. Grimes static int
width(register char * s,register char * os)590b16000daSBaptiste Daroussin width(register char *s, register char *os)
5919b50d902SRodney W. Grimes {
5929b50d902SRodney W. Grimes 	register int i = 0;
5939b50d902SRodney W. Grimes 
5949b50d902SRodney W. Grimes 	while (s < os) {
5959b50d902SRodney W. Grimes 		if (*s == '\t') {
5969b50d902SRodney W. Grimes 			i = (i + 8) &~ 7;
5979b50d902SRodney W. Grimes 			s++;
5989b50d902SRodney W. Grimes 			continue;
5999b50d902SRodney W. Grimes 		}
6009b50d902SRodney W. Grimes 		if (*s < ' ')
6019b50d902SRodney W. Grimes 			i += 2;
6029b50d902SRodney W. Grimes 		else
6039b50d902SRodney W. Grimes 			i++;
6049b50d902SRodney W. Grimes 		s++;
6059b50d902SRodney W. Grimes 	}
6069b50d902SRodney W. Grimes 	return (i);
6079b50d902SRodney W. Grimes }
6089b50d902SRodney W. Grimes 
6099b50d902SRodney W. Grimes static void
putcp(register int c)610c99acb73SBaptiste Daroussin putcp(register int c)
6119b50d902SRodney W. Grimes {
6129b50d902SRodney W. Grimes 
6139b50d902SRodney W. Grimes 	switch(c) {
6149b50d902SRodney W. Grimes 
6159b50d902SRodney W. Grimes 	case 0:
6169b50d902SRodney W. Grimes 		break;
6179b50d902SRodney W. Grimes 
6189b50d902SRodney W. Grimes 	case '\f':
6199b50d902SRodney W. Grimes 		break;
6209b50d902SRodney W. Grimes 
62128445a63SJoerg Wunsch 	case '\r':
62228445a63SJoerg Wunsch 		break;
62328445a63SJoerg Wunsch 
6249b50d902SRodney W. Grimes 	case '{':
6259b50d902SRodney W. Grimes 		ps("\\*(+K{\\*(-K");
6269b50d902SRodney W. Grimes 		break;
6279b50d902SRodney W. Grimes 
6289b50d902SRodney W. Grimes 	case '}':
6299b50d902SRodney W. Grimes 		ps("\\*(+K}\\*(-K");
6309b50d902SRodney W. Grimes 		break;
6319b50d902SRodney W. Grimes 
6329b50d902SRodney W. Grimes 	case '\\':
6339b50d902SRodney W. Grimes 		ps("\\e");
6349b50d902SRodney W. Grimes 		break;
6359b50d902SRodney W. Grimes 
6369b50d902SRodney W. Grimes 	case '_':
6379b50d902SRodney W. Grimes 		ps("\\*_");
6389b50d902SRodney W. Grimes 		break;
6399b50d902SRodney W. Grimes 
6409b50d902SRodney W. Grimes 	case '-':
6419b50d902SRodney W. Grimes 		ps("\\*-");
6429b50d902SRodney W. Grimes 		break;
6439b50d902SRodney W. Grimes 
6449b50d902SRodney W. Grimes 	case '`':
6459b50d902SRodney W. Grimes 		ps("\\`");
6469b50d902SRodney W. Grimes 		break;
6479b50d902SRodney W. Grimes 
6489b50d902SRodney W. Grimes 	case '\'':
6499b50d902SRodney W. Grimes 		ps("\\'");
6509b50d902SRodney W. Grimes 		break;
6519b50d902SRodney W. Grimes 
6529b50d902SRodney W. Grimes 	case '.':
6539b50d902SRodney W. Grimes 		ps("\\&.");
6549b50d902SRodney W. Grimes 		break;
6559b50d902SRodney W. Grimes 
6569b50d902SRodney W. Grimes 	case '*':
6579b50d902SRodney W. Grimes 		ps("\\fI*\\fP");
6589b50d902SRodney W. Grimes 		break;
6599b50d902SRodney W. Grimes 
6609b50d902SRodney W. Grimes 	case '/':
6619b50d902SRodney W. Grimes 		ps("\\fI\\h'\\w' 'u-\\w'/'u'/\\fP");
6629b50d902SRodney W. Grimes 		break;
6639b50d902SRodney W. Grimes 
6649b50d902SRodney W. Grimes 	default:
6659b50d902SRodney W. Grimes 		if (c < 040)
6669b50d902SRodney W. Grimes 			putchar('^'), c |= '@';
6679b50d902SRodney W. Grimes 	case '\t':
6689b50d902SRodney W. Grimes 	case '\n':
6699b50d902SRodney W. Grimes 		putchar(c);
6709b50d902SRodney W. Grimes 	}
6719b50d902SRodney W. Grimes }
6729b50d902SRodney W. Grimes 
6739b50d902SRodney W. Grimes /*
6749b50d902SRodney W. Grimes  *	look for a process beginning on this line
6759b50d902SRodney W. Grimes  */
676179646ccSBaptiste Daroussin static bool
isproc(char * s)677b16000daSBaptiste Daroussin isproc(char *s)
6789b50d902SRodney W. Grimes {
679d030d2d2SPoul-Henning Kamp     pname[0] = '\0';
6809b50d902SRodney W. Grimes     if (!l_toplex || blklevel == 0)
6811dd178d1SBaptiste Daroussin 	if (expmatch(s, l_prcbeg, pname) != NULL) {
682179646ccSBaptiste Daroussin 	    return (true);
6839b50d902SRodney W. Grimes 	}
684179646ccSBaptiste Daroussin     return (false);
6859b50d902SRodney W. Grimes }
6869b50d902SRodney W. Grimes 
6879b50d902SRodney W. Grimes 
6889b50d902SRodney W. Grimes /*  iskw -	check to see if the next word is a keyword
6899b50d902SRodney W. Grimes  */
6909b50d902SRodney W. Grimes 
6919b50d902SRodney W. Grimes static int
iskw(register char * s)692b16000daSBaptiste Daroussin iskw(register char *s)
6939b50d902SRodney W. Grimes {
6949b50d902SRodney W. Grimes 	register char **ss = l_keywds;
6959b50d902SRodney W. Grimes 	register int i = 1;
6969b50d902SRodney W. Grimes 	register char *cp = s;
6979b50d902SRodney W. Grimes 
6989b50d902SRodney W. Grimes 	while (++cp, isidchr(*cp))
6999b50d902SRodney W. Grimes 		i++;
700573560d5SMark Murray 	while ((cp = *ss++))
7019b50d902SRodney W. Grimes 		if (!STRNCMP(s,cp,i) && !isidchr(cp[i]))
7029b50d902SRodney W. Grimes 			return (i);
7039b50d902SRodney W. Grimes 	return (0);
7049b50d902SRodney W. Grimes }
705