Hi Nick, thanx for your help. This code is really more clear than the one I was about to used.
But I've a compiling error from the autogenerate procsinfo.c Would be great if you could give me a hand with it thanx :) "procsinfo.c", line 32.28: 1506-117 (S) Operand must be a scalar type. ### ==> cat procsinfo.xs #include <procinfo.h> #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #define my_pi_pid(proc) ((IV)proc.pi_pid) MODULE = AIX::Procinfo::procsinfo PACKAGE = AIX::Procinfo::procsinfo PREFIX = my_ IV pi_pid(struct procsinfo proc) ### ==> cat procsinfo.c /* * This file was generated automatically by xsubpp version 1.9508 from the * contents of procsinfo.xs. Do not edit this file, edit procsinfo.xs instead. * * ANY CHANGES MADE HERE WILL BE LOST! * */ #line 1 "procsinfo.xs" #include <procinfo.h> #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #define my_pi_pid(proc) ((IV)proc.pi_pid) #line 19 "procsinfo.c" XS(XS_AIX__Procinfo__procsinfo_pi_pid); /* prototype to pass -Wmissing-prototypes */ XS(XS_AIX__Procinfo__procsinfo_pi_pid) { dXSARGS; if (items != 1) Perl_croak(aTHX_ "Usage: AIX::Procinfo::procsinfo::pi_pid(proc)"); { IV RETVAL; dXSTARG; struct procsinfo proc; if (sv_derived_from(ST(0), "struct procsinfo")) { IV tmp = SvIV((SV*)SvRV(ST(0))); proc = INT2PTR(struct procsinfo,tmp); } else Perl_croak(aTHX_ "proc is not of type struct procsinfo"); RETVAL = pi_pid(proc); XSprePUSH; PUSHi((IV)RETVAL); } XSRETURN(1); } #ifdef __cplusplus extern "C" #endif XS(boot_AIX__Procinfo__procsinfo); /* prototype to pass -Wmissing-prototypes */ XS(boot_AIX__Procinfo__procsinfo) { dXSARGS; char* file = __FILE__; XS_VERSION_BOOTCHECK ; newXS("AIX::Procinfo::procsinfo::pi_pid", XS_AIX__Procinfo__procsinfo_pi_pid, file); XSRETURN_YES; } Quoting Nick Ing-Simmons <[EMAIL PROTECTED]>: > Yannick Bergeron <[EMAIL PROTECTED]> writes: > >I'm trying to write a module for an AIX structure named procinfo. This > structure > >is different if we run AIX with a 32bit kernel or with a 64bit kernel > > > >the xs parser doesn't seem to like ifdef. How can I declarer the same > subroutine > >for 32 bits and 64 bits? > > I suspect it isn't only the #if that is the problem but the blank line(s). > xsubpp processes things in "paragraphs". > > #ifdef is ok in the C part (before the MODULE line) > so put the #if there: > > ------------------------------- > static IV my_pi_pid(struct procsinfo proc) > { > #ifdef __64BIT__ > return (IV) proc.pi_pid; > #else > return (IV) proc.pi_pid; > #endif > } > > MODULE AIX::Procinfo::procsinfo PACKAGE = AIX::Procinfo::procsinfo PREFIX = > my_ > > IV pi_pid(struct procsinfo proc) > > ------------------------------- > > That said as the only difference is the return type, and both are > presumably going to end up as an IV anyway > > ------------------------------- > #define my_pi_pid(proc) ((IV)proc.pi_pid) > > MODULE AIX::Procinfo::procsinfo PACKAGE = AIX::Procinfo::procsinfo PREFIX = > my_ > > IV pi_pid(struct procsinfo proc) > ------------------------------- > > Should suffice. > > > > > >example: > > > >#include <procinfo.h> > > > >#include "EXTERN.h" > >#include "perl.h" > >#include "XSUB.h" > > > >MODULE = AIX::Procinfo::procsinfo PACKAGE = AIX::Procinfo::procsinfo > > > >#ifdef __64BIT__ > >pid_t > >pi_pid(struct procsinfo proc) > > CODE: > > /* process ID */ > > RETVAL = proc.pi_pid; > > > > OUTPUT: > > RETVAL > >#else /* __64BIT__ */ > >unsigned long > >pi_pid(struct procsinfo proc) > > CODE: > > /* process ID */ > > RETVAL = proc.pi_pid; > > OUTPUT: > > RETVAL > >#endif /* __64BIT__ */ > > >