www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Kapitel 16: Perl und C

Inhalt
Synopsis
########## 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);
Beispielprogramme
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
Ergänzungen
Lösungen zu ausgewählten Übungsaufgaben

In Vorbereitung

FAQ

In Vorbereitung

Errata

[Prev] [Up] [Next]

[Alte Quelle]


Last modified: $Date: 2006/05/18 12:55:45 $
FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy
FreeBSD Logo