> 
> Can you once more explain why you want a C program that
> executes Perl code given as a string? 

Mainly learning purposes to better my mind

> And how should the Perl
> code be injected into the C program?

To illustrate it in Perl:
$perlcode = q(print "monkey";);
eval $perlcode;
Excpet in C

Explained a bit more below with the examples...

> 
> You can always do
> 
>     const char *perlcode = "use CGI; ...";
> 
> This however is tedious since you can't break literal C
> strings into several lines and have to escape double-quotes 
> etc. There are probably a million ways to fill a string. It 
> really depends on your requirements.
> 
[snip]
> You could do:
> 
>     printf("%s", SvPV(eval_pv(perlcode)));
>     
> >        string = SvPV(ret, n_a);
> > 
> >        perl_destruct(my_perl);
> >        perl_free(my_perl);
> > 
> >      /** Would this be better right after string =
> SvPV(...) or after perl_free() ?? **/
> >      printf(string);
> 
> Probably better before you destruct and free the Perl interpreter.
> SvPV() does not return a copy of the string in the scalar
> variable. It returns the pointer in it. So it could happen 
> that the memory this pointer points to has been freed because 
> the Perl interpreter has been destructed.
> 
> How much of the allocated memory perl frees when exiting
> depends on the PERL_DESTRUCT_LEVEL (perl checks the value of 
> this environment variable when exiting). Per default perl 
> doesn't clean up very much and leaves this work to the 
> operating system. Nonetheless, it's safer to access the 
> perl-related memory before perl_free() happens.
> 
>
Thanks for that awesome info Tassilo!!!!
Here's where I'm at so far everyone who's keeping score at home:

Ok, I can compile this example with:
cc -o perlemb perlemb.c `perl -MExtUtils::Embed -e ccopts -e ldopts`  

I can run it like this:
./perlemb -e 'print "Howdy";'
Howdy
Or
./perlemb
print "Howdy";
<cntrl D>
Howdy

Here's what I have on the inetrnal version (IE the perl to execute is provided inside 
and not via cmd line)

#include <EXTERN.h>               /* from the Perl distribution     */
#include <perl.h>                 /* from the Perl distribution     */

static PerlInterpreter *my_perl;  /***    The Perl interpreter    ***/

int main(int argc, char **argv, char **env)
{
    my_perl = perl_alloc();
    perl_construct(my_perl);
    perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
    perl_run(my_perl);
    perl_destruct(my_perl);
    perl_free(my_perl);
}

What I'd like to do with this is:

./perlemb2
Howdy
And eventually through using CGI's param() perhas:
./perlemb2 name=JoeMama
Howdy JoeMama

What I have so far for testing is:

#include <EXTERN.h>
#include <perl.h>

static PerlInterpreter *my_perl;

main (int argc, char **argv, char **env)
{
   STRLEN n_a;
   const char *perlcode = "use CGI 'header';print header();print 'hello World';";

   my_perl = perl_alloc();
   perl_construct( my_perl );

   perl_parse(my_perl, NULL, argc, argv, (char **)NULL);

   perl_run(my_perl);

   printf("%s", SvPV(eval_pv(perlcode)));

   perl_destruct(my_perl);
   perl_free(my_perl);
}

But when I compile it the same way as the first I get:

perlemb.c:18: macro `SvPV' used with just one arg

So I tried it as 
printf("%s", SvPV(eval_pv(perlcode),n_a));
Which is how it was in another example and got:

perlemb.c: In function `main':
perlemb.c:18: invalid type argument of `->'
perlemb.c:18: invalid type argument of `->'
perlemb.c:18: invalid type argument of `->'
perlemb.c:18: warning: passing arg 1 of `Perl_sv_2pv' makes pointer from integer 
without a cast

I'm sure I'm missing somethgin obvious but I'm fascinated with this!

TIA

Dan

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to