Integrate mainline
[p5sagit/p5-mst-13.2.git] / pod / perlembed.pod
index b46c463..57d1bdb 100644 (file)
@@ -37,25 +37,45 @@ Read on...
 
 =over 5
 
-L<Compiling your C program>
+=item *
 
-L<Adding a Perl interpreter to your C program>
+Compiling your C program
 
-L<Calling a Perl subroutine from your C program>
+=item *
 
-L<Evaluating a Perl statement from your C program>
+Adding a Perl interpreter to your C program
 
-L<Performing Perl pattern matches and substitutions from your C program>
+=item *
 
-L<Fiddling with the Perl stack from your C program>
+Calling a Perl subroutine from your C program
 
-L<Maintaining a persistent interpreter>
+=item *
 
-L<Maintaining multiple interpreter instances>
+Evaluating a Perl statement from your C program
 
-L<Using Perl modules, which themselves use C libraries, from your C program>
+=item *
 
-L<Embedding Perl under Win32>
+Performing Perl pattern matches and substitutions from your C program
+
+=item *
+
+Fiddling with the Perl stack from your C program
+
+=item *
+
+Maintaining a persistent interpreter
+
+=item *
+
+Maintaining multiple interpreter instances
+
+=item *
+
+Using Perl modules, which themselves use C libraries, from your C program
+
+=item *
+
+Embedding Perl under Win32
 
 =back 
 
@@ -258,9 +278,8 @@ and package C<END {}> blocks.
 If you want to pass arguments to the Perl subroutine, you can add
 strings to the C<NULL>-terminated C<args> list passed to
 I<call_argv>.  For other data types, or to examine return values,
-you'll need to manipulate the Perl stack.  That's demonstrated in the
-last section of this document: L<Fiddling with the Perl stack from
-your C program>.
+you'll need to manipulate the Perl stack.  That's demonstrated in
+L<Fiddling with the Perl stack from your C program>.
 
 =head2 Evaluating a Perl statement from your C program
 
@@ -280,32 +299,32 @@ the first, a C<float> from the second, and a C<char *> from the third.
 
    #include <EXTERN.h>
    #include <perl.h>
-   
+
    static PerlInterpreter *my_perl;
-   
+
    main (int argc, char **argv, char **env)
    {
        STRLEN n_a;
        char *embedding[] = { "", "-e", "0" };
-   
+
        my_perl = perl_alloc();
        perl_construct( my_perl );
-   
+
        perl_parse(my_perl, NULL, 3, embedding, NULL);
        perl_run(my_perl);
-   
+
        /** Treat $a as an integer **/
        eval_pv("$a = 3; $a **= 2", TRUE);
        printf("a = %d\n", SvIV(get_sv("a", FALSE)));
-   
+
        /** Treat $a as a float **/
        eval_pv("$a = 3.14; $a **= 2", TRUE);
        printf("a = %f\n", SvNV(get_sv("a", FALSE)));
-   
+
        /** Treat $a as a string **/
        eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE);
        printf("a = %s\n", SvPV(get_sv("a", FALSE), n_a));
-   
+
        perl_destruct(my_perl);
        perl_free(my_perl);
    }
@@ -356,7 +375,7 @@ made.
    int matches(SV *string, char *pattern, AV **matches);
 
 Given an C<SV>, a pattern, and a pointer to an empty C<AV>,
-matches() evaluates C<$string =~ $pattern> in an array context, and
+matches() evaluates C<$string =~ $pattern> in a list context, and
 fills in I<matches> with the array elements, returning the number of matches found.
 
 Here's a sample program, I<match.c>, that uses all three (long lines have
@@ -364,7 +383,7 @@ been wrapped here):
 
  #include <EXTERN.h>
  #include <perl.h>
+
  /** my_eval_sv(code, error_check)
  ** kinda like eval_sv(), 
  ** but we pop the return value off the stack 
@@ -374,41 +393,41 @@ been wrapped here):
      dSP;
      SV* retval;
      STRLEN n_a;
+
      PUSHMARK(SP);
      eval_sv(sv, G_SCALAR);
+
      SPAGAIN;
      retval = POPs;
      PUTBACK;
+
      if (croak_on_error && SvTRUE(ERRSV))
        croak(SvPVx(ERRSV, n_a));
+
      return retval;
  }
+
  /** match(string, pattern)
  **
  ** Used for matches in a scalar context.
  **
  ** Returns 1 if the match was successful; 0 otherwise.
  **/
+
  I32 match(SV *string, char *pattern)
  {
      SV *command = NEWSV(1099, 0), *retval;
      STRLEN n_a;
+
      sv_setpvf(command, "my $string = '%s'; $string =~ %s",
              SvPV(string,n_a), pattern);
+
      retval = my_eval_sv(command, TRUE);
      SvREFCNT_dec(command);
+
      return SvIV(retval);
  }
+
  /** substitute(string, pattern)
  **
  ** Used for =~ operations that modify their left-hand side (s/// and tr///)
@@ -416,48 +435,48 @@ been wrapped here):
  ** Returns the number of successful matches, and
  ** modifies the input string if there were any.
  **/
+
  I32 substitute(SV **string, char *pattern)
  {
      SV *command = NEWSV(1099, 0), *retval;
      STRLEN n_a;
+
      sv_setpvf(command, "$string = '%s'; ($string =~ %s)",
              SvPV(*string,n_a), pattern);
+
      retval = my_eval_sv(command, TRUE);
      SvREFCNT_dec(command);
+
      *string = get_sv("string", FALSE);
      return SvIV(retval);
  }
+
  /** matches(string, pattern, matches)
  **
- ** Used for matches in an array context.
+ ** Used for matches in a list context.
  **
  ** Returns the number of matches,
  ** and fills in **matches with the matching substrings
  **/
+
  I32 matches(SV *string, char *pattern, AV **match_list)
  {
      SV *command = NEWSV(1099, 0);
      I32 num_matches;
      STRLEN n_a;
+
      sv_setpvf(command, "my $string = '%s'; @array = ($string =~ %s)",
              SvPV(string,n_a), pattern);
+
      my_eval_sv(command, TRUE);
      SvREFCNT_dec(command);
+
      *match_list = get_av("array", FALSE);
      num_matches = av_len(*match_list) + 1; /** assume $[ is 0 **/
+
      return num_matches;
  }
+
  main (int argc, char **argv, char **env)
  {
      PerlInterpreter *my_perl = perl_alloc();
@@ -466,30 +485,30 @@ been wrapped here):
      I32 num_matches, i;
      SV *text = NEWSV(1099,0);
      STRLEN n_a;
+
      perl_construct(my_perl);
      perl_parse(my_perl, NULL, 3, embedding, NULL);
+
      sv_setpv(text, "When he is at a convenience store and the bill comes to some amount like 76 cents, Maynard is aware that there is something he *should* do, something that will enable him to get back a quarter, but he has no idea *what*.  He fumbles through his red squeezey changepurse and gives the boy three extra pennies with his dollar, hoping that he might luck into the correct amount.  The boy gives him back two of his own pennies and then the big shiny quarter that is his prize. -RICHH");
+
      if (match(text, "m/quarter/")) /** Does text contain 'quarter'? **/
        printf("match: Text contains the word 'quarter'.\n\n");
      else
        printf("match: Text doesn't contain the word 'quarter'.\n\n");
+
      if (match(text, "m/eighth/")) /** Does text contain 'eighth'? **/
        printf("match: Text contains the word 'eighth'.\n\n");
      else
        printf("match: Text doesn't contain the word 'eighth'.\n\n");
+
      /** Match all occurrences of /wi../ **/
      num_matches = matches(text, "m/(wi..)/g", &match_list);
      printf("matches: m/(wi..)/g found %d matches...\n", num_matches);
+
      for (i = 0; i < num_matches; i++)
        printf("match: %s\n", SvPV(*av_fetch(match_list, i, FALSE),n_a));
      printf("\n");
+
      /** Remove all vowels from text **/
      num_matches = substitute(&text, "s/[aeiou]//gi");
      if (num_matches) {
@@ -497,12 +516,12 @@ been wrapped here):
               num_matches);
        printf("Now text is: %s\n\n", SvPV(text,n_a));
      }
+
      /** Attempt a substitution **/
      if (!substitute(&text, "s/Perl/C/")) {
        printf("substitute: s/Perl/C...No substitution made.\n\n");
      }
+
      SvREFCNT_dec(text);
      PL_perl_destruct_level = 1;
      perl_destruct(my_perl);
@@ -894,21 +913,14 @@ That's where the glue code can be inserted to create the initial contact between
 Perl and linked C/C++ routines.  Let's take a look some pieces of I<perlmain.c>
 to see how Perl does this:
 
+ static void xs_init (pTHX);
 
- #ifdef __cplusplus
- #  define EXTERN_C extern "C"
- #else
- #  define EXTERN_C extern
- #endif
-
- static void xs_init (void);
-
- EXTERN_C void boot_DynaLoader (CV* cv);
- EXTERN_C void boot_Socket (CV* cv);
+ EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
+ EXTERN_C void boot_Socket (pTHX_ CV* cv);
 
 
  EXTERN_C void
- xs_init()
+ xs_init(pTHX)
  {
         char *file = __FILE__;
         /* DynaLoader is a special case */
@@ -957,19 +969,11 @@ Consult L<perlxs>, L<perlguts>, and L<perlapi> for more details.
 
 =head1 Embedding Perl under Win32
 
-At the time of this writing (5.004), there are two versions of Perl
-which run under Win32.  (The two versions are merging in 5.005.)
-Interfacing to ActiveState's Perl library is quite different from the
-examples in this documentation, as significant changes were made to
-the internal Perl API.  However, it is possible to embed ActiveState's
-Perl runtime.  For details, see the Perl for Win32 FAQ at
-http://www.perl.com/CPAN/doc/FAQs/win32/perlwin32faq.html.
-
-With the "official" Perl version 5.004 or higher, all the examples
-within this documentation will compile and run untouched, although
-the build process is slightly different between Unix and Win32.  
+In general, all of the source code shown here should work unmodified under
+Windows.
 
-For starters, backticks don't work under the Win32 native command shell.
+However, there are some caveats about the command-line examples shown.
+For starters, backticks won't work under the Win32 native command shell.
 The ExtUtils::Embed kit on CPAN ships with a script called
 B<genmake>, which generates a simple makefile to build a program from
 a single C source file.  It can be used like this: