rnpantos@puff.uwaterloo.ca (Roger Pantos) (06/15/91)
I recently switched to using the System 7 header and library files (from the 7b4 CD-ROM) with Think C v4.0.5. It seems that a few constants in Events.h which were formerly #define'd are now enum's instead. This, I believe, has led to a problem. Consider adbAddrMask: it contains the definition enum { adbAddrMask = 0x00FF0000 }; Now consider the following code: #include <Events.h> void main( void) { long message, test; message = 0x00330000; test = message & adbAddrMask; } If you step through this with the debugger, at the end of the program you get message == 0x00330000, but test == 0x00000000. Is this wrong? Well, yes and no. It's not really the result I'd like to get, but according K&R, 2nd Ed., enum's are to be treated as type "int". adbAddrMask (0x00FF0000) becomes 0 when cast to a (16-bit) int in Think C. This problem does not show up under MPW because ints there are 32 bits. There is an even better example in keyCodeMask, 0x0000FF00. Because an enum is a _signed_ int, keyCodeMask when used in an operation with a long becomes sign-extended to be 0xFFFFFF00. Thus in the above program, setting message to be, say, 0x00023300 means that message & keyCodeMask == 0x00023300 is not masked at all. There are 4 constants in Events.h which should be #define'd as they were previously: charCodeMask, keyCodeMask, adbAddrMask and osEvtMessageMask (0xFF000000L). This will fix the problem. Doing a quick grep through the include files, I only found one other constant with the same problem - MaxSmallFract in Picker.h (formerly in ColorToolbox.h). I may have missed a few, however. Other than that, my projects converted to the new stuff without any problems. Symantec, Pete Helme and DTS did a great job, considering the time constraints they were under. Thanks, guys! cheers, Roger