• Живи, доченька… (Ольга Луконина )

  • Шаблонизатор BlackTiger :: первые примеры


  • Маленький пример работы XS модуля, для того, чтобы утолить желание "побыстрее что-то запустить"

    Ну так вот, мы быстренько накидали структуру нашего модуля, пора заставить его работать.

    Вот тут мы живем
    zaur ~ $ pwd
    /Users/zaur/www/mangust/bin/Gadz-Tpl

    Наши заголовочные файлы (обратите внимание, мы еще ppport.h скопировали, зачем - толком не знаю, уж простите)
    zaur ~ $ ls -la include/
    total 352
    drwxr-xr-x 4 zaur staff 136 26 янв 08:22 .
    drwxr-xr-x 17 zaur staff 578 26 янв 08:12 ..
    -rw-r--r-- 1 zaur staff 175214 26 янв 06:26 ppport.h
    -rw-r--r-- 1 zaur staff 166 26 янв 07:53 tpl_dust1.h

    Наши исходники
    zaur ~ $ ls -la src/
    total 16
    drwxr-xr-x 4 zaur staff 136 26 янв 08:24 .
    drwxr-xr-x 17 zaur staff 578 26 янв 08:12 ..
    -rw-r--r-- 1 zaur staff 210 26 янв 08:19 tpl_dust1.c

    А теперь что там внутри:

    zaur ~ $ cat include/tpl_dust1.h
    #include "EXTERN.h"
    #include "perl.h"
    #include "XSUB.h"
    #include "ppport.h"

    typedef struct {
    char *out;
    STRLEN l;
    } tpldata;

    void
    tpl_dust1(SV *d,tpldata *data);

    zaur ~ $ cat src/tpl_dust1.c
    #include
    #include "../include/tpl_dust1.h"

    void tpl_dust1(SV *d, tpldata *data)
    {
    char *out;
    STRLEN l;
    out = SvPV( *hv_fetch((HV*)SvRV(d), "title", 5, 0), l );
    data->out = out;
    data->l = l;
    }

    Наш связной

    zaur ~ $ cat Tpl.xs
    #include "EXTERN.h"
    #include "perl.h"
    #include "XSUB.h"

    #include "ppport.h"
    #include
    #include "tpl_dust1.h"

    MODULE = Gadz::Tpl PACKAGE = Gadz::Tpl

    SV*
    dust1call(d)
    SV *d;
    CODE:
    SV *toperl;
    tpldata *data;
    data = malloc(sizeof(tpldata));
    tpl_dust1(d,data);
    toperl = newSVpv(data->out,0);
    RETVAL = newRV( (SV*)toperl );
    OUTPUT:
    RETVAL

    Закрепляем успех
    zaur ~ $ ./Build
    Copying ./Tpl.xs -> lib/Gadz/Tpl.xs
    lib/Gadz/Tpl.xs -> lib/Gadz/Tpl.c
    /usr/bin/gcc-4.2 -I. -Isrc -I/opt/local/lib/perl5/5.10.1/darwin-multi-2level/CORE -DXS_VERSION="0.01" -DVERSION="0.01" -Iinclude -c -O2 -arch x86_64 -fno-common -DPERL_DARWIN -I/opt/local/include -no-cpp-precomp -fno-strict-aliasing -pipe -fstack-protector -I/opt/local/include -O3 -o lib/Gadz/Tpl.o lib/Gadz/Tpl.c
    ExtUtils::Mkbootstrap::Mkbootstrap('blib/arch/auto/Gadz/Tpl/Tpl.bs')
    env MACOSX_DEPLOYMENT_TARGET=10.3 /usr/bin/gcc-4.2 -L/opt/local/lib -arch x86_64 -bundle -undefined dynamic_lookup -fstack-protector -o blib/arch/auto/Gadz/Tpl/Tpl.bundle lib/Gadz/Tpl.o src/tpl_dust1.o

    Ну, и вот, perl скриптик

    #!/usr/bin/perl
    use strict;
    use Data::Dumper;
    use Time::HiRes;

    use ExtUtils::testlib;
    use lib '/Users/zaur/www/mangust/bin/Gadz-Tpl/blib/arch';
    use lib '/Users/zaur/www/mangust/bin/Gadz-Tpl/blib/lib';
    use Gadz::Tpl;

    my $data = {
    title => "This's work"
    };

    my $out = &Gadz::Tpl::dust1call($data);
    print $$out;
    print "\nexit\n";

    Должно удовлетворить хотелку. А дальше кропотливое ковыряние в носу.





































































  • Живи, доченька… (Ольга Луконина )

  • Шаблонизатор BlackTiger :: первые примеры