386BSD 0.1 development
[unix-history] / usr / src / usr.bin / m4 / misc.c
CommitLineData
88bb73f0
WJ
1/*
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Ozan Yigit.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#ifndef lint
38static char sccsid[] = "@(#)misc.c 5.6 (Berkeley) 2/26/91";
39#endif /* not lint */
40
41/*
42 * misc.c
43 * Facility: m4 macro processor
44 * by: oz
45 */
46
47#include <unistd.h>
48#include <stdio.h>
49#include <stdlib.h>
50#include <string.h>
51#include "mdef.h"
52#include "extr.h"
53#include "pathnames.h"
54
55/*
56 * indx - find the index of second str in the
57 * first str.
58 */
59indx(s1, s2)
60char *s1;
61char *s2;
62{
63 register char *t;
64 register char *p;
65 register char *m;
66
67 for (p = s1; *p; p++) {
68 for (t = p, m = s2; *m && *m == *t; m++, t++)
69 ;
70 if (!*m)
71 return(p - s1);
72 }
73 return (-1);
74}
75
76/*
77 * putback - push character back onto input
78 *
79 */
80putback (c)
81char c;
82{
83 if (bp < endpbb)
84 *bp++ = c;
85 else
86 error("m4: too many characters pushed back");
87}
88
89/*
90 * pbstr - push string back onto input
91 * putback is replicated to improve
92 * performance.
93 *
94 */
95pbstr(s)
96register char *s;
97{
98 register char *es;
99 register char *zp;
100
101 es = s;
102 zp = bp;
103
104 while (*es)
105 es++;
106 es--;
107 while (es >= s)
108 if (zp < endpbb)
109 *zp++ = *es--;
110 if ((bp = zp) == endpbb)
111 error("m4: too many characters pushed back");
112}
113
114/*
115 * pbnum - convert number to string, push back on input.
116 *
117 */
118pbnum (n)
119int n;
120{
121 register int num;
122
123 num = (n < 0) ? -n : n;
124 do {
125 putback(num % 10 + '0');
126 }
127 while ((num /= 10) > 0);
128
129 if (n < 0) putback('-');
130}
131
132/*
133 * chrsave - put single char on string space
134 *
135 */
136chrsave (c)
137char c;
138{
139/*** if (sp < 0)
140 putc(c, active);
141 else ***/ if (ep < endest)
142 *ep++ = c;
143 else
144 error("m4: string space overflow");
145}
146
147/*
148 * getdiv - read in a diversion file, and
149 * trash it.
150 */
151getdiv(ind) {
152 register int c;
153 register FILE *dfil;
154
155 if (active == outfile[ind])
156 error("m4: undivert: diversion still active.");
157 (void) fclose(outfile[ind]);
158 outfile[ind] = NULL;
159 m4temp[UNIQUE] = ind + '0';
160 if ((dfil = fopen(m4temp, "r")) == NULL)
161 error("m4: cannot undivert.");
162 else
163 while((c = getc(dfil)) != EOF)
164 putc(c, active);
165 (void) fclose(dfil);
166
167 if (unlink(m4temp) == -1)
168 error("m4: cannot unlink.");
169}
170
171/*
172 * Very fatal error. Close all files
173 * and die hard.
174 */
175error(s)
176char *s;
177{
178 killdiv();
179 fprintf(stderr,"%s\n",s);
180 exit(1);
181}
182
183/*
184 * Interrupt handling
185 */
186static char *msg = "\ninterrupted.";
187
188void
189onintr() {
190 error(msg);
191}
192
193/*
194 * killdiv - get rid of the diversion files
195 *
196 */
197killdiv() {
198 register int n;
199
200 for (n = 0; n < MAXOUT; n++)
201 if (outfile[n] != NULL) {
202 (void) fclose (outfile[n]);
203 m4temp[UNIQUE] = n + '0';
204 (void) unlink (m4temp);
205 }
206}
207
208usage() {
209 fprintf(stderr, "usage: m4 [-Dname[=val]] [-Uname]\n");
210 exit(1);
211}