utils.c revision 0e20ee16
10e20ee16Smrg 20e20ee16Smrg /*\ 30e20ee16Smrg * $Xorg: utils.c,v 1.5 2000/08/17 19:54:50 cpqbld Exp $ 40e20ee16Smrg * 50e20ee16Smrg * COPYRIGHT 1990 60e20ee16Smrg * DIGITAL EQUIPMENT CORPORATION 70e20ee16Smrg * MAYNARD, MASSACHUSETTS 80e20ee16Smrg * ALL RIGHTS RESERVED. 90e20ee16Smrg * 100e20ee16Smrg * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND 110e20ee16Smrg * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. 120e20ee16Smrg * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 130e20ee16Smrg * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 140e20ee16Smrg * WARRANTY. 150e20ee16Smrg * 160e20ee16Smrg * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT 170e20ee16Smrg * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN 180e20ee16Smrg * ADDITION TO THAT SET FORTH ABOVE. 190e20ee16Smrg * 200e20ee16Smrg * Permission to use, copy, modify, and distribute this software and its 210e20ee16Smrg * documentation for any purpose and without fee is hereby granted, provided 220e20ee16Smrg * that the above copyright notice appear in all copies and that both that 230e20ee16Smrg * copyright notice and this permission notice appear in supporting 240e20ee16Smrg * documentation, and that the name of Digital Equipment Corporation not be 250e20ee16Smrg * used in advertising or publicity pertaining to distribution of the 260e20ee16Smrg * software without specific, written prior permission. 270e20ee16Smrg \*/ 280e20ee16Smrg/* $XFree86: xc/programs/xkbprint/utils.c,v 3.4 2001/01/17 23:46:11 dawes Exp $ */ 290e20ee16Smrg 300e20ee16Smrg#include "utils.h" 310e20ee16Smrg#include <ctype.h> 320e20ee16Smrg#include <stdlib.h> 330e20ee16Smrg 340e20ee16Smrg/***====================================================================***/ 350e20ee16Smrg 360e20ee16SmrgOpaque 370e20ee16SmrguAlloc(size) 380e20ee16Smrg unsigned size; 390e20ee16Smrg{ 400e20ee16Smrg return((Opaque)malloc(size)); 410e20ee16Smrg} 420e20ee16Smrg 430e20ee16Smrg/***====================================================================***/ 440e20ee16Smrg 450e20ee16SmrgOpaque 460e20ee16SmrguCalloc(n,size) 470e20ee16Smrg unsigned n; 480e20ee16Smrg unsigned size; 490e20ee16Smrg{ 500e20ee16Smrg return((Opaque)calloc(n,size)); 510e20ee16Smrg} 520e20ee16Smrg 530e20ee16Smrg/***====================================================================***/ 540e20ee16Smrg 550e20ee16SmrgOpaque 560e20ee16SmrguRealloc(old,newSize) 570e20ee16Smrg Opaque old; 580e20ee16Smrg unsigned newSize; 590e20ee16Smrg{ 600e20ee16Smrg if (old==NULL) 610e20ee16Smrg return((Opaque)malloc(newSize)); 620e20ee16Smrg else return((Opaque)realloc((char *)old,newSize)); 630e20ee16Smrg} 640e20ee16Smrg 650e20ee16Smrg/***====================================================================***/ 660e20ee16Smrg 670e20ee16SmrgOpaque 680e20ee16SmrguRecalloc(old,nOld,nNew,itemSize) 690e20ee16Smrg Opaque old; 700e20ee16Smrg unsigned nOld; 710e20ee16Smrg unsigned nNew; 720e20ee16Smrg unsigned itemSize; 730e20ee16Smrg{ 740e20ee16Smrgchar *rtrn; 750e20ee16Smrg 760e20ee16Smrg if (old==NULL) 770e20ee16Smrg rtrn= (char *)calloc(nNew,itemSize); 780e20ee16Smrg else { 790e20ee16Smrg rtrn= (char *)realloc((char *)old,nNew*itemSize); 800e20ee16Smrg if ((rtrn)&&(nNew>nOld)) { 810e20ee16Smrg bzero(&rtrn[nOld*itemSize],(nNew-nOld)*itemSize); 820e20ee16Smrg } 830e20ee16Smrg } 840e20ee16Smrg return (Opaque)rtrn; 850e20ee16Smrg} 860e20ee16Smrg 870e20ee16Smrg/***====================================================================***/ 880e20ee16Smrg 890e20ee16Smrgvoid 900e20ee16SmrguFree(ptr) 910e20ee16Smrg Opaque ptr; 920e20ee16Smrg{ 930e20ee16Smrg if (ptr!=(Opaque)NULL) 940e20ee16Smrg free((char *)ptr); 950e20ee16Smrg return; 960e20ee16Smrg} 970e20ee16Smrg 980e20ee16Smrg/***====================================================================***/ 990e20ee16Smrg/*** FUNCTION ENTRY TRACKING ***/ 1000e20ee16Smrg/***====================================================================***/ 1010e20ee16Smrg 1020e20ee16Smrgstatic FILE *entryFile= NULL; 1030e20ee16Smrg int uEntryLevel; 1040e20ee16Smrg 1050e20ee16SmrgBoolean 1060e20ee16SmrguSetEntryFile(name) 1070e20ee16Smrg char *name; 1080e20ee16Smrg{ 1090e20ee16Smrg if ((entryFile!=NULL)&&(entryFile!=stderr)) { 1100e20ee16Smrg fprintf(entryFile,"switching to %s\n",name?name:"stderr"); 1110e20ee16Smrg fclose(entryFile); 1120e20ee16Smrg } 1130e20ee16Smrg if (name!=NullString) entryFile= fopen(name,"w"); 1140e20ee16Smrg else entryFile= stderr; 1150e20ee16Smrg if (entryFile==NULL) { 1160e20ee16Smrg entryFile= stderr; 1170e20ee16Smrg return(False); 1180e20ee16Smrg } 1190e20ee16Smrg return(True); 1200e20ee16Smrg} 1210e20ee16Smrg 1220e20ee16Smrgvoid 1230e20ee16SmrguEntry(int l, char *s,...) 1240e20ee16Smrg{ 1250e20ee16Smrgint i; 1260e20ee16Smrgva_list ap; 1270e20ee16Smrg 1280e20ee16Smrg va_start(ap, s); 1290e20ee16Smrg for (i=0;i<uEntryLevel;i++) { 1300e20ee16Smrg putc(' ',entryFile); 1310e20ee16Smrg } 1320e20ee16Smrg vfprintf(entryFile,s,ap); 1330e20ee16Smrg uEntryLevel+= l; 1340e20ee16Smrg va_end(ap); 1350e20ee16Smrg return; 1360e20ee16Smrg} 1370e20ee16Smrg 1380e20ee16Smrgvoid 1390e20ee16SmrguExit(l,rtVal) 1400e20ee16Smrg int l; 1410e20ee16Smrg char * rtVal; 1420e20ee16Smrg{ 1430e20ee16Smrgint i; 1440e20ee16Smrg 1450e20ee16Smrg uEntryLevel-= l; 1460e20ee16Smrg if (uEntryLevel<0) uEntryLevel= 0; 1470e20ee16Smrg for (i=0;i<uEntryLevel;i++) { 1480e20ee16Smrg putc(' ',entryFile); 1490e20ee16Smrg } 1500e20ee16Smrg fprintf(entryFile,"---> 0x%p\n",rtVal); 1510e20ee16Smrg return; 1520e20ee16Smrg} 1530e20ee16Smrg 1540e20ee16Smrg/***====================================================================***/ 1550e20ee16Smrg/*** PRINT FUNCTIONS ***/ 1560e20ee16Smrg/***====================================================================***/ 1570e20ee16Smrg 1580e20ee16Smrg FILE *uDebugFile= NULL; 1590e20ee16Smrg int uDebugIndentLevel= 0; 1600e20ee16Smrg int uDebugIndentSize= 4; 1610e20ee16Smrg 1620e20ee16SmrgBoolean 1630e20ee16SmrguSetDebugFile(name) 1640e20ee16Smrg char *name; 1650e20ee16Smrg{ 1660e20ee16Smrg if ((uDebugFile!=NULL)&&(uDebugFile!=stderr)) { 1670e20ee16Smrg fprintf(uDebugFile,"switching to %s\n",name?name:"stderr"); 1680e20ee16Smrg fclose(uDebugFile); 1690e20ee16Smrg } 1700e20ee16Smrg if (name!=NullString) uDebugFile= fopen(name,"w"); 1710e20ee16Smrg else uDebugFile= stderr; 1720e20ee16Smrg if (uDebugFile==NULL) { 1730e20ee16Smrg uDebugFile= stderr; 1740e20ee16Smrg return(False); 1750e20ee16Smrg } 1760e20ee16Smrg return(True); 1770e20ee16Smrg} 1780e20ee16Smrg 1790e20ee16Smrgvoid 1800e20ee16SmrguDebug(char *s,...) 1810e20ee16Smrg{ 1820e20ee16Smrgint i; 1830e20ee16Smrgva_list ap; 1840e20ee16Smrg 1850e20ee16Smrg va_start(ap, s); 1860e20ee16Smrg for (i=(uDebugIndentLevel*uDebugIndentSize);i>0;i--) { 1870e20ee16Smrg putc(' ',uDebugFile); 1880e20ee16Smrg } 1890e20ee16Smrg vfprintf(uDebugFile,s,ap); 1900e20ee16Smrg fflush(uDebugFile); 1910e20ee16Smrg va_end(ap); 1920e20ee16Smrg return; 1930e20ee16Smrg} 1940e20ee16Smrg 1950e20ee16Smrgvoid 1960e20ee16SmrguDebugNOI(char *s,...) 1970e20ee16Smrg{ 1980e20ee16Smrgva_list ap; 1990e20ee16Smrg 2000e20ee16Smrg va_start(ap, s); 2010e20ee16Smrg vfprintf(uDebugFile,s,ap); 2020e20ee16Smrg fflush(uDebugFile); 2030e20ee16Smrg va_end(ap); 2040e20ee16Smrg return; 2050e20ee16Smrg} 2060e20ee16Smrg 2070e20ee16Smrg/***====================================================================***/ 2080e20ee16Smrg 2090e20ee16Smrgstatic FILE *errorFile= NULL; 2100e20ee16Smrg 2110e20ee16SmrgBoolean 2120e20ee16SmrguSetErrorFile(char *name) 2130e20ee16Smrg{ 2140e20ee16Smrg if ((errorFile!=NULL)&&(errorFile!=stderr)) { 2150e20ee16Smrg fprintf(errorFile,"switching to %s\n",name?name:"stderr"); 2160e20ee16Smrg fclose(errorFile); 2170e20ee16Smrg } 2180e20ee16Smrg if (name!=NullString) errorFile= fopen(name,"w"); 2190e20ee16Smrg else errorFile= stderr; 2200e20ee16Smrg if (errorFile==NULL) { 2210e20ee16Smrg errorFile= stderr; 2220e20ee16Smrg return(False); 2230e20ee16Smrg } 2240e20ee16Smrg return(True); 2250e20ee16Smrg} 2260e20ee16Smrg 2270e20ee16Smrgvoid 2280e20ee16SmrguInformation(char *s,...) 2290e20ee16Smrg{ 2300e20ee16Smrg va_list ap; 2310e20ee16Smrg 2320e20ee16Smrg va_start(ap, s); 2330e20ee16Smrg vfprintf(errorFile,s,ap); 2340e20ee16Smrg fflush(errorFile); 2350e20ee16Smrg va_end(ap); 2360e20ee16Smrg return; 2370e20ee16Smrg} 2380e20ee16Smrg 2390e20ee16Smrg/***====================================================================***/ 2400e20ee16Smrg 2410e20ee16Smrgvoid 2420e20ee16SmrguAction(char *s,...) 2430e20ee16Smrg{ 2440e20ee16Smrg va_list ap; 2450e20ee16Smrg 2460e20ee16Smrg va_start(ap, s); 2470e20ee16Smrg fprintf(errorFile," "); 2480e20ee16Smrg vfprintf(errorFile,s,ap); 2490e20ee16Smrg fflush(errorFile); 2500e20ee16Smrg va_end(ap); 2510e20ee16Smrg return; 2520e20ee16Smrg} 2530e20ee16Smrg 2540e20ee16Smrg/***====================================================================***/ 2550e20ee16Smrg 2560e20ee16Smrgvoid 2570e20ee16SmrguWarning(char *s,...) 2580e20ee16Smrg{ 2590e20ee16Smrg va_list ap; 2600e20ee16Smrg 2610e20ee16Smrg va_start(ap, s); 2620e20ee16Smrg fprintf(errorFile,"Warning: "); 2630e20ee16Smrg vfprintf(errorFile,s,ap); 2640e20ee16Smrg fflush(errorFile); 2650e20ee16Smrg va_end(ap); 2660e20ee16Smrg return; 2670e20ee16Smrg} 2680e20ee16Smrg 2690e20ee16Smrg/***====================================================================***/ 2700e20ee16Smrg 2710e20ee16Smrgvoid 2720e20ee16SmrguError(char *s,...) 2730e20ee16Smrg{ 2740e20ee16Smrg va_list ap; 2750e20ee16Smrg 2760e20ee16Smrg va_start(ap, s); 2770e20ee16Smrg fprintf(errorFile,"Error: "); 2780e20ee16Smrg vfprintf(errorFile,s,ap); 2790e20ee16Smrg fflush(errorFile); 2800e20ee16Smrg va_end(ap); 2810e20ee16Smrg return; 2820e20ee16Smrg} 2830e20ee16Smrg 2840e20ee16Smrg/***====================================================================***/ 2850e20ee16Smrg 2860e20ee16Smrgvoid 2870e20ee16SmrguFatalError(char *s,...) 2880e20ee16Smrg{ 2890e20ee16Smrg va_list ap; 2900e20ee16Smrg 2910e20ee16Smrg va_start(ap, s); 2920e20ee16Smrg fprintf(errorFile,"Fatal Error: "); 2930e20ee16Smrg vfprintf(errorFile,s,ap); 2940e20ee16Smrg fprintf(errorFile," Exiting\n"); 2950e20ee16Smrg fflush(errorFile); 2960e20ee16Smrg va_end(ap); 2970e20ee16Smrg exit(1); 2980e20ee16Smrg /* NOTREACHED */ 2990e20ee16Smrg} 3000e20ee16Smrg 3010e20ee16Smrg/***====================================================================***/ 3020e20ee16Smrg 3030e20ee16Smrgvoid 3040e20ee16SmrguInternalError(char *s,...) 3050e20ee16Smrg{ 3060e20ee16Smrg va_list ap; 3070e20ee16Smrg 3080e20ee16Smrg va_start(ap, s); 3090e20ee16Smrg fprintf(errorFile,"Internal error: "); 3100e20ee16Smrg vfprintf(errorFile,s,ap); 3110e20ee16Smrg fflush(errorFile); 3120e20ee16Smrg va_end(ap); 3130e20ee16Smrg return; 3140e20ee16Smrg} 3150e20ee16Smrg 3160e20ee16Smrg/***====================================================================***/ 3170e20ee16Smrg 3180e20ee16Smrg#ifndef HAVE_STRDUP 3190e20ee16Smrgchar * 3200e20ee16SmrguStringDup(str) 3210e20ee16Smrg char *str; 3220e20ee16Smrg{ 3230e20ee16Smrgchar *rtrn; 3240e20ee16Smrg 3250e20ee16Smrg if (str==NULL) 3260e20ee16Smrg return NULL; 3270e20ee16Smrg rtrn= (char *)uAlloc(strlen(str)+1); 3280e20ee16Smrg strcpy(rtrn,str); 3290e20ee16Smrg return rtrn; 3300e20ee16Smrg} 3310e20ee16Smrg#endif 3320e20ee16Smrg 3330e20ee16Smrg#ifndef HAVE_STRCASECMP 3340e20ee16Smrgint 3350e20ee16SmrguStrCaseCmp(str1, str2) 3360e20ee16Smrg char *str1, *str2; 3370e20ee16Smrg{ 3380e20ee16Smrg char buf1[512],buf2[512]; 3390e20ee16Smrg char c, *s; 3400e20ee16Smrg register int n; 3410e20ee16Smrg 3420e20ee16Smrg for (n=0, s = buf1; (c = *str1++); n++) { 3430e20ee16Smrg if (isupper(c)) 3440e20ee16Smrg c = tolower(c); 3450e20ee16Smrg if (n>510) 3460e20ee16Smrg break; 3470e20ee16Smrg *s++ = c; 3480e20ee16Smrg } 3490e20ee16Smrg *s = '\0'; 3500e20ee16Smrg for (n=0, s = buf2; (c = *str2++); n++) { 3510e20ee16Smrg if (isupper(c)) 3520e20ee16Smrg c = tolower(c); 3530e20ee16Smrg if (n>510) 3540e20ee16Smrg break; 3550e20ee16Smrg *s++ = c; 3560e20ee16Smrg } 3570e20ee16Smrg *s = '\0'; 3580e20ee16Smrg return (strcmp(buf1, buf2)); 3590e20ee16Smrg} 3600e20ee16Smrg 3610e20ee16Smrgint 3620e20ee16SmrguStrCasePrefix(prefix, str) 3630e20ee16Smrg char *prefix, *str; 3640e20ee16Smrg{ 3650e20ee16Smrg char c1; 3660e20ee16Smrg char c2; 3670e20ee16Smrg while (((c1=*prefix)!='\0')&&((c2=*str)!='\0')) { 3680e20ee16Smrg if (isupper(c1)) c1= tolower(c1); 3690e20ee16Smrg if (isupper(c2)) c2= tolower(c2); 3700e20ee16Smrg if (c1!=c2) 3710e20ee16Smrg return 0; 3720e20ee16Smrg prefix++; str++; 3730e20ee16Smrg } 3740e20ee16Smrg if (c1!='\0') 3750e20ee16Smrg return 0; 3760e20ee16Smrg return 1; 3770e20ee16Smrg} 3780e20ee16Smrg 3790e20ee16Smrg#endif 380