1#ifdef __cplusplus 2extern "C" { 3#endif 4 5#ifndef kGenericError 6 #define kGenericError -1 7#endif 8 9extern char *gErrorMessage; 10 11 12void SetErrorMessage(const char *theErrorMessage); 13void SetErrorMessageAndAppendLongInt(const char *theErrorMessage,const long theLongInt); 14void SetErrorMessageAndCStrAndLongInt(const char *theErrorMessage,const char * theCStr,const long theLongInt); 15void SetErrorMessageAndCStr(const char *theErrorMessage,const char * theCStr); 16void AppendCStrToErrorMessage(const char *theErrorMessage); 17void AppendLongIntToErrorMessage(const long theLongInt); 18 19 20char *GetErrorMessage(void); 21OSErr GetErrorMessageInNewHandle(Handle *inoutHandle); 22OSErr GetErrorMessageInExistingHandle(Handle inoutHandle); 23OSErr AppendErrorMessageToHandle(Handle inoutHandle); 24 25 26#ifdef __EXCEPTIONS_ENABLED__ 27 void ThrowErrorMessageException(void); 28#endif 29 30 31 32// A bunch of evil macros that would be unnecessary if I were always using C++ ! 33 34#define SetErrorMessageAndBailIfNil(theArg,theMessage) \ 35{ \ 36 if (theArg == nil) \ 37 { \ 38 SetErrorMessage(theMessage); \ 39 errCode = kGenericError; \ 40 goto EXITPOINT; \ 41 } \ 42} 43 44 45#define SetErrorMessageAndBail(theMessage) \ 46{ \ 47 SetErrorMessage(theMessage); \ 48 errCode = kGenericError; \ 49 goto EXITPOINT; \ 50} 51 52 53#define SetErrorMessageAndLongIntAndBail(theMessage,theLongInt) \ 54{ \ 55 SetErrorMessageAndAppendLongInt(theMessage,theLongInt); \ 56 errCode = kGenericError; \ 57 goto EXITPOINT; \ 58} 59 60 61#define SetErrorMessageAndLongIntAndBailIfError(theErrCode,theMessage,theLongInt) \ 62{ \ 63 if (theErrCode != noErr) \ 64 { \ 65 SetErrorMessageAndAppendLongInt(theMessage,theLongInt); \ 66 errCode = theErrCode; \ 67 goto EXITPOINT; \ 68 } \ 69} 70 71 72#define SetErrorMessageCStrLongIntAndBailIfError(theErrCode,theMessage,theCStr,theLongInt) \ 73{ \ 74 if (theErrCode != noErr) \ 75 { \ 76 SetErrorMessageAndCStrAndLongInt(theMessage,theCStr,theLongInt); \ 77 errCode = theErrCode; \ 78 goto EXITPOINT; \ 79 } \ 80} 81 82 83#define SetErrorMessageAndCStrAndBail(theMessage,theCStr) \ 84{ \ 85 SetErrorMessageAndCStr(theMessage,theCStr); \ 86 errCode = kGenericError; \ 87 goto EXITPOINT; \ 88} 89 90 91#define SetErrorMessageAndBailIfError(theErrCode,theMessage) \ 92{ \ 93 if (theErrCode != noErr) \ 94 { \ 95 SetErrorMessage(theMessage); \ 96 errCode = theErrCode; \ 97 goto EXITPOINT; \ 98 } \ 99} 100 101 102#define SetErrorMessageAndLongIntAndBailIfNil(theArg,theMessage,theLongInt) \ 103{ \ 104 if (theArg == nil) \ 105 { \ 106 SetErrorMessageAndAppendLongInt(theMessage,theLongInt); \ 107 errCode = kGenericError; \ 108 goto EXITPOINT; \ 109 } \ 110} 111 112 113#define BailIfError(theErrCode) \ 114{ \ 115 if ((theErrCode) != noErr) \ 116 { \ 117 goto EXITPOINT; \ 118 } \ 119} 120 121 122#define SetErrCodeAndBail(theErrCode) \ 123{ \ 124 errCode = theErrCode; \ 125 \ 126 goto EXITPOINT; \ 127} 128 129 130#define SetErrorCodeAndMessageAndBail(theErrCode,theMessage) \ 131{ \ 132 SetErrorMessage(theMessage); \ 133 errCode = theErrCode; \ 134 goto EXITPOINT; \ 135} 136 137 138#define BailNow() \ 139{ \ 140 errCode = kGenericError; \ 141 goto EXITPOINT; \ 142} 143 144 145#ifdef __cplusplus 146} 147#endif 148