SlideShare a Scribd company logo
Embedding Perl in C and
 the other way around




      Marian Marinov(mm@1h.com
                  
            Co-Founder and CIO of 1H Ltd.
Embedding C in Perl




              
The XS way...

       It cannot be seen, cannot be felt,
     Cannot be heard, cannot be smelt.
    It lies behind stars and under hills,
             And empty holes it fills.
                  - J.R.R. Tolkien, The Hobbit


    Answer: dark.

                         
XS Docs

● perlman:perlxstut
● man perlxs

● man perlguts

● man perlapi

● man h2xs




                       
XS Basics
● SV – Scalar Value                 SV*   newSVsv(SV*);
● AV  – Array Value
● HV  – Hash Value
● IV  – Integer Value               SV*   newSViv(IV);
● UV  – Unsigned Integer Value      SV*   newSVuv(UV);
● NV  – Double Value                SV*   newSVnv(double);
● PV  – String Value
●SV* newSVpv(const char*, STRLEN);

●SV* newSVpvn(const char*, STRLEN);

●SV* newSVpvf(const char*, ...);




    SvIV(SV*)
    SvUV(SV*)
    SvNV(SV*)
    SvPV(SV*, STRLEN len)
    SvPV_nolen(SV*)
                                
Inline::C
$ cat inline.pl
#!/usr/bin/perl
use Inline C=>'
void some_func() {
        printf("Hello Worldn");
}';
&some_func

$ ./inline.pl
Hello World

Examples from Inline::C-Cookbook
                     
fun way of using Inline::C

$ cat perl­sign.pl 
#!/usr/bin/perl 
use Inline C=>'
void C() {
    int m,u,e=0;float l,_,I;
    for(;1840­e;putchar((++e>907&&942>e?61­m:u)
["n)moc.isc@rezneumb(rezneuM drahnreB"]))
        for(u=_=l=0;79­(m=e%80)&&I*l+_*_<6&&26­+
+u;_=2*l*_+e/80*.09­1,l=I)
            I=l*l­_*_­2+m/27.;
    }';
&C
                             
mmmmmmmmooooooooooooooooooooooooocccccccccc....is@zrre i.cccccccoooooooooommmmm
mmmmmmoooooooooooooooooooooooccccccccccc.....iiscrr n@csi...ccccccoooooooooommm
mmmmooooooooooooooooooooooccccccccccc....iiiss@n     zMesii....cccccoooooooooom
mmooooooooooooooooooooocccccccccc....iisssssc@rn      erccsiiiii..ccccooooooooo
moooooooooooooooooocccccccc.......iis@e uMeu r          e r@@@ezs..cccoooooooo
oooooooooooooooccccccc.........iiiisc@z                     e   eci..cccooooooo
ooooooooooccccccc..iiiiiiiiiiiiisscz z                         z@sii.ccccoooooo
oooooccccccccc...iicz@ccccz@ccccccrrr                              s..cccoooooo
ooocccccccc.....iisc@eb     bnneree                              eci..ccccooooo
occcccccc.....iisccrnb           m                               nci..ccccooooo
ccc....iiiiisss@emee(                                            cii..cccccoooo
iscc@@beremeene(           Bernhard Muenzer(bmuenzer@csi.com) ercsi...cccccoooo
c....iiiiiisssc@e rnz                                           esi...cccccoooo
occccccc....iiiscc@rb            (                               esi..ccccooooo
oocccccccc......iisc@z        bneze                              z@i..ccccooooo
ooooocccccccc....ii@er@@@@nr@cccc@e                               es..cccoooooo
oooooooooccccccc...@siiiiiiiiisssscnM                          urcsi..cccoooooo
ooooooooooooooccccccc..........iiiisc@e                         zsi..cccooooooo
mooooooooooooooooocccccccc.......iiis@    nu               er eznri.cccoooooooo
mmoooooooooooooooooooocccccccccc....issc@ccc@@rn      er@cssiiiss..cccooooooooo
mmmmoooooooooooooooooooooccccccccccc....iiiisc@z      rrsii.....ccccoooooooooom
mmmmmooooooooooooooooooooooocccccccccccc....iis@rz rrcsi....ccccccoooooooooomm
mmmmmmmmoooooooooooooooooooooooocccccccccc....iisceeeusi..cccccccooooooooommmmm

                                         
Multiple Return Values

print map {"$_n"} get_localtime(time);

use Inline C => <<'END_OF_C_CODE';

#include <time.h>
void get_localtime(int utc) {
   struct tm *ltime = localtime(&utc);
   Inline_Stack_Vars;
   Inline_Stack_Reset;

        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_year)));
        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_mon)));
        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_mday)));
        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_hour)));
        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_min)));
        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_sec)));
        Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_isdst)));
        Inline_Stack_Done;
}
                                       
END_OF_C_CODE
Variable Argument Lists


greet(qw(Sarathy Jan Sparky Murray Mike));

use Inline C => <<'END_OF_C_CODE';
void greet(SV* name1, ...) {
  Inline_Stack_Vars;
  int i;

  for (i = 0; i < Inline_Stack_Items; i++)
    printf("Hello %s!n",
       SvPV(Inline_Stack_Item(i), PL_na));

  Inline_Stack_Void;
}
END_OF_C_CODE
                         
Another way of using Inline::C


use Inline C;

$vp = string_scan($text);      # call our function

__END__
__C__
/*
 * Our C code goes here
 */
int string_scan(char* str) {

}
                         
Embedding Perl in C




              
How you can do it?


● ExtUtils::Embed
      perl -MExtUtils::Embed -e ccopts -e ldopts
● B::C

● The only way... XS




                          
Docs


man   perlembed
man   perlcall
man   perlguts
man   perlapi
man   perlxs



                    
B::C/perlcc
●   Works with Perl 5.6.0
●   Works with Perl 5.13.x

#!/usr/bin/perl
use strict;
use warnings;
use lib '.';
use parse_config;

my $a = 'some text';
my $b = 13;
my %config = parse_config('/etc/guardian.conf');
#my %config = ( df => 13, hj => 18);
printf "%s %dn", $a, $b;
while (my ($k,$v) = each %config) {
        print "$k :: $vn";
}
                                 
$ perlcc -o em em.pl
$ ./em
Segmentation fault

$ perlcc -o em em.pl
$ ./em
some text 13
df :: 13
hj :: 18




                        
#include "embed.h"

int main (int argc, char **argv, char **env) {
        char *embedding[] = { "", "-e", "0" };
        unsigned char *perlPlain;
        size_t len = 0;
        int err = 0;

        PERL_SYS_INIT3(&argc,&argv,&env);
        my_perl = perl_alloc();
        perl_construct( my_perl );

        perl_parse(my_perl, xs_init, 3, embedding, NULL);
        PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
        perl_run(my_perl);

        perlPlain=spc_base64_decode(&perl64,&len,0,&err);
        eval_pv(perlPlain, TRUE);

        perl_destruct(my_perl);
        perl_free(my_perl);
        PERL_SYS_TERM();
        return 0;
                                   
}
#ifndef _EMBED_H
#define _EMBED_H
#include <EXTERN.h>
#include <perl.h>
#include "base64.h"
#include "code_64.h"

static PerlInterpreter *my_perl;
static void xs_init (pTHX);

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);
EXTERN_C void boot_Socket (pTHX_ CV* cv);
EXTERN_C void xs_init(pTHX) {
        char *file = __FILE__;
        /* DynaLoader is a special case */
        newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader,
file);
}

#endif

                                    
$ ./embed --version

This is perl, v5.10.1 (*) built for i386-linux-thread-multi

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic
License or the
GNU General Public License, which may be found in the Perl 5
source kit.

Complete documentation for Perl, including FAQ lists, should be
found on
this system using "man perl" or "perldoc perl". If you have
access to the
Internet, point your browser at http://www.perl.org/, the Perl
Home Page.



                                   
# perl -MExtUtils::Embed -e ccopts -e ldopts
-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux-thread-
multi/CORE -L/usr/local/lib /usr/lib/perl5/5.8.8/i386-linux-
thread-multi/auto/DynaLoader/DynaLoader.a
-L/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE -lperl
-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
 -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe
-Wdeclaration-after-statement -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm
-I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE

# gcc -o embed embed.c $(perl -MExtUtils::Embed -e ccopts -e
ldopts)




                                 
call_argv("showtime", G_DISCARD | G_NOARGS, args);

                             vs.

      eval_pv(perlPlain, TRUE);


    /** Treat $a as an integer **/
      eval_pv("$a = 3; $a **= 2", TRUE);
      printf("a = %dn", SvIV(get_sv("a", 0)));

    /** Treat $a as a float **/
      eval_pv("$a = 3.14; $a **= 2", TRUE);
      printf("a = %fn", SvNV(get_sv("a", 0)));

 /** Treat $a as a string **/
   eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);",
TRUE);
   printf("a = %sn", SvPV_nolen(get_sv("a", 0)));

                                    

More Related Content

PDF
Php radomize
PDF
Beware sharp tools
PDF
Beware: Sharp Tools
TXT
Tgh.pl
PDF
Perl 5.10 on OSDC.tw 2009
KEY
Advanced Shell Scripting
PDF
Fizzbuzzalooza
PDF
Stupid Awesome Python Tricks
Php radomize
Beware sharp tools
Beware: Sharp Tools
Tgh.pl
Perl 5.10 on OSDC.tw 2009
Advanced Shell Scripting
Fizzbuzzalooza
Stupid Awesome Python Tricks

What's hot (20)

PDF
FizzBuzz Trek
PDF
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
PDF
Get Kata
PDF
Ruby Topic Maps Tutorial (2007-10-10)
PDF
festival ICT 2013: Solid as diamond: use ruby in an web application penetrati...
PDF
ATS language overview
PDF
Checking the Open-Source Multi Theft Auto Game
KEY
how to hack with pack and unpack
PDF
gemdiff
PDF
R で解く FizzBuzz 問題
PDF
ES6 - Level up your JavaScript Skills
PDF
Code obfuscation, php shells & more
PDF
From Zero to Iterators: Building and Extending the Iterator Hierarchy in a Mo...
PDF
An Introduction to PHP Dependency Management With Composer
DOCX
Office doc (10)
PDF
Search and Replacement Techniques in Emacs: avy, swiper, multiple-cursor, ag,...
PDF
Combine vs RxSwift
PDF
[Erlang LT] Regexp Perl And Port
PPTX
망고100 보드로 놀아보자 7
PDF
Dip Your Toes in the Sea of Security (PHP MiNDS January Meetup 2016)
FizzBuzz Trek
Clean Coders Hate What Happens To Your Code When You Use These Enterprise Pro...
Get Kata
Ruby Topic Maps Tutorial (2007-10-10)
festival ICT 2013: Solid as diamond: use ruby in an web application penetrati...
ATS language overview
Checking the Open-Source Multi Theft Auto Game
how to hack with pack and unpack
gemdiff
R で解く FizzBuzz 問題
ES6 - Level up your JavaScript Skills
Code obfuscation, php shells & more
From Zero to Iterators: Building and Extending the Iterator Hierarchy in a Mo...
An Introduction to PHP Dependency Management With Composer
Office doc (10)
Search and Replacement Techniques in Emacs: avy, swiper, multiple-cursor, ag,...
Combine vs RxSwift
[Erlang LT] Regexp Perl And Port
망고100 보드로 놀아보자 7
Dip Your Toes in the Sea of Security (PHP MiNDS January Meetup 2016)
Ad

Similar to Embedding perl (20)

PPTX
C to perl binding
PDF
start_printf: dev/ic/com.c comstart()
KEY
Yapcasia2011 - Hello Embed Perl
PDF
40d5984d819aaa72e55aa10376b73bde_MIT6_087IAP10_lec12.pdf
DOC
C - aptitude3
DOC
C aptitude questions
PDF
The Perl API for the Mortally Terrified (beta)
PDF
Im trying to run make qemu-nox In a putty terminal but it.pdf
PDF
So I am writing a CS code for a project and I keep getting cannot .pdf
PDF
Степан Кольцов — Rust — лучше, чем C++
PDF
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
PDF
NativeBoost
PDF
Hacking parse.y (RubyKansai38)
PPTX
(Slightly) Smarter Smart Pointers
PDF
Introduction to Compiler Development
PPT
Unit 4
PDF
Hacking Parse.y with ujihisa
PDF
printf("%s from %c to Z, in %d minutes!\n", "printf", 'A', 45);
PDF
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
C to perl binding
start_printf: dev/ic/com.c comstart()
Yapcasia2011 - Hello Embed Perl
40d5984d819aaa72e55aa10376b73bde_MIT6_087IAP10_lec12.pdf
C - aptitude3
C aptitude questions
The Perl API for the Mortally Terrified (beta)
Im trying to run make qemu-nox In a putty terminal but it.pdf
So I am writing a CS code for a project and I keep getting cannot .pdf
Степан Кольцов — Rust — лучше, чем C++
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
NativeBoost
Hacking parse.y (RubyKansai38)
(Slightly) Smarter Smart Pointers
Introduction to Compiler Development
Unit 4
Hacking Parse.y with ujihisa
printf("%s from %c to Z, in %d minutes!\n", "printf", 'A', 45);
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
Ad

More from Marian Marinov (20)

PDF
How to start and then move forward in IT
PDF
Thinking about highly-available systems and their setup
PDF
Understanding your memory usage under Linux
PDF
How to implement PassKeys in your application
PDF
Dev.bg DevOps March 2024 Monitoring & Logging
PDF
Basic presentation of cryptography mechanisms
PDF
Microservices: Benefits, drawbacks and are they for me?
PDF
Introduction and replication to DragonflyDB
PDF
Message Queuing - Gearman, Mosquitto, Kafka and RabbitMQ
PDF
How to successfully migrate to DevOps .pdf
PDF
How to survive in the work from home era
PDF
Managing sysadmins
PDF
Improve your storage with bcachefs
PDF
Control your service resources with systemd
PDF
Comparison of-foss-distributed-storage
PDF
Защо и как да обогатяваме знанията си?
PDF
Securing your MySQL server
PDF
Sysadmin vs. dev ops
PDF
DoS and DDoS mitigations with eBPF, XDP and DPDK
PDF
Challenges with high density networks
How to start and then move forward in IT
Thinking about highly-available systems and their setup
Understanding your memory usage under Linux
How to implement PassKeys in your application
Dev.bg DevOps March 2024 Monitoring & Logging
Basic presentation of cryptography mechanisms
Microservices: Benefits, drawbacks and are they for me?
Introduction and replication to DragonflyDB
Message Queuing - Gearman, Mosquitto, Kafka and RabbitMQ
How to successfully migrate to DevOps .pdf
How to survive in the work from home era
Managing sysadmins
Improve your storage with bcachefs
Control your service resources with systemd
Comparison of-foss-distributed-storage
Защо и как да обогатяваме знанията си?
Securing your MySQL server
Sysadmin vs. dev ops
DoS and DDoS mitigations with eBPF, XDP and DPDK
Challenges with high density networks

Recently uploaded (20)

PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPT
Teaching material agriculture food technology
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
A Presentation on Artificial Intelligence
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Approach and Philosophy of On baking technology
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
“AI and Expert System Decision Support & Business Intelligence Systems”
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Teaching material agriculture food technology
MYSQL Presentation for SQL database connectivity
Building Integrated photovoltaic BIPV_UPV.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Unlocking AI with Model Context Protocol (MCP)
A Presentation on Artificial Intelligence
Reach Out and Touch Someone: Haptics and Empathic Computing
The AUB Centre for AI in Media Proposal.docx
Per capita expenditure prediction using model stacking based on satellite ima...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Spectral efficient network and resource selection model in 5G networks
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Mobile App Security Testing_ A Comprehensive Guide.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Approach and Philosophy of On baking technology
20250228 LYD VKU AI Blended-Learning.pptx
NewMind AI Weekly Chronicles - August'25 Week I

Embedding perl

  • 1. Embedding Perl in C and the other way around   Marian Marinov(mm@1h.com   Co-Founder and CIO of 1H Ltd.
  • 3. The XS way... It cannot be seen, cannot be felt, Cannot be heard, cannot be smelt. It lies behind stars and under hills, And empty holes it fills. - J.R.R. Tolkien, The Hobbit Answer: dark.    
  • 4. XS Docs ● perlman:perlxstut ● man perlxs ● man perlguts ● man perlapi ● man h2xs    
  • 5. XS Basics ● SV – Scalar Value SV* newSVsv(SV*); ● AV – Array Value ● HV – Hash Value ● IV – Integer Value SV* newSViv(IV); ● UV – Unsigned Integer Value SV* newSVuv(UV); ● NV – Double Value SV* newSVnv(double); ● PV – String Value ●SV* newSVpv(const char*, STRLEN); ●SV* newSVpvn(const char*, STRLEN); ●SV* newSVpvf(const char*, ...); SvIV(SV*) SvUV(SV*) SvNV(SV*) SvPV(SV*, STRLEN len) SvPV_nolen(SV*)    
  • 6. Inline::C $ cat inline.pl #!/usr/bin/perl use Inline C=>' void some_func() { printf("Hello Worldn"); }'; &some_func $ ./inline.pl Hello World Examples from Inline::C-Cookbook    
  • 7. fun way of using Inline::C $ cat perl­sign.pl  #!/usr/bin/perl  use Inline C=>' void C() { int m,u,e=0;float l,_,I; for(;1840­e;putchar((++e>907&&942>e?61­m:u) ["n)moc.isc@rezneumb(rezneuM drahnreB"])) for(u=_=l=0;79­(m=e%80)&&I*l+_*_<6&&26­+ +u;_=2*l*_+e/80*.09­1,l=I) I=l*l­_*_­2+m/27.; }'; &C    
  • 8. mmmmmmmmooooooooooooooooooooooooocccccccccc....is@zrre i.cccccccoooooooooommmmm mmmmmmoooooooooooooooooooooooccccccccccc.....iiscrr n@csi...ccccccoooooooooommm mmmmooooooooooooooooooooooccccccccccc....iiiss@n zMesii....cccccoooooooooom mmooooooooooooooooooooocccccccccc....iisssssc@rn erccsiiiii..ccccooooooooo moooooooooooooooooocccccccc.......iis@e uMeu r e r@@@ezs..cccoooooooo oooooooooooooooccccccc.........iiiisc@z e eci..cccooooooo ooooooooooccccccc..iiiiiiiiiiiiisscz z z@sii.ccccoooooo oooooccccccccc...iicz@ccccz@ccccccrrr s..cccoooooo ooocccccccc.....iisc@eb bnneree eci..ccccooooo occcccccc.....iisccrnb m nci..ccccooooo ccc....iiiiisss@emee( cii..cccccoooo iscc@@beremeene( Bernhard Muenzer(bmuenzer@csi.com) ercsi...cccccoooo c....iiiiiisssc@e rnz esi...cccccoooo occccccc....iiiscc@rb ( esi..ccccooooo oocccccccc......iisc@z bneze z@i..ccccooooo ooooocccccccc....ii@er@@@@nr@cccc@e es..cccoooooo oooooooooccccccc...@siiiiiiiiisssscnM urcsi..cccoooooo ooooooooooooooccccccc..........iiiisc@e zsi..cccooooooo mooooooooooooooooocccccccc.......iiis@ nu er eznri.cccoooooooo mmoooooooooooooooooooocccccccccc....issc@ccc@@rn er@cssiiiss..cccooooooooo mmmmoooooooooooooooooooooccccccccccc....iiiisc@z rrsii.....ccccoooooooooom mmmmmooooooooooooooooooooooocccccccccccc....iis@rz rrcsi....ccccccoooooooooomm mmmmmmmmoooooooooooooooooooooooocccccccccc....iisceeeusi..cccccccooooooooommmmm    
  • 9. Multiple Return Values print map {"$_n"} get_localtime(time); use Inline C => <<'END_OF_C_CODE'; #include <time.h> void get_localtime(int utc) { struct tm *ltime = localtime(&utc); Inline_Stack_Vars; Inline_Stack_Reset; Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_year))); Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_mon))); Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_mday))); Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_hour))); Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_min))); Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_sec))); Inline_Stack_Push(sv_2mortal(newSViv(ltime->tm_isdst))); Inline_Stack_Done; }     END_OF_C_CODE
  • 10. Variable Argument Lists greet(qw(Sarathy Jan Sparky Murray Mike)); use Inline C => <<'END_OF_C_CODE'; void greet(SV* name1, ...) { Inline_Stack_Vars; int i; for (i = 0; i < Inline_Stack_Items; i++) printf("Hello %s!n", SvPV(Inline_Stack_Item(i), PL_na)); Inline_Stack_Void; } END_OF_C_CODE    
  • 11. Another way of using Inline::C use Inline C; $vp = string_scan($text); # call our function __END__ __C__ /* * Our C code goes here */ int string_scan(char* str) { }    
  • 13. How you can do it? ● ExtUtils::Embed perl -MExtUtils::Embed -e ccopts -e ldopts ● B::C ● The only way... XS    
  • 14. Docs man perlembed man perlcall man perlguts man perlapi man perlxs    
  • 15. B::C/perlcc ● Works with Perl 5.6.0 ● Works with Perl 5.13.x #!/usr/bin/perl use strict; use warnings; use lib '.'; use parse_config; my $a = 'some text'; my $b = 13; my %config = parse_config('/etc/guardian.conf'); #my %config = ( df => 13, hj => 18); printf "%s %dn", $a, $b; while (my ($k,$v) = each %config) { print "$k :: $vn"; }    
  • 16. $ perlcc -o em em.pl $ ./em Segmentation fault $ perlcc -o em em.pl $ ./em some text 13 df :: 13 hj :: 18    
  • 17. #include "embed.h" int main (int argc, char **argv, char **env) { char *embedding[] = { "", "-e", "0" }; unsigned char *perlPlain; size_t len = 0; int err = 0; PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, xs_init, 3, embedding, NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_run(my_perl); perlPlain=spc_base64_decode(&perl64,&len,0,&err); eval_pv(perlPlain, TRUE); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); return 0;     }
  • 18. #ifndef _EMBED_H #define _EMBED_H #include <EXTERN.h> #include <perl.h> #include "base64.h" #include "code_64.h" static PerlInterpreter *my_perl; static void xs_init (pTHX); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C void boot_Socket (pTHX_ CV* cv); EXTERN_C void xs_init(pTHX) { char *file = __FILE__; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); } #endif    
  • 19. $ ./embed --version This is perl, v5.10.1 (*) built for i386-linux-thread-multi Copyright 1987-2009, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.    
  • 20. # perl -MExtUtils::Embed -e ccopts -e ldopts -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux-thread- multi/CORE -L/usr/local/lib /usr/lib/perl5/5.8.8/i386-linux- thread-multi/auto/DynaLoader/DynaLoader.a -L/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE -lperl -lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE # gcc -o embed embed.c $(perl -MExtUtils::Embed -e ccopts -e ldopts)    
  • 21. call_argv("showtime", G_DISCARD | G_NOARGS, args); vs. eval_pv(perlPlain, TRUE); /** Treat $a as an integer **/ eval_pv("$a = 3; $a **= 2", TRUE); printf("a = %dn", SvIV(get_sv("a", 0))); /** Treat $a as a float **/ eval_pv("$a = 3.14; $a **= 2", TRUE); printf("a = %fn", SvNV(get_sv("a", 0))); /** Treat $a as a string **/ eval_pv("$a = 'rekcaH lreP rehtonA tsuJ'; $a = reverse($a);", TRUE); printf("a = %sn", SvPV_nolen(get_sv("a", 0)));    

Editor's Notes

  • #3: Why would I want to do that? Get some performance by using native C for some of the processing Embed parts of your existing C application into your Perl app without rewriting it completely
  • #4: XS is an interface description file format used to create an extension interface between Perl and C code extremely hard to learn even the smallest program must be implemented as additional module There is another, similar way using SWIG... I don&apos;t know how it works :( If someone is interested... www.swig.org
  • #5: .
  • #6: Scalar, Hash and Arrays are typedefs which can include any of the following types. You create the value with the coresponding newSV* function. You access the value with the coresponding Sv* function.
  • #7: Describe the way we add and execute the C code.
  • #10: Describe the way we add and execute the code. We begin the function with Inline_Stack_Vars This defines some internal variables including Inline_Stack_Items Inline_Stack_* variables can be used only when we use ... in the argument list or the return type of the function is VOID. sv_2mortal() – marks a variable as ready for destroy newSViv() - creates a Scalar Value from integer
  • #11: We begin the function with Inline_Stack_Vars This defines some internal variables including Inline_Stack_Items Inline_Stack_* variables can be used only when we use ... in the argument list or the return type of the function is VOID. We have to have at least one argument before the variable length argument because of the XS parsing.
  • #12: We begin the function with Inline_Stack_Vars This defines some internal variables including Inline_Stack_Items Inline_Stack_* variables can be used only when we use ... in the argument list or the return type of the function is VOID. We have to have at least one argument before the variable length argument because of the XS parsing.
  • #13: Why would I want to do that? Use Perl&apos;s RE Package your software into a single binary Use some of the nice Perl already working perl modules in your C application
  • #14: In all cases ExtUtils::Embed will help with the compilation flags. B::C is used for direct compile (perlcc) but is available only for perl 5.8.0 or 5.13.x. Using XS seams the only portable/compatible way...
  • #16: it should work with perl &gt;=5.10 but i haven&apos;t made it to work :(