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