From ec7e7a9eabe210e1a75eeeb68f45dc1d6e5a7731 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Fri, 3 May 2024 22:48:26 +0100 Subject: xapian: Wrap FieldProcessor. * xapian.i.in (GuileXapianFieldProcessorWrapper): New class. * xapian/xapian.scm (field-processor): New public function. --- xapian.i.in | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'xapian.i.in') diff --git a/xapian.i.in b/xapian.i.in index ff4ce80..bc9991c 100644 --- a/xapian.i.in +++ b/xapian.i.in @@ -1,5 +1,5 @@ /* guile-xapian --- Guile bindings for Xapian - * Copyright © 2020, 2023 Arun Isaac + * Copyright © 2020, 2023–2024 Arun Isaac * Copyright © 2021, 2022 Bob131 * * This file is part of guile-xapian. @@ -141,3 +141,34 @@ return new Xapian::Query (op_, slot, range_lower, range_upper); } } + +// Child class of Xapian::FieldProcessor that calls back to a +// user-specified Scheme procedure to process fields. +%{ + class GuileXapianFieldProcessorWrapper + : public Xapian::FieldProcessor { + private: + SCM proc; + public: + GuileXapianFieldProcessorWrapper(SCM _proc) { + proc = _proc; + } + Xapian::Query operator()(const std::string &str) { + void *ptr; + int res = SWIG_ConvertPtr(scm_call_1(proc, scm_from_utf8_string(str.c_str())), + &ptr, + SWIGTYPE_p_Xapian__Query, + 0); + return *((Xapian::Query*)ptr); + } + }; +%} + +class GuileXapianFieldProcessorWrapper +: public Xapian::FieldProcessor +{ + public: + GuileXapianFieldProcessorWrapper(SCM); + ~GuileXapianFieldProcessorWrapper(); + Xapian::Query operator()(std::string const&); +}; -- cgit v1.2.3