namespace Xapian { int major_version(); const char * version_string(); }
use Search::Xapian; say Search::Xapian::major_version(); say Search::Xapian::version_string();
1 1.2.5
Same syntax, different semantics:
void set_entry(const char * name, unsigned value);
set_entry('answer', 42);
Same syntax, different semantics:
void set_entry(const char * name, unsigned value);
set_entry('answer', 42);
void write_data(const char * ptr, unsigned len);
Same syntax, different semantics:
void set_entry(const char * name, unsigned value);
set_entry('answer', 42);
void write_data(const char * ptr, unsigned len);
write_data("hello\x00world", 11);
Same syntax, different semantics:
void set_entry(const char * name, unsigned value);
set_entry('answer', 42);
void write_data(const char * ptr, unsigned len);
my $data = "hello\x00world"; write_data($data, length($data));
Same syntax, different semantics:
void set_entry(const char * name, unsigned value);
set_entry('answer', 42);
void write_data(const char * ptr, unsigned len); %typemap(in) (const char * ptr, unsigned len) { STRLEN len_tmp; $1 = SvPV($input, len); $2 = len_tmp; }
write_data("hello\x00world");
namespace Xapian { class PostingSource { // [...] void next(double min_wt); }; }
xapian/postingsource.h:4: Warning 314: 'next' is a perl keyword
%rename(inc) Xapian::PostingSource::next; namespace Xapian { class PostingSource { // [...] void next(double min_wt); }; }
$postingsource->inc();
%rename(inc) next; namespace Xapian { class PostingSource { // [...] void next(double min_wt); }; }
$postingsource->inc();
%module MyLib int mylib_init(); int mylib_crunch_numbers(int a, int b);
use MyLib; MyLib::mylib_init() or die $!; say MyLib::mylib_crunch_numbers(6, 28);
%module MyLib %rename("%(regex/^mylib_//)s") ""; int mylib_init(); int mylib_crunch_numbers(int a, int b);
use MyLib; MyLib::init() or die $!; say MyLib::crunch_numbers(6, 28);
%rename("%(undercase)s",%$isfunction) ""; %rename("%(camelcase)s",%$isclass) "";
%ignore max_size;
%exception { [...] $action [...] }
%exception { try { $action } catch (std::range_error & e) { SWIG_exception(SWIG_IndexError, e.what()); } }
%exception { try { $action } catch (const Xapian::Error & e) { SV * sv = sv_newmortal(); sv_setref_pv(sv, "Search::Xapian::Error", (void *) new Xapian::Error(e)); croak_sv(sv); SWIG_fail; } }
static void set_perl_exception() { try { throw; } catch (const Xapian::Error & e) { // Call croak_sv(), etc as before. } } %exception { try { $action } catch (...) { set_perl_exception(); SWIG_fail; } }
%exception { $action if (result < 0) { SWIG_exception(SWIG_IndexError, strerror(errno)); } }
%typemap(in) const vector<Xapian::Query> & (vector<Xapian::Query> v) { AV * array = (AV*) SvRV($1); int num_items = av_len(q) + 1; v.reserve(num_items); for (int i = 0; i < num_items; ++i) { // Loop body on next slide... } $1 = &v; }
SV **svp = av_fetch(array, i, 0); if( svp == NULL ) croak("Unexpected NULL returned by av_fetch()"); SV *sv = *svp; if (sv_isa(sv, "Search::Xapian::Query")) { Xapian::Query *q; SWIG_ConvertPtr(sv, (void **)&q, SWIGTYPE_p_Xapian__Query, 0); v.push_back(*q); } else if (SvOK(sv)) { STRLEN len; const char * ptr = SvPV(sv, len); v.push_back(Xapian::Query(std::string(ptr, len))); } else { croak("USAGE: Search::Xapian::Query->new(OP, @TERMS_OR_QUERIES)"); }
%extend Xapian::Query { Query(Query::op op, const vector<Query> & v) { return new Xapian::Query(op, v.begin(), v.end()); } }
int decode(const char *s, int & width, int & height);
my @result = decode($input);
my $i = $matches->begin(); while ($i != $matches->end()) { say $i->get_docid(); $i++; }
foreach my $m ($matches->items) { say $m->get_docid(); }