in reply to A clean way to account for machine word sizes in XS code?
For the typemap you need to add typemap entries that map your types to the same as the other int types, eg. in typemap:
gf2_u8 T_UV gf2_u16 T_UV gf2_u32 T_UV gf2_s8 T_IV gf2_s16 T_IV gf2_s32 T_IV
ExtUtils::MakeMaker should pick up the type map automatically when you run Makefile.PL.
As to whether those types are the correct types, one possibility is stdint.h, which requires a C99 compiler/libc, but in most cases, if the C compiler has 8 and 16 bit int types, char and short will be them.
Unfortunately perl doesn't probe for stdint.h, so it's something you'd need to probe for yourself.
For 32-bit, long might be 64-bit*, so in the absence of inttypes.h you could use limits.h:
#include <limits.h> #if USHRT_MAX > 0x80000000 typedef unsigned short gf2_u32; #elif UINT_MAX > 0x80000000 typedef unsigned gf2_u32; #else typedef unsigned long gf2_u32; #endif
* According to the standard, they could all be 128-bit, but most likely char is 8 bit if the compiler has an 8-bit type, and unless the compiler has stdint.h, short will be the 16 bit type if there is one.
|
---|