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