utils.h revision 0e20ee16
10e20ee16Smrg#ifndef UTILS_H
20e20ee16Smrg#define	UTILS_H 1
30e20ee16Smrg
40e20ee16Smrg  /*\
50e20ee16Smrg   * $Xorg: utils.h,v 1.3 2000/08/17 19:54:50 cpqbld Exp $
60e20ee16Smrg   *
70e20ee16Smrg   *		              COPYRIGHT 1990
80e20ee16Smrg   *		        DIGITAL EQUIPMENT CORPORATION
90e20ee16Smrg   *		           MAYNARD, MASSACHUSETTS
100e20ee16Smrg   *			    ALL RIGHTS RESERVED.
110e20ee16Smrg   *
120e20ee16Smrg   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
130e20ee16Smrg   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
140e20ee16Smrg   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE
150e20ee16Smrg   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED
160e20ee16Smrg   * WARRANTY.
170e20ee16Smrg   *
180e20ee16Smrg   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
190e20ee16Smrg   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
200e20ee16Smrg   * ADDITION TO THAT SET FORTH ABOVE.
210e20ee16Smrg   *
220e20ee16Smrg   * Permission to use, copy, modify, and distribute this software and its
230e20ee16Smrg   * documentation for any purpose and without fee is hereby granted, provided
240e20ee16Smrg   * that the above copyright notice appear in all copies and that both that
250e20ee16Smrg   * copyright notice and this permission notice appear in supporting
260e20ee16Smrg   * documentation, and that the name of Digital Equipment Corporation not be
270e20ee16Smrg   * used in advertising or publicity pertaining to distribution of the
280e20ee16Smrg   * software without specific, written prior permission.
290e20ee16Smrg  \*/
300e20ee16Smrg/* $XFree86: xc/programs/xkbprint/utils.h,v 1.5 2001/07/25 15:05:25 dawes Exp $ */
310e20ee16Smrg
320e20ee16Smrg/***====================================================================***/
330e20ee16Smrg
340e20ee16Smrg#include 	<stdio.h>
350e20ee16Smrg#include	<X11/Xos.h>
360e20ee16Smrg#include	<X11/Xfuncproto.h>
370e20ee16Smrg#include	<X11/Xfuncs.h>
380e20ee16Smrg#include 	<stdarg.h>
390e20ee16Smrg#include	<stddef.h>
400e20ee16Smrg
410e20ee16Smrg_XFUNCPROTOBEGIN
420e20ee16Smrg
430e20ee16Smrg
440e20ee16Smrg#ifndef NUL
450e20ee16Smrg#define	NUL	'\0'
460e20ee16Smrg#endif
470e20ee16Smrg
480e20ee16Smrg/***====================================================================***/
490e20ee16Smrg
500e20ee16Smrg#ifndef OPAQUE_DEFINED
510e20ee16Smrgtypedef	void *Opaque;
520e20ee16Smrg#endif
530e20ee16Smrg#ifndef NullOpaque
540e20ee16Smrg#define	NullOpaque	((Opaque)NULL)
550e20ee16Smrg#endif
560e20ee16Smrg
570e20ee16Smrg#ifndef BOOLEAN_DEFINED
580e20ee16Smrgtypedef	char	Boolean;
590e20ee16Smrg#endif
600e20ee16Smrg
610e20ee16Smrg#ifndef True
620e20ee16Smrg#define	True	((Boolean)1)
630e20ee16Smrg#define	False	((Boolean)0)
640e20ee16Smrg#endif /* ndef True */
650e20ee16Smrg#define	booleanText(b)	((b)?"True":"False")
660e20ee16Smrg
670e20ee16Smrg#ifndef COMPARISON_DEFINED
680e20ee16Smrgtypedef	int		Comparison;
690e20ee16Smrg
700e20ee16Smrg#define	Greater		((Comparison)1)
710e20ee16Smrg#define	Equal		((Comparison)0)
720e20ee16Smrg#define	Less		((Comparison)-1)
730e20ee16Smrg#define	CannotCompare	((Comparison)-37)
740e20ee16Smrg#define	comparisonText(c)	((c)?((c)<0?"Less":"Greater"):"Equal")
750e20ee16Smrg#endif
760e20ee16Smrg
770e20ee16Smrg#ifdef notyet
780e20ee16Smrgtypedef union {
790e20ee16Smrg	int		 i;
800e20ee16Smrg	unsigned	 u;
810e20ee16Smrg	void		*p;
820e20ee16Smrg	void		*(*fp)();
830e20ee16Smrg} Union;
840e20ee16Smrg#endif
850e20ee16Smrg
860e20ee16Smrg/***====================================================================***/
870e20ee16Smrg
880e20ee16Smrgextern	Opaque	uAlloc(
890e20ee16Smrg    unsigned	/* size */
900e20ee16Smrg);
910e20ee16Smrgextern	Opaque	uCalloc(
920e20ee16Smrg    unsigned	/* n */,
930e20ee16Smrg    unsigned	/* size */
940e20ee16Smrg);
950e20ee16Smrgextern	Opaque	uRealloc(
960e20ee16Smrg    Opaque	/* old */,
970e20ee16Smrg    unsigned	/* newSize */
980e20ee16Smrg);
990e20ee16Smrgextern	Opaque	uRecalloc(
1000e20ee16Smrg    Opaque 	/* old */,
1010e20ee16Smrg    unsigned	/* nOld */,
1020e20ee16Smrg    unsigned	/* nNew */,
1030e20ee16Smrg    unsigned 	/* newSize */
1040e20ee16Smrg);
1050e20ee16Smrgextern	void	uFree(
1060e20ee16Smrg    Opaque	/* ptr */
1070e20ee16Smrg);
1080e20ee16Smrg
1090e20ee16Smrg#define	uTypedAlloc(t)		((t *)uAlloc((unsigned)sizeof(t)))
1100e20ee16Smrg#define	uTypedCalloc(n,t)	((t *)uCalloc((unsigned)n,(unsigned)sizeof(t)))
1110e20ee16Smrg#define	uTypedRealloc(pO,n,t)	((t *)uRealloc((Opaque)pO,((unsigned)n)*sizeof(t)))
1120e20ee16Smrg#define	uTypedRecalloc(pO,o,n,t) ((t *)uRecalloc((Opaque)pO,((unsigned)o),((unsigned)n),sizeof(t)))
1130e20ee16Smrg#if (defined mdHasAlloca) && (mdHasAlloca)
1140e20ee16Smrg#define	uTmpAlloc(n)	((Opaque)alloca((unsigned)n))
1150e20ee16Smrg#define	uTmpFree(p)
1160e20ee16Smrg#else
1170e20ee16Smrg#define	uTmpAlloc(n)	uAlloc(n)
1180e20ee16Smrg#define	uTmpFree(p)	uFree(p)
1190e20ee16Smrg#endif
1200e20ee16Smrg
1210e20ee16Smrg/***====================================================================***/
1220e20ee16Smrg
1230e20ee16Smrgextern Boolean uSetErrorFile ( char *name );
1240e20ee16Smrgextern void uInformation ( char *s, ...);
1250e20ee16Smrgextern void uAction ( char *s, ... );
1260e20ee16Smrgextern void uWarning ( char *s, ... );
1270e20ee16Smrgextern void uError ( char *s, ... );
1280e20ee16Smrgextern void uFatalError(char *s,...);
1290e20ee16Smrgextern void uInternalError ( char *s, ... );
1300e20ee16Smrg
1310e20ee16Smrg/***====================================================================***/
1320e20ee16Smrg
1330e20ee16Smrg#define	NullString	((char *)NULL)
1340e20ee16Smrg
1350e20ee16Smrg#define	uStringText(s)		((s)==NullString?"<NullString>":(s))
1360e20ee16Smrg#define	uStringEqual(s1,s2)	(uStringCompare(s1,s2)==Equal)
1370e20ee16Smrg#define	uStringPrefix(p,s)	(strncmp(p,s,strlen(p))==0)
1380e20ee16Smrg#define	uStringCompare(s1,s2)	(strcmp(s1,s2))
1390e20ee16Smrg#define	uStrCaseEqual(s1,s2)	(uStrCaseCmp(s1,s2)==0)
1400e20ee16Smrg#ifdef HAVE_STRCASECMP
1410e20ee16Smrg#define	uStrCaseCmp(s1,s2)	(strcasecmp(s1,s2))
1420e20ee16Smrg#define	uStrCasePrefix(p,s)	(strncasecmp(p,s,strlen(p))==0)
1430e20ee16Smrg#else
1440e20ee16Smrgextern	int uStrCaseCmp(
1450e20ee16Smrg	char *	/* s1 */,
1460e20ee16Smrg	char *	/* s2 */
1470e20ee16Smrg);
1480e20ee16Smrgextern	int uStrCasePrefix(
1490e20ee16Smrg	char *	/* p */,
1500e20ee16Smrg	char *	/* str */
1510e20ee16Smrg);
1520e20ee16Smrg#endif
1530e20ee16Smrg#ifdef HAVE_STRDUP
1540e20ee16Smrg#define	uStringDup(s1)		(strdup(s1))
1550e20ee16Smrg#else
1560e20ee16Smrgextern	char *uStringDup(
1570e20ee16Smrg	char *	/* s1 */
1580e20ee16Smrg);
1590e20ee16Smrg#endif
1600e20ee16Smrg
1610e20ee16Smrg/***====================================================================***/
1620e20ee16Smrg
1630e20ee16Smrg#ifdef	ASSERTIONS_ON
1640e20ee16Smrg#define	uASSERT(where,why) \
1650e20ee16Smrg	{if (!(why)) uFatalError("assertion botched in %s ( why )\n",where);}
1660e20ee16Smrg#else
1670e20ee16Smrg#define	uASSERT(where,why)
1680e20ee16Smrg#endif
1690e20ee16Smrg
1700e20ee16Smrg/***====================================================================***/
1710e20ee16Smrg
1720e20ee16Smrg#ifndef DEBUG_VAR
1730e20ee16Smrg#define	DEBUG_VAR	debugFlags
1740e20ee16Smrg#endif
1750e20ee16Smrg
1760e20ee16Smrg#ifdef DEBUG_VAR_NOT_LOCAL
1770e20ee16Smrgextern
1780e20ee16Smrg#endif
1790e20ee16Smrgunsigned	int	DEBUG_VAR;
1800e20ee16Smrg
1810e20ee16Smrgextern	void	uDebug( char *s, ... );
1820e20ee16Smrgextern	void	uDebugNOI( char *s, ... );	/* no indent */
1830e20ee16Smrgextern	Boolean	uSetDebugFile(
1840e20ee16Smrg    char *name
1850e20ee16Smrg);
1860e20ee16Smrgextern	FILE	*uDebugFile;
1870e20ee16Smrgextern	int	uDebugIndentLevel;
1880e20ee16Smrgextern	int	uDebugIndentSize;
1890e20ee16Smrg#define	uDebugIndent(l)		(uDebugIndentLevel+=(l))
1900e20ee16Smrg#define	uDebugOutdent(l)	(uDebugIndentLevel-=(l))
1910e20ee16Smrg#ifdef DEBUG_ON
1920e20ee16Smrg#define	uDEBUG(f,s)		{ if (DEBUG_VAR&(f)) uDebug(s);}
1930e20ee16Smrg#define	uDEBUG1(f,s,a)		{ if (DEBUG_VAR&(f)) uDebug(s,a);}
1940e20ee16Smrg#define	uDEBUG2(f,s,a,b)	{ if (DEBUG_VAR&(f)) uDebug(s,a,b);}
1950e20ee16Smrg#define	uDEBUG3(f,s,a,b,c)	{ if (DEBUG_VAR&(f)) uDebug(s,a,b,c);}
1960e20ee16Smrg#define	uDEBUG4(f,s,a,b,c,d)	{ if (DEBUG_VAR&(f)) uDebug(s,a,b,c,d);}
1970e20ee16Smrg#define	uDEBUG5(f,s,a,b,c,d,e)	{ if (DEBUG_VAR&(f)) uDebug(s,a,b,c,d,e);}
1980e20ee16Smrg#define	uDEBUG_NOI(f,s)		{ if (DEBUG_VAR&(f)) uDebug(s);}
1990e20ee16Smrg#define	uDEBUG_NOI1(f,s,a)	{ if (DEBUG_VAR&(f)) uDebugNOI(s,a);}
2000e20ee16Smrg#define	uDEBUG_NOI2(f,s,a,b)	{ if (DEBUG_VAR&(f)) uDebugNOI(s,a,b);}
2010e20ee16Smrg#define	uDEBUG_NOI3(f,s,a,b,c)	{ if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c);}
2020e20ee16Smrg#define	uDEBUG_NOI4(f,s,a,b,c,d) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c,d);}
2030e20ee16Smrg#define	uDEBUG_NOI5(f,s,a,b,c,d,e) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c,d,e);}
2040e20ee16Smrg#else
2050e20ee16Smrg#define	uDEBUG(f,s)
2060e20ee16Smrg#define	uDEBUG1(f,s,a)
2070e20ee16Smrg#define	uDEBUG2(f,s,a,b)
2080e20ee16Smrg#define	uDEBUG3(f,s,a,b,c)
2090e20ee16Smrg#define	uDEBUG4(f,s,a,b,c,d)
2100e20ee16Smrg#define	uDEBUG5(f,s,a,b,c,d,e)
2110e20ee16Smrg#define	uDEBUG_NOI(f,s)
2120e20ee16Smrg#define	uDEBUG_NOI1(f,s,a)
2130e20ee16Smrg#define	uDEBUG_NOI2(f,s,a,b)
2140e20ee16Smrg#define	uDEBUG_NOI3(f,s,a,b,c)
2150e20ee16Smrg#define	uDEBUG_NOI4(f,s,a,b,c,d)
2160e20ee16Smrg#define	uDEBUG_NOI5(f,s,a,b,c,d,e)
2170e20ee16Smrg#endif
2180e20ee16Smrg
2190e20ee16Smrgextern	Boolean	uSetEntryFile(
2200e20ee16Smrg    char *name
2210e20ee16Smrg);
2220e20ee16Smrgextern	void	uEntry(int l, char *s, ... );
2230e20ee16Smrgextern	void	uExit(
2240e20ee16Smrg    int l,char *rtVal
2250e20ee16Smrg);
2260e20ee16Smrg#ifdef ENTRY_TRACKING_ON
2270e20ee16Smrg#define	ENTRY_BIT	0x10
2280e20ee16Smrg#define	LOW_ENTRY_BIT	0x1000
2290e20ee16Smrg#define	ENTER	(DEBUG_VAR&ENTRY_BIT)
2300e20ee16Smrg#define	FLAG(fLag)	(DEBUG_VAR&(fLag))
2310e20ee16Smrg
2320e20ee16Smrgextern	int	uEntryLevel;
2330e20ee16Smrg
2340e20ee16Smrg#define	uENTRY(s)			{ if (ENTER) uEntry(1,s);}
2350e20ee16Smrg#define	uENTRY1(s,a)			{ if (ENTER) uEntry(1,s,a);}
2360e20ee16Smrg#define	uENTRY2(s,a,b)			{ if (ENTER) uEntry(1,s,a,b);}
2370e20ee16Smrg#define	uENTRY3(s,a,b,c)		{ if (ENTER) uEntry(1,s,a,b,c);}
2380e20ee16Smrg#define	uENTRY4(s,a,b,c,d)		{ if (ENTER) uEntry(1,s,a,b,c,d);}
2390e20ee16Smrg#define	uENTRY5(s,a,b,c,d,e)		{ if (ENTER) uEntry(1,s,a,b,c,d,e);}
2400e20ee16Smrg#define	uENTRY6(s,a,b,c,d,e,f)		{ if (ENTER) uEntry(1,s,a,b,c,d,e,f);}
2410e20ee16Smrg#define	uENTRY7(s,a,b,c,d,e,f,g)	{ if (ENTER) uEntry(1,s,a,b,c,d,e,f,g);}
2420e20ee16Smrg#define	uRETURN(v)			{ if (ENTER) uEntryLevel--; return(v); }
2430e20ee16Smrg#define	uVOIDRETURN			{ if (ENTER) uEntryLevel--; return; }
2440e20ee16Smrg
2450e20ee16Smrg#define	uFLAG_ENTRY(w,s)		{ if (FLAG(w)) uEntry(0,s);}
2460e20ee16Smrg#define	uFLAG_ENTRY1(w,s,a)		{ if (FLAG(w)) uEntry(0,s,a);}
2470e20ee16Smrg#define	uFLAG_ENTRY2(w,s,a,b)		{ if (FLAG(w)) uEntry(0,s,a,b);}
2480e20ee16Smrg#define	uFLAG_ENTRY3(w,s,a,b,c)		{ if (FLAG(w)) uEntry(0,s,a,b,c);}
2490e20ee16Smrg#define	uFLAG_ENTRY4(w,s,a,b,c,d)	{ if (FLAG(w)) uEntry(0,s,a,b,c,d);}
2500e20ee16Smrg#define	uFLAG_ENTRY5(w,s,a,b,c,d,e)	{ if (FLAG(w)) uEntry(0,s,a,b,c,d,e);}
2510e20ee16Smrg#define	uFLAG_ENTRY6(w,s,a,b,c,d,e,f)	{ if (FLAG(w)) uEntry(0,s,a,b,c,d,e,f);}
2520e20ee16Smrg#define	uFLAG_ENTRY7(w,s,a,b,c,d,e,f,g)	{ if(FLAG(w))uEntry(0,s,a,b,c,d,e,f,g);}
2530e20ee16Smrg#define	uFLAG_RETURN(v)			{ return(v);}
2540e20ee16Smrg#define	uFLAG_VOIDRETURN		{ return; }
2550e20ee16Smrg#else
2560e20ee16Smrg#define	uENTRY(s)
2570e20ee16Smrg#define	uENTRY1(s,a)
2580e20ee16Smrg#define	uENTRY2(s,a1,a2)
2590e20ee16Smrg#define	uENTRY3(s,a1,a2,a3)
2600e20ee16Smrg#define	uENTRY4(s,a1,a2,a3,a4)
2610e20ee16Smrg#define	uENTRY5(s,a1,a2,a3,a4,a5)
2620e20ee16Smrg#define	uENTRY6(s,a1,a2,a3,a4,a5,a6)
2630e20ee16Smrg#define	uENTRY7(s,a1,a2,a3,a4,a5,a6,a7)
2640e20ee16Smrg#define	uRETURN(v)	{ return(v); }
2650e20ee16Smrg#define	uVOIDRETURN	{ return; }
2660e20ee16Smrg
2670e20ee16Smrg#define	uFLAG_ENTRY(f,s)
2680e20ee16Smrg#define	uFLAG_ENTRY1(f,s,a)
2690e20ee16Smrg#define	uFLAG_ENTRY2(f,s,a,b)
2700e20ee16Smrg#define	uFLAG_ENTRY3(f,s,a,b,c)
2710e20ee16Smrg#define	uFLAG_ENTRY4(f,s,a,b,c,d)
2720e20ee16Smrg#define	uFLAG_ENTRY5(f,s,a,b,c,d,e)
2730e20ee16Smrg#define	uFLAG_ENTRY6(f,s,a,b,c,d,e,g)
2740e20ee16Smrg#define	uFLAG_ENTRY7(f,s,a,b,c,d,e,g,h)
2750e20ee16Smrg#define	uFLAG_RETURN(v)			{ return(v);}
2760e20ee16Smrg#define	uFLAG_VOIDRETURN		{ return; }
2770e20ee16Smrg#endif
2780e20ee16Smrg
2790e20ee16Smrg_XFUNCPROTOEND
2800e20ee16Smrg
2810e20ee16Smrg#endif /* UTILS_H */
2820e20ee16Smrg
2830e20ee16Smrg
284