/* module.h - GNU Emacs module API. Copyright (C) 2015 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 . */ #ifndef EMACS_MODULE_H #define EMACS_MODULE_H #include #include #include #ifdef __cplusplus #define EMACS_EXTERN_C_BEGIN extern "C" { #define EMACS_EXTERN_C_END } #else #define EMACS_EXTERN_C_BEGIN #define EMACS_EXTERN_C_END #endif #if defined(__cplusplus) && __cplusplus >= 201103L #define EMACS_NOEXCEPT noexcept #else #define EMACS_NOEXCEPT #endif EMACS_EXTERN_C_BEGIN /* Current environement */ typedef struct emacs_env_25 emacs_env; /* Opaque structure pointer representing an Emacs Lisp value */ typedef struct emacs_value_tag* emacs_value; enum emacs_arity { emacs_variadic_function = -2 }; /* Struct passed to a module init function (emacs_module_init) */ struct emacs_runtime { /* Structure size (for version checking) */ size_t size; /* Private data; users should not touch this */ struct emacs_runtime_private *private_members; /* Returns an environment pointer. */ emacs_env* (*get_environment)(struct emacs_runtime *ert); }; /* Function prototype for the module init function */ typedef int (*emacs_init_function)(struct emacs_runtime *ert); /* Function prototype for the module Lisp functions */ typedef emacs_value (*emacs_subr)(emacs_env *env, int nargs, emacs_value args[], void *data); /* Function prototype for module user-pointer finalizers */ typedef void (*emacs_finalizer_function)(void*); /* 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, }; struct emacs_env_25 { /* * Structure size (for version checking) */ size_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 any_reference); void (*free_global_ref)(emacs_env *env, emacs_value global_reference); /* * Non-local exit handling */ enum emacs_funcall_exit (*non_local_exit_check)(emacs_env *env); void (*non_local_exit_clear)(emacs_env *env); enum emacs_funcall_exit (*non_local_exit_get)(emacs_env *env, emacs_value *non_local_exit_symbol_out, emacs_value *non_local_exit_data_out); void (*non_local_exit_signal)(emacs_env *env, emacs_value non_local_exit_symbol, emacs_value non_local_exit_data); void (*non_local_exit_throw)(emacs_env *env, emacs_value tag, emacs_value value); /* * Function registration */ emacs_value (*make_function)(emacs_env *env, int min_arity, int max_arity, emacs_value (*function)(emacs_env*, int, emacs_value*, void*) EMACS_NOEXCEPT, const char *documentation, void *data); emacs_value (*funcall)(emacs_env *env, emacs_value function, int nargs, emacs_value args[]); emacs_value (*intern)(emacs_env *env, const char *symbol_name); /* * Type conversion */ emacs_value (*type_of)(emacs_env *env, emacs_value value); bool (*is_not_nil)(emacs_env *env, emacs_value value); bool (*eq)(emacs_env *env, emacs_value a, emacs_value b); int64_t (*extract_integer)(emacs_env *env, emacs_value value); emacs_value (*make_integer)(emacs_env *env, int64_t value); double (*extract_float)(emacs_env *env, emacs_value value); emacs_value (*make_float)(emacs_env *env, double value); /* * 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 false. * * Note that SIZE must include the last null byte (e.g. "abc" needs * a buffer of size 4). * * Returns true if the string was successfully copied. */ bool (*copy_string_contents)(emacs_env *env, emacs_value value, char *buffer, size_t *size_inout); /* * Create a lisp string from a utf8 encoded string. */ emacs_value (*make_string)(emacs_env *env, const char *contents, size_t length); /* * Embedded pointer type */ emacs_value (*make_user_ptr)(emacs_env *env, void (*fin)(void *) EMACS_NOEXCEPT, void *ptr); void* (*get_user_ptr)(emacs_env *env, emacs_value uptr); void (*set_user_ptr)(emacs_env *env, emacs_value uptr, void *ptr); void (*(*get_user_finalizer)(emacs_env *env, emacs_value uptr))(void *) EMACS_NOEXCEPT; void (*set_user_finalizer)(emacs_env *env, emacs_value uptr, void (*fin)(void *) EMACS_NOEXCEPT); /* * Vector functions */ emacs_value (*vec_get) (emacs_env *env, emacs_value vec, size_t i); void (*vec_set) (emacs_env *env, emacs_value vec, size_t i, emacs_value val); size_t (*vec_size) (emacs_env *env, emacs_value vec); }; EMACS_EXTERN_C_END #endif /* EMACS_MODULE_H */