summaryrefslogtreecommitdiff
path: root/src/emacs_module.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emacs_module.h')
-rw-r--r--src/emacs_module.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/src/emacs_module.h b/src/emacs_module.h
new file mode 100644
index 00000000000..2dbb2a2f5ce
--- /dev/null
+++ b/src/emacs_module.h
@@ -0,0 +1,175 @@
+/*
+ emacs_module.h - 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef EMACS_MODULE_H
+#define EMACS_MODULE_H
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+/* Current environment */
+typedef struct emacs_env_25 emacs_env;
+
+/* The size of emacs_value must match EMACS_INT:
+ 32 bit system: 32 bits
+ 32 bit system with --with-wide-int: 64 bits
+ 64 bit system: 64 bits.
+
+ When compiling modules, define the macro EMACS_VALUE_TYPE by the
+ result of `module-emacs_value-type'. */
+typedef EMACS_VALUE_TYPE emacs_value;
+
+/* Struct passed to a module init function (emacs_module_init) */
+struct emacs_runtime {
+ size_t size;
+ 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[]);
+struct emacs_env_25 {
+ /*
+ * Structure size (for version checking)
+ */
+
+ size_t size;
+
+ /*
+ * Constants
+ */
+ emacs_value Qt_value;
+ emacs_value Qnil_value;
+
+ /*
+ * Memory management
+ */
+
+ emacs_value (*make_global_reference)(emacs_env *env,
+ emacs_value any_reference);
+
+ void (*free_global_reference)(emacs_env *env,
+ emacs_value global_reference);
+
+ /*
+ * Error handling
+ */
+
+ bool (*error_check)(emacs_env *env);
+
+ void (*clear_error)(emacs_env *env);
+
+ bool (*get_error)(emacs_env *env,
+ emacs_value *error_symbol_out,
+ emacs_value *error_data_out);
+
+ void (*signal_error)(emacs_env *env,
+ const char* msg,
+ emacs_value error_data);
+
+ /*
+ * Function registration
+ */
+
+ emacs_value (*make_function)(emacs_env *env,
+ int min_arity,
+ int max_arity,
+ emacs_subr function);
+
+ emacs_value (*funcall)(emacs_env *env,
+ emacs_value function,
+ int nargs,
+ emacs_value args[]);
+
+ emacs_value (*intern)(emacs_env *env,
+ const char *symbol_name);
+
+ emacs_value (*intern_soft)(emacs_env *env,
+ const char *symbol_name);
+
+ void (*bind_function) (emacs_env *env,
+ const char *name,
+ emacs_value definition);
+
+ /*
+ * Type conversion
+ */
+
+ emacs_value (*type_of)(emacs_env *env,
+ emacs_value value);
+
+ int64_t (*fixnum_to_int)(emacs_env *env,
+ emacs_value value);
+
+ emacs_value (*make_fixnum)(emacs_env *env,
+ int64_t value);
+
+ double (*float_to_c_double)(emacs_env *env,
+ emacs_value value);
+
+ emacs_value (*make_float)(emacs_env *env,
+ double value);
+
+ bool (*copy_string_contents)(emacs_env *env,
+ emacs_value value,
+ char *buffer,
+ size_t* length_inout);
+
+ size_t (*buffer_byte_length)(emacs_env *env,
+ emacs_value start,
+ emacs_value end);
+ /* Return the size in bytes of the buffer substring in the current
+ buffer from START to END */
+
+ void (*copy_buffer_substring)(emacs_env *env,
+ emacs_value start,
+ emacs_value end,
+ char *buffer,
+ size_t* length_inout);
+ /* Copy buffer string from current buffer, BEG to END (integers or
+ markers), to BUFFER. On call, LENGTH_INOUT is the size in bytes
+ of BUFFER; on return, it is the size in bytes of the copied
+ string.
+
+ If BUFFER is too small, signals an error. Use buffer_byte_length
+ to ensure BUFFER is not too small. */
+
+ emacs_value (*make_string)(emacs_env *env,
+ const char *contents);
+
+ /*
+ * miscellaneous
+ */
+
+ void (*message)(emacs_env *env,
+ emacs_value msg);
+ /* msg must be already formatted */
+
+ emacs_value (*symbol_value)(emacs_env *env,
+ emacs_value symbol);
+};
+
+#endif /* EMACS_MODULE_H */