Neil,
I made some changes and got it compiled. I print the items number and it is
9. Is that because I am passing the @ARGV (which has seven arguments, $#ARGV
is seven). I am not sure where the 9 comes from. Anyway I changed the items
!= 2 line to items != 9 and I now get an error from the XS_unpack_CharPtrPtr:
rv was not an AV ref
This function I got from Dean Roehrich Cookbook A.
Why do you think the items is 9 and is there something else I should be passing
in place of the @ARGV for a char **?
Thanks
Glenn
Neil Watkiss wrote:
> Glenn MacGregor [31/07/01 16:46 +0000]:
> > Hi All,
> >
> > I got my test to run (somewhat), thanks to all for your help. I have a
> > c function in a static lib file which takes and int and a char **
> >
> > int
> > Init(int, char **);
> >
> > I have made a wrapper around it in my perl test in the __C__ section
> >
> > int
> > PInit(int argc, char **argv) {
> > return Init(argc, argv);
> > }
> >
> > I have also put in that library the XS_unpack_CharPtrPtr; The compile
> > works fine. When It runs I always get the Usage message:
> >
> > Usage main::PInit(int argc, char ** argv)
> >
> > Now Calling PInit:
> >
> > $test = PInit($#ARGV, @ARGV);
> >
> > Looking into the build directory I see where it is happening in the c
> > file:
> >
> > if (item != 2) ...
> >
> > I don't see where item gets set though.
> >
> > Any clues?
>
> It's set in a macro. Here's how to see it expanded (unfortunately MakeMaker
> doesn't put a rule for this automatically). This is a little cryptic because
> the command lines are so long. Try to follow along:
>
> 0) First, we need to get a couple of commands that aren't provided in the
> Makefile for us (stupid MakeMaker :)
>
> In pseudo-shell (adapt to your shell as necessary)
>
> SH> A=`perl -MConfig -e 'print $Config{cpprun}'`
> SH> B=`perl -MExtUtils::Embed -e ccopts`
>
> 1) Create the build directory and preserve it:
>
> SH> perl -MInline=info,force,noclean script.pl
>
> 2) Go to the build dir (I'm making up the md5 key here)
>
> SH> cd _Inline/build/script_pl_0abc/
>
> 3) Generate the preprocessed output:
>
> SH> $A $B script_pl_0abc.c > out.i
>
> 4) You should see a something like this in out.i. It's quite far down in my
> case: line 31155, actually. I never said this was fun...
>
> ----8<----
> extern int Perl___notused ; register SV **sp =
> (*Perl_Tstack_sp_ptr(((PerlInterpreter
> *)pthread_getspecific((*Perl_Gthr_key_ptr(((void *)0) )) ) ) )) ;
> register SV **mark = (*Perl_Tstack_base_ptr(((PerlInterpreter
> *)pthread_getspecific((*Perl_Gthr_key_ptr(((void *)0) )) ) ) )) + (*
> (*Perl_Tmarkstack_ptr_ptr(((PerlInterpreter
> *)pthread_getspecific((*Perl_Gthr_key_ptr(((void *)0) )) ) ) )) --) ;
> I32 ax = mark - (*Perl_Tstack_base_ptr(((PerlInterpreter
> *)pthread_getspecific((*Perl_Gthr_key_ptr(((void *)0) )) ) ) )) + 1;
> I32 items = sp - mark ;
> ---->8----
>
> That's the expansion of the initialization macros XS generates for you. I
> wish MakeMaker inserted the following lines automatically:
>
> CPPFLAG = -E
> CPP = $(CC) $(CPPFLAG)
> CPPCMD = $(CPP) $(INC) $(CCFLAGS) $(OPTIMIZE) \
> $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \
> $(XS_DEFINE_VERSION)
> .c.i:
> $(CPPCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c > $*.i
>
> Then you could just type 'make script_pl_0abc.i' and have done with it.
>
> Later,
> Neil
--
Glenn MacGregor
Director of Services
Oracom, Inc.
http://www.oracom.com
Tel. +1 978.557.5710 Ext. 302
Fax +1 978.557.5716