Add documentation and '-h' option to perlbug
[p5sagit/p5-mst-13.2.git] / x2p / util.c
CommitLineData
79072805 1/* $RCSfile: util.c,v $$Revision: 4.1 $$Date: 92/08/07 18:29:29 $
a687059c 2 *
d48672a2 3 * Copyright (c) 1991, Larry Wall
a687059c 4 *
d48672a2 5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
8d063cd8 7 *
8 * $Log: util.c,v $
8d063cd8 9 */
10
8d063cd8 11#include "EXTERN.h"
12#include "a2p.h"
13#include "INTERN.h"
14#include "util.h"
15
55497cff 16#ifdef I_STDARG
17# include <stdarg.h>
18#endif
8d063cd8 19#define FLUSH
8d063cd8 20
21static char nomem[] = "Out of memory!\n";
22
23/* paranoid version of malloc */
24
8d063cd8 25
75f92628 26Malloc_t
8d063cd8 27safemalloc(size)
28MEM_SIZE size;
29{
6d82b384 30 Malloc_t ptr;
8d063cd8 31
6d82b384 32 /* malloc(0) is NASTY on some systems */
33 ptr = malloc(size ? size : 1);
8d063cd8 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
75f92628 49Malloc_t
8d063cd8 50saferealloc(where,size)
6d82b384 51Malloc_t where;
8d063cd8 52MEM_SIZE size;
53{
6d82b384 54 Malloc_t ptr;
8d063cd8 55
6d82b384 56 /* realloc(0) is NASTY on some systems */
57 ptr = realloc(where, size ? size : 1);
8d063cd8 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
6d82b384 75Free_t
8d063cd8 76safefree(where)
6d82b384 77Malloc_t where;
8d063cd8 78{
79#ifdef DEBUGGING
80 if (debug & 128)
81 fprintf(stderr,"0x%x: (%05d) free\n",where,an++);
82#endif
83 free(where);
84}
85
86/* safe version of string copy */
87
88char *
89safecpy(to,from,len)
90char *to;
91register char *from;
92register int len;
93{
94 register char *dest = to;
95
96 if (from != Nullch)
97 for (len--; len && (*dest++ = *from++); len--) ;
98 *dest = '\0';
99 return to;
100}
101
8d063cd8 102/* copy a string up to some (non-backslashed) delimiter, if any */
103
104char *
105cpytill(to,from,delim)
106register char *to, *from;
107register int delim;
108{
109 for (; *from; from++,to++) {
378cc40b 110 if (*from == '\\') {
111 if (from[1] == delim)
112 from++;
113 else if (from[1] == '\\')
114 *to++ = *from++;
115 }
8d063cd8 116 else if (*from == delim)
117 break;
118 *to = *from;
119 }
120 *to = '\0';
121 return from;
122}
123
378cc40b 124
8d063cd8 125char *
126cpy2(to,from,delim)
127register char *to, *from;
128register int delim;
129{
130 for (; *from; from++,to++) {
378cc40b 131 if (*from == '\\')
8d063cd8 132 *to++ = *from++;
133 else if (*from == '$')
134 *to++ = '\\';
135 else if (*from == delim)
136 break;
137 *to = *from;
138 }
139 *to = '\0';
140 return from;
141}
142
143/* return ptr to little string in big string, NULL if not found */
144
145char *
146instr(big, little)
147char *big, *little;
148
149{
150 register char *t, *s, *x;
151
152 for (t = big; *t; t++) {
153 for (x=t,s=little; *s; x++,s++) {
154 if (!*x)
155 return Nullch;
156 if (*s != *x)
157 break;
158 }
159 if (!*s)
160 return t;
161 }
162 return Nullch;
163}
164
165/* copy a string to a safe spot */
166
167char *
168savestr(str)
169char *str;
170{
171 register char *newaddr = safemalloc((MEM_SIZE)(strlen(str)+1));
172
173 (void)strcpy(newaddr,str);
174 return newaddr;
175}
176
177/* grow a static string to at least a certain length */
178
179void
180growstr(strptr,curlen,newlen)
181char **strptr;
182int *curlen;
183int newlen;
184{
185 if (newlen > *curlen) { /* need more room? */
186 if (*curlen)
187 *strptr = saferealloc(*strptr,(MEM_SIZE)newlen);
188 else
189 *strptr = safemalloc((MEM_SIZE)newlen);
190 *curlen = newlen;
191 }
192}
193
e50aee73 194void
55497cff 195#if defined(I_STDARG) && defined(HAS_VPRINTF)
196croak(char *pat,...)
197#else /* I_STDARG */
198/*VARARGS1*/
a0d0e21e 199croak(pat,a1,a2,a3,a4)
55497cff 200 char *pat;
201 int a1,a2,a3,a4;
202#endif /* I_STDARG */
a0d0e21e 203{
55497cff 204#if defined(I_STDARG) && defined(HAS_VPRINTF)
205 va_list args;
206
207 va_start(args, pat);
208 vfprintf(stderr,pat,args);
209#else
a0d0e21e 210 fprintf(stderr,pat,a1,a2,a3,a4);
55497cff 211#endif
a0d0e21e 212 exit(1);
213}
214
e50aee73 215void
55497cff 216#if defined(I_STDARG) && defined(HAS_VPRINTF)
217fatal(char *pat,...)
218#else /* I_STDARG */
219/*VARARGS1*/
8d063cd8 220fatal(pat,a1,a2,a3,a4)
55497cff 221 char *pat;
222 int a1,a2,a3,a4;
223#endif /* I_STDARG */
8d063cd8 224{
55497cff 225#if defined(I_STDARG) && defined(HAS_VPRINTF)
226 va_list args;
227
228 va_start(args, pat);
229 vfprintf(stderr,pat,args);
230#else
8d063cd8 231 fprintf(stderr,pat,a1,a2,a3,a4);
55497cff 232#endif
8d063cd8 233 exit(1);
234}
235
9c8d0b29 236void
55497cff 237#if defined(I_STDARG) && defined(HAS_VPRINTF)
238warn(char *pat,...)
239#else /* I_STDARG */
240/*VARARGS1*/
a687059c 241warn(pat,a1,a2,a3,a4)
55497cff 242 char *pat;
243 int a1,a2,a3,a4;
244#endif /* I_STDARG */
a687059c 245{
55497cff 246#if defined(I_STDARG) && defined(HAS_VPRINTF)
247 va_list args;
248
249 va_start(args, pat);
250 vfprintf(stderr,pat,args);
251#else
a687059c 252 fprintf(stderr,pat,a1,a2,a3,a4);
55497cff 253#endif
a687059c 254}
255