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