xref: /titanic_44/usr/src/cmd/regcmp/regcmp.c (revision b7f45089ccbe01bab3d7c7377b49d80d2ae18a69)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1988 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /*
27  * Copyright (c) 1997, by Sun Microsystems, Inc.
28  * All rights reserved.
29  */
30 
31 #ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.6.1.1	*/
32 
33 #include <stdio.h>
34 #include <locale.h>
35 #include <libgen.h>
36 FILE *fopen();
37 FILE *iobuf;
38 int gotflg;
39 char ofile[64];
40 char a1[1024];
41 char a2[64];
42 int c;
43 
44 main(argc, argv) char **argv;
45 {
46 	register char *name, *str, *v;
47 	char *bp, *cp, *sv;
48 	char *message;
49 	int j, k, cflg = 0;
50 	int status = 0;
51 
52 	(void) setlocale(LC_ALL, "");
53 #if !defined(TEXT_DOMAIN)	/* Should be defined by cc -D */
54 #define	TEXT_DOMAIN "SYS_TEST"	/* Use this only if it weren't */
55 #endif
56 	(void) textdomain(TEXT_DOMAIN);
57 	if (argc > 1 && *argv[1] == '-') {
58 		cflg++;
59 		++argv;
60 		argc--;
61 	} else cflg = 0;
62 	while (--argc) {
63 		++argv;
64 		bp = *argv;
65 		if ((iobuf = fopen(*argv, "r")) == NULL) {
66 			message = gettext("can not open ");
67 			write(2, message, strlen(message));
68 			write(2, *argv, size(*argv));
69 			write(2, "\n", 1);
70 			/* continues to next file, if any, but the */
71 			/* exit status will indicate an error */
72 			status = 1;
73 			continue;
74 		}
75 		cp = ofile;
76 		while (*++bp)
77 			if (*bp == '/') *bp = '\0';
78 		while (*--bp == '\0');
79 		while (*bp != '\0' && bp > *argv) bp--;
80 		while (*bp == 0)
81 			bp++;
82 		while (*cp++ = *bp++);
83 		cp--; *cp++ = '.';
84 		if (cflg) *cp++ = 'c';
85 		else *cp++ = 'i';
86 		*cp = '\0';
87 		close(1);
88 		if (creat(ofile, 0644) < 0) {
89 			message = gettext("can not create .i file\n");
90 			write(2, message, strlen(message));
91 			exit(1);
92 		}
93 		gotflg = 0;
94 		while (1) {
95 			str = a1;
96 			name = a2;
97 			if (!gotflg)
98 				while (((c = getc(iobuf)) == '\n') ||
99 				    (c == ' '));
100 			else
101 				gotflg = 0;
102 			if (c == EOF) break;
103 			*name++ = c;
104 			while (((*name++ = c = getc(iobuf)) != ' ') &&
105 			    (c != EOF) && (c != '\n'));
106 				*--name = '\0';
107 			while (((c = getc(iobuf)) == ' ') || (c == '\n'));
108 			if (c != '"') {
109 				if (c == EOF) {
110 					message = gettext("unexpected eof\n");
111 					write(2, message, strlen(message));
112 					exit(1);
113 				}
114 				message = gettext("missing initial quote for ");
115 				write(2, message, strlen(message));
116 				write(2, a2, size(a2));
117 				message =
118 				    gettext(" : remainder of line ignored\n");
119 				write(2, message, strlen(message));
120 				while ((c = getc(iobuf)) != '\n');
121 				continue;
122 			}
123 			keeponl:
124 			while (gotflg || (c = getc(iobuf)) != EOF) {
125 				gotflg = 0;
126 				switch (c) {
127 				case '"':
128 					break;
129 				case '\\':
130 					switch (c = getc(iobuf)) {
131 					case 't':
132 						*str++ = '\011';
133 						continue;
134 					case 'n':
135 						*str++ = '\012';
136 						continue;
137 					case 'r':
138 						*str++ = '\015';
139 						continue;
140 					case 'b':
141 						*str++ = '\010';
142 						continue;
143 					case '\\':
144 						*str++ = '\\';
145 						continue;
146 					default:
147 						if (c <= '7' && c >= '0')
148 							*str++ = getnm(c);
149 						else *str++ = c;
150 						continue;
151 					}
152 				default:
153 					*str++ = c;
154 				}
155 				if (c == '"') break;
156 			}
157 			if (c == EOF) {
158 				message = gettext("unexpected eof\n");
159 				write(2, message, strlen(message));
160 				exit(1);
161 			}
162 			while (((c = getc(iobuf)) == '\n') || (c == ' '));
163 			if (c == '"') goto keeponl;
164 			else {
165 				gotflg++;
166 			}
167 			*str = '\0';
168 			if (!(sv = v = regcmp(a1, 0))) {
169 				message = gettext("fail: ");
170 				write(2, message, strlen(message));
171 				write(2, a2, size(a2));
172 				write(2, "\n", 1);
173 				continue;
174 			}
175 			printf("/* \"%s\" */\n", a1);
176 			printf("char %s[] = {\n", a2);
177 			while (__i_size > 0) {
178 				for (k = 0; k < 12; k++)
179 					if (__i_size-- > 0)
180 						printf("0%o, ", *v++);
181 				printf("\n");
182 			}
183 			printf("0};\n");
184 			free(sv);
185 		}
186 		fclose(iobuf);
187 	}
188 	exit(status);
189 }
190 size(p)
191 char *p;
192 {
193 	register i;
194 	register char *q;
195 
196 	i = 0;
197 	q = p;
198 	while (*q++) i++;
199 	return (i);
200 }
201 getnm(j) char j;
202 {
203 	register int i;
204 	register int k;
205 	i = j - '0';
206 	k = 1;
207 	while (++k < 4 && (c = getc(iobuf)) >= '0' && c <= '7')
208 		i = (i*8+(c-'0'));
209 	if (k >= 4)
210 		c = getc(iobuf);
211 	gotflg++;
212 	return (i);
213 }
214