Changeset 4025
- Timestamp:
- 01/04/08 10:18:55 (5 years ago)
- Location:
- lang/perl/Senna/trunk
- Files:
-
- 6 modified
-
Changes (modified) (1 diff)
-
lib/Senna.pm (modified) (1 diff)
-
lib/Senna.xs (modified) (3 diffs)
-
senna-perl.h (modified) (1 diff)
-
senna-query.c (modified) (4 diffs)
-
typemap (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/Senna/trunk/Changes
r3767 r4025 4 4 0.60000_01 5 5 * 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. 7 8 * Deprecated getters for Senna::Index. These should now be accessed 8 9 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) 9 12 10 13 0.50 - -
lang/perl/Senna/trunk/lib/Senna.pm
r3991 r4025 25 25 use Senna::Encoding; 26 26 use Senna::Index; 27 use Senna::Query; 27 28 use Senna::RC; 28 29 use Senna::Symbol; -
lang/perl/Senna/trunk/lib/Senna.xs
r4001 r4025 193 193 194 194 SV * 195 SennaPerl_Query_ open(pkg, str, default_op, max_exprs, encoding)195 SennaPerl_Query__XS_open(pkg, str, default_op, max_exprs, encoding) 196 196 char *pkg; 197 197 char *str; … … 199 199 int max_exprs; 200 200 sen_encoding encoding; 201 CODE: 202 RETVAL = SennaPerl_Query_open(pkg, str, default_op, max_exprs, encoding); 203 OUTPUT: 204 RETVAL 201 205 202 206 sen_rc … … 209 213 210 214 sen_rc 211 SennaPerl_Query_ exec(obj, index, records, op)215 SennaPerl_Query__XS_exec(obj, index, records, op) 212 216 SennaPerl_Query *obj; 213 217 SennaPerl_Index *index; 214 218 SennaPerl_Records *records; 215 219 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 225 SennaPerl_Snip * 226 SennaPerl_Query_snip(query, flags, width, max_results, tags, mapping) 219 227 SennaPerl_Query *query; 220 228 int flags; 221 229 unsigned int width; 222 230 unsigned int max_results; 223 unsigned int n_tags; 224 AV *opentags_av; 225 AV *closetags_av; 231 AV *tags; 226 232 sen_snip_mapping *mapping; 227 233 228 234 SV * 235 SennaPerl_Query_rest(query) 236 SennaPerl_Query *query; 237 238 void 239 SennaPerl_Query_term(query, callback) 240 SennaPerl_Query *query; 241 SV *callback; 242 -
lang/perl/Senna/trunk/senna-perl.h
r4001 r4025 131 131 void SennaPerl_Query_DESTROY(SennaPerl_Query *obj); 132 132 sen_rc SennaPerl_Query_exec(SennaPerl_Query *obj, SennaPerl_Index *index, SennaPerl_Records *records, sen_sel_operator op); 133 SennaPerl_Snip * SennaPerl_Query_snip( SennaPerl_Query *query, int flags, unsigned int width, unsigned int max_results, AV *tags, sen_snip_mapping *mapping); 134 void SennaPerl_Query_term(SennaPerl_Query *obj, SV *callback); 135 SV * SennaPerl_Query_rest(SennaPerl_Query *query); 133 136 134 137 #endif /* ifndef __SENNA_PERL_H__ */ -
lang/perl/Senna/trunk/senna-query.c
r4001 r4025 66 66 } 67 67 68 sen_snip *69 SennaPerl_Query_snip(query, flags, width, max_results, n_tags, opentags_av, closetags_av, mapping)68 SennaPerl_Snip * 69 SennaPerl_Query_snip(query, flags, width, max_results, tags, mapping) 70 70 SennaPerl_Query *query; 71 71 int flags; 72 72 unsigned int width; 73 73 unsigned int max_results; 74 unsigned int n_tags; 75 AV *opentags_av; 76 AV *closetags_av; 74 AV *tags; 77 75 sen_snip_mapping *mapping; 78 76 { 79 77 sen_snip *snip; 80 78 SV **svr; 81 I32 list_len; 79 unsigned int tags_av_len; 80 82 81 STRLEN tag_len; 83 82 char **opentags = NULL; … … 86 85 unsigned int *closetag_lens = NULL; 87 86 88 { 89 /* first the open tags */ 87 88 tags_av_len = tags != NULL ? av_len(tags) : 0; 89 if (tags_av_len > 0) { 90 90 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)"); 103 108 } 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"); 121 114 } 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; 122 127 } 123 128 } … … 127 132 width, 128 133 max_results, 129 n_tags,134 tags_av_len, 130 135 (const char **) opentags, 131 136 opentag_lens, … … 143 148 } 144 149 150 SV * 151 SennaPerl_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 */ 165 int 166 SennaPerl_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 191 void 192 SennaPerl_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 } 145 207 146 208 #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 */ 150 210 sen_rc sen_query_scan(sen_query *q, const char **strs, unsigned int *str_lens, 151 211 unsigned int nstrs, int flags, int *found, int *score); -
lang/perl/Senna/trunk/typemap
r4001 r4025 26 26 $var = XS_STATE(SennaPerl_Snip *, $arg); 27 27 28 OUTPUT 29 T_PTROBJ_SNIP 30 XS_STRUCT2OBJ($arg, "Senna::Snip", $var); 31 SvREADONLY_on($arg); 32
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)