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