Changeset 4025

Show
Ignore:
Timestamp:
01/04/08 10:18:55 (5 years ago)
Author:
daisuke
Message:

lang/perl/Senna; fix Query->snip, other various XS stuff

Location:
lang/perl/Senna/trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Senna/trunk/Changes

    r3767 r4025  
    440.60000_01 
    55 * Complete rewrite. 
    6  * Now only works with newer libsenna >= 1.0.9 
     6     * Now only works with newer libsenna >= 1.0.9 
     7     * Various XS tunings. 
    78 * Deprecated getters for Senna::Index. These should now be accessed 
    89   via Senna::Index::Info, which is returned by using $index->info() 
     10 * Deprecated usage of $foo->method(%args). Everything should now be 
     11   called as $foo->method(\%args) 
    912 
    10130.50 - 
  • lang/perl/Senna/trunk/lib/Senna.pm

    r3991 r4025  
    2525use Senna::Encoding; 
    2626use Senna::Index; 
     27use Senna::Query; 
    2728use Senna::RC; 
    2829use Senna::Symbol; 
  • lang/perl/Senna/trunk/lib/Senna.xs

    r4001 r4025  
    193193 
    194194SV * 
    195 SennaPerl_Query_open(pkg, str, default_op, max_exprs, encoding) 
     195SennaPerl_Query__XS_open(pkg, str, default_op, max_exprs, encoding) 
    196196        char *pkg; 
    197197        char *str; 
     
    199199        int max_exprs; 
    200200        sen_encoding encoding; 
     201    CODE: 
     202        RETVAL = SennaPerl_Query_open(pkg, str, default_op, max_exprs, encoding); 
     203    OUTPUT: 
     204        RETVAL 
    201205 
    202206sen_rc 
     
    209213 
    210214sen_rc 
    211 SennaPerl_Query_exec(obj, index, records, op) 
     215SennaPerl_Query__XS_exec(obj, index, records, op) 
    212216        SennaPerl_Query *obj; 
    213217        SennaPerl_Index *index; 
    214218        SennaPerl_Records *records; 
    215219        sen_sel_operator op 
    216  
    217 SV * 
    218 SennaPerl_Query_snip(query, flags, width, max_results, n_tags, opentags_av, closetags_av, mapping) 
     220    CODE: 
     221        RETVAL = SennaPerl_Query_exec(obj, index, records, op); 
     222    OUTPUT: 
     223        RETVAL 
     224 
     225SennaPerl_Snip * 
     226SennaPerl_Query_snip(query, flags, width, max_results, tags, mapping) 
    219227        SennaPerl_Query *query; 
    220228        int flags; 
    221229        unsigned int width; 
    222230        unsigned int max_results; 
    223         unsigned int n_tags; 
    224         AV *opentags_av; 
    225         AV *closetags_av; 
     231        AV *tags; 
    226232        sen_snip_mapping *mapping; 
    227233 
    228  
     234SV * 
     235SennaPerl_Query_rest(query) 
     236        SennaPerl_Query *query; 
     237 
     238void 
     239SennaPerl_Query_term(query, callback) 
     240        SennaPerl_Query *query; 
     241        SV *callback; 
     242 
  • lang/perl/Senna/trunk/senna-perl.h

    r4001 r4025  
    131131void SennaPerl_Query_DESTROY(SennaPerl_Query *obj); 
    132132sen_rc SennaPerl_Query_exec(SennaPerl_Query *obj, SennaPerl_Index *index, SennaPerl_Records *records, sen_sel_operator op); 
     133SennaPerl_Snip * SennaPerl_Query_snip( SennaPerl_Query *query, int flags, unsigned int width, unsigned int max_results, AV *tags, sen_snip_mapping *mapping); 
     134void SennaPerl_Query_term(SennaPerl_Query *obj, SV *callback); 
     135SV * SennaPerl_Query_rest(SennaPerl_Query *query); 
    133136 
    134137#endif /* ifndef __SENNA_PERL_H__ */ 
  • lang/perl/Senna/trunk/senna-query.c

    r4001 r4025  
    6666} 
    6767 
    68 sen_snip * 
    69 SennaPerl_Query_snip(query, flags, width, max_results, n_tags, opentags_av, closetags_av, mapping) 
     68SennaPerl_Snip * 
     69SennaPerl_Query_snip(query, flags, width, max_results, tags, mapping) 
    7070        SennaPerl_Query *query; 
    7171        int flags; 
    7272        unsigned int width; 
    7373        unsigned int max_results; 
    74         unsigned int n_tags; 
    75         AV *opentags_av; 
    76         AV *closetags_av; 
     74        AV *tags; 
    7775        sen_snip_mapping *mapping; 
    7876{ 
    7977    sen_snip *snip; 
    8078    SV **svr; 
    81     I32 list_len; 
     79    unsigned int tags_av_len; 
     80     
    8281    STRLEN tag_len; 
    8382    char **opentags = NULL; 
     
    8685    unsigned int *closetag_lens = NULL; 
    8786 
    88     { 
    89         /* first the open tags */ 
     87     
     88    tags_av_len = tags != NULL ? av_len(tags) : 0; 
     89    if (tags_av_len > 0) { 
    9090        I32 i; 
    91         list_len = opentags_av != NULL ? av_len(opentags_av) : 0; 
    92         if (list_len > 0) { 
    93             Newz(1234, opentags, list_len, char *); 
    94             Newz(1234, opentag_lens, list_len, unsigned int); 
    95  
    96             for(i = 0; i < list_len; i++) { 
    97                 svr = av_fetch(opentags_av, i, 0); 
    98                 if (svr != NULL && SvOK(*svr)) { 
    99                     /* won't make a copy to save memory */ 
    100                     opentags[i] = SvPV(*svr, tag_len); 
    101                     opentag_lens[i] = tag_len; 
    102                 } 
     91        SV **svr; 
     92        AV *tag_pair; 
     93 
     94        Newz(1234, opentags, tags_av_len, char *); 
     95        Newz(1234, opentag_lens, tags_av_len, unsigned int); 
     96        Newz(1234, closetags, tags_av_len, char *); 
     97        Newz(1234, closetag_lens, tags_av_len, unsigned int); 
     98         
     99        for(i = 0; i < tags_av_len; i++) { 
     100            /* each array element contains another array, which should 
     101             * contain two elements [ 'opentag', 'closetag' ] 
     102             */ 
     103            svr = av_fetch(tags, i, 0); 
     104            if (svr == NULL || ! SvOK(*svr) || ! SvROK(*svr) || 
     105                SvTYPE(*svr) != SVt_PVAV ) 
     106            { 
     107                croak("tags must contain arrayref(s)"); 
    103108            } 
    104         } 
    105     } 
    106  
    107     { 
    108         I32 i; 
    109         list_len = closetags_av != NULL ? av_len(closetags_av) : 0; 
    110         if (list_len > 0) { 
    111             Newz(1234, closetags, list_len, char *); 
    112             Newz(1234, closetag_lens, list_len, unsigned int); 
    113  
    114             for(i = 0; i < list_len; i++) { 
    115                 svr = av_fetch(closetags_av, i, 0); 
    116                 if (svr != NULL && SvOK(*svr)) { 
    117                     /* won't make a copy to save memory */ 
    118                     closetags[i] = SvPV(*svr, tag_len); 
    119                     closetag_lens[i] = tag_len; 
    120                 } 
     109 
     110            tag_pair = (AV *) SvRV(*svr); 
     111            svr = av_fetch(tag_pair, 0, 0); 
     112            if (svr == NULL || ! SvOK(*svr)) { 
     113                croak("each element in tags must contain a tag string"); 
    121114            } 
     115 
     116            opentags[i] = SvPV(*svr, tag_len); 
     117            opentag_lens[i] = tag_len; 
     118 
     119            tag_pair = (AV *) SvRV(*svr); 
     120            svr = av_fetch(tag_pair, 1, 0); 
     121            if (svr == NULL || ! SvOK(*svr)) { 
     122                croak("each element in tags must contain a tag string"); 
     123            } 
     124 
     125            closetags[i] = SvPV(*svr, tag_len); 
     126            closetag_lens[i] = tag_len; 
    122127        } 
    123128    } 
     
    127132        width, 
    128133        max_results, 
    129         n_tags, 
     134        tags_av_len, 
    130135        (const char **) opentags, 
    131136        opentag_lens, 
     
    143148} 
    144149 
     150SV * 
     151SennaPerl_Query_rest(query) 
     152        SennaPerl_Query *query; 
     153{ 
     154    char *rest; 
     155    unsigned int len; 
     156 
     157    len = sen_query_rest(XS_2SENQUERY(query), (const char **) &rest); 
     158    return newSVpv(rest, len); 
     159} 
     160 
     161/* sen_query_term needs a callback. This C callback is a bridge that 
     162 * calls a Perl subroutine from within that callback. The first argument 
     163 * in C<args> is the ref to sub 
     164 */ 
     165int 
     166SennaPerl_Query_Term_CallbackBridge(const char *value, unsigned int len, void *args) 
     167{ 
     168    SV *sv; 
     169    SV *callback; 
     170    dSP; 
     171 
     172    ENTER; 
     173    SAVETMPS; 
     174 
     175    PUSHMARK(SP); 
     176    EXTEND(SP, 1); 
     177    PUSHs(sv_2mortal(newSVpv(value, len))); 
     178    PUTBACK; 
     179 
     180    call_sv((SV *) args, G_DISCARD|G_VOID); 
     181 
     182    SPAGAIN; 
     183    sv = POPs; 
     184 
     185    FREETMPS; 
     186    LEAVE; 
     187 
     188    return SvIV(sv); 
     189} 
     190 
     191void 
     192SennaPerl_Query_term(query, callback) 
     193        SennaPerl_Query *query; 
     194        SV *callback; 
     195{ 
     196    if (callback == NULL || !SvOK(callback) || ! SvROK(callback) || 
     197        SvTYPE( SvRV( callback ) ) != SVt_PVCV ) 
     198    { 
     199        croak("Senna::Query->term needs a coderef"); 
     200    } 
     201 
     202    sen_query_term( XS_2SENQUERY(query),  
     203        SennaPerl_Query_Term_CallbackBridge, 
     204        (void *) callback 
     205    ); 
     206} 
    145207 
    146208#if 0 
    147  
    148 unsigned int sen_query_rest(sen_query *q, const char ** const rest); 
    149 void sen_query_term(sen_query *q, query_term_callback func, void *func_arg); 
     209/* Not documented as of 2008/01/03 */ 
    150210sen_rc sen_query_scan(sen_query *q, const char **strs, unsigned int *str_lens, 
    151211                      unsigned int nstrs, int flags, int *found, int *score); 
  • lang/perl/Senna/trunk/typemap

    r4001 r4025  
    2626        $var = XS_STATE(SennaPerl_Snip *, $arg); 
    2727 
     28OUTPUT 
     29T_PTROBJ_SNIP 
     30        XS_STRUCT2OBJ($arg, "Senna::Snip", $var); 
     31        SvREADONLY_on($arg); 
     32