/* emacs-module.h - GNU Emacs module API. Copyright (C) 2015-2019 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 #include #ifndef __cplusplus #include #endif #define EMACS_MAJOR_VERSION @emacs_major_version@ #if defined __cplusplus && __cplusplus >= 201103L # define EMACS_NOEXCEPT noexcept #else # define EMACS_NOEXCEPT #endif #ifdef __has_attribute #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_27 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 *ert) EMACS_ATTRIBUTE_NONNULL(1); }; /* 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 }; /* Implementation note: We define emacs_limb_t so that it is likely to match the GMP mp_limb_t type. If the types match, GMP can use an optimization for mpz_import and mpz_export that boils down to a memcpy. According to https://gmplib.org/manual/ABI-and-ISA.html GMP will prefer a 64-bit limb and will default to unsigned long if that is wide enough. Note that this is an internal micro-optimization. Users shouldn't rely on the exact size of emacs_limb_t. */ #if ULONG_MAX == 0xFFFFFFFF typedef unsigned long long emacs_limb_t; # define EMACS_LIMB_MAX ULLONG_MAX #else typedef unsigned long emacs_limb_t; # define EMACS_LIMB_MAX ULONG_MAX #endif struct emacs_env_25 { @module_env_snippet_25@ }; struct emacs_env_26 { @module_env_snippet_25@ @module_env_snippet_26@ }; struct emacs_env_27 { @module_env_snippet_25@ @module_env_snippet_26@ @module_env_snippet_27@ }; /* Every module should define a function as follows. */ extern int emacs_module_init (struct emacs_runtime *ert) EMACS_NOEXCEPT EMACS_ATTRIBUTE_NONNULL(1); #ifdef __cplusplus } #endif #endif /* EMACS_MODULE_H */