Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
REFCNT-Manipulationperl_eval_*()-FunktionenMakefile.PL.xs-Erweiterung.pm-Modultest.plXSUB-MakrosC::DynaLib
########## Perl-Datentypen in C: man perlguts
PL_sv_undef; PL_sv_yes; PL_sv_no /* undef, 1, 0 in C */
SvOK(SV*); SvTRUE(SV*) /* SV definiert, wahr */
IV SvIV(SV*); NV SvNV(SV*); PV SvPV(SV*, PL_na); /* Konvert */
SV* perl_get_sv("package:varname", FALSE);
SV* newSViv(IV); SV* newSVnv(NV);
SV* newSVpv(char *,int); SV* newSVsv(SV*);
sv_setnv(SV*,NV); sv_setpvn(SV*,char *,int); ...
/* Ähnliche Funktionen fuer RV, AV und HV.*/
int sv_REFCNT(SV*); SV* sv_REFCNT_inc(SV*); void sv_REFCNT_dec(SV*);
SV* sv_2mortal(SV*); SV* sv_mortalcpy(SV*); SV* sv_newmortal();
########## Perl in C
# prog.c mit libperl.[a,so] zusammen übersetzen:
gcc -o prog prog.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
# Einbettung von Perl in C
#include <EXTERN.h> /* Perl-Distribution */
#include <perl.h> /* Perl-Distribution */
static PerlInterpreter *myinterp; /* Interpreter-Objekt */
int main(int argc, char *argv[], char *env[]) {
myinterp = perl_alloc(); perl_construct(myinterp);
perl_parse(myinterp, NULL, argc, argv, (char **)NULL);
/* >>>>> Hier eigene API-Aufrufe <<<<<< */
perl_run(myinterp);
perl_destruct(myinterp); perl_free(myinterp); return 0;
}
# Direkter Aufruf einer Perl-Funktion mit Stackmanipulation:
dSP;
ENTER;
SAVETEMPS;
PUSHMARK(SP);
/* Hier Aufrufparameter auf den Stack pushen */
XPUSHs(sv_2mortal(newSVpv(c_inputstring, 0)));
PUTBACK;
nvals = perl_call_pv("perl_func_name", G_ARRAY);
SPAGAIN;
/* Rückgabewerte in umgekehrter Reihenfolge poppen */
for (i=0; i<nvals; i++) {
resultSV = POPs; c_string = SvPV(resultSV, PL_na);
}
PUTBACK;
FREETMPS;
LEAVE;
# Aufruf von dynamischem Perl-Code von C heraus (eval())
perl_eval_pv("$a = scalar localtime(time)", TRUE);
printf("Date: %s\n", SvPV(perl_get_sv("a", FALSE), PL_na));
########## C in Perl
# Erzeugen eines Modulskeletts
# Externe Libraries in Makefile.PL, Wrapper in ModulName.pm
# XS-Code in ModulName.xs; dann Modul normal bauen.
h2xs -A -n ModulName
double
funcname(p1,p2)
c_typ1 p1;
c_typ2 p2;
PREINIT:
int priv;
CODE:
/* C-Code mit p1,p2,priv, Aufruf externer Funktionen OK */
/* Rückgabewert in RETVAL */
OUTPUT:
RETVAL
sometype
myfunc(p1, ...)
PPCODE:
/* Eingabewerte: SVs von ST(0) bis ST(items-1) */
nvalue = (double)(SvNV(ST(i)));
/* Rückgabewerte auf dem Stack mit XPUSHs() stellen */
for (i=0; i<nretvals; i++)
XPUSHs(sv_2mortal(newSVpv(c_variable[i])));
XSRETURN(nretvals); /* Anzahl der Rückgabewerte angeben! */
# Typkonvertierungen C <-> Perl in Typemaps. Standardtypemap:
"/usr/local/lib/perl5/$]/ExtUtils/typemap" # $] = 5.00553 z.B.
# Aufruf von Funktionen aus dynamisch ladbaren Libraries:
use C::DynaLib; # CPAN-Modul
$libc = new C::DynaLib("-lc");
$func = $libc->DeclareSub("pathconf", $returntype, @inputtypes);
$retval = $func->(@inputparameters);
# Perl-Callbacks für C-Funktionen mit C::DynaLib::Callback
$callback = new C::DynaLib::Callback(\&perlfunc,
$rettype, @inptypes);
$cbptr = $callback->Ptr();
$val = $func->($param, $cbptr);
prog.c |
Ein einfaches C-Programm mit der Perl-Library |
embedmain.c |
Eine kleine Testumgebung für das Embedding |
test1.c |
Funktion ohne Argumente, ohne Rückgabewerte |
c-test1.pl |
Eine Funktion func1() für embedmain.c/test1.c |
test2.c |
Funktion mit einem Argument, ohne Rückgabewerte |
test3.c |
Funktion mit mehreren Argumenten; kein Rückgabewert |
c-test4.pl |
myconvert() für test4.c/embedmain.c uuencoding |
test4.c |
Funktion mit mehreren Argumenten; ein Rückgabewert |
c-test5.pl |
Dreht alle übergebenen Strings byteweise um |
test5.c |
Funktion mit mehreren Args und Rückgabewerten |
test6.c |
perl_eval_pv() und dynamischer Code |
test7.c |
Ein grep(1) mit den regulären Ausdrücken von Perl |
myxsub.pl |
Ruft XSUBs aus dem ST::Xten-Erweiterungsmodul auf |
ST/Xten/Makefile.PL |
Meta-Makefile für das ST::Xten-Erweiterungsmodul |
ST/Xten/Xten.xs |
XS-Definitionen des ST::Xten-Erweiterungsmoduls |
ST/Xten/Xten.pm |
Perl-Definitionen des ST::Xten-Erweiterungsmoduls |
ST/Xten/test.pl |
Einige Tests für das ST::Xten-Erweiterungsmodul |
ST/Xten/Xten.c |
Von xsubpp erzeugte C-Quelle des ST::Xten-Moduls |
ST-Xten-0.01.tar.gz |
Der gesamte Code des ST::Xten-Moduls |
dynalib.pl |
Dynamischer Aufruf von Libraryfunktionen: C::DynaLib |
ExtUtils::Embed:# Die Ausgabe des folgenden Programms kann auf Ihrer Maschine # durchaus anders aussehen. farid@sun-1:~> perl -MExtUtils::Embed -e ccopts -e ldopts -R /usr/local/lib/perl5/5.00553/i86pc-solaris/CORE \ -L/usr/local/lib \ /usr/local/lib/perl5/5.00553/i86pc-solaris/auto/DynaLoader/DynaLoader.a \ -L/usr/local/lib/perl5/5.00553/i86pc-solaris/CORE \ -lperl -lsocket -lnsl -ldb -ldl -lm -lc -lcrypt \ -I/usr/local/include -I/usr/local/lib/perl5/5.00553/i86pc-solaris/CORE
# Seite 721 (Synopsis), mitte:
gcc -o prog prog.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
# Seite 746, oben:
gcc -o embedmain embedmain.c test1.c \
`perl -MExtUtils::Embed -e ccopts -e ldopts`
# Seite 746, mitte:
gcc -c embedmain.c `perl -MExtUtils::Embed -e ccopts`
gcc -c test1.c `perl -MExtUtils::Embed -e ccopts`
gcc -o embedmain embedmain.o test1.o \
`perl -MExtUtils::Embed -e ldopts`
# Seite 478, mitte:
gcc -c test1.c `perl -MExtUtils::Embed -e ccopts`
gcc -o embedmain embedmain.o test1.o \
`perl -MExtUtils::Embed -e ldopts`
In Vorbereitung
In Vorbereitung
SV* save_scalar(GV *gv); /* Wie: local $gv */
-DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" -fPIC \
[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:55:45 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|