Regen toc.
[p5sagit/p5-mst-13.2.git] / pod / perlembed.pod
index b46c463..1787e4b 100644 (file)
@@ -280,32 +280,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 +356,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 +364,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 +374,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 +416,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 +466,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 +497,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 +894,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 */
@@ -955,21 +948,13 @@ B<ExtUtils::Embed> can also automate writing the I<xs_init> glue code.
 
 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.
+=head1 Embedding Perl under Windows
 
-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: