fix for asmconv - stop translating after .sect .end.
[minix.git] / commands / m4 / misc.c
bloba71e133a24c18cb7456177d9ce428a0c191b3fa3
1 /*
2 * misc.c
3 * Facility: m4 macro processor
4 * by: oz
5 */
7 #include "mdef.h"
8 #include "extr.h"
11 * indx - find the index of second str in the
12 * first str.
14 int indx(s1, s2)
15 char *s1;
16 char *s2;
18 register char *t;
19 register char *p;
20 register char *m;
22 for (p = s1; *p; p++) {
23 for (t = p, m = s2; *m && *m == *t; m++, t++)
25 if (!*m)
26 return(p - s1);
28 return (-1);
32 * putback - push character back onto input
35 void putback (c)
36 char c;
38 if (bp < endpbb)
39 *bp++ = c;
40 else
41 error("m4: too many characters pushed back");
45 * pbstr - push string back onto input
46 * putback is replicated to improve
47 * performance.
50 void pbstr(s)
51 register char *s;
53 register char *es;
54 register char *zp;
56 es = s;
57 zp = bp;
59 while (*es)
60 es++;
61 es--;
62 while (es >= s)
63 if (zp < endpbb)
64 *zp++ = *es--;
65 if ((bp = zp) == endpbb)
66 error("m4: too many characters pushed back");
70 * pbnum - convert number to string, push back on input.
73 void pbnum (n)
74 int n;
76 register int num;
78 num = (n < 0) ? -n : n;
79 do {
80 putback(num % 10 + '0');
82 while ((num /= 10) > 0);
84 if (n < 0) putback('-');
88 * chrsave - put single char on string space
91 void chrsave (c)
92 char c;
94 /*** if (sp < 0)
95 putc(c, active);
96 else ***/ if (ep < endest)
97 *ep++ = c;
98 else
99 error("m4: string space overflow");
103 * getdiv - read in a diversion file, and
104 * trash it.
106 void getdiv(ind)
107 int ind;
109 register int c;
110 register FILE *dfil;
112 if (active == outfile[ind])
113 error("m4: undivert: diversion still active.");
114 (void) fclose(outfile[ind]);
115 outfile[ind] = NULL;
116 m4temp[UNIQUE] = ind + '0';
117 if ((dfil = fopen(m4temp, "r")) == NULL)
118 error("m4: cannot undivert.");
119 else
120 while((c = getc(dfil)) != EOF)
121 putc(c, active);
122 (void) fclose(dfil);
124 #if vms
125 if (remove(m4temp))
126 #else
127 if (unlink(m4temp) == -1)
128 #endif
129 error("m4: cannot unlink.");
133 * Very fatal error. Close all files
134 * and die hard.
136 void error(s)
137 char *s;
139 killdiv();
140 fprintf(stderr,"%s\n",s);
141 exit(1);
145 * Interrupt handling
147 static char *msg = "\ninterrupted.";
149 void onintr(s)
150 int s; /* ANSI requires the parameter */
152 error(msg);
156 * killdiv - get rid of the diversion files
159 void killdiv() {
160 register int n;
162 for (n = 0; n < MAXOUT; n++)
163 if (outfile[n] != NULL) {
164 (void) fclose (outfile[n]);
165 m4temp[UNIQUE] = n + '0';
166 #if vms
167 (void) remove (m4temp);
168 #else
169 (void) unlink (m4temp);
170 #endif
175 * save a string somewhere..
178 char *strsave(s)
179 char *s;
181 register int n;
182 char *p;
184 n = strlen(s)+1;
185 p = (char *) malloc(n);
186 if (p != NULL) (void) memcpy(p, s, n);
187 return (p);
190 void usage() {
191 fprintf(stderr, "Usage: m4 [-Dname[=val]] [-Uname]\n");
192 exit(1);
195 #ifdef GETOPT
197 * H. Spencer getopt - get option letter from argv
200 #include <stdio.h>
204 char *optarg; /* Global argument pointer. */
205 int optind = 0; /* Global argv index. */
207 static char *scan = NULL; /* Private scan pointer. */
210 getopt(argc, argv, optstring)
211 int argc;
212 char *argv[];
213 char *optstring;
215 register char c;
216 register char *place;
218 optarg = NULL;
220 if (scan == NULL || *scan == '\0') {
221 if (optind == 0)
222 optind++;
224 if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
225 return(EOF);
226 if (strcmp(argv[optind], "--")==0) {
227 optind++;
228 return(EOF);
231 scan = argv[optind]+1;
232 optind++;
235 c = *scan++;
236 place = index(optstring, c);
238 if (place == NULL || c == ':') {
239 fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
240 return('?');
243 place++;
244 if (*place == ':') {
245 if (*scan != '\0') {
246 optarg = scan;
247 scan = NULL;
248 } else {
249 optarg = argv[optind];
250 optind++;
254 return(c);
257 #endif
259 #ifdef DUFFCP
261 * This code uses Duff's Device (tm Tom Duff)
262 * to unroll the copying loop:
263 * while (count-- > 0)
264 * *to++ = *from++;
267 #define COPYBYTE *to++ = *from++
269 void memcpy(to, from, count)
270 register char *from, *to;
271 register int count;
273 if (count > 0) {
274 register int loops = (count+8-1) >> 3; /* div 8 round up */
276 switch (count&(8-1)) { /* mod 8 */
277 case 0: do {
278 COPYBYTE;
279 case 7: COPYBYTE;
280 case 6: COPYBYTE;
281 case 5: COPYBYTE;
282 case 4: COPYBYTE;
283 case 3: COPYBYTE;
284 case 2: COPYBYTE;
285 case 1: COPYBYTE;
286 } while (--loops > 0);
292 #endif