Git init
[framework/uifw/xorg/util/x11-xkb-utils.git] / xkbutils / utils.c
1
2   /*\
3    * $Xorg: utils.c,v 1.6 2000/08/17 19:54:51 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/xkbutils/utils.c,v 3.4 2001/01/17 23:46:13 dawes Exp $ */
29
30 #include        "utils.h"
31 #include        <ctype.h>
32 #include        <stdlib.h>
33
34 unsigned int debugFlags;
35
36 /***====================================================================***/
37
38 Opaque
39 uAlloc(unsigned size)
40 {
41     return((Opaque)malloc(size));
42 }
43
44 /***====================================================================***/
45
46 Opaque
47 uCalloc(unsigned n, unsigned size)
48 {
49     return((Opaque)calloc(n,size));
50 }
51
52 /***====================================================================***/
53
54 Opaque
55 uRealloc(Opaque old, unsigned newSize)
56 {
57     if (old==NULL)
58          return((Opaque)malloc(newSize));
59     else return((Opaque)realloc((char *)old,newSize));
60 }
61
62 /***====================================================================***/
63
64 Opaque
65 uRecalloc(Opaque old, unsigned nOld, unsigned nNew, unsigned itemSize)
66 {
67 char *rtrn;
68
69     if (old==NULL)
70          rtrn= (char *)calloc(nNew,itemSize);
71     else {
72         rtrn= (char *)realloc((char *)old,nNew*itemSize);
73         if ((rtrn)&&(nNew>nOld)) {
74             bzero(&rtrn[nOld*itemSize],(nNew-nOld)*itemSize);
75         }
76     }
77     return (Opaque)rtrn;
78 }
79
80 /***====================================================================***/
81
82 void
83 uFree(Opaque ptr)
84 {
85     if (ptr!=(Opaque)NULL)
86         free((char *)ptr);
87     return;
88 }
89
90 /***====================================================================***/
91 /***                  FUNCTION ENTRY TRACKING                           ***/
92 /***====================================================================***/
93
94 static  FILE    *entryFile=     NULL;
95         int      uEntryLevel;
96
97 Boolean
98 uSetEntryFile(char *name)
99 {
100     if ((entryFile!=NULL)&&(entryFile!=stderr)) {
101         fprintf(entryFile,"switching to %s\n",name?name:"stderr");
102         fclose(entryFile);
103     }
104     if (name!=NullString)       entryFile=      fopen(name,"w");
105     else                        entryFile=      stderr;
106     if (entryFile==NULL) {
107         entryFile=      stderr;
108         return(False);
109     }
110     return(True);
111 }
112
113 void
114 uEntry(int l, char *s,...)
115 {
116 int     i;
117 va_list ap;
118
119     va_start(ap, s);
120     for (i=0;i<uEntryLevel;i++) {
121         putc(' ',entryFile);
122     }
123     vfprintf(entryFile,s,ap);
124     uEntryLevel+= l;
125     va_end(ap);
126     return;
127 }
128
129 void
130 uExit(int l, char *rtVal)
131 {
132 int     i;
133
134     uEntryLevel-= l;
135     if (uEntryLevel<0)  uEntryLevel=    0;
136     for (i=0;i<uEntryLevel;i++) {
137         putc(' ',entryFile);
138     }
139     fprintf(entryFile,"---> 0x%p\n",rtVal);
140     return;
141 }
142
143 /***====================================================================***/
144 /***                    PRINT FUNCTIONS                                 ***/
145 /***====================================================================***/
146
147         FILE    *uDebugFile=            NULL;
148         int      uDebugIndentLevel=     0;
149         int      uDebugIndentSize=      4;
150
151 Boolean
152 uSetDebugFile(char *name)
153 {
154     if ((uDebugFile!=NULL)&&(uDebugFile!=stderr)) {
155         fprintf(uDebugFile,"switching to %s\n",name?name:"stderr");
156         fclose(uDebugFile);
157     }
158     if (name!=NullString)       uDebugFile=     fopen(name,"w");
159     else                        uDebugFile=     stderr;
160     if (uDebugFile==NULL) {
161         uDebugFile=     stderr;
162         return(False);
163     }
164     return(True);
165 }
166
167 void
168 uDebug(char *s,...)
169 {
170 int     i;
171 va_list ap;
172
173     va_start(ap, s);
174     for (i=(uDebugIndentLevel*uDebugIndentSize);i>0;i--) {
175         putc(' ',uDebugFile);
176     }
177     vfprintf(uDebugFile,s,ap);
178     fflush(uDebugFile);
179     va_end(ap);
180     return;
181 }
182
183 void
184 uDebugNOI(char *s,...)
185 {
186 va_list ap;
187
188     va_start(ap, s);
189     vfprintf(uDebugFile,s,ap);
190     fflush(uDebugFile);
191     va_end(ap);
192     return;
193 }
194
195 /***====================================================================***/
196
197 static  FILE    *errorFile=     NULL;
198
199 Boolean
200 uSetErrorFile(char *name)
201 {
202     if ((errorFile!=NULL)&&(errorFile!=stderr)) {
203         fprintf(errorFile,"switching to %s\n",name?name:"stderr");
204         fclose(errorFile);
205     }
206     if (name!=NullString)       errorFile=      fopen(name,"w");
207     else                        errorFile=      stderr;
208     if (errorFile==NULL) {
209         errorFile=      stderr;
210         return(False);
211     }
212     return(True);
213 }
214
215 void
216 uInformation(char *s,...)
217 {
218     va_list ap;
219
220     va_start(ap, s);
221     vfprintf(errorFile,s,ap);
222     fflush(errorFile);
223     va_end(ap);
224     return;
225 }
226
227 /***====================================================================***/
228
229 void
230 uAction(char *s,...)
231 {
232     va_list ap;
233
234     va_start(ap, s);
235     fprintf(errorFile,"                  ");
236     vfprintf(errorFile,s,ap);
237     fflush(errorFile);
238     va_end(ap);
239     return;
240 }
241
242 /***====================================================================***/
243
244 void
245 uWarning(char *s,...)
246 {
247     va_list ap;
248
249     va_start(ap, s);
250     fprintf(errorFile,"Warning:          ");
251     vfprintf(errorFile,s,ap);
252     fflush(errorFile);
253     va_end(ap);
254     return;
255 }
256
257 /***====================================================================***/
258
259 void
260 uError(char *s,...)
261 {
262     va_list ap;
263
264     va_start(ap, s);
265     fprintf(errorFile,"Error:            ");
266     vfprintf(errorFile,s,ap);
267     fflush(errorFile);
268     va_end(ap);
269     return;
270 }
271
272 /***====================================================================***/
273
274 void
275 uFatalError(char *s,...)
276 {
277     va_list ap;
278
279     va_start(ap, s);
280     fprintf(errorFile,"Fatal Error:      ");
281     vfprintf(errorFile,s,ap);
282     fprintf(errorFile,"                  Exiting\n");
283     fflush(errorFile);
284     va_end(ap);
285     exit(1);
286     /* NOTREACHED */
287 }
288
289 /***====================================================================***/
290
291 void
292 uInternalError(char *s,...)
293 {
294     va_list ap;
295
296     va_start(ap, s);
297     fprintf(errorFile,"Internal error:   ");
298     vfprintf(errorFile,s,ap);
299     fflush(errorFile);
300     va_end(ap);
301     return;
302 }
303
304 /***====================================================================***/
305
306 #ifndef HAVE_STRDUP
307 char *
308 uStringDup(char *str)
309 {
310 char *rtrn;
311
312     if (str==NULL)
313         return NULL;
314     rtrn= (char *)uAlloc(strlen(str)+1);
315     strcpy(rtrn,str);
316     return rtrn;
317 }
318 #endif
319
320 #ifndef HAVE_STRCASECMP
321 int
322 uStrCaseCmp(char *str1, char *str2)
323 {
324     char buf1[512],buf2[512];
325     char c, *s;
326     register int n;
327
328     for (n=0, s = buf1; (c = *str1++); n++) {
329         if (isupper(c))
330             c = tolower(c);
331         if (n>510)
332             break;
333         *s++ = c;
334     }
335     *s = '\0';
336     for (n=0, s = buf2; (c = *str2++); n++) {
337         if (isupper(c))
338             c = tolower(c);
339         if (n>510)
340             break;
341         *s++ = c;
342     }
343     *s = '\0';
344     return (strcmp(buf1, buf2));
345 }
346
347 int
348 uStrCasePrefix(char *prefix, char *str)
349 {
350     char c1;
351     char c2;
352     while (((c1=*prefix)!='\0')&&((c2=*str)!='\0')) {
353         if (isupper(c1))        c1= tolower(c1);
354         if (isupper(c2))        c2= tolower(c2);
355         if (c1!=c2)
356             return 0;
357         prefix++; str++;
358     }
359     if (c1!='\0')
360         return 0;
361     return 1;
362 }
363
364 #endif