1 #ifdef __cplusplus 2 extern "C" { 3 #endif 4 5 #ifndef kGenericError 6 #define kGenericError -1 7 #endif 8 9 extern char *gErrorMessage; 10 11 12 void SetErrorMessage(const char *theErrorMessage); 13 void SetErrorMessageAndAppendLongInt(const char *theErrorMessage,const long theLongInt); 14 void SetErrorMessageAndCStrAndLongInt(const char *theErrorMessage,const char * theCStr,const long theLongInt); 15 void SetErrorMessageAndCStr(const char *theErrorMessage,const char * theCStr); 16 void AppendCStrToErrorMessage(const char *theErrorMessage); 17 void AppendLongIntToErrorMessage(const long theLongInt); 18 19 20 char *GetErrorMessage(void); 21 OSErr GetErrorMessageInNewHandle(Handle *inoutHandle); 22 OSErr GetErrorMessageInExistingHandle(Handle inoutHandle); 23 OSErr 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