branch: externals/xeft
commit b980aac44fe23f29c4d4764209ba4e62d2945568
Author: Yuan Fu <caso...@gmail.com>
Commit: Yuan Fu <caso...@gmail.com>

    Pull xapian-lite from GitHub
    
    * Makefile: Add some flags.  Pull xapian-lite from GitHub instead of
    tracking a local copy.
    * module: Remove directory.
---
 Makefile                      |   6 +-
 module/emacs-module-prelude.h | 164 ---------
 module/emacs-module.h         | 763 ------------------------------------------
 module/xapian-lite-internal.h |  40 ---
 module/xapian-lite.cc         | 446 ------------------------
 5 files changed, 5 insertions(+), 1414 deletions(-)

diff --git a/Makefile b/Makefile
index 44cdd9a066..a31fbfdc06 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 # Even if this is unnecessary, it doesn’t hurt.
 PREFIX=/usr/local
 CXX=g++
-CXXFLAGS=-fPIC -I$(PREFIX)/include
+CXXFLAGS=-fPIC -I$(PREFIX)/include -std=c++11 -stdlib=libc++
 LDFLAGS=-L$(PREFIX)/lib
 LDLIBS=-lxapian
 
@@ -18,5 +18,9 @@ endif
 xapian-lite.$(SOEXT): module/xapian-lite.cc
        $(CXX) $< -o $@ -shared $(CXXFLAGS) $(LDFLAGS) $(LDLIBS)
 
+module/xapian-lite.cc:
+       git clone https://github.com/casouri/xapian-lite module --depth=1
+
 clean:
        rm -f *.so *.o
+       rm -rf module
diff --git a/module/emacs-module-prelude.h b/module/emacs-module-prelude.h
deleted file mode 100644
index 4edb9d1450..0000000000
--- a/module/emacs-module-prelude.h
+++ /dev/null
@@ -1,164 +0,0 @@
-#include "emacs-module.h"
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-
-#ifndef EMACS_MODULE_PRELUDE_H
-#define EMACS_MODULE_PRELUDE_H
-
-#define EMP_MAJOR_VERSION 1
-#define EMP_MINOR_VERSION 0
-#define EMP_PATCH_VERSION 0
-
-
-/*
-  Copy a Lisp string VALUE into BUFFER, and store the string size in
-  SIZE. A user doesn’t need to allocate BUFFER, but it is the user’s
-  responsibility to free it. If failed, return false, and the buffer
-  doesn’t need to be freed.
- */
-bool
-emp_copy_string_contents
-(emacs_env *env, emacs_value value, char **buffer, size_t *size)
-/* Copied from Pillipp’s document.  I commented out assertions. */
-{
-  ptrdiff_t buffer_size;
-  if (!env->copy_string_contents (env, value, NULL, &buffer_size))
-    return false;
-  /* assert (env->non_local_exit_check (env) == emacs_funcall_exit_return); */
-  /* assert (buffer_size > 0); */
-  *buffer = (char*) malloc ((size_t) buffer_size);
-  if (*buffer == NULL)
-    {
-      env->non_local_exit_signal (env, env->intern (env, "memory-full"),
-                                  env->intern (env, "nil"));
-      return false;
-    }
-  ptrdiff_t old_buffer_size = buffer_size;
-  if (!env->copy_string_contents (env, value, *buffer, &buffer_size))
-    {
-      free (*buffer);
-      *buffer = NULL;
-      return false;
-    }
-  /* assert (env->non_local_exit_check (env) == emacs_funcall_exit_return); */
-  /* assert (buffer_size == old_buffer_size); */
-  *size = (size_t) (buffer_size - 1);
-  return true;
-}
-
-/*
-  Return a Lisp string. This is basically env->make_string except that
-  it calls strlen for you.
- */
-emacs_value
-emp_build_string (emacs_env *env, const char *string)
-{
-  return env->make_string (env, string, strlen (string));
-}
-
-/*
-  Intern NAME to a symbol. NAME has to be all-ASCII.
- */
-emacs_value
-emp_intern (emacs_env *env, const char *name)
-{
-  return env->intern (env, name);
-}
-
-/*
-  Call a function named FN which takes NARGS number of arguments.
-  Example: funcall (env, "cons", 2, car, cdr);
- */
-emacs_value
-emp_funcall (emacs_env *env, const char* fn, ptrdiff_t nargs, ...)
-{
-  va_list argv;
-  va_start (argv, nargs);
-  emacs_value *args = (emacs_value *) malloc(nargs * sizeof(emacs_value));
-  for (int idx = 0; idx < nargs; idx++)
-    {
-      args[idx] = va_arg (argv, emacs_value);
-    }
-  va_end (argv);
-  emacs_value val = env->funcall (env, emp_intern (env, fn), nargs, args);
-  free (args);
-  return val;
-}
-
-/*
-  Provide FEATURE like ‘provide’ in Lisp.
-*/
-void
-emp_provide (emacs_env *env, const char *feature)
-{
-  emp_funcall (env, "provide", 1, emp_intern (env, feature));
-}
-  
-/*
-  Raise a signal where NAME is the signal name and MESSAGE is the
-  error message.
- */
-void
-emp_signal_message1
-(emacs_env *env, const char *name, const char *message)
-{
-  env->non_local_exit_signal
-    (env, env->intern (env, name),
-     emp_funcall (env, "cons", 2,
-                  env->make_string (env, message, strlen (message)),
-                  emp_intern (env, "nil")));
-}
-
-/*
-  Define an error like ‘define-error’.
- */
-void
-emp_define_error
-(emacs_env *env, const char *name,
- const char *description, const char *parent)
-{
-  emp_funcall (env, "define-error", 3,
-               emp_intern (env, name),
-               env->make_string (env, description, strlen (description)),
-               emp_intern (env, parent));
-}
-
-/*
-  Return true if VAL is symbol nil.
- */
-bool
-emp_nilp (emacs_env *env, emacs_value val)
-{
-  return !env->is_not_nil (env, val);
-}
-
-/*
-  Define a function NAME. The number of arguments that the function
-  takes is between MIN_ARITY and MAX_ARITY.  FUNCTION is a function
-  with signature
-
-  static emacs_value
-  function
-  (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
-  EMACS_NOEXCEPT
-
-  DOCUMENTATION is the docstring for FUNCTION.
- */
-void
-emp_define_function
-(emacs_env *env, const char *name, ptrdiff_t min_arity,
- ptrdiff_t max_arity,
- emacs_value (*function) (emacs_env *env,
-                          ptrdiff_t nargs,
-                          emacs_value* args,
-                          void *data) EMACS_NOEXCEPT,
- const char *documentation)
-{
-  emacs_value fn = env->make_function
-    (env, min_arity, max_arity, function, documentation, NULL);
-  emp_funcall (env, "fset", 2, emp_intern (env, name), fn);
-}
-
-#endif /* EMACS_MODULE_PRELUDE_H */
diff --git a/module/emacs-module.h b/module/emacs-module.h
deleted file mode 100644
index 1185c06f45..0000000000
--- a/module/emacs-module.h
+++ /dev/null
@@ -1,763 +0,0 @@
-/* emacs-module.h - GNU Emacs module API.
-
-Copyright (C) 2015-2021 Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or (at
-your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
-
-/*
-This file defines the Emacs module API.  Please see the chapter
-`Dynamic Modules' in the GNU Emacs Lisp Reference Manual for
-information how to write modules and use this header file.
-*/
-
-#ifndef EMACS_MODULE_H
-#define EMACS_MODULE_H
-
-#include <stddef.h>
-#include <stdint.h>
-#include <time.h>
-
-#ifndef __cplusplus
-#include <stdbool.h>
-#endif
-
-#define EMACS_MAJOR_VERSION 28
-
-#if defined __cplusplus && __cplusplus >= 201103L
-# define EMACS_NOEXCEPT noexcept
-#else
-# define EMACS_NOEXCEPT
-#endif
-
-#if defined __cplusplus && __cplusplus >= 201703L
-# define EMACS_NOEXCEPT_TYPEDEF noexcept
-#else
-# define EMACS_NOEXCEPT_TYPEDEF
-#endif
-
-#if 3 < __GNUC__ + (3 <= __GNUC_MINOR__)
-# define EMACS_ATTRIBUTE_NONNULL(...) \
-   __attribute__ ((__nonnull__ (__VA_ARGS__)))
-#elif (defined __has_attribute \
-       && (!defined __clang_minor__ \
-          || 3 < __clang_major__ + (5 <= __clang_minor__)))
-# if __has_attribute (__nonnull__)
-#  define EMACS_ATTRIBUTE_NONNULL(...) \
-    __attribute__ ((__nonnull__ (__VA_ARGS__)))
-# endif
-#endif
-#ifndef EMACS_ATTRIBUTE_NONNULL
-# define EMACS_ATTRIBUTE_NONNULL(...)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Current environment.  */
-typedef struct emacs_env_28 emacs_env;
-
-/* Opaque pointer representing an Emacs Lisp value.
-   BEWARE: Do not assume NULL is a valid value!  */
-typedef struct emacs_value_tag *emacs_value;
-
-enum { emacs_variadic_function = -2 };
-
-/* Struct passed to a module init function (emacs_module_init).  */
-struct emacs_runtime
-{
-  /* Structure size (for version checking).  */
-  ptrdiff_t size;
-
-  /* Private data; users should not touch this.  */
-  struct emacs_runtime_private *private_members;
-
-  /* Return an environment pointer.  */
-  emacs_env *(*get_environment) (struct emacs_runtime *runtime)
-    EMACS_ATTRIBUTE_NONNULL (1);
-};
-
-/* Type aliases for function pointer types used in the module API.
-   Note that we don't use these aliases directly in the API to be able
-   to mark the function arguments as 'noexcept' before C++20.
-   However, users can use them if they want.  */
-
-/* Function prototype for the module Lisp functions.  These must not
-   throw C++ exceptions.  */
-typedef emacs_value (*emacs_function) (emacs_env *env, ptrdiff_t nargs,
-                                       emacs_value *args,
-                                       void *data)
-  EMACS_NOEXCEPT_TYPEDEF EMACS_ATTRIBUTE_NONNULL (1);
-
-/* Function prototype for module user-pointer and function finalizers.
-   These must not throw C++ exceptions.  */
-typedef void (*emacs_finalizer) (void *data) EMACS_NOEXCEPT_TYPEDEF;
-
-/* Possible Emacs function call outcomes.  */
-enum emacs_funcall_exit
-{
-  /* Function has returned normally.  */
-  emacs_funcall_exit_return = 0,
-
-  /* Function has signaled an error using `signal'.  */
-  emacs_funcall_exit_signal = 1,
-
-  /* Function has exit using `throw'.  */
-  emacs_funcall_exit_throw = 2
-};
-
-/* Possible return values for emacs_env.process_input.  */
-enum emacs_process_input_result
-{
-  /* Module code may continue  */
-  emacs_process_input_continue = 0,
-
-  /* Module code should return control to Emacs as soon as possible.  */
-  emacs_process_input_quit = 1
-};
-
-/* Define emacs_limb_t so that it is likely to match GMP's mp_limb_t.
-   This micro-optimization can help modules that use mpz_export and
-   mpz_import, which operate more efficiently on mp_limb_t.  It's OK
-   (if perhaps a bit slower) if the two types do not match, and
-   modules shouldn't rely on the two types matching.  */
-typedef size_t emacs_limb_t;
-#define EMACS_LIMB_MAX SIZE_MAX
-
-struct emacs_env_25
-{
-  /* Structure size (for version checking).  */
-  ptrdiff_t size;
-
-  /* Private data; users should not touch this.  */
-  struct emacs_env_private *private_members;
-
-  /* Memory management.  */
-
-  emacs_value (*make_global_ref) (emacs_env *env, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*free_global_ref) (emacs_env *env, emacs_value global_value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Non-local exit handling.  */
-
-  enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_clear) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  enum emacs_funcall_exit (*non_local_exit_get)
-    (emacs_env *env, emacs_value *symbol, emacs_value *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 2, 3);
-
-  void (*non_local_exit_signal) (emacs_env *env,
-                                emacs_value symbol, emacs_value data)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_throw) (emacs_env *env,
-                               emacs_value tag, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Function registration.  */
-
-  emacs_value (*make_function) (emacs_env *env,
-                               ptrdiff_t min_arity,
-                               ptrdiff_t max_arity,
-                               emacs_value (*func) (emacs_env *env,
-                                                     ptrdiff_t nargs,
-                                                     emacs_value* args,
-                                                     void *data)
-                                 EMACS_NOEXCEPT
-                                  EMACS_ATTRIBUTE_NONNULL(1),
-                               const char *docstring,
-                               void *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  emacs_value (*funcall) (emacs_env *env,
-                          emacs_value func,
-                          ptrdiff_t nargs,
-                          emacs_value* args)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*intern) (emacs_env *env, const char *name)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Type conversion.  */
-
-  emacs_value (*type_of) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*is_not_nil) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*eq) (emacs_env *env, emacs_value a, emacs_value b)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  intmax_t (*extract_integer) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_integer) (emacs_env *env, intmax_t n)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  double (*extract_float) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_float) (emacs_env *env, double d)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
-     null-terminated string.
-
-     SIZE must point to the total size of the buffer.  If BUFFER is
-     NULL or if SIZE is not big enough, write the required buffer size
-     to SIZE and return true.
-
-     Note that SIZE must include the last null byte (e.g. "abc" needs
-     a buffer of size 4).
-
-     Return true if the string was successfully copied.  */
-
-  bool (*copy_string_contents) (emacs_env *env,
-                                emacs_value value,
-                                char *buf,
-                                ptrdiff_t *len)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  /* Create a Lisp string from a utf8 encoded string.  */
-  emacs_value (*make_string) (emacs_env *env,
-                             const char *str, ptrdiff_t len)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Embedded pointer type.  */
-  emacs_value (*make_user_ptr) (emacs_env *env,
-                               void (*fin) (void *) EMACS_NOEXCEPT,
-                               void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void *(*get_user_ptr) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_ptr) (emacs_env *env, emacs_value arg, void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
-    (void *) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_finalizer) (emacs_env *env, emacs_value arg,
-                             void (*fin) (void *) EMACS_NOEXCEPT)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Vector functions.  */
-  emacs_value (*vec_get) (emacs_env *env, emacs_value vector, ptrdiff_t index)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*vec_set) (emacs_env *env, emacs_value vector, ptrdiff_t index,
-                  emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vector)
-    EMACS_ATTRIBUTE_NONNULL(1);
-};
-
-struct emacs_env_26
-{
-  /* Structure size (for version checking).  */
-  ptrdiff_t size;
-
-  /* Private data; users should not touch this.  */
-  struct emacs_env_private *private_members;
-
-  /* Memory management.  */
-
-  emacs_value (*make_global_ref) (emacs_env *env, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*free_global_ref) (emacs_env *env, emacs_value global_value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Non-local exit handling.  */
-
-  enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_clear) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  enum emacs_funcall_exit (*non_local_exit_get)
-    (emacs_env *env, emacs_value *symbol, emacs_value *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 2, 3);
-
-  void (*non_local_exit_signal) (emacs_env *env,
-                                emacs_value symbol, emacs_value data)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_throw) (emacs_env *env,
-                               emacs_value tag, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Function registration.  */
-
-  emacs_value (*make_function) (emacs_env *env,
-                               ptrdiff_t min_arity,
-                               ptrdiff_t max_arity,
-                               emacs_value (*func) (emacs_env *env,
-                                                     ptrdiff_t nargs,
-                                                     emacs_value* args,
-                                                     void *data)
-                                 EMACS_NOEXCEPT
-                                  EMACS_ATTRIBUTE_NONNULL(1),
-                               const char *docstring,
-                               void *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  emacs_value (*funcall) (emacs_env *env,
-                          emacs_value func,
-                          ptrdiff_t nargs,
-                          emacs_value* args)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*intern) (emacs_env *env, const char *name)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Type conversion.  */
-
-  emacs_value (*type_of) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*is_not_nil) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*eq) (emacs_env *env, emacs_value a, emacs_value b)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  intmax_t (*extract_integer) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_integer) (emacs_env *env, intmax_t n)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  double (*extract_float) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_float) (emacs_env *env, double d)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
-     null-terminated string.
-
-     SIZE must point to the total size of the buffer.  If BUFFER is
-     NULL or if SIZE is not big enough, write the required buffer size
-     to SIZE and return true.
-
-     Note that SIZE must include the last null byte (e.g. "abc" needs
-     a buffer of size 4).
-
-     Return true if the string was successfully copied.  */
-
-  bool (*copy_string_contents) (emacs_env *env,
-                                emacs_value value,
-                                char *buf,
-                                ptrdiff_t *len)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  /* Create a Lisp string from a utf8 encoded string.  */
-  emacs_value (*make_string) (emacs_env *env,
-                             const char *str, ptrdiff_t len)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Embedded pointer type.  */
-  emacs_value (*make_user_ptr) (emacs_env *env,
-                               void (*fin) (void *) EMACS_NOEXCEPT,
-                               void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void *(*get_user_ptr) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_ptr) (emacs_env *env, emacs_value arg, void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
-    (void *) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_finalizer) (emacs_env *env, emacs_value arg,
-                             void (*fin) (void *) EMACS_NOEXCEPT)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Vector functions.  */
-  emacs_value (*vec_get) (emacs_env *env, emacs_value vector, ptrdiff_t index)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*vec_set) (emacs_env *env, emacs_value vector, ptrdiff_t index,
-                  emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vector)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Returns whether a quit is pending.  */
-  bool (*should_quit) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-};
-
-struct emacs_env_27
-{
-  /* Structure size (for version checking).  */
-  ptrdiff_t size;
-
-  /* Private data; users should not touch this.  */
-  struct emacs_env_private *private_members;
-
-  /* Memory management.  */
-
-  emacs_value (*make_global_ref) (emacs_env *env, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*free_global_ref) (emacs_env *env, emacs_value global_value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Non-local exit handling.  */
-
-  enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_clear) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  enum emacs_funcall_exit (*non_local_exit_get)
-    (emacs_env *env, emacs_value *symbol, emacs_value *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 2, 3);
-
-  void (*non_local_exit_signal) (emacs_env *env,
-                                emacs_value symbol, emacs_value data)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_throw) (emacs_env *env,
-                               emacs_value tag, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Function registration.  */
-
-  emacs_value (*make_function) (emacs_env *env,
-                               ptrdiff_t min_arity,
-                               ptrdiff_t max_arity,
-                               emacs_value (*func) (emacs_env *env,
-                                                     ptrdiff_t nargs,
-                                                     emacs_value* args,
-                                                     void *data)
-                                 EMACS_NOEXCEPT
-                                  EMACS_ATTRIBUTE_NONNULL(1),
-                               const char *docstring,
-                               void *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  emacs_value (*funcall) (emacs_env *env,
-                          emacs_value func,
-                          ptrdiff_t nargs,
-                          emacs_value* args)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*intern) (emacs_env *env, const char *name)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Type conversion.  */
-
-  emacs_value (*type_of) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*is_not_nil) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*eq) (emacs_env *env, emacs_value a, emacs_value b)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  intmax_t (*extract_integer) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_integer) (emacs_env *env, intmax_t n)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  double (*extract_float) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_float) (emacs_env *env, double d)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
-     null-terminated string.
-
-     SIZE must point to the total size of the buffer.  If BUFFER is
-     NULL or if SIZE is not big enough, write the required buffer size
-     to SIZE and return true.
-
-     Note that SIZE must include the last null byte (e.g. "abc" needs
-     a buffer of size 4).
-
-     Return true if the string was successfully copied.  */
-
-  bool (*copy_string_contents) (emacs_env *env,
-                                emacs_value value,
-                                char *buf,
-                                ptrdiff_t *len)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  /* Create a Lisp string from a utf8 encoded string.  */
-  emacs_value (*make_string) (emacs_env *env,
-                             const char *str, ptrdiff_t len)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Embedded pointer type.  */
-  emacs_value (*make_user_ptr) (emacs_env *env,
-                               void (*fin) (void *) EMACS_NOEXCEPT,
-                               void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void *(*get_user_ptr) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_ptr) (emacs_env *env, emacs_value arg, void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
-    (void *) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_finalizer) (emacs_env *env, emacs_value arg,
-                             void (*fin) (void *) EMACS_NOEXCEPT)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Vector functions.  */
-  emacs_value (*vec_get) (emacs_env *env, emacs_value vector, ptrdiff_t index)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*vec_set) (emacs_env *env, emacs_value vector, ptrdiff_t index,
-                  emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vector)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Returns whether a quit is pending.  */
-  bool (*should_quit) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Processes pending input events and returns whether the module
-     function should quit.  */
-  enum emacs_process_input_result (*process_input) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  struct timespec (*extract_time) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  emacs_value (*make_time) (emacs_env *env, struct timespec time)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  bool (*extract_big_integer) (emacs_env *env, emacs_value arg, int *sign,
-                               ptrdiff_t *count, emacs_limb_t *magnitude)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  emacs_value (*make_big_integer) (emacs_env *env, int sign, ptrdiff_t count,
-                                   const emacs_limb_t *magnitude)
-    EMACS_ATTRIBUTE_NONNULL (1);
-};
-
-struct emacs_env_28
-{
-  /* Structure size (for version checking).  */
-  ptrdiff_t size;
-
-  /* Private data; users should not touch this.  */
-  struct emacs_env_private *private_members;
-
-  /* Memory management.  */
-
-  emacs_value (*make_global_ref) (emacs_env *env, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*free_global_ref) (emacs_env *env, emacs_value global_value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Non-local exit handling.  */
-
-  enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_clear) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  enum emacs_funcall_exit (*non_local_exit_get)
-    (emacs_env *env, emacs_value *symbol, emacs_value *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 2, 3);
-
-  void (*non_local_exit_signal) (emacs_env *env,
-                                emacs_value symbol, emacs_value data)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*non_local_exit_throw) (emacs_env *env,
-                               emacs_value tag, emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Function registration.  */
-
-  emacs_value (*make_function) (emacs_env *env,
-                               ptrdiff_t min_arity,
-                               ptrdiff_t max_arity,
-                               emacs_value (*func) (emacs_env *env,
-                                                     ptrdiff_t nargs,
-                                                     emacs_value* args,
-                                                     void *data)
-                                 EMACS_NOEXCEPT
-                                  EMACS_ATTRIBUTE_NONNULL(1),
-                               const char *docstring,
-                               void *data)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  emacs_value (*funcall) (emacs_env *env,
-                          emacs_value func,
-                          ptrdiff_t nargs,
-                          emacs_value* args)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*intern) (emacs_env *env, const char *name)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Type conversion.  */
-
-  emacs_value (*type_of) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*is_not_nil) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  bool (*eq) (emacs_env *env, emacs_value a, emacs_value b)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  intmax_t (*extract_integer) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_integer) (emacs_env *env, intmax_t n)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  double (*extract_float) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  emacs_value (*make_float) (emacs_env *env, double d)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Copy the content of the Lisp string VALUE to BUFFER as an utf8
-     null-terminated string.
-
-     SIZE must point to the total size of the buffer.  If BUFFER is
-     NULL or if SIZE is not big enough, write the required buffer size
-     to SIZE and return true.
-
-     Note that SIZE must include the last null byte (e.g. "abc" needs
-     a buffer of size 4).
-
-     Return true if the string was successfully copied.  */
-
-  bool (*copy_string_contents) (emacs_env *env,
-                                emacs_value value,
-                                char *buf,
-                                ptrdiff_t *len)
-    EMACS_ATTRIBUTE_NONNULL(1, 4);
-
-  /* Create a Lisp string from a utf8 encoded string.  */
-  emacs_value (*make_string) (emacs_env *env,
-                             const char *str, ptrdiff_t len)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-
-  /* Embedded pointer type.  */
-  emacs_value (*make_user_ptr) (emacs_env *env,
-                               void (*fin) (void *) EMACS_NOEXCEPT,
-                               void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void *(*get_user_ptr) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_ptr) (emacs_env *env, emacs_value arg, void *ptr)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*(*get_user_finalizer) (emacs_env *env, emacs_value uptr))
-    (void *) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1);
-  void (*set_user_finalizer) (emacs_env *env, emacs_value arg,
-                             void (*fin) (void *) EMACS_NOEXCEPT)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Vector functions.  */
-  emacs_value (*vec_get) (emacs_env *env, emacs_value vector, ptrdiff_t index)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  void (*vec_set) (emacs_env *env, emacs_value vector, ptrdiff_t index,
-                  emacs_value value)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  ptrdiff_t (*vec_size) (emacs_env *env, emacs_value vector)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Returns whether a quit is pending.  */
-  bool (*should_quit) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL(1);
-
-  /* Processes pending input events and returns whether the module
-     function should quit.  */
-  enum emacs_process_input_result (*process_input) (emacs_env *env)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  struct timespec (*extract_time) (emacs_env *env, emacs_value arg)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  emacs_value (*make_time) (emacs_env *env, struct timespec time)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  bool (*extract_big_integer) (emacs_env *env, emacs_value arg, int *sign,
-                               ptrdiff_t *count, emacs_limb_t *magnitude)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  emacs_value (*make_big_integer) (emacs_env *env, int sign, ptrdiff_t count,
-                                   const emacs_limb_t *magnitude)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  /* Add module environment functions newly added in Emacs 28 here.
-     Before Emacs 28 is released, remove this comment and start
-     module-env-29.h on the master branch.  */
-
-  void (*(*EMACS_ATTRIBUTE_NONNULL (1)
-            get_function_finalizer) (emacs_env *env,
-                                     emacs_value arg)) (void *) EMACS_NOEXCEPT;
-
-  void (*set_function_finalizer) (emacs_env *env, emacs_value arg,
-                                  void (*fin) (void *) EMACS_NOEXCEPT)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  int (*open_channel) (emacs_env *env, emacs_value pipe_process)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  void (*make_interactive) (emacs_env *env, emacs_value function,
-                            emacs_value spec)
-    EMACS_ATTRIBUTE_NONNULL (1);
-
-  /* Create a unibyte Lisp string from a string.  */
-  emacs_value (*make_unibyte_string) (emacs_env *env,
-                                     const char *str, ptrdiff_t len)
-    EMACS_ATTRIBUTE_NONNULL(1, 2);
-};
-
-/* Every module should define a function as follows.  */
-extern int emacs_module_init (struct emacs_runtime *runtime)
-  EMACS_NOEXCEPT
-  EMACS_ATTRIBUTE_NONNULL (1);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* EMACS_MODULE_H */
diff --git a/module/xapian-lite-internal.h b/module/xapian-lite-internal.h
deleted file mode 100644
index d739004003..0000000000
--- a/module/xapian-lite-internal.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef XAPIAN_LITE_INTERNAL_H
-#define XAPIAN_LITE_INTERNAL_H
-
-#include "emacs-module.h"
-
-typedef emacs_value (*emacs_subr) (emacs_env *env,
-                                   ptrdiff_t nargs, emacs_value *args,
-                                   void *data);
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void
-define_error
-(emacs_env *env, const char *name,
- const char *description, const char *parent);
-
-emacs_value
-Fxapian_lite_reindex_file
-(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
-  EMACS_NOEXCEPT;
-
-emacs_value
-Fxapian_lite_query_term
-(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
-  EMACS_NOEXCEPT;
-
-void
-define_function
-(emacs_env *env, const char *name, ptrdiff_t min_arity,
- ptrdiff_t max_arity, emacs_subr function, const char *documentation);
-
-void
-provide (emacs_env *env, const char *feature);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* XAPIAN_LITE_INTERNAL_H */
diff --git a/module/xapian-lite.cc b/module/xapian-lite.cc
deleted file mode 100644
index 50a7eb9500..0000000000
--- a/module/xapian-lite.cc
+++ /dev/null
@@ -1,446 +0,0 @@
-#include <string>
-#include <cstring>
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <exception>
-#include <iterator>
-#include <cstdarg>
-
-#include <stdlib.h>
-#include <assert.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <xapian.h>
-
-#include "emacs-module.h"
-#include "emacs-module-prelude.h"
-
-using namespace std;
-
-int plugin_is_GPL_compatible;
-
-#if defined __cplusplus && __cplusplus >= 201103L
-# define EMACS_NOEXCEPT noexcept
-#else
-# define EMACS_NOEXCEPT
-#endif
-
-#define CHECK_EXIT(env) \
-  if (env->non_local_exit_check (env) \
-      != emacs_funcall_exit_return)   \
-    { return NULL; }
-
-/* A few notes: The database we use, WritableDatabase, will not throw
-   DatabaseModifiedError, so we don’t need to handle that. For query,
-   we first try to parse it with special syntax enabled, i.e., with
-   AND, OR, +/-, etc. If that doesn’t parse, we’ll just parse it as
-   plain text.
-
-   REF: 
https://lists.xapian.org/pipermail/xapian-discuss/2021-August/009906.html
- */ 
-
-/*** Xapian stuff */
-
-static const Xapian::valueno DOC_MTIME = 0;
-static const Xapian::valueno DOC_FILEPATH = 1;
-
-static Xapian::WritableDatabase database;
-static string cached_dbpath = "";
-
-class xapian_lite_cannot_open_file: public exception {};
-
-// Reindex the file at PATH, using database at DBPATH. Throws
-// cannot_open_file. Both path must be absolute. Normally only reindex
-// if file has change since last index, if FORCE is true, always
-// reindex. Return true if re-indexed, return false if didn’t.
-// LANG is the language used by the stemmer.
-// Possible langauges:
-// https://xapian.org/docs/apidoc/html/classXapian_1_1Stem.html
-static bool
-reindex_file
-(string path, string dbpath, string lang = "en", bool force = false)
-{
-  // Check for mtime.
-  struct stat st;
-  time_t file_mtime;
-  off_t file_size;
-  if (stat (path.c_str(), &st) == 0)
-    {
-      file_mtime = st.st_mtime;
-      file_size = st.st_size;
-    }
-  else
-    {
-      throw xapian_lite_cannot_open_file();
-    }
-
-  // Even though the document says that database object only carries a
-  // pointer to the actual object, it is still not cheap enough. By
-  // using this cache, we get much better performance when reindexing
-  // hundreds of files, which most are no-op because they hasn’t been
-  // modified.
-  if (dbpath != cached_dbpath)
-    {
-      database = Xapian::WritableDatabase
-        (dbpath, Xapian::DB_CREATE_OR_OPEN);
-      cached_dbpath = dbpath;
-    }
-  // Track doc with file path as "id". See
-  // 
https://getting-started-with-xapian.readthedocs.io/en/latest/practical_example/indexing/updating_the_database.html
-  string termID = 'Q' + path;
-  Xapian::PostingIterator it_begin = database.postlist_begin (termID);
-  Xapian::PostingIterator it_end = database.postlist_end (termID);
-  bool has_doc = it_begin != it_end;
-  time_t db_mtime;
-  if (has_doc)
-    {
-      // sortable_serialise is for double and we can’t really use it.
-      Xapian::Document db_doc = database.get_document(*it_begin);
-      db_mtime = (time_t) stoi (db_doc.get_value (DOC_MTIME));
-    }
-
-  // Need re-index.
-  if (!has_doc || (has_doc && db_mtime < file_mtime) || force)
-    {
-      // Get the file content.
-      // REF: 
https://stackoverflow.com/questions/2912520/read-file-contents-into-a-string-in-c
-      ifstream infile (path);
-      string content ((istreambuf_iterator<char>(infile)),
-                      (istreambuf_iterator<char>()));
-      // Create the indexer.
-      Xapian::TermGenerator indexer;
-      Xapian::Stem stemmer (lang);
-      indexer.set_stemmer (stemmer);
-      indexer.set_stemming_strategy
-        (Xapian::TermGenerator::STEM_SOME);
-      // Support CJK.
-      indexer.set_flags (Xapian::TermGenerator::FLAG_CJK_NGRAM);
-      // Index file content.
-      Xapian::Document new_doc;
-      indexer.set_document (new_doc);
-      indexer.index_text (content);
-      // Set doc info.
-      new_doc.add_boolean_term (termID);
-      // We store the path in value, no need to use set_data.
-      new_doc.add_value (DOC_FILEPATH, path);
-      new_doc.add_value (DOC_MTIME, (string) to_string (file_mtime));
-      database.replace_document (termID, new_doc);
-      return true;
-    }
-  else
-    {
-      return false;
-    }
-}
-
-// Query TERM in the databse at DBPATH. OFFSET and PAGE_SIZE is for
-// paging, see the docstring for the lisp function. If a file in the
-// result doesn’t exist anymore, it is removed from the database.
-// LANG is the language used by the stemmer.
-// Possible langauges:
-// https://xapian.org/docs/apidoc/html/classXapian_1_1Stem.html
-static vector<string>
-query_term
-(string term, string dbpath, int offset, int page_size,
- string lang = "en")
-{
-  // See reindex_file for the reason for caching the database object.
-  if (dbpath != cached_dbpath)
-    {
-      database = Xapian::WritableDatabase
-        (dbpath, Xapian::DB_CREATE_OR_OPEN);
-      cached_dbpath = dbpath;
-    }
-
-  Xapian::QueryParser parser;
-  Xapian::Stem stemmer (lang);
-  parser.set_stemmer (stemmer);
-  parser.set_stemming_strategy (Xapian::QueryParser::STEM_SOME);
-  // Partial match (FLAG_PARTIAL) needs the database to expand
-  // wildcards.
-  parser.set_database(database);
-
-  Xapian::Query query;
-  try
-    {
-      query = parser.parse_query
-        // CJK_NGRAM is the flag for CJK support. PARTIAL makes
-        // interactive search more stable. DEFAULT enables AND OR and
-        // +/-.
-        (term, Xapian::QueryParser::FLAG_CJK_NGRAM
-         | Xapian::QueryParser::FLAG_PARTIAL
-         | Xapian::QueryParser::FLAG_DEFAULT);
-    }
-  // If the syntax is syntactically wrong, Xapian throws this error.
-  // Try again without enabling any special syntax.
-  catch (Xapian::QueryParserError &e)
-    {
-      query = parser.parse_query
-        (term, Xapian::QueryParser::FLAG_CJK_NGRAM
-         | Xapian::QueryParser::FLAG_PARTIAL);
-    }
-  
-  Xapian::Enquire enquire (database);
-  enquire.set_query (query);
-
-  Xapian::MSet mset = enquire.get_mset (offset, page_size);
-  vector<string> result (0);
-  for (Xapian::MSetIterator it = mset.begin(); it != mset.end(); it++)
-    {
-      Xapian::Document doc = it.get_document();
-      string path = doc.get_value(DOC_FILEPATH);
-      // If the file doesn’t exists anymore, remove it.
-      struct stat st;
-      if (stat (path.c_str(), &st) == 0)
-        {
-          result.push_back (doc.get_value (DOC_FILEPATH));
-        }
-      else
-        {
-          database.delete_document (doc.get_docid());
-        }
-    }
-  return result;
-}
-
-/*** Module definition */
-
-static string
-copy_string (emacs_env *env, emacs_value value)
-{
-  char* char_buffer;
-  size_t size;
-  if (emp_copy_string_contents (env, value, &char_buffer, &size))
-    {
-      string str = (string) char_buffer;
-      free (char_buffer);
-      return str;
-    }
-  else
-    {
-      emp_signal_message1 (env, "xapian-lite-error",
-              "Error turning lisp string to C++ string");
-      return "";
-    }
-}
-
-static bool
-NILP (emacs_env *env, emacs_value val)
-{
-  return !env->is_not_nil (env, val);
-}
-
-static const char* xapian_lite_reindex_file_doc =
-  "Refindex file at PATH with database at DBPATH\n"
-  "Both paths has to be absolute.  Normally, this function only\n"
-  "reindex a file if it has been modified since last indexed,\n"
-  "but if FORCE is non-nil, this function will always reindex.\n"
-  "Return non-nil if actually reindexed the file, return nil if not.\n"
-  "\n"
-  "LANG is the language used by the indexer, it tells Xapian how to\n"
-  "reduce words to word stems, e.g., apples <-> apple.\n"
-  "A full list of possible languages can be found at\n"
-  "https://xapian.org/docs/apidoc/html/classXapian_1_1Stem.html.\n";
-  "By default, LANG is \"en\".\n"
-  "\n"
-  "(fn PATH DBPATH &optional LANG FORCE)";
-
-static emacs_value
-Fxapian_lite_reindex_file
-(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
-  EMACS_NOEXCEPT
-{
-
-  // Decode arguments.
-  emacs_value lisp_path = args[0];
-  emacs_value lisp_dbpath = args[1];
-
-  if (NILP (env, emp_funcall (env, "file-name-absolute-p", 1, lisp_path)))
-    {
-      emp_signal_message1 (env, "xapian-lite-file-error",
-                           "PATH is not a absolute path");
-      return NULL;
-    }
-  if (NILP (env,
-            emp_funcall (env, "file-name-absolute-p", 1, lisp_dbpath)))
-    {
-      emp_signal_message1 (env, "xapian-lite-file-error",
-                           "DBPATH is not a absolute path");
-      return NULL;
-    }
-
-  // Expand "~" in the filename.
-  emacs_value lisp_args[] = {lisp_path};
-  lisp_path = emp_funcall (env, "expand-file-name", 1, lisp_path);
-  lisp_dbpath = emp_funcall (env, "expand-file-name", 1, lisp_dbpath);
-
-  emacs_value lisp_lang = nargs < 3 ? emp_intern (env, "nil") : args[2];
-  emacs_value lisp_force = nargs < 4 ? emp_intern (env, "nil") : args[3];
-  
-  string path = copy_string (env, lisp_path);
-  string dbpath = copy_string (env, lisp_dbpath);
-  bool force = !NILP (env, lisp_force);
-  CHECK_EXIT (env);
-  string lang = NILP (env, lisp_lang) ?
-    "en" : copy_string (env, lisp_lang);
-  CHECK_EXIT (env);
-  
-  // Do the work.
-  bool indexed;
-  try
-    {
-      indexed = reindex_file (path, dbpath, lang, force);
-      return indexed ? emp_intern (env, "t") : emp_intern (env, "nil");
-    }
-  catch (xapian_lite_cannot_open_file &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-file-error",
-                           "Cannot open the file");
-      return NULL;
-    }
-  catch (Xapian::DatabaseCorruptError &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-database-corrupt-error",
-                           e.get_description().c_str());
-      return NULL;
-    }
-  catch (Xapian::DatabaseLockError &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-database-lock-error",
-                           e.get_description().c_str());
-      return NULL;
-    }
-  catch (Xapian::Error &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-lib-error",
-                           e.get_description().c_str());
-      return NULL;
-    }
-  catch (exception &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-error",
-                           "Something went wrong");
-      return NULL;
-    }
-}
-
-static const char *xapian_lite_query_term_doc =
-  "Query for TERM in database at DBPATH.\n"
-  "Paging is supported by OFFSET and PAGE-SIZE. OFFSET specifies page\n"
-  "start, and PAGE-SIZE the size. For example, if a page is 10 entries,\n"
-  "OFFSET and PAGE-SIZE would be first 0 and 10, then 10 and 10, and\n"
-  "so on.\n"
-  "\n"
-  "If a file in the result doesn't exist anymore, it is removed from\n"
-  "the database, and is not included in the return value.\n"
-  "\n"
-  "LANG is the language used by the indexer, it tells Xapian how to\n"
-  "reduce words to word stems, e.g., apples <-> apple.\n"
-  "A full list of possible languages can be found at\n"
-  "https://xapian.org/docs/apidoc/html/classXapian_1_1Stem.html.\n";
-  "By default, LANG is \"en\".\n"
-  "\n"
-  "TERM can use common Xapian syntax like AND, OR, and +/-.\n"
-  "Specifically, this function supports:\n"
-  "\n"
-  "    Boolean operators: AND, OR, XOR, NOT\n"
-  "    Parenthesized expression: ()\n"
-  "    Love/hate terms: +/-\n"
-  "    Exact match: \"\"\n"
-  "\n"
-  "If TERM contains syntactic errors, like \"a AND AND b\",\n"
-  "it is treated as a plain term.\n"
-  "\n"
-  "(fn TERM DBPATH OFFSET PAGE-SIZE &optional LANG)";
-
-static emacs_value
-Fxapian_lite_query_term
-(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data)
-  EMACS_NOEXCEPT
-{
-  // Decode arguments.
-  emacs_value lisp_term = args[0];
-  emacs_value lisp_dbpath = args[1];
-  emacs_value lisp_offset = args[2];
-  emacs_value lisp_page_size = args[3];
-
-  if (NILP (env,
-            emp_funcall (env, "file-name-absolute-p", 1, lisp_dbpath)))
-    {
-      emp_signal_message1 (env, "xapian-lite-file-error",
-                           "DBPATH is not a absolute path");
-      return NULL;
-    }
-
-  lisp_dbpath = emp_funcall (env, "expand-file-name", 1, lisp_dbpath);
-
-  string term = copy_string (env, lisp_term);
-  string dbpath = copy_string (env, lisp_dbpath);
-  int offset = env->extract_integer (env, lisp_offset);
-  int page_size = env->extract_integer (env, lisp_page_size);
-  CHECK_EXIT (env);
-
-  vector<string> result;
-  try
-    {
-      result = query_term (term, dbpath, offset, page_size);
-    }
-  catch (Xapian::Error &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-lib-error",
-                           e.get_description().c_str());
-      return NULL;
-    }
-  catch (exception &e)
-    {
-      emp_signal_message1 (env, "xapian-lite-error",
-                           "Something went wrong");
-      return NULL;
-    }
-
-  vector<string>::iterator it;
-  emacs_value ret = emp_intern (env, "nil");
-  for (it = result.begin(); it != result.end(); it++) {
-    ret = emp_funcall (env, "cons", 2,
-                   env->make_string
-                   (env, it->c_str(), strlen(it->c_str())),
-                   ret);
-    CHECK_EXIT (env);
-  }
-  return emp_funcall (env, "reverse", 1, ret);
-}
-
-int
-emacs_module_init (struct emacs_runtime *ert) EMACS_NOEXCEPT
-{
-  emacs_env *env = ert->get_environment (ert);
-
-  emp_define_error (env, "xapian-lite-error",
-                "Generic xapian-lite error", "error");
-  emp_define_error (env, "xapian-lite-lib-error",
-                "Xapian library error", "xapian-lite-error");
-  emp_define_error (env, "xapian-lite-database-corrupt-error",
-                "Xapian library error", "xapian-lite-lib-error");
-  emp_define_error (env, "xapian-lite-database-lock-error",
-                "Xapian library error", "xapian-lite-lib-error");
-  emp_define_error (env, "xapian-lite-file-error",
-                "Cannot open file", "xapian-lite-error");
-
-  emp_define_function(env, "xapian-lite-reindex-file", 2, 3,
-                  &Fxapian_lite_reindex_file,
-                  xapian_lite_reindex_file_doc);
-  emp_define_function(env, "xapian-lite-query-term", 4, 4,
-                  &Fxapian_lite_query_term,
-                  xapian_lite_query_term_doc);
-
-  emp_provide (env, "xapian-lite");
-
-  /* Return 0 to indicate module loaded successfully.  */
-  return 0;
-}


Reply via email to