utils.c revision 0e20ee16
1
2  /*\
3   * $Xorg: utils.c,v 1.5 2000/08/17 19:54:50 cpqbld Exp $
4   *
5   *		              COPYRIGHT 1990
6   *		        DIGITAL EQUIPMENT CORPORATION
7   *		           MAYNARD, MASSACHUSETTS
8   *			    ALL RIGHTS RESERVED.
9   *
10   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
11   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
12   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE
13   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED
14   * WARRANTY.
15   *
16   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
17   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
18   * ADDITION TO THAT SET FORTH ABOVE.
19   *
20   * Permission to use, copy, modify, and distribute this software and its
21   * documentation for any purpose and without fee is hereby granted, provided
22   * that the above copyright notice appear in all copies and that both that
23   * copyright notice and this permission notice appear in supporting
24   * documentation, and that the name of Digital Equipment Corporation not be
25   * used in advertising or publicity pertaining to distribution of the
26   * software without specific, written prior permission.
27  \*/
28/* $XFree86: xc/programs/xkbprint/utils.c,v 3.4 2001/01/17 23:46:11 dawes Exp $ */
29
30#include 	"utils.h"
31#include	<ctype.h>
32#include	<stdlib.h>
33
34/***====================================================================***/
35
36Opaque
37uAlloc(size)
38    unsigned	size;
39{
40    return((Opaque)malloc(size));
41}
42
43/***====================================================================***/
44
45Opaque
46uCalloc(n,size)
47    unsigned	n;
48    unsigned	size;
49{
50    return((Opaque)calloc(n,size));
51}
52
53/***====================================================================***/
54
55Opaque
56uRealloc(old,newSize)
57    Opaque	old;
58    unsigned	newSize;
59{
60    if (old==NULL)
61	 return((Opaque)malloc(newSize));
62    else return((Opaque)realloc((char *)old,newSize));
63}
64
65/***====================================================================***/
66
67Opaque
68uRecalloc(old,nOld,nNew,itemSize)
69    Opaque	old;
70    unsigned	nOld;
71    unsigned	nNew;
72    unsigned	itemSize;
73{
74char *rtrn;
75
76    if (old==NULL)
77	 rtrn= (char *)calloc(nNew,itemSize);
78    else {
79	rtrn= (char *)realloc((char *)old,nNew*itemSize);
80   	if ((rtrn)&&(nNew>nOld)) {
81	    bzero(&rtrn[nOld*itemSize],(nNew-nOld)*itemSize);
82	}
83    }
84    return (Opaque)rtrn;
85}
86
87/***====================================================================***/
88
89void
90uFree(ptr)
91    Opaque ptr;
92{
93    if (ptr!=(Opaque)NULL)
94	free((char *)ptr);
95    return;
96}
97
98/***====================================================================***/
99/***                  FUNCTION ENTRY TRACKING                           ***/
100/***====================================================================***/
101
102static	FILE	*entryFile=	NULL;
103	int	 uEntryLevel;
104
105Boolean
106uSetEntryFile(name)
107    char *name;
108{
109    if ((entryFile!=NULL)&&(entryFile!=stderr)) {
110	fprintf(entryFile,"switching to %s\n",name?name:"stderr");
111	fclose(entryFile);
112    }
113    if (name!=NullString)	entryFile=	fopen(name,"w");
114    else			entryFile=	stderr;
115    if (entryFile==NULL) {
116	entryFile=	stderr;
117	return(False);
118    }
119    return(True);
120}
121
122void
123uEntry(int l, char *s,...)
124{
125int	i;
126va_list ap;
127
128    va_start(ap, s);
129    for (i=0;i<uEntryLevel;i++) {
130	putc(' ',entryFile);
131    }
132    vfprintf(entryFile,s,ap);
133    uEntryLevel+= l;
134    va_end(ap);
135    return;
136}
137
138void
139uExit(l,rtVal)
140    int		l;
141    char *	rtVal;
142{
143int	i;
144
145    uEntryLevel-= l;
146    if (uEntryLevel<0)	uEntryLevel=	0;
147    for (i=0;i<uEntryLevel;i++) {
148	putc(' ',entryFile);
149    }
150    fprintf(entryFile,"---> 0x%p\n",rtVal);
151    return;
152}
153
154/***====================================================================***/
155/***			PRINT FUNCTIONS					***/
156/***====================================================================***/
157
158	FILE	*uDebugFile=		NULL;
159	int	 uDebugIndentLevel=	0;
160	int	 uDebugIndentSize=	4;
161
162Boolean
163uSetDebugFile(name)
164    char *name;
165{
166    if ((uDebugFile!=NULL)&&(uDebugFile!=stderr)) {
167	fprintf(uDebugFile,"switching to %s\n",name?name:"stderr");
168	fclose(uDebugFile);
169    }
170    if (name!=NullString)	uDebugFile=	fopen(name,"w");
171    else			uDebugFile=	stderr;
172    if (uDebugFile==NULL) {
173	uDebugFile=	stderr;
174	return(False);
175    }
176    return(True);
177}
178
179void
180uDebug(char *s,...)
181{
182int	i;
183va_list ap;
184
185    va_start(ap, s);
186    for (i=(uDebugIndentLevel*uDebugIndentSize);i>0;i--) {
187	putc(' ',uDebugFile);
188    }
189    vfprintf(uDebugFile,s,ap);
190    fflush(uDebugFile);
191    va_end(ap);
192    return;
193}
194
195void
196uDebugNOI(char *s,...)
197{
198va_list ap;
199
200    va_start(ap, s);
201    vfprintf(uDebugFile,s,ap);
202    fflush(uDebugFile);
203    va_end(ap);
204    return;
205}
206
207/***====================================================================***/
208
209static	FILE	*errorFile=	NULL;
210
211Boolean
212uSetErrorFile(char *name)
213{
214    if ((errorFile!=NULL)&&(errorFile!=stderr)) {
215	fprintf(errorFile,"switching to %s\n",name?name:"stderr");
216	fclose(errorFile);
217    }
218    if (name!=NullString)	errorFile=	fopen(name,"w");
219    else			errorFile=	stderr;
220    if (errorFile==NULL) {
221	errorFile=	stderr;
222	return(False);
223    }
224    return(True);
225}
226
227void
228uInformation(char *s,...)
229{
230    va_list ap;
231
232    va_start(ap, s);
233    vfprintf(errorFile,s,ap);
234    fflush(errorFile);
235    va_end(ap);
236    return;
237}
238
239/***====================================================================***/
240
241void
242uAction(char *s,...)
243{
244    va_list ap;
245
246    va_start(ap, s);
247    fprintf(errorFile,"                  ");
248    vfprintf(errorFile,s,ap);
249    fflush(errorFile);
250    va_end(ap);
251    return;
252}
253
254/***====================================================================***/
255
256void
257uWarning(char *s,...)
258{
259    va_list ap;
260
261    va_start(ap, s);
262    fprintf(errorFile,"Warning:          ");
263    vfprintf(errorFile,s,ap);
264    fflush(errorFile);
265    va_end(ap);
266    return;
267}
268
269/***====================================================================***/
270
271void
272uError(char *s,...)
273{
274    va_list ap;
275
276    va_start(ap, s);
277    fprintf(errorFile,"Error:            ");
278    vfprintf(errorFile,s,ap);
279    fflush(errorFile);
280    va_end(ap);
281    return;
282}
283
284/***====================================================================***/
285
286void
287uFatalError(char *s,...)
288{
289    va_list ap;
290
291    va_start(ap, s);
292    fprintf(errorFile,"Fatal Error:      ");
293    vfprintf(errorFile,s,ap);
294    fprintf(errorFile,"                  Exiting\n");
295    fflush(errorFile);
296    va_end(ap);
297    exit(1);
298    /* NOTREACHED */
299}
300
301/***====================================================================***/
302
303void
304uInternalError(char *s,...)
305{
306    va_list ap;
307
308    va_start(ap, s);
309    fprintf(errorFile,"Internal error:   ");
310    vfprintf(errorFile,s,ap);
311    fflush(errorFile);
312    va_end(ap);
313    return;
314}
315
316/***====================================================================***/
317
318#ifndef HAVE_STRDUP
319char *
320uStringDup(str)
321    char *str;
322{
323char *rtrn;
324
325    if (str==NULL)
326	return NULL;
327    rtrn= (char *)uAlloc(strlen(str)+1);
328    strcpy(rtrn,str);
329    return rtrn;
330}
331#endif
332
333#ifndef HAVE_STRCASECMP
334int
335uStrCaseCmp(str1, str2)
336    char *str1, *str2;
337{
338    char buf1[512],buf2[512];
339    char c, *s;
340    register int n;
341
342    for (n=0, s = buf1; (c = *str1++); n++) {
343	if (isupper(c))
344	    c = tolower(c);
345	if (n>510)
346	    break;
347	*s++ = c;
348    }
349    *s = '\0';
350    for (n=0, s = buf2; (c = *str2++); n++) {
351	if (isupper(c))
352	    c = tolower(c);
353	if (n>510)
354	    break;
355	*s++ = c;
356    }
357    *s = '\0';
358    return (strcmp(buf1, buf2));
359}
360
361int
362uStrCasePrefix(prefix, str)
363    char *prefix, *str;
364{
365    char c1;
366    char c2;
367    while (((c1=*prefix)!='\0')&&((c2=*str)!='\0')) {
368	if (isupper(c1))	c1= tolower(c1);
369	if (isupper(c2))	c2= tolower(c2);
370	if (c1!=c2)
371	    return 0;
372	prefix++; str++;
373    }
374    if (c1!='\0')
375	return 0;
376    return 1;
377}
378
379#endif
380