aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xapian.i.in104
1 files changed, 104 insertions, 0 deletions
diff --git a/xapian.i.in b/xapian.i.in
index 1832786..4f36f8e 100644
--- a/xapian.i.in
+++ b/xapian.i.in
@@ -1,5 +1,6 @@
/* guile-xapian --- Guile bindings for Xapian
* Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net>
+ * Copyright © 2021 Bob131 <bob@bob131.so>
*
* This file is part of guile-xapian.
*
@@ -34,5 +35,108 @@
(load-extension "libguilexapian" "SWIG_init")))
%}
+%{
+ #include <string>
+
+ // We introduce a dummy typedef for std::string without declaring it
+ // to SWIG so we can establish a new SWIG typemap applying only to
+ // certain redeclarations of existing C++ functions taking or
+ // returning strings.
+ typedef std::string SWIG_bytevector;
+
+ static inline void typemap_in_SWIG_bytevector (SWIG_bytevector& out, SCM in) {
+ out.assign ((char*) SCM_BYTEVECTOR_CONTENTS (in),
+ SCM_BYTEVECTOR_LENGTH (in));
+ }
+
+ static inline SCM typemap_out_SWIG_bytevector (const SWIG_bytevector& in) {
+ SCM result = scm_c_make_bytevector (in.size ());
+ memcpy (SCM_BYTEVECTOR_CONTENTS (result), in.data (), in.size ());
+ return result;
+ }
+%}
+
+%typemap(in) SWIG_bytevector {
+ if (scm_is_bytevector ($input)) {
+ $1 = std::string ();
+ typemap_in_SWIG_bytevector ($1, $input);
+ } else {
+ %argument_fail (SWIG_TypeError, "$type", $symname, $argnum);
+ }
+}
+
+%typemap(in) SWIG_bytevector&, SWIG_bytevector* {
+ if (scm_is_bytevector ($input)) {
+ $1 = new std::string ();
+ typemap_in_SWIG_bytevector (*$1, $input);
+ } else {
+ %argument_fail (SWIG_TypeError, "$type", $symname, $argnum);
+ }
+}
+
+%typemap(out) SWIG_bytevector {
+ $result = typemap_out_SWIG_bytevector ($1);
+}
+
+%typemap(out) SWIG_bytevector&, SWIG_bytevector* {
+ $result = typemap_out_SWIG_bytevector (*$1);
+}
+
+%typecheck(SWIG_TYPECHECK_SWIGOBJECT)
+ SWIG_bytevector, SWIG_bytevector&, SWIG_bytevector*
+{
+ $1 = scm_is_bytevector ($input);
+}
+
%include xapian-head.i
%include xapian-headers.i
+
+%extend Xapian::ValueIterator {
+ SWIG_bytevector get_value_bytes () {
+ return **$self;
+ }
+}
+
+%extend Xapian::Document {
+ SWIG_bytevector get_value_bytes (Xapian::valueno valueno) {
+ return $self->get_value (valueno);
+ }
+
+ void add_value_bytes (Xapian::valueno valueno, const SWIG_bytevector& bytes) {
+ $self->add_value (valueno, bytes);
+ }
+
+ SWIG_bytevector get_data_bytes () {
+ return $self->get_data ();
+ }
+
+ void set_data_bytes (const SWIG_bytevector& bytes) {
+ $self->set_data (bytes);
+ }
+}
+
+%extend Xapian::Database {
+ SWIG_bytevector get_metadata_bytes (const std::string& key) {
+ return $self->get_metadata (key);
+ }
+}
+
+%extend Xapian::WritableDatabase {
+ void set_metadata_bytes (const std::string& key,
+ const SWIG_bytevector& bytes)
+ {
+ $self->set_metadata (key, bytes);
+ }
+}
+
+%extend Xapian::Query {
+ Query (op op_, Xapian::valueno slot, const SWIG_bytevector& range_limit) {
+ return new Xapian::Query (op_, slot, range_limit);
+ }
+
+ Query (op op_, Xapian::valueno slot,
+ const SWIG_bytevector& range_lower, const SWIG_bytevector& range_upper)
+ {
+ return new Xapian::Query (op_, slot, range_lower, range_upper);
+ }
+}