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.
In reply to Re: A clean way to account for machine word sizes in XS code?
by tonyc
in thread A clean way to account for machine word sizes in XS code?
by dec
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |