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