Patch for 'perldoc -f'
[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 *
9607fc9c 3 * Copyright (c) 1991-1997, 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)
68dc0745 36 fprintf(stderr,"0x%lx: (%05d) malloc %d bytes\n",(unsigned long)ptr,
37 an++,size);
8d063cd8 38#endif
39 if (ptr != Nullch)
40 return ptr;
41 else {
42 fputs(nomem,stdout) FLUSH;
43 exit(1);
44 }
45 /*NOTREACHED*/
46}
47
48/* paranoid version of realloc */
49
75f92628 50Malloc_t
8d063cd8 51saferealloc(where,size)
6d82b384 52Malloc_t where;
8d063cd8 53MEM_SIZE size;
54{
6d82b384 55 Malloc_t ptr;
8d063cd8 56
6d82b384 57 /* realloc(0) is NASTY on some systems */
58 ptr = realloc(where, size ? size : 1);
8d063cd8 59#ifdef DEBUGGING
60 if (debug & 128) {
68dc0745 61 fprintf(stderr,"0x%lx: (%05d) rfree\n",(unsigned long)where,an++);
62 fprintf(stderr,"0x%lx: (%05d) realloc %d bytes\n",(unsigned long)ptr,an++,size);
8d063cd8 63 }
64#endif
65 if (ptr != Nullch)
66 return ptr;
67 else {
68 fputs(nomem,stdout) FLUSH;
69 exit(1);
70 }
71 /*NOTREACHED*/
72}
73
74/* safe version of free */
75
6d82b384 76Free_t
8d063cd8 77safefree(where)
6d82b384 78Malloc_t where;
8d063cd8 79{
80#ifdef DEBUGGING
81 if (debug & 128)
68dc0745 82 fprintf(stderr,"0x%lx: (%05d) free\n",(unsigned long)where,an++);
8d063cd8 83#endif
84 free(where);
85}
86
87/* safe version of string copy */
88
89char *
90safecpy(to,from,len)
91char *to;
92register char *from;
93register int len;
94{
95 register char *dest = to;
96
97 if (from != Nullch)
98 for (len--; len && (*dest++ = *from++); len--) ;
99 *dest = '\0';
100 return to;
101}
102
8d063cd8 103/* copy a string up to some (non-backslashed) delimiter, if any */
104
105char *
106cpytill(to,from,delim)
107register char *to, *from;
108register int delim;
109{
110 for (; *from; from++,to++) {
378cc40b 111 if (*from == '\\') {
112 if (from[1] == delim)
113 from++;
114 else if (from[1] == '\\')
115 *to++ = *from++;
116 }
8d063cd8 117 else if (*from == delim)
118 break;
119 *to = *from;
120 }
121 *to = '\0';
122 return from;
123}
124
378cc40b 125
8d063cd8 126char *
127cpy2(to,from,delim)
128register char *to, *from;
129register int delim;
130{
131 for (; *from; from++,to++) {
378cc40b 132 if (*from == '\\')
8d063cd8 133 *to++ = *from++;
134 else if (*from == '$')
135 *to++ = '\\';
136 else if (*from == delim)
137 break;
138 *to = *from;
139 }
140 *to = '\0';
141 return from;
142}
143
144/* return ptr to little string in big string, NULL if not found */
145
146char *
147instr(big, little)
148char *big, *little;
149
150{
151 register char *t, *s, *x;
152
153 for (t = big; *t; t++) {
154 for (x=t,s=little; *s; x++,s++) {
155 if (!*x)
156 return Nullch;
157 if (*s != *x)
158 break;
159 }
160 if (!*s)
161 return t;
162 }
163 return Nullch;
164}
165
166/* copy a string to a safe spot */
167
168char *
169savestr(str)
170char *str;
171{
172 register char *newaddr = safemalloc((MEM_SIZE)(strlen(str)+1));
173
174 (void)strcpy(newaddr,str);
175 return newaddr;
176}
177
178/* grow a static string to at least a certain length */
179
180void
181growstr(strptr,curlen,newlen)
182char **strptr;
183int *curlen;
184int newlen;
185{
186 if (newlen > *curlen) { /* need more room? */
187 if (*curlen)
188 *strptr = saferealloc(*strptr,(MEM_SIZE)newlen);
189 else
190 *strptr = safemalloc((MEM_SIZE)newlen);
191 *curlen = newlen;
192 }
193}
194
e50aee73 195void
55497cff 196#if defined(I_STDARG) && defined(HAS_VPRINTF)
197croak(char *pat,...)
198#else /* I_STDARG */
199/*VARARGS1*/
a0d0e21e 200croak(pat,a1,a2,a3,a4)
55497cff 201 char *pat;
202 int a1,a2,a3,a4;
203#endif /* I_STDARG */
a0d0e21e 204{
55497cff 205#if defined(I_STDARG) && defined(HAS_VPRINTF)
206 va_list args;
207
208 va_start(args, pat);
209 vfprintf(stderr,pat,args);
210#else
a0d0e21e 211 fprintf(stderr,pat,a1,a2,a3,a4);
55497cff 212#endif
a0d0e21e 213 exit(1);
214}
215
e50aee73 216void
55497cff 217#if defined(I_STDARG) && defined(HAS_VPRINTF)
218fatal(char *pat,...)
219#else /* I_STDARG */
220/*VARARGS1*/
8d063cd8 221fatal(pat,a1,a2,a3,a4)
55497cff 222 char *pat;
223 int a1,a2,a3,a4;
224#endif /* I_STDARG */
8d063cd8 225{
55497cff 226#if defined(I_STDARG) && defined(HAS_VPRINTF)
227 va_list args;
228
229 va_start(args, pat);
230 vfprintf(stderr,pat,args);
231#else
8d063cd8 232 fprintf(stderr,pat,a1,a2,a3,a4);
55497cff 233#endif
8d063cd8 234 exit(1);
235}
236
9c8d0b29 237void
55497cff 238#if defined(I_STDARG) && defined(HAS_VPRINTF)
239warn(char *pat,...)
240#else /* I_STDARG */
241/*VARARGS1*/
a687059c 242warn(pat,a1,a2,a3,a4)
55497cff 243 char *pat;
244 int a1,a2,a3,a4;
245#endif /* I_STDARG */
a687059c 246{
55497cff 247#if defined(I_STDARG) && defined(HAS_VPRINTF)
248 va_list args;
249
250 va_start(args, pat);
251 vfprintf(stderr,pat,args);
252#else
a687059c 253 fprintf(stderr,pat,a1,a2,a3,a4);
55497cff 254#endif
a687059c 255}
256