Yes, 32bit/64bit support is quite tricky. I build a Unit that seems to work for Allegro.pas (or it does for Linux and Allegro 4, but it doesn't seems to work so good with Allegro 5 or Win64 ). Look at it:
Code:(* Next are definitions of numeric data types. We may use FPC's ctype unit, but Delphi doesn't has it so I prefer to do it by hand. First: it defines some integers with specific lenght. Then: it defines the types used by C declarations. *) TYPE (* Generic pointer. *) AL_POINTER = POINTER; (* Signed 8bit integer values. *) AL_INT8 = SHORTINT; (* Unsigned 8bit integer values. *) AL_UINT8 = BYTE; (* Signed 16bit integer values. *) AL_INT16 = SMALLINT; (* Unsigned 16bit integer values. *) AL_UINT16 = WORD; (* Signed 32bit integer values. *) AL_INT32 = LONGINT; (* Unsigned 32bit integer values. *) AL_UINT32 = LONGWORD; (* Signed 64bit integer values. *) AL_INT64 = INT64; (* Unsigned 64bit integer values. *) AL_UINT64 = QWORD; (* Signed 8bit integer. Note that it isn't Pascal's CHAR type! *) AL_CHAR = AL_INT8; (* Unsigned 8bit integer values. *) AL_UCHAR = AL_UINT8; (* Signed 16bit integer values. *) AL_SHORT = AL_INT16; (* Unsigned 16bit integer values. *) AL_USHORT = AL_UINT16; (* Signed 32bit integer values. *) AL_INT = AL_INT32; (* Unsigned 32bit integer values. *) AL_UINT = AL_UINT32; {$IFDEF CPU64} {$IFDEF WINDOWS} (* Signed 32/64bit integer values. *) AL_LONG = AL_INT32; (* Unsigned 32/64bit integer values. *) AL_ULONG = AL_UINT32; {$ELSE} (* Signed 32/64bit integer values. *) AL_LONG = AL_INT64; (* Unsigned 32/64bit integer values. *) AL_ULONG = AL_UINT64; {$ENDIF} (* size_t equivalent. *) AL_SIZE_T = AL_UINT64; (* Fake pointer type. It's needed because the need of pointer arithmetics in some inlined methods. *) AL_UINTPTR_T = AL_UINT64; {$ELSE} (* Signed 32/64bit integer values. *) AL_LONG = AL_INT32; (* Unsigned 32/64bit integer values. *) AL_ULONG = AL_UINT32; (* size_t equivalent. *) AL_SIZE_T = AL_UINT32; (* Fake pointer type. It's needed because the need of pointer arithmetics in some inlined methods. *) AL_UINTPTR_T = AL_UINT32; {$ENDIF} (* Float value. *) AL_FLOAT = SINGLE; (* Double value. *) AL_DOUBLE = DOUBLE; (* Pointer. *) AL_VOIDptr = AL_POINTER; (* Special 8bit integer pointer. *) AL_UINT8ptr = ^AL_UINT8; (* Pointer to signed 8bit integer values. *) AL_CHARptr = ^AL_CHAR; (* Pointer to unsigned 8bit integer values. *) AL_UCHARptr = ^AL_UCHAR; (* Pointer to unsigned 16bit integer values. *) AL_USHORTptr = ^AL_USHORT; (* Special 16bit integer pointer. *) AL_UINT16ptr = ^AL_UINT16; (* Special 32bit integer pointer. *) AL_UINT32ptr = ^AL_UINT32; (* Pointer to signed 32bit integer values. *) AL_INTptr = ^AL_INT; (* Pointer to signed 32bit integer values. *) AL_UINTptr = ^AL_UINT; (* Pointer to float values. *) AL_FLOATptr = ^AL_FLOAT; (* Pointer to text strings. Used to convert Pascal's @code(STRING) to C @code(char * ) *) AL_STRptr = PCHAR;
Bookmarks