utils.c revision 010cdda0
1010cdda0Smrg
2010cdda0Smrg  /*\
3010cdda0Smrg   * $Xorg: utils.c,v 1.6 2000/08/17 19:54:51 cpqbld Exp $
4010cdda0Smrg   *
5010cdda0Smrg   *		              COPYRIGHT 1990
6010cdda0Smrg   *		        DIGITAL EQUIPMENT CORPORATION
7010cdda0Smrg   *		           MAYNARD, MASSACHUSETTS
8010cdda0Smrg   *			    ALL RIGHTS RESERVED.
9010cdda0Smrg   *
10010cdda0Smrg   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
11010cdda0Smrg   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
12010cdda0Smrg   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE
13010cdda0Smrg   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED
14010cdda0Smrg   * WARRANTY.
15010cdda0Smrg   *
16010cdda0Smrg   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
17010cdda0Smrg   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
18010cdda0Smrg   * ADDITION TO THAT SET FORTH ABOVE.
19010cdda0Smrg   *
20010cdda0Smrg   * Permission to use, copy, modify, and distribute this software and its
21010cdda0Smrg   * documentation for any purpose and without fee is hereby granted, provided
22010cdda0Smrg   * that the above copyright notice appear in all copies and that both that
23010cdda0Smrg   * copyright notice and this permission notice appear in supporting
24010cdda0Smrg   * documentation, and that the name of Digital Equipment Corporation not be
25010cdda0Smrg   * used in advertising or publicity pertaining to distribution of the
26010cdda0Smrg   * software without specific, written prior permission.
27010cdda0Smrg  \*/
28010cdda0Smrg/* $XFree86: xc/programs/xkbutils/utils.c,v 3.4 2001/01/17 23:46:13 dawes Exp $ */
29010cdda0Smrg
30010cdda0Smrg#include 	"utils.h"
31010cdda0Smrg#include	<ctype.h>
32010cdda0Smrg#include	<stdlib.h>
33010cdda0Smrg
34010cdda0Smrg/***====================================================================***/
35010cdda0Smrg
36010cdda0SmrgOpaque
37010cdda0SmrguAlloc(size)
38010cdda0Smrg    unsigned	size;
39010cdda0Smrg{
40010cdda0Smrg    return((Opaque)malloc(size));
41010cdda0Smrg}
42010cdda0Smrg
43010cdda0Smrg/***====================================================================***/
44010cdda0Smrg
45010cdda0SmrgOpaque
46010cdda0SmrguCalloc(n,size)
47010cdda0Smrg    unsigned	n;
48010cdda0Smrg    unsigned	size;
49010cdda0Smrg{
50010cdda0Smrg    return((Opaque)calloc(n,size));
51010cdda0Smrg}
52010cdda0Smrg
53010cdda0Smrg/***====================================================================***/
54010cdda0Smrg
55010cdda0SmrgOpaque
56010cdda0SmrguRealloc(old,newSize)
57010cdda0Smrg    Opaque	old;
58010cdda0Smrg    unsigned	newSize;
59010cdda0Smrg{
60010cdda0Smrg    if (old==NULL)
61010cdda0Smrg	 return((Opaque)malloc(newSize));
62010cdda0Smrg    else return((Opaque)realloc((char *)old,newSize));
63010cdda0Smrg}
64010cdda0Smrg
65010cdda0Smrg/***====================================================================***/
66010cdda0Smrg
67010cdda0SmrgOpaque
68010cdda0SmrguRecalloc(old,nOld,nNew,itemSize)
69010cdda0Smrg    Opaque	old;
70010cdda0Smrg    unsigned	nOld;
71010cdda0Smrg    unsigned	nNew;
72010cdda0Smrg    unsigned	itemSize;
73010cdda0Smrg{
74010cdda0Smrgchar *rtrn;
75010cdda0Smrg
76010cdda0Smrg    if (old==NULL)
77010cdda0Smrg	 rtrn= (char *)calloc(nNew,itemSize);
78010cdda0Smrg    else {
79010cdda0Smrg	rtrn= (char *)realloc((char *)old,nNew*itemSize);
80010cdda0Smrg   	if ((rtrn)&&(nNew>nOld)) {
81010cdda0Smrg	    bzero(&rtrn[nOld*itemSize],(nNew-nOld)*itemSize);
82010cdda0Smrg	}
83010cdda0Smrg    }
84010cdda0Smrg    return (Opaque)rtrn;
85010cdda0Smrg}
86010cdda0Smrg
87010cdda0Smrg/***====================================================================***/
88010cdda0Smrg
89010cdda0Smrgvoid
90010cdda0SmrguFree(ptr)
91010cdda0Smrg    Opaque ptr;
92010cdda0Smrg{
93010cdda0Smrg    if (ptr!=(Opaque)NULL)
94010cdda0Smrg	free((char *)ptr);
95010cdda0Smrg    return;
96010cdda0Smrg}
97010cdda0Smrg
98010cdda0Smrg/***====================================================================***/
99010cdda0Smrg/***                  FUNCTION ENTRY TRACKING                           ***/
100010cdda0Smrg/***====================================================================***/
101010cdda0Smrg
102010cdda0Smrgstatic	FILE	*entryFile=	NULL;
103010cdda0Smrg	int	 uEntryLevel;
104010cdda0Smrg
105010cdda0SmrgBoolean
106010cdda0SmrguSetEntryFile(name)
107010cdda0Smrg    char *name;
108010cdda0Smrg{
109010cdda0Smrg    if ((entryFile!=NULL)&&(entryFile!=stderr)) {
110010cdda0Smrg	fprintf(entryFile,"switching to %s\n",name?name:"stderr");
111010cdda0Smrg	fclose(entryFile);
112010cdda0Smrg    }
113010cdda0Smrg    if (name!=NullString)	entryFile=	fopen(name,"w");
114010cdda0Smrg    else			entryFile=	stderr;
115010cdda0Smrg    if (entryFile==NULL) {
116010cdda0Smrg	entryFile=	stderr;
117010cdda0Smrg	return(False);
118010cdda0Smrg    }
119010cdda0Smrg    return(True);
120010cdda0Smrg}
121010cdda0Smrg
122010cdda0Smrgvoid
123010cdda0SmrguEntry(int l, char *s,...)
124010cdda0Smrg{
125010cdda0Smrgint	i;
126010cdda0Smrgva_list ap;
127010cdda0Smrg
128010cdda0Smrg    va_start(ap, s);
129010cdda0Smrg    for (i=0;i<uEntryLevel;i++) {
130010cdda0Smrg	putc(' ',entryFile);
131010cdda0Smrg    }
132010cdda0Smrg    vfprintf(entryFile,s,ap);
133010cdda0Smrg    uEntryLevel+= l;
134010cdda0Smrg    va_end(ap);
135010cdda0Smrg    return;
136010cdda0Smrg}
137010cdda0Smrg
138010cdda0Smrgvoid
139010cdda0SmrguExit(l,rtVal)
140010cdda0Smrg    int		l;
141010cdda0Smrg    char *	rtVal;
142010cdda0Smrg{
143010cdda0Smrgint	i;
144010cdda0Smrg
145010cdda0Smrg    uEntryLevel-= l;
146010cdda0Smrg    if (uEntryLevel<0)	uEntryLevel=	0;
147010cdda0Smrg    for (i=0;i<uEntryLevel;i++) {
148010cdda0Smrg	putc(' ',entryFile);
149010cdda0Smrg    }
150010cdda0Smrg    fprintf(entryFile,"---> 0x%p\n",rtVal);
151010cdda0Smrg    return;
152010cdda0Smrg}
153010cdda0Smrg
154010cdda0Smrg/***====================================================================***/
155010cdda0Smrg/***			PRINT FUNCTIONS					***/
156010cdda0Smrg/***====================================================================***/
157010cdda0Smrg
158010cdda0Smrg	FILE	*uDebugFile=		NULL;
159010cdda0Smrg	int	 uDebugIndentLevel=	0;
160010cdda0Smrg	int	 uDebugIndentSize=	4;
161010cdda0Smrg
162010cdda0SmrgBoolean
163010cdda0SmrguSetDebugFile(name)
164010cdda0Smrg    char *name;
165010cdda0Smrg{
166010cdda0Smrg    if ((uDebugFile!=NULL)&&(uDebugFile!=stderr)) {
167010cdda0Smrg	fprintf(uDebugFile,"switching to %s\n",name?name:"stderr");
168010cdda0Smrg	fclose(uDebugFile);
169010cdda0Smrg    }
170010cdda0Smrg    if (name!=NullString)	uDebugFile=	fopen(name,"w");
171010cdda0Smrg    else			uDebugFile=	stderr;
172010cdda0Smrg    if (uDebugFile==NULL) {
173010cdda0Smrg	uDebugFile=	stderr;
174010cdda0Smrg	return(False);
175010cdda0Smrg    }
176010cdda0Smrg    return(True);
177010cdda0Smrg}
178010cdda0Smrg
179010cdda0Smrgvoid
180010cdda0SmrguDebug(char *s,...)
181010cdda0Smrg{
182010cdda0Smrgint	i;
183010cdda0Smrgva_list ap;
184010cdda0Smrg
185010cdda0Smrg    va_start(ap, s);
186010cdda0Smrg    for (i=(uDebugIndentLevel*uDebugIndentSize);i>0;i--) {
187010cdda0Smrg	putc(' ',uDebugFile);
188010cdda0Smrg    }
189010cdda0Smrg    vfprintf(uDebugFile,s,ap);
190010cdda0Smrg    fflush(uDebugFile);
191010cdda0Smrg    va_end(ap);
192010cdda0Smrg    return;
193010cdda0Smrg}
194010cdda0Smrg
195010cdda0Smrgvoid
196010cdda0SmrguDebugNOI(char *s,...)
197010cdda0Smrg{
198010cdda0Smrgva_list ap;
199010cdda0Smrg
200010cdda0Smrg    va_start(ap, s);
201010cdda0Smrg    vfprintf(uDebugFile,s,ap);
202010cdda0Smrg    fflush(uDebugFile);
203010cdda0Smrg    va_end(ap);
204010cdda0Smrg    return;
205010cdda0Smrg}
206010cdda0Smrg
207010cdda0Smrg/***====================================================================***/
208010cdda0Smrg
209010cdda0Smrgstatic	FILE	*errorFile=	NULL;
210010cdda0Smrg
211010cdda0SmrgBoolean
212010cdda0SmrguSetErrorFile(char *name)
213010cdda0Smrg{
214010cdda0Smrg    if ((errorFile!=NULL)&&(errorFile!=stderr)) {
215010cdda0Smrg	fprintf(errorFile,"switching to %s\n",name?name:"stderr");
216010cdda0Smrg	fclose(errorFile);
217010cdda0Smrg    }
218010cdda0Smrg    if (name!=NullString)	errorFile=	fopen(name,"w");
219010cdda0Smrg    else			errorFile=	stderr;
220010cdda0Smrg    if (errorFile==NULL) {
221010cdda0Smrg	errorFile=	stderr;
222010cdda0Smrg	return(False);
223010cdda0Smrg    }
224010cdda0Smrg    return(True);
225010cdda0Smrg}
226010cdda0Smrg
227010cdda0Smrgvoid
228010cdda0SmrguInformation(char *s,...)
229010cdda0Smrg{
230010cdda0Smrg    va_list ap;
231010cdda0Smrg
232010cdda0Smrg    va_start(ap, s);
233010cdda0Smrg    vfprintf(errorFile,s,ap);
234010cdda0Smrg    fflush(errorFile);
235010cdda0Smrg    va_end(ap);
236010cdda0Smrg    return;
237010cdda0Smrg}
238010cdda0Smrg
239010cdda0Smrg/***====================================================================***/
240010cdda0Smrg
241010cdda0Smrgvoid
242010cdda0SmrguAction(char *s,...)
243010cdda0Smrg{
244010cdda0Smrg    va_list ap;
245010cdda0Smrg
246010cdda0Smrg    va_start(ap, s);
247010cdda0Smrg    fprintf(errorFile,"                  ");
248010cdda0Smrg    vfprintf(errorFile,s,ap);
249010cdda0Smrg    fflush(errorFile);
250010cdda0Smrg    va_end(ap);
251010cdda0Smrg    return;
252010cdda0Smrg}
253010cdda0Smrg
254010cdda0Smrg/***====================================================================***/
255010cdda0Smrg
256010cdda0Smrgvoid
257010cdda0SmrguWarning(char *s,...)
258010cdda0Smrg{
259010cdda0Smrg    va_list ap;
260010cdda0Smrg
261010cdda0Smrg    va_start(ap, s);
262010cdda0Smrg    fprintf(errorFile,"Warning:          ");
263010cdda0Smrg    vfprintf(errorFile,s,ap);
264010cdda0Smrg    fflush(errorFile);
265010cdda0Smrg    va_end(ap);
266010cdda0Smrg    return;
267010cdda0Smrg}
268010cdda0Smrg
269010cdda0Smrg/***====================================================================***/
270010cdda0Smrg
271010cdda0Smrgvoid
272010cdda0SmrguError(char *s,...)
273010cdda0Smrg{
274010cdda0Smrg    va_list ap;
275010cdda0Smrg
276010cdda0Smrg    va_start(ap, s);
277010cdda0Smrg    fprintf(errorFile,"Error:            ");
278010cdda0Smrg    vfprintf(errorFile,s,ap);
279010cdda0Smrg    fflush(errorFile);
280010cdda0Smrg    va_end(ap);
281010cdda0Smrg    return;
282010cdda0Smrg}
283010cdda0Smrg
284010cdda0Smrg/***====================================================================***/
285010cdda0Smrg
286010cdda0Smrgvoid
287010cdda0SmrguFatalError(char *s,...)
288010cdda0Smrg{
289010cdda0Smrg    va_list ap;
290010cdda0Smrg
291010cdda0Smrg    va_start(ap, s);
292010cdda0Smrg    fprintf(errorFile,"Fatal Error:      ");
293010cdda0Smrg    vfprintf(errorFile,s,ap);
294010cdda0Smrg    fprintf(errorFile,"                  Exiting\n");
295010cdda0Smrg    fflush(errorFile);
296010cdda0Smrg    va_end(ap);
297010cdda0Smrg    exit(1);
298010cdda0Smrg    /* NOTREACHED */
299010cdda0Smrg}
300010cdda0Smrg
301010cdda0Smrg/***====================================================================***/
302010cdda0Smrg
303010cdda0Smrgvoid
304010cdda0SmrguInternalError(char *s,...)
305010cdda0Smrg{
306010cdda0Smrg    va_list ap;
307010cdda0Smrg
308010cdda0Smrg    va_start(ap, s);
309010cdda0Smrg    fprintf(errorFile,"Internal error:   ");
310010cdda0Smrg    vfprintf(errorFile,s,ap);
311010cdda0Smrg    fflush(errorFile);
312010cdda0Smrg    va_end(ap);
313010cdda0Smrg    return;
314010cdda0Smrg}
315010cdda0Smrg
316010cdda0Smrg/***====================================================================***/
317010cdda0Smrg
318010cdda0Smrg#ifndef HAVE_STRDUP
319010cdda0Smrgchar *
320010cdda0SmrguStringDup(str)
321010cdda0Smrg    char *str;
322010cdda0Smrg{
323010cdda0Smrgchar *rtrn;
324010cdda0Smrg
325010cdda0Smrg    if (str==NULL)
326010cdda0Smrg	return NULL;
327010cdda0Smrg    rtrn= (char *)uAlloc(strlen(str)+1);
328010cdda0Smrg    strcpy(rtrn,str);
329010cdda0Smrg    return rtrn;
330010cdda0Smrg}
331010cdda0Smrg#endif
332010cdda0Smrg
333010cdda0Smrg#ifndef HAVE_STRCASECMP
334010cdda0Smrgint
335010cdda0SmrguStrCaseCmp(str1, str2)
336010cdda0Smrg    char *str1, *str2;
337010cdda0Smrg{
338010cdda0Smrg    char buf1[512],buf2[512];
339010cdda0Smrg    char c, *s;
340010cdda0Smrg    register int n;
341010cdda0Smrg
342010cdda0Smrg    for (n=0, s = buf1; (c = *str1++); n++) {
343010cdda0Smrg	if (isupper(c))
344010cdda0Smrg	    c = tolower(c);
345010cdda0Smrg	if (n>510)
346010cdda0Smrg	    break;
347010cdda0Smrg	*s++ = c;
348010cdda0Smrg    }
349010cdda0Smrg    *s = '\0';
350010cdda0Smrg    for (n=0, s = buf2; (c = *str2++); n++) {
351010cdda0Smrg	if (isupper(c))
352010cdda0Smrg	    c = tolower(c);
353010cdda0Smrg	if (n>510)
354010cdda0Smrg	    break;
355010cdda0Smrg	*s++ = c;
356010cdda0Smrg    }
357010cdda0Smrg    *s = '\0';
358010cdda0Smrg    return (strcmp(buf1, buf2));
359010cdda0Smrg}
360010cdda0Smrg
361010cdda0Smrgint
362010cdda0SmrguStrCasePrefix(prefix, str)
363010cdda0Smrg    char *prefix, *str;
364010cdda0Smrg{
365010cdda0Smrg    char c1;
366010cdda0Smrg    char c2;
367010cdda0Smrg    while (((c1=*prefix)!='\0')&&((c2=*str)!='\0')) {
368010cdda0Smrg	if (isupper(c1))	c1= tolower(c1);
369010cdda0Smrg	if (isupper(c2))	c2= tolower(c2);
370010cdda0Smrg	if (c1!=c2)
371010cdda0Smrg	    return 0;
372010cdda0Smrg	prefix++; str++;
373010cdda0Smrg    }
374010cdda0Smrg    if (c1!='\0')
375010cdda0Smrg	return 0;
376010cdda0Smrg    return 1;
377010cdda0Smrg}
378010cdda0Smrg
379010cdda0Smrg#endif
380