perl 1.0 patch 14: a2p incorrectly translates 'for (a in b)' construct.
[p5sagit/p5-mst-13.2.git] / x2p / util.c
CommitLineData
8d063cd8 1/* $Header: util.c,v 1.0 87/12/18 13:07:34 root Exp $
2 *
3 * $Log: util.c,v $
4 * Revision 1.0 87/12/18 13:07:34 root
5 * Initial revision
6 *
7 */
8
9#include <stdio.h>
10
11#include "handy.h"
12#include "EXTERN.h"
13#include "a2p.h"
14#include "INTERN.h"
15#include "util.h"
16
17#define FLUSH
18#define MEM_SIZE unsigned int
19
20static char nomem[] = "Out of memory!\n";
21
22/* paranoid version of malloc */
23
24static int an = 0;
25
26char *
27safemalloc(size)
28MEM_SIZE size;
29{
30 char *ptr;
31 char *malloc();
32
33 ptr = malloc(size?size:1); /* malloc(0) is NASTY on our system */
34#ifdef DEBUGGING
35 if (debug & 128)
36 fprintf(stderr,"0x%x: (%05d) malloc %d bytes\n",ptr,an++,size);
37#endif
38 if (ptr != Nullch)
39 return ptr;
40 else {
41 fputs(nomem,stdout) FLUSH;
42 exit(1);
43 }
44 /*NOTREACHED*/
45}
46
47/* paranoid version of realloc */
48
49char *
50saferealloc(where,size)
51char *where;
52MEM_SIZE size;
53{
54 char *ptr;
55 char *realloc();
56
57 ptr = realloc(where,size?size:1); /* realloc(0) is NASTY on our system */
58#ifdef DEBUGGING
59 if (debug & 128) {
60 fprintf(stderr,"0x%x: (%05d) rfree\n",where,an++);
61 fprintf(stderr,"0x%x: (%05d) realloc %d bytes\n",ptr,an++,size);
62 }
63#endif
64 if (ptr != Nullch)
65 return ptr;
66 else {
67 fputs(nomem,stdout) FLUSH;
68 exit(1);
69 }
70 /*NOTREACHED*/
71}
72
73/* safe version of free */
74
75safefree(where)
76char *where;
77{
78#ifdef DEBUGGING
79 if (debug & 128)
80 fprintf(stderr,"0x%x: (%05d) free\n",where,an++);
81#endif
82 free(where);
83}
84
85/* safe version of string copy */
86
87char *
88safecpy(to,from,len)
89char *to;
90register char *from;
91register int len;
92{
93 register char *dest = to;
94
95 if (from != Nullch)
96 for (len--; len && (*dest++ = *from++); len--) ;
97 *dest = '\0';
98 return to;
99}
100
101#ifdef undef
102/* safe version of string concatenate, with \n deletion and space padding */
103
104char *
105safecat(to,from,len)
106char *to;
107register char *from;
108register int len;
109{
110 register char *dest = to;
111
112 len--; /* leave room for null */
113 if (*dest) {
114 while (len && *dest++) len--;
115 if (len) {
116 len--;
117 *(dest-1) = ' ';
118 }
119 }
120 if (from != Nullch)
121 while (len && (*dest++ = *from++)) len--;
122 if (len)
123 dest--;
124 if (*(dest-1) == '\n')
125 dest--;
126 *dest = '\0';
127 return to;
128}
129#endif
130
131/* copy a string up to some (non-backslashed) delimiter, if any */
132
133char *
134cpytill(to,from,delim)
135register char *to, *from;
136register int delim;
137{
138 for (; *from; from++,to++) {
139 if (*from == '\\' && from[1] == delim)
140 *to++ = *from++;
141 else if (*from == delim)
142 break;
143 *to = *from;
144 }
145 *to = '\0';
146 return from;
147}
148
149char *
150cpy2(to,from,delim)
151register char *to, *from;
152register int delim;
153{
154 for (; *from; from++,to++) {
155 if (*from == '\\' && from[1] == delim)
156 *to++ = *from++;
157 else if (*from == '$')
158 *to++ = '\\';
159 else if (*from == delim)
160 break;
161 *to = *from;
162 }
163 *to = '\0';
164 return from;
165}
166
167/* return ptr to little string in big string, NULL if not found */
168
169char *
170instr(big, little)
171char *big, *little;
172
173{
174 register char *t, *s, *x;
175
176 for (t = big; *t; t++) {
177 for (x=t,s=little; *s; x++,s++) {
178 if (!*x)
179 return Nullch;
180 if (*s != *x)
181 break;
182 }
183 if (!*s)
184 return t;
185 }
186 return Nullch;
187}
188
189/* copy a string to a safe spot */
190
191char *
192savestr(str)
193char *str;
194{
195 register char *newaddr = safemalloc((MEM_SIZE)(strlen(str)+1));
196
197 (void)strcpy(newaddr,str);
198 return newaddr;
199}
200
201/* grow a static string to at least a certain length */
202
203void
204growstr(strptr,curlen,newlen)
205char **strptr;
206int *curlen;
207int newlen;
208{
209 if (newlen > *curlen) { /* need more room? */
210 if (*curlen)
211 *strptr = saferealloc(*strptr,(MEM_SIZE)newlen);
212 else
213 *strptr = safemalloc((MEM_SIZE)newlen);
214 *curlen = newlen;
215 }
216}
217
218/*VARARGS1*/
219fatal(pat,a1,a2,a3,a4)
220char *pat;
221{
222 fprintf(stderr,pat,a1,a2,a3,a4);
223 exit(1);
224}
225
226static bool firstsetenv = TRUE;
227extern char **environ;
228
229void
230setenv(nam,val)
231char *nam, *val;
232{
233 register int i=envix(nam); /* where does it go? */
234
235 if (!environ[i]) { /* does not exist yet */
236 if (firstsetenv) { /* need we copy environment? */
237 int j;
238#ifndef lint
239 char **tmpenv = (char**) /* point our wand at memory */
240 safemalloc((i+2) * sizeof(char*));
241#else
242 char **tmpenv = Null(char **);
243#endif /* lint */
244
245 firstsetenv = FALSE;
246 for (j=0; j<i; j++) /* copy environment */
247 tmpenv[j] = environ[j];
248 environ = tmpenv; /* tell exec where it is now */
249 }
250#ifndef lint
251 else
252 environ = (char**) saferealloc((char*) environ,
253 (i+2) * sizeof(char*));
254 /* just expand it a bit */
255#endif /* lint */
256 environ[i+1] = Nullch; /* make sure it's null terminated */
257 }
258 environ[i] = safemalloc(strlen(nam) + strlen(val) + 2);
259 /* this may or may not be in */
260 /* the old environ structure */
261 sprintf(environ[i],"%s=%s",nam,val);/* all that work just for this */
262}
263
264int
265envix(nam)
266char *nam;
267{
268 register int i, len = strlen(nam);
269
270 for (i = 0; environ[i]; i++) {
271 if (strnEQ(environ[i],nam,len) && environ[i][len] == '=')
272 break; /* strnEQ must come first to avoid */
273 } /* potential SEGV's */
274 return i;
275}