Newsgroups: comp.sys.mac.programmer
Path: utzoo!utgpu!watserv1!watdragon!puff.waterloo.edu!rnpantos
From: rnpantos@puff.uwaterloo.ca (Roger Pantos)
Subject: Think C enum bug in Events.h
Message-ID: <1991Jun14.190703.10891@watdragon.waterloo.edu>
Followup-To: comp.sys.mac.programmer
Summary: upper word gets munged
Originator: rnpantos@puff.waterloo.edu
Sender: news@watdragon.waterloo.edu (News Owner)
Organization: University of Waterloo
Date: Fri, 14 Jun 1991 19:07:03 GMT
Lines: 59



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

