utils.h revision 34345a63
1f46a6179Smrg#ifndef UTILS_H 2f46a6179Smrg#define UTILS_H 1 3f46a6179Smrg 4f46a6179Smrg /*\ 5f46a6179Smrg * 634345a63Smrg * COPYRIGHT 1990 734345a63Smrg * DIGITAL EQUIPMENT CORPORATION 834345a63Smrg * MAYNARD, MASSACHUSETTS 934345a63Smrg * ALL RIGHTS RESERVED. 10f46a6179Smrg * 11f46a6179Smrg * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND 12f46a6179Smrg * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. 13f46a6179Smrg * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 14f46a6179Smrg * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 15f46a6179Smrg * WARRANTY. 16f46a6179Smrg * 17f46a6179Smrg * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT 18f46a6179Smrg * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN 19f46a6179Smrg * ADDITION TO THAT SET FORTH ABOVE. 20f46a6179Smrg * 21f46a6179Smrg * Permission to use, copy, modify, and distribute this software and its 22f46a6179Smrg * documentation for any purpose and without fee is hereby granted, provided 23f46a6179Smrg * that the above copyright notice appear in all copies and that both that 24f46a6179Smrg * copyright notice and this permission notice appear in supporting 25f46a6179Smrg * documentation, and that the name of Digital Equipment Corporation not be 26f46a6179Smrg * used in advertising or publicity pertaining to distribution of the 27f46a6179Smrg * software without specific, written prior permission. 2834345a63Smrg \*/ 29f46a6179Smrg 30f46a6179Smrg/***====================================================================***/ 31f46a6179Smrg 32f46a6179Smrg#include <stdio.h> 33f46a6179Smrg#include <X11/Xos.h> 34f46a6179Smrg#include <X11/Xfuncproto.h> 35f46a6179Smrg#include <X11/Xfuncs.h> 36f46a6179Smrg 37f46a6179Smrg#include <stddef.h> 3834345a63Smrg#include "config.h" 39f46a6179Smrg 40f46a6179Smrg#ifndef NUL 41f46a6179Smrg#define NUL '\0' 42f46a6179Smrg#endif 43f46a6179Smrg 44f46a6179Smrg/***====================================================================***/ 45f46a6179Smrg 46f46a6179Smrg#ifndef OPAQUE_DEFINED 4734345a63Smrgtypedef void *Opaque; 48f46a6179Smrg#endif 49f46a6179Smrg#ifndef NullOpaque 50f46a6179Smrg#define NullOpaque ((Opaque)NULL) 51f46a6179Smrg#endif 52f46a6179Smrg 53f46a6179Smrg#ifndef BOOLEAN_DEFINED 5434345a63Smrgtypedef char Boolean; 55f46a6179Smrg#endif 56f46a6179Smrg 57f46a6179Smrg#ifndef True 58f46a6179Smrg#define True ((Boolean)1) 59f46a6179Smrg#define False ((Boolean)0) 60f46a6179Smrg#endif /* ndef True */ 61f46a6179Smrg#define booleanText(b) ((b)?"True":"False") 62f46a6179Smrg 63f46a6179Smrg#ifndef COMPARISON_DEFINED 6434345a63Smrgtypedef int Comparison; 65f46a6179Smrg 66f46a6179Smrg#define Greater ((Comparison)1) 67f46a6179Smrg#define Equal ((Comparison)0) 68f46a6179Smrg#define Less ((Comparison)-1) 69f46a6179Smrg#define CannotCompare ((Comparison)-37) 70f46a6179Smrg#define comparisonText(c) ((c)?((c)<0?"Less":"Greater"):"Equal") 71f46a6179Smrg#endif 72f46a6179Smrg 73f46a6179Smrg/***====================================================================***/ 74f46a6179Smrg 7534345a63Smrgextern Opaque uAlloc(unsigned /* size */ 7634345a63Smrg ); 7734345a63Smrgextern Opaque uCalloc(unsigned /* n */ , 7834345a63Smrg unsigned /* size */ 7934345a63Smrg ); 8034345a63Smrgextern Opaque uRealloc(Opaque /* old */ , 8134345a63Smrg unsigned /* newSize */ 8234345a63Smrg ); 8334345a63Smrgextern Opaque uRecalloc(Opaque /* old */ , 8434345a63Smrg unsigned /* nOld */ , 8534345a63Smrg unsigned /* nNew */ , 8634345a63Smrg unsigned /* newSize */ 8734345a63Smrg ); 8834345a63Smrgextern void uFree(Opaque /* ptr */ 8934345a63Smrg ); 90f46a6179Smrg 91f46a6179Smrg#define uTypedAlloc(t) ((t *)uAlloc((unsigned)sizeof(t))) 92f46a6179Smrg#define uTypedCalloc(n,t) ((t *)uCalloc((unsigned)n,(unsigned)sizeof(t))) 93f46a6179Smrg#define uTypedRealloc(pO,n,t) ((t *)uRealloc((Opaque)pO,((unsigned)n)*sizeof(t))) 94f46a6179Smrg#define uTypedRecalloc(pO,o,n,t) ((t *)uRecalloc((Opaque)pO,((unsigned)o),((unsigned)n),sizeof(t))) 95f46a6179Smrg#if (defined mdHasAlloca) && (mdHasAlloca) 96f46a6179Smrg#define uTmpAlloc(n) ((Opaque)alloca((unsigned)n)) 97f46a6179Smrg#define uTmpFree(p) 98f46a6179Smrg#else 99f46a6179Smrg#define uTmpAlloc(n) uAlloc(n) 100f46a6179Smrg#define uTmpFree(p) uFree(p) 101f46a6179Smrg#endif 102f46a6179Smrg 103f46a6179Smrg/***====================================================================***/ 104f46a6179Smrg 10534345a63Smrgextern Boolean uSetErrorFile(char * /* name */ 10634345a63Smrg ); 107f46a6179Smrg 108f46a6179Smrg#define INFO6 uInformation 109f46a6179Smrg#define INFO5 uInformation 110f46a6179Smrg#define INFO4 uInformation 111f46a6179Smrg#define INFO3 uInformation 112f46a6179Smrg#define INFO2 uInformation 113f46a6179Smrg#define INFO1 uInformation 114f46a6179Smrg#define INFO uInformation 115f46a6179Smrg 11634345a63Smrgextern void 11734345a63SmrguInformation(const char * /* s */ , ... 11834345a63Smrg ) 119f46a6179Smrg#if defined(__GNUC__) && \ 120f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 12134345a63Smrg __attribute__ ((format(printf, 1, 2))) 122f46a6179Smrg#endif 12334345a63Smrg ; 124f46a6179Smrg 125f46a6179Smrg#define ACTION6 uAction 126f46a6179Smrg#define ACTION5 uAction 127f46a6179Smrg#define ACTION4 uAction 128f46a6179Smrg#define ACTION3 uAction 129f46a6179Smrg#define ACTION2 uAction 130f46a6179Smrg#define ACTION1 uAction 131f46a6179Smrg#define ACTION uAction 132f46a6179Smrg 13334345a63Smrg extern void uAction(const char * /* s */ , ... 13434345a63Smrg ) 135f46a6179Smrg#if defined(__GNUC__) && \ 136f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 13734345a63Smrg __attribute__ ((format(printf, 1, 2))) 138f46a6179Smrg#endif 13934345a63Smrg ; 140f46a6179Smrg 141f46a6179Smrg#define WARN6 uWarning 142f46a6179Smrg#define WARN5 uWarning 143f46a6179Smrg#define WARN4 uWarning 144f46a6179Smrg#define WARN3 uWarning 145f46a6179Smrg#define WARN2 uWarning 146f46a6179Smrg#define WARN1 uWarning 147f46a6179Smrg#define WARN uWarning 148f46a6179Smrg 14934345a63Smrg extern void uWarning(const char * /* s */ , ... 15034345a63Smrg ) 151f46a6179Smrg#if defined(__GNUC__) && \ 152f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 15334345a63Smrg __attribute__ ((format(printf, 1, 2))) 154f46a6179Smrg#endif 15534345a63Smrg ; 156f46a6179Smrg 157f46a6179Smrg#define ERROR6 uError 158f46a6179Smrg#define ERROR5 uError 159f46a6179Smrg#define ERROR4 uError 160f46a6179Smrg#define ERROR3 uError 161f46a6179Smrg#define ERROR2 uError 162f46a6179Smrg#define ERROR1 uError 163f46a6179Smrg#define ERROR uError 164f46a6179Smrg 16534345a63Smrg extern void uError(const char * /* s */ , ... 16634345a63Smrg ) 167f46a6179Smrg#if defined(__GNUC__) && \ 168f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 16934345a63Smrg __attribute__ ((format(printf, 1, 2))) 170f46a6179Smrg#endif 17134345a63Smrg ; 172f46a6179Smrg 173f46a6179Smrg#define FATAL6 uFatalError 174f46a6179Smrg#define FATAL5 uFatalError 175f46a6179Smrg#define FATAL4 uFatalError 176f46a6179Smrg#define FATAL3 uFatalError 177f46a6179Smrg#define FATAL2 uFatalError 178f46a6179Smrg#define FATAL1 uFatalError 179f46a6179Smrg#define FATAL uFatalError 180f46a6179Smrg 18134345a63Smrg extern void uFatalError(const char * /* s */ , ... 18234345a63Smrg ) 183f46a6179Smrg#if defined(__GNUC__) && \ 184f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 18534345a63Smrg __attribute__ ((format(printf, 1, 2))) 186f46a6179Smrg#endif 18734345a63Smrg ; 188f46a6179Smrg 189f46a6179Smrg/* WSGO stands for "Weird Stuff Going On" */ 190f46a6179Smrg#define WSGO6 uInternalError 191f46a6179Smrg#define WSGO5 uInternalError 192f46a6179Smrg#define WSGO4 uInternalError 193f46a6179Smrg#define WSGO3 uInternalError 194f46a6179Smrg#define WSGO2 uInternalError 195f46a6179Smrg#define WSGO1 uInternalError 196f46a6179Smrg#define WSGO uInternalError 197f46a6179Smrg 19834345a63Smrg extern void uInternalError(const char * /* s */ , ... 19934345a63Smrg ) 200f46a6179Smrg#if defined(__GNUC__) && \ 201f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 20234345a63Smrg __attribute__ ((format(printf, 1, 2))) 203f46a6179Smrg#endif 20434345a63Smrg ; 205f46a6179Smrg 20634345a63Smrg extern void uSetPreErrorMessage(char * /* msg */ 20734345a63Smrg ); 208f46a6179Smrg 20934345a63Smrg extern void uSetPostErrorMessage(char * /* msg */ 21034345a63Smrg ); 211f46a6179Smrg 21234345a63Smrg extern void uSetErrorPrefix(char * /* void */ 21334345a63Smrg ); 214f46a6179Smrg 21534345a63Smrg extern void uFinishUp(void); 216f46a6179Smrg 217f46a6179Smrg 218f46a6179Smrg/***====================================================================***/ 219f46a6179Smrg 220f46a6179Smrg#define NullString ((char *)NULL) 221f46a6179Smrg 222f46a6179Smrg#define uStringText(s) ((s)==NullString?"<NullString>":(s)) 223f46a6179Smrg#define uStringEqual(s1,s2) (uStringCompare(s1,s2)==Equal) 224f46a6179Smrg#define uStringPrefix(p,s) (strncmp(p,s,strlen(p))==0) 225f46a6179Smrg#define uStringCompare(s1,s2) (((s1)==NullString||(s2)==NullString)?\ 226f46a6179Smrg (s1)!=(s2):strcmp(s1,s2)) 227f46a6179Smrg#define uStrCaseEqual(s1,s2) (uStrCaseCmp(s1,s2)==0) 228f46a6179Smrg#ifdef HAVE_STRCASECMP 229f46a6179Smrg#define uStrCaseCmp(s1,s2) (strcasecmp(s1,s2)) 230f46a6179Smrg#define uStrCasePrefix(p,s) (strncasecmp(p,s,strlen(p))==0) 231f46a6179Smrg#else 23234345a63Smrg extern int uStrCaseCmp(const char * /* s1 */ , 23334345a63Smrg const char * /* s2 */ 23434345a63Smrg ); 23534345a63Smrg extern int uStrCasePrefix(const char * /* p */ , 23634345a63Smrg char * /* str */ 23734345a63Smrg ); 238f46a6179Smrg#endif 239f46a6179Smrg#ifdef HAVE_STRDUP 24034345a63Smrg#define uStringDup(s1) ((s1) ? strdup(s1) : NULL) 241f46a6179Smrg#else 24234345a63Smrg extern char *uStringDup(const char * /* s1 */ 24334345a63Smrg ); 244f46a6179Smrg#endif 245f46a6179Smrg 246f46a6179Smrg/***====================================================================***/ 247f46a6179Smrg 248f46a6179Smrg#ifdef ASSERTIONS_ON 249f46a6179Smrg#define uASSERT(where,why) \ 250f46a6179Smrg {if (!(why)) uFatalError("assertion botched in %s ( why )\n",where);} 251f46a6179Smrg#else 252f46a6179Smrg#define uASSERT(where,why) 253f46a6179Smrg#endif 254f46a6179Smrg 255f46a6179Smrg/***====================================================================***/ 256f46a6179Smrg 257f46a6179Smrg#ifndef DEBUG_VAR 258f46a6179Smrg#define DEBUG_VAR debugFlags 259f46a6179Smrg#endif 260f46a6179Smrg 261f46a6179Smrgextern 26234345a63Smrg unsigned int DEBUG_VAR; 263f46a6179Smrg 26434345a63Smrg extern void uDebug(char * /* s */ , ... 26534345a63Smrg ) 266f46a6179Smrg#if defined(__GNUC__) && \ 267f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 26834345a63Smrg __attribute__ ((format(printf, 1, 2))) 269f46a6179Smrg#endif 27034345a63Smrg ; 271f46a6179Smrg 27234345a63Smrg extern void uDebugNOI( /* no indent */ 27334345a63Smrg char * /* s */ , ... 27434345a63Smrg ) 275f46a6179Smrg#if defined(__GNUC__) && \ 276f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 27734345a63Smrg __attribute__ ((format(printf, 1, 2))) 278f46a6179Smrg#endif 27934345a63Smrg ; 280f46a6179Smrg 28134345a63Smrg extern Boolean uSetDebugFile(char *name); 282f46a6179Smrg 28334345a63Smrg extern FILE *uDebugFile; 28434345a63Smrg extern int uDebugIndentLevel; 28534345a63Smrg extern int uDebugIndentSize; 286f46a6179Smrg#define uDebugIndent(l) (uDebugIndentLevel+=(l)) 287f46a6179Smrg#define uDebugOutdent(l) (uDebugIndentLevel-=(l)) 288f46a6179Smrg#ifdef DEBUG_ON 289f46a6179Smrg#define uDEBUG(f,s) { if (DEBUG_VAR&(f)) uDebug(s);} 290f46a6179Smrg#define uDEBUG1(f,s,a) { if (DEBUG_VAR&(f)) uDebug(s,a);} 291f46a6179Smrg#define uDEBUG2(f,s,a,b) { if (DEBUG_VAR&(f)) uDebug(s,a,b);} 292f46a6179Smrg#define uDEBUG3(f,s,a,b,c) { if (DEBUG_VAR&(f)) uDebug(s,a,b,c);} 293f46a6179Smrg#define uDEBUG4(f,s,a,b,c,d) { if (DEBUG_VAR&(f)) uDebug(s,a,b,c,d);} 294f46a6179Smrg#define uDEBUG5(f,s,a,b,c,d,e) { if (DEBUG_VAR&(f)) uDebug(s,a,b,c,d,e);} 295f46a6179Smrg#define uDEBUG_NOI(f,s) { if (DEBUG_VAR&(f)) uDebug(s);} 296f46a6179Smrg#define uDEBUG_NOI1(f,s,a) { if (DEBUG_VAR&(f)) uDebugNOI(s,a);} 297f46a6179Smrg#define uDEBUG_NOI2(f,s,a,b) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b);} 298f46a6179Smrg#define uDEBUG_NOI3(f,s,a,b,c) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c);} 299f46a6179Smrg#define uDEBUG_NOI4(f,s,a,b,c,d) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c,d);} 300f46a6179Smrg#define uDEBUG_NOI5(f,s,a,b,c,d,e) { if (DEBUG_VAR&(f)) uDebugNOI(s,a,b,c,d,e);} 301f46a6179Smrg#else 302f46a6179Smrg#define uDEBUG(f,s) 303f46a6179Smrg#define uDEBUG1(f,s,a) 304f46a6179Smrg#define uDEBUG2(f,s,a,b) 305f46a6179Smrg#define uDEBUG3(f,s,a,b,c) 306f46a6179Smrg#define uDEBUG4(f,s,a,b,c,d) 307f46a6179Smrg#define uDEBUG5(f,s,a,b,c,d,e) 308f46a6179Smrg#define uDEBUG_NOI(f,s) 309f46a6179Smrg#define uDEBUG_NOI1(f,s,a) 310f46a6179Smrg#define uDEBUG_NOI2(f,s,a,b) 311f46a6179Smrg#define uDEBUG_NOI3(f,s,a,b,c) 312f46a6179Smrg#define uDEBUG_NOI4(f,s,a,b,c,d) 313f46a6179Smrg#define uDEBUG_NOI5(f,s,a,b,c,d,e) 314f46a6179Smrg#endif 315f46a6179Smrg 31634345a63Smrg extern Boolean uSetEntryFile(char *name); 31734345a63Smrg extern void uEntry(int /* l */ , 31834345a63Smrg char * /* s */ , ... 31934345a63Smrg ) 320f46a6179Smrg#if defined(__GNUC__) && \ 321f46a6179Smrg ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 6))) 32234345a63Smrg __attribute__ ((format(printf, 2, 3))) 323f46a6179Smrg#endif 32434345a63Smrg ; 325f46a6179Smrg 32634345a63Smrg extern void uExit(int l, char *rtVal); 327f46a6179Smrg#ifdef ENTRY_TRACKING_ON 328f46a6179Smrg#define ENTRY_BIT 0x10 329f46a6179Smrg#define LOW_ENTRY_BIT 0x1000 330f46a6179Smrg#define ENTER (DEBUG_VAR&ENTRY_BIT) 331f46a6179Smrg#define FLAG(fLag) (DEBUG_VAR&(fLag)) 332f46a6179Smrg 33334345a63Smrg extern int uEntryLevel; 334f46a6179Smrg 335f46a6179Smrg#define uENTRY(s) { if (ENTER) uEntry(1,s);} 336f46a6179Smrg#define uENTRY1(s,a) { if (ENTER) uEntry(1,s,a);} 337f46a6179Smrg#define uENTRY2(s,a,b) { if (ENTER) uEntry(1,s,a,b);} 338f46a6179Smrg#define uENTRY3(s,a,b,c) { if (ENTER) uEntry(1,s,a,b,c);} 339f46a6179Smrg#define uENTRY4(s,a,b,c,d) { if (ENTER) uEntry(1,s,a,b,c,d);} 340f46a6179Smrg#define uENTRY5(s,a,b,c,d,e) { if (ENTER) uEntry(1,s,a,b,c,d,e);} 341f46a6179Smrg#define uENTRY6(s,a,b,c,d,e,f) { if (ENTER) uEntry(1,s,a,b,c,d,e,f);} 342f46a6179Smrg#define uENTRY7(s,a,b,c,d,e,f,g) { if (ENTER) uEntry(1,s,a,b,c,d,e,f,g);} 343f46a6179Smrg#define uRETURN(v) { if (ENTER) uEntryLevel--; return(v); } 344f46a6179Smrg#define uVOIDRETURN { if (ENTER) uEntryLevel--; return; } 345f46a6179Smrg 346f46a6179Smrg#define uFLAG_ENTRY(w,s) { if (FLAG(w)) uEntry(0,s);} 347f46a6179Smrg#define uFLAG_ENTRY1(w,s,a) { if (FLAG(w)) uEntry(0,s,a);} 348f46a6179Smrg#define uFLAG_ENTRY2(w,s,a,b) { if (FLAG(w)) uEntry(0,s,a,b);} 349f46a6179Smrg#define uFLAG_ENTRY3(w,s,a,b,c) { if (FLAG(w)) uEntry(0,s,a,b,c);} 350f46a6179Smrg#define uFLAG_ENTRY4(w,s,a,b,c,d) { if (FLAG(w)) uEntry(0,s,a,b,c,d);} 351f46a6179Smrg#define uFLAG_ENTRY5(w,s,a,b,c,d,e) { if (FLAG(w)) uEntry(0,s,a,b,c,d,e);} 352f46a6179Smrg#define uFLAG_ENTRY6(w,s,a,b,c,d,e,f) { if (FLAG(w)) uEntry(0,s,a,b,c,d,e,f);} 353f46a6179Smrg#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);} 354f46a6179Smrg#define uFLAG_RETURN(v) { return(v);} 355f46a6179Smrg#define uFLAG_VOIDRETURN { return; } 356f46a6179Smrg#else 357f46a6179Smrg#define uENTRY(s) 358f46a6179Smrg#define uENTRY1(s,a) 359f46a6179Smrg#define uENTRY2(s,a1,a2) 360f46a6179Smrg#define uENTRY3(s,a1,a2,a3) 361f46a6179Smrg#define uENTRY4(s,a1,a2,a3,a4) 362f46a6179Smrg#define uENTRY5(s,a1,a2,a3,a4,a5) 363f46a6179Smrg#define uENTRY6(s,a1,a2,a3,a4,a5,a6) 364f46a6179Smrg#define uENTRY7(s,a1,a2,a3,a4,a5,a6,a7) 365f46a6179Smrg#define uRETURN(v) { return(v); } 366f46a6179Smrg#define uVOIDRETURN { return; } 367f46a6179Smrg 368f46a6179Smrg#define uFLAG_ENTRY(f,s) 369f46a6179Smrg#define uFLAG_ENTRY1(f,s,a) 370f46a6179Smrg#define uFLAG_ENTRY2(f,s,a,b) 371f46a6179Smrg#define uFLAG_ENTRY3(f,s,a,b,c) 372f46a6179Smrg#define uFLAG_ENTRY4(f,s,a,b,c,d) 373f46a6179Smrg#define uFLAG_ENTRY5(f,s,a,b,c,d,e) 374f46a6179Smrg#define uFLAG_ENTRY6(f,s,a,b,c,d,e,g) 375f46a6179Smrg#define uFLAG_ENTRY7(f,s,a,b,c,d,e,g,h) 376f46a6179Smrg#define uFLAG_RETURN(v) { return(v);} 377f46a6179Smrg#define uFLAG_VOIDRETURN { return; } 37834345a63Smrg#endif 379f46a6179Smrg 380f46a6179Smrg 381f46a6179Smrg#endif /* UTILS_H */ 382