Amar Deep Singh <[EMAIL PROTECTED]> writes:
>Hi
>
>I am calling a C subroutine from Perl. The "*argv_ptr" if the global @ARGV
>is perl.
>I am passing the pointer to this to the C which does some manipulations and
>removes some of the arguments in @ARGV.
>But it seems the values returned are not the same which I want.
>
>Any idea how I can push the values of "args_av" back into "argv_ptr".
>I am pushing back the values in "args_av" but its not working. Any idea if I
>am missing something.
>In simple words I want the modified values of c_args to be put into @ARGV,
>which is nothing but the pointer "argv_ptr"
@ARGV is an AV not just an SV ** - you need to get the AV and call
av_push() etc. to keep length in sync.
>
>Thanks
>Amar
>
>Here is the code in xs. which i call from Perl as return
>_Initialise($config, $0, \@ARGV);
>
>============================================================================
>=============
>int D_Initialise(config, appname, argv_ptr)
> Configuration config
> char *appname
> SV *argv_ptr
> CODE:
> {
> int argc, i, str_length;
> char **c_args;
> char *arg;
> SV *tmpSV;
> AV *args_av, *ret_args;
>
> /* dereference the argv */
> args_av = (AV*) SvRV(argv_ptr);
>
> /* get the number of arguments */
> argc = av_len(args_av) + 1;
>
> /* allocate enough memory */
> c_args = (char **) malloc((argc + 1) * sizeof(char *));
>
> /* copy the appname into the c_args array */
> c_args[0] = (char *) malloc((strlen(appname) + 1) * sizeof(char));
>
> /* copy the contents of the argv ref */
> for(i = 0; i < argc; i++) {
> /* get the string */
> tmpSV = av_shift(args_av);
> arg = (char *) SvPV(tmpSV, str_length);
> c_args[i + 1] = (char *) malloc((str_length + 1) *
>sizeof(char));
> strcpy(c_args[i + 1], arg);
> }
>
> /* now call the proper Initialise */
> RETVAL = Initialise(config, &c_args, &argc);
>
> /* put the arguments back */
> for(i = 0; i < argc; i++) {
> av_unshift(args_av, 1);
> av_store(args_av, i, (SV *) newSVpv(c_args[i], 0));
> }
> }
> OUTPUT:
> argv_ptr
> RETVAL
>============================================================================
>=============
--
Nick Ing-Simmons
http://www.ni-s.u-net.com/