/*
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 .
*/
#ifndef EMACS_MODULE_H
#define EMACS_MODULE_H
#include
#include
#include
/* 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 */