Style fixes for indenting etc. in module code
This is mostly indenting and spacing changes. Also, remove some unnecessary static decls instead of bothering to reindent them. * src/module.h (EMACS_EXTERN_C_BEGIN): Remove, and do this inline, as most other Emacs files do for this sort of thing.
This commit is contained in:
parent
7cd728c813
commit
c8a972b0c3
9 changed files with 607 additions and 662 deletions
|
@ -3322,7 +3322,8 @@ fi
|
|||
if test "${HAVE_MODULES}" = yes; then
|
||||
MODULES_OBJ="dynlib.o module.o"
|
||||
AC_DEFINE(HAVE_MODULES, 1, [Define to 1 if dynamic modules are enabled])
|
||||
AC_DEFINE_UNQUOTED(MODULES_SUFFIX, "$MODULES_SUFFIX", [System extension for dynamic libraries])
|
||||
AC_DEFINE_UNQUOTED(MODULES_SUFFIX, "$MODULES_SUFFIX",
|
||||
[System extension for dynamic libraries])
|
||||
fi
|
||||
AC_SUBST(MODULES_OBJ)
|
||||
AC_SUBST(LIBMODULES)
|
||||
|
|
|
@ -23,24 +23,21 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
int plugin_is_GPL_compatible;
|
||||
|
||||
/*
|
||||
* Always return symbol 't'
|
||||
*/
|
||||
static emacs_value Fmod_test_return_t (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
/* Always return symbol 't'. */
|
||||
static emacs_value
|
||||
Fmod_test_return_t (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
return env->intern (env, "t");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Expose simple sum function
|
||||
*/
|
||||
/* Expose simple sum function. */
|
||||
static int64_t sum (int64_t a, int64_t b)
|
||||
{
|
||||
return a + b;
|
||||
}
|
||||
|
||||
static emacs_value Fmod_test_sum (emacs_env *env, int nargs, emacs_value args[], void* data)
|
||||
static emacs_value
|
||||
Fmod_test_sum (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
int64_t a = env->extract_integer (env, args[0]);
|
||||
int64_t b = env->extract_integer (env, args[1]);
|
||||
|
@ -51,38 +48,40 @@ static emacs_value Fmod_test_sum (emacs_env *env, int nargs, emacs_value args[],
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Signal '(error 56)
|
||||
*/
|
||||
static emacs_value Fmod_test_signal (emacs_env *env, int nargs, emacs_value args[], void* data)
|
||||
/* Signal '(error 56). */
|
||||
static emacs_value
|
||||
Fmod_test_signal (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
assert (env->non_local_exit_check (env) == emacs_funcall_exit_return);
|
||||
env->non_local_exit_signal (env, env->intern (env, "error"), env->make_integer (env, 56));
|
||||
env->non_local_exit_signal (env, env->intern (env, "error"),
|
||||
env->make_integer (env, 56));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Throw '(tag 65)
|
||||
*/
|
||||
static emacs_value Fmod_test_throw (emacs_env *env, int nargs, emacs_value args[], void* data)
|
||||
/* Throw '(tag 65). */
|
||||
static emacs_value
|
||||
Fmod_test_throw (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
assert (env->non_local_exit_check (env) == emacs_funcall_exit_return);
|
||||
env->non_local_exit_throw (env, env->intern (env, "tag"), env->make_integer (env, 65));
|
||||
env->non_local_exit_throw (env, env->intern (env, "tag"),
|
||||
env->make_integer (env, 65));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Call argument function, catch all non-local exists and return
|
||||
* either normal result or a list describing the non-local exit.
|
||||
*/
|
||||
static emacs_value Fmod_test_non_local_exit_funcall (emacs_env *env, int nargs, emacs_value args[], void* data)
|
||||
/* Call argument function, catch all non-local exists and return
|
||||
either normal result or a list describing the non-local exit. */
|
||||
static emacs_value
|
||||
Fmod_test_non_local_exit_funcall (emacs_env *env, int nargs, emacs_value args[],
|
||||
void *data)
|
||||
{
|
||||
assert (nargs == 1);
|
||||
const emacs_value result = env->funcall (env, args[0], 0, NULL);
|
||||
emacs_value non_local_exit_symbol, non_local_exit_data;
|
||||
enum emacs_funcall_exit code = env->non_local_exit_get (env, &non_local_exit_symbol, &non_local_exit_data);
|
||||
enum emacs_funcall_exit code
|
||||
= env->non_local_exit_get (env, &non_local_exit_symbol,
|
||||
&non_local_exit_data);
|
||||
switch (code)
|
||||
{
|
||||
case emacs_funcall_exit_return:
|
||||
|
@ -91,141 +90,133 @@ static emacs_value Fmod_test_non_local_exit_funcall (emacs_env *env, int nargs,
|
|||
{
|
||||
env->non_local_exit_clear (env);
|
||||
const emacs_value Flist = env->intern (env, "list");
|
||||
emacs_value list_args[] = {env->intern (env, "signal"), non_local_exit_symbol, non_local_exit_data};
|
||||
emacs_value list_args[] = {env->intern (env, "signal"),
|
||||
non_local_exit_symbol, non_local_exit_data};
|
||||
return env->funcall (env, Flist, 3, list_args);
|
||||
}
|
||||
case emacs_funcall_exit_throw:
|
||||
{
|
||||
env->non_local_exit_clear (env);
|
||||
const emacs_value Flist = env->intern (env, "list");
|
||||
emacs_value list_args[] = {env->intern (env, "throw"), non_local_exit_symbol, non_local_exit_data};
|
||||
emacs_value list_args[] = {env->intern (env, "throw"),
|
||||
non_local_exit_symbol, non_local_exit_data};
|
||||
return env->funcall (env, Flist, 3, list_args);
|
||||
}
|
||||
}
|
||||
/* never reached */
|
||||
|
||||
/* Never reached. */
|
||||
return env->intern (env, "nil");;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a global referrence
|
||||
*/
|
||||
static emacs_value Fmod_test_globref_make (emacs_env *env, int nargs, emacs_value args[], void* data)
|
||||
/* Return a global referrence. */
|
||||
static emacs_value
|
||||
Fmod_test_globref_make (emacs_env *env, int nargs, emacs_value args[],
|
||||
void *data)
|
||||
{
|
||||
/* make a big string and make it global */
|
||||
size_t i;
|
||||
char str[26*100];
|
||||
/* Make a big string and make it global. */
|
||||
char str[26 * 100];
|
||||
for (size_t i = 0; i < sizeof str; i++)
|
||||
str[i] = 'a' + (i % 26);
|
||||
|
||||
for (i = 0; i < sizeof (str); i++)
|
||||
{
|
||||
str[i] = 'a' + (i % 26);
|
||||
}
|
||||
|
||||
/* we don't need to null-terminate str */
|
||||
emacs_value lisp_str = env->make_string (env, str, sizeof (str));
|
||||
/* We don't need to null-terminate str. */
|
||||
emacs_value lisp_str = env->make_string (env, str, sizeof str);
|
||||
return env->make_global_ref (env, lisp_str);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a copy of the argument string where every 'a' is replaced with 'b'.
|
||||
*/
|
||||
static emacs_value Fmod_test_string_a_to_b (emacs_env *env, int nargs, emacs_value args[], void* data)
|
||||
/* Return a copy of the argument string where every 'a' is replaced
|
||||
with 'b'. */
|
||||
static emacs_value
|
||||
Fmod_test_string_a_to_b (emacs_env *env, int nargs, emacs_value args[],
|
||||
void *data)
|
||||
{
|
||||
emacs_value lisp_str = args[0];
|
||||
size_t size = 0;
|
||||
char * buf = NULL;
|
||||
size_t i;
|
||||
|
||||
env->copy_string_contents (env, lisp_str, buf, &size);
|
||||
buf = malloc (size);
|
||||
env->copy_string_contents (env, lisp_str, buf, &size);
|
||||
|
||||
for (i = 0; i+1 < size; i++) {
|
||||
for (size_t i = 0; i + 1 < size; i++)
|
||||
if (buf[i] == 'a')
|
||||
buf[i] = 'b';
|
||||
}
|
||||
|
||||
return env->make_string (env, buf, size-1);
|
||||
return env->make_string (env, buf, size - 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Embedded pointers in lisp objects.
|
||||
*/
|
||||
/* Embedded pointers in lisp objects. */
|
||||
|
||||
/* C struct (pointer to) that will be embedded */
|
||||
/* C struct (pointer to) that will be embedded. */
|
||||
struct super_struct
|
||||
{
|
||||
int amazing_int;
|
||||
char large_unused_buffer[512];
|
||||
};
|
||||
|
||||
/* Associated finalizer */
|
||||
static void finalizer (void *p)
|
||||
/* Associated finalizer. */
|
||||
static void
|
||||
finalizer (void *p)
|
||||
{
|
||||
if (p)
|
||||
free (p);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a new user-pointer to a super_struct, with amazing_int set
|
||||
* to the passed parameter.
|
||||
*/
|
||||
static emacs_value Fmod_test_userptr_make (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
/* Return a new user-pointer to a super_struct, with amazing_int set
|
||||
to the passed parameter. */
|
||||
static emacs_value
|
||||
Fmod_test_userptr_make (emacs_env *env, int nargs, emacs_value args[],
|
||||
void *data)
|
||||
{
|
||||
struct super_struct *p = calloc (1, sizeof(*p));
|
||||
struct super_struct *p = calloc (1, sizeof *p);
|
||||
p->amazing_int = env->extract_integer (env, args[0]);
|
||||
return env->make_user_ptr (env, finalizer, p);
|
||||
return env->make_user_ptr (env, free, p);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the amazing_int of a passed 'user-pointer to a super_struct'.
|
||||
*/
|
||||
static emacs_value Fmod_test_userptr_get (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
/* Return the amazing_int of a passed 'user-pointer to a super_struct'. */
|
||||
static emacs_value
|
||||
Fmod_test_userptr_get (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
struct super_struct *p = env->get_user_ptr (env, args[0]);
|
||||
return env->make_integer (env, p->amazing_int);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Fill vector in args[0] with value in args[1]
|
||||
*/
|
||||
static emacs_value Fmod_test_vector_fill (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
/* Fill vector in args[0] with value in args[1]. */
|
||||
static emacs_value
|
||||
Fmod_test_vector_fill (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
size_t i;
|
||||
emacs_value vec = args[0];
|
||||
emacs_value val = args[1];
|
||||
const size_t size = env->vec_size (env, vec);
|
||||
for (i = 0; i < size; i++)
|
||||
for (size_t i = 0; i < size; i++)
|
||||
env->vec_set (env, vec, i, val);
|
||||
return env->intern (env, "t");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return whether all elements of vector in args[0] are 'eq' to value in args[1]
|
||||
*/
|
||||
static emacs_value Fmod_test_vector_eq (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
/* Return whether all elements of vector in args[0] are 'eq' to value
|
||||
in args[1]. */
|
||||
static emacs_value
|
||||
Fmod_test_vector_eq (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
size_t i;
|
||||
emacs_value vec = args[0];
|
||||
emacs_value val = args[1];
|
||||
const size_t size = env->vec_size (env, vec);
|
||||
for (i = 0; i < size; i++)
|
||||
for (size_t i = 0; i < size; i++)
|
||||
if (!env->eq (env, env->vec_get (env, vec, i), val))
|
||||
return env->intern (env, "nil");
|
||||
return env->intern (env, "t");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Lisp utilities for easier readability (simple wrappers)
|
||||
*/
|
||||
/* Lisp utilities for easier readability (simple wrappers). */
|
||||
|
||||
/* Provide FEATURE to Emacs */
|
||||
static void provide (emacs_env *env, const char *feature)
|
||||
/* Provide FEATURE to Emacs. */
|
||||
static void
|
||||
provide (emacs_env *env, const char *feature)
|
||||
{
|
||||
emacs_value Qfeat = env->intern (env, feature);
|
||||
emacs_value Qprovide = env->intern (env, "provide");
|
||||
|
@ -234,8 +225,9 @@ static void provide (emacs_env *env, const char *feature)
|
|||
env->funcall (env, Qprovide, 1, args);
|
||||
}
|
||||
|
||||
/* Binds NAME to FUN */
|
||||
static void bind_function (emacs_env *env, const char *name, emacs_value Sfun)
|
||||
/* Bind NAME to FUN. */
|
||||
static void
|
||||
bind_function (emacs_env *env, const char *name, emacs_value Sfun)
|
||||
{
|
||||
emacs_value Qfset = env->intern (env, "fset");
|
||||
emacs_value Qsym = env->intern (env, name);
|
||||
|
@ -244,21 +236,22 @@ static void bind_function (emacs_env *env, const char *name, emacs_value Sfun)
|
|||
env->funcall (env, Qfset, 2, args);
|
||||
}
|
||||
|
||||
/*
|
||||
* Module init function.
|
||||
*/
|
||||
int emacs_module_init (struct emacs_runtime *ert)
|
||||
/* Module init function. */
|
||||
int
|
||||
emacs_module_init (struct emacs_runtime *ert)
|
||||
{
|
||||
emacs_env *env = ert->get_environment (ert);
|
||||
|
||||
#define DEFUN(lsym, csym, amin, amax, doc, data) \
|
||||
bind_function (env, lsym, env->make_function (env, amin, amax, csym, doc, data))
|
||||
bind_function (env, lsym, \
|
||||
env->make_function (env, amin, amax, csym, doc, data))
|
||||
|
||||
DEFUN ("mod-test-return-t", Fmod_test_return_t, 1, 1, NULL, NULL);
|
||||
DEFUN ("mod-test-sum", Fmod_test_sum, 2, 2, "Return A + B", NULL);
|
||||
DEFUN ("mod-test-signal", Fmod_test_signal, 0, 0, NULL, NULL);
|
||||
DEFUN ("mod-test-throw", Fmod_test_throw, 0, 0, NULL, NULL);
|
||||
DEFUN ("mod-test-non-local-exit-funcall", Fmod_test_non_local_exit_funcall, 1, 1, NULL, NULL);
|
||||
DEFUN ("mod-test-non-local-exit-funcall", Fmod_test_non_local_exit_funcall,
|
||||
1, 1, NULL, NULL);
|
||||
DEFUN ("mod-test-globref-make", Fmod_test_globref_make, 0, 0, NULL, NULL);
|
||||
DEFUN ("mod-test-string-a-to-b", Fmod_test_string_a_to_b, 1, 1, NULL, NULL);
|
||||
DEFUN ("mod-test-userptr-make", Fmod_test_userptr_make, 1, 1, NULL, NULL);
|
||||
|
|
|
@ -19,11 +19,12 @@
|
|||
|
||||
(require 'ert)
|
||||
|
||||
(add-to-list 'load-path (file-name-directory (or #$ (expand-file-name (buffer-file-name)))))
|
||||
(add-to-list 'load-path
|
||||
(file-name-directory (or #$ (expand-file-name (buffer-file-name)))))
|
||||
(require 'mod-test)
|
||||
|
||||
;;
|
||||
;; basic tests
|
||||
;; Basic tests.
|
||||
;;
|
||||
|
||||
(ert-deftest mod-test-sum-test ()
|
||||
|
@ -33,7 +34,7 @@
|
|||
(should (string= (documentation 'mod-test-sum) "Return A + B")))
|
||||
|
||||
;;
|
||||
;; non-local exists (throw, signal)
|
||||
;; Non-local exists (throw, signal).
|
||||
;;
|
||||
|
||||
(ert-deftest mod-test-non-local-exit-signal-test ()
|
||||
|
@ -51,7 +52,8 @@
|
|||
23)))
|
||||
|
||||
(ert-deftest mod-test-non-local-exit-funcall-signal ()
|
||||
(should (equal (mod-test-non-local-exit-funcall (lambda () (signal 'error '(32))))
|
||||
(should (equal (mod-test-non-local-exit-funcall
|
||||
(lambda () (signal 'error '(32))))
|
||||
'(signal error (32)))))
|
||||
|
||||
(ert-deftest mod-test-non-local-exit-funcall-throw ()
|
||||
|
@ -59,7 +61,7 @@
|
|||
'(throw tag 32))))
|
||||
|
||||
;;
|
||||
;; string
|
||||
;; String tests.
|
||||
;;
|
||||
|
||||
(defun multiply-string (s n)
|
||||
|
@ -77,7 +79,7 @@
|
|||
(should (string= (mod-test-string-a-to-b "aaa") "bbb")))
|
||||
|
||||
;;
|
||||
;; user-pointer
|
||||
;; User-pointer tests.
|
||||
;;
|
||||
|
||||
(ert-deftest mod-test-userptr-fun-test ()
|
||||
|
@ -92,7 +94,7 @@
|
|||
;; TODO: try to test finalizer
|
||||
|
||||
;;
|
||||
;; vectors
|
||||
;; Vector tests.
|
||||
;;
|
||||
|
||||
(ert-deftest mod-test-vector-test ()
|
||||
|
|
|
@ -56,7 +56,8 @@ def cmd_test(args):
|
|||
print '[*] %s: running test' % m
|
||||
testpath = os.path.join(m, 'test.el')
|
||||
if os.path.isfile(testpath):
|
||||
emacs_cmd = [EMACS, '-batch', '-L', '.', '-l', 'ert', '-l', testpath, '-f', 'ert-run-tests-batch-and-exit']
|
||||
emacs_cmd = [EMACS, '-batch', '-L', '.', '-l', 'ert',
|
||||
'-l', testpath, '-f', 'ert-run-tests-batch-and-exit']
|
||||
print ' '.join(emacs_cmd)
|
||||
r = sp.call(emacs_cmd)
|
||||
if r != 0:
|
||||
|
@ -111,13 +112,16 @@ def main():
|
|||
subp = mainp.add_subparsers()
|
||||
|
||||
testp = subp.add_parser('test', help='run tests')
|
||||
testp.add_argument('-f', '--force', action='store_true', help='force regeneration (make -B)')
|
||||
testp.add_argument('module', nargs='*', help='path to module to test (default all)')
|
||||
testp.add_argument('-f', '--force', action='store_true',
|
||||
help='force regeneration (make -B)')
|
||||
testp.add_argument('module', nargs='*',
|
||||
help='path to module to test (default all)')
|
||||
testp.set_defaults(func=cmd_test)
|
||||
|
||||
initp = subp.add_parser('init', help='create a test module from a template')
|
||||
initp.add_argument('module', help='name of the new module')
|
||||
initp.add_argument('-f', '--fun', default='fun', help='overide name of the default function')
|
||||
initp.add_argument('-f', '--fun', default='fun',
|
||||
help='overide name of the default function')
|
||||
initp.set_defaults(func=cmd_init)
|
||||
|
||||
args = mainp.parse_args()
|
||||
|
@ -149,13 +153,15 @@ def main():
|
|||
|
||||
int plugin_is_GPL_compatible;
|
||||
|
||||
static emacs_value ${c_func} (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
static emacs_value
|
||||
${c_func} (emacs_env *env, int nargs, emacs_value args[], void *data)
|
||||
{
|
||||
return env->intern (env, "t");
|
||||
}
|
||||
|
||||
/* Binds NAME to FUN */
|
||||
static void bind_function (emacs_env *env, const char *name, emacs_value Sfun)
|
||||
/* Bind NAME to FUN. */
|
||||
static void
|
||||
bind_function (emacs_env *env, const char *name, emacs_value Sfun)
|
||||
{
|
||||
emacs_value Qfset = env->intern (env, "fset");
|
||||
emacs_value Qsym = env->intern (env, name);
|
||||
|
@ -164,8 +170,9 @@ def main():
|
|||
env->funcall (env, Qfset, 2, args);
|
||||
}
|
||||
|
||||
/* Provide FEATURE to Emacs */
|
||||
static void provide (emacs_env *env, const char *feature)
|
||||
/* Provide FEATURE to Emacs. */
|
||||
static void
|
||||
provide (emacs_env *env, const char *feature)
|
||||
{
|
||||
emacs_value Qfeat = env->intern (env, feature);
|
||||
emacs_value Qprovide = env->intern (env, "provide");
|
||||
|
@ -174,10 +181,12 @@ def main():
|
|||
env->funcall (env, Qprovide, 1, args);
|
||||
}
|
||||
|
||||
int emacs_module_init (struct emacs_runtime *ert)
|
||||
int
|
||||
emacs_module_init (struct emacs_runtime *ert)
|
||||
{
|
||||
emacs_env *env = ert->get_environment (ert);
|
||||
bind_function (env, "${lisp_func}", env->make_function (env, 1, 1, ${c_func}, "doc", NULL));
|
||||
bind_function (env, "${lisp_func}",
|
||||
env->make_function (env, 1, 1, ${c_func}, "doc", NULL));
|
||||
provide (env, "${module}");
|
||||
return 0;
|
||||
}
|
||||
|
|
45
src/dynlib.c
45
src/dynlib.c
|
@ -26,63 +26,68 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
#include "dynlib.h"
|
||||
|
||||
/*
|
||||
* Windows systems
|
||||
*/
|
||||
#if defined(_WIN32)
|
||||
#if defined _WIN32
|
||||
|
||||
/* MS-Windows systems. */
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
dynlib_handle_ptr dynlib_open (const char * path)
|
||||
dynlib_handle_ptr
|
||||
dynlib_open (const char *path)
|
||||
{
|
||||
|
||||
return (dynlib_handle_ptr) LoadLibrary (path);
|
||||
}
|
||||
|
||||
void * dynlib_sym (dynlib_handle_ptr h, const char * sym)
|
||||
void *
|
||||
dynlib_sym (dynlib_handle_ptr h, const char *sym)
|
||||
{
|
||||
return GetProcAddress ((HMODULE) h, sym);
|
||||
}
|
||||
|
||||
bool dynlib_addr (void *ptr, const char **path, const char **sym)
|
||||
bool
|
||||
dynlib_addr (void *ptr, const char **path, const char **sym)
|
||||
{
|
||||
return false; /* not implemented */
|
||||
}
|
||||
|
||||
const char * dynlib_error (void)
|
||||
const char *
|
||||
dynlib_error (void)
|
||||
{
|
||||
/* TODO: use GetLastError(), FormatMessage(), ... */
|
||||
return "Can't load DLL";
|
||||
}
|
||||
|
||||
int dynlib_close (dynlib_handle_ptr h)
|
||||
int
|
||||
dynlib_close (dynlib_handle_ptr h)
|
||||
{
|
||||
return FreeLibrary ((HMODULE) h) != 0;
|
||||
}
|
||||
|
||||
#elif defined HAVE_UNISTD_H
|
||||
|
||||
/*
|
||||
* POSIX systems
|
||||
*/
|
||||
#elif defined(HAVE_UNISTD_H)
|
||||
/* POSIX systems. */
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
dynlib_handle_ptr dynlib_open (const char * path)
|
||||
dynlib_handle_ptr
|
||||
dynlib_open (const char *path)
|
||||
{
|
||||
return dlopen (path, RTLD_LAZY);
|
||||
}
|
||||
|
||||
void * dynlib_sym (dynlib_handle_ptr h, const char * sym)
|
||||
void *
|
||||
dynlib_sym (dynlib_handle_ptr h, const char *sym)
|
||||
{
|
||||
return dlsym (h, sym);
|
||||
}
|
||||
|
||||
bool dynlib_addr (void *ptr, const char **path, const char **sym)
|
||||
bool
|
||||
dynlib_addr (void *ptr, const char **path, const char **sym)
|
||||
{
|
||||
#ifdef HAVE_DLADDR
|
||||
Dl_info info;
|
||||
if (dladdr (ptr, &info) != 0 && info.dli_fname != NULL && info.dli_sname != NULL)
|
||||
if (dladdr (ptr, &info) && info.dli_fname && info.dli_sname)
|
||||
{
|
||||
*path = info.dli_fname;
|
||||
*sym = info.dli_sname;
|
||||
|
@ -92,12 +97,14 @@ bool dynlib_addr (void *ptr, const char **path, const char **sym)
|
|||
return false;
|
||||
}
|
||||
|
||||
const char * dynlib_error (void)
|
||||
const char *
|
||||
dynlib_error (void)
|
||||
{
|
||||
return dlerror ();
|
||||
}
|
||||
|
||||
int dynlib_close (dynlib_handle_ptr h)
|
||||
int
|
||||
dynlib_close (dynlib_handle_ptr h)
|
||||
{
|
||||
return dlclose (h) == 0;
|
||||
}
|
||||
|
|
|
@ -23,11 +23,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include <config.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef void* dynlib_handle_ptr;
|
||||
dynlib_handle_ptr dynlib_open (const char * path);
|
||||
void * dynlib_sym (dynlib_handle_ptr h, const char * sym);
|
||||
typedef void *dynlib_handle_ptr;
|
||||
dynlib_handle_ptr dynlib_open (const char *path);
|
||||
void *dynlib_sym (dynlib_handle_ptr h, const char *sym);
|
||||
bool dynlib_addr (void *ptr, const char **path, const char **sym);
|
||||
const char * dynlib_error (void);
|
||||
const char *dynlib_error (void);
|
||||
int dynlib_close (dynlib_handle_ptr h);
|
||||
|
||||
#endif /* DYNLIB_H */
|
||||
|
|
|
@ -2246,7 +2246,7 @@ struct Lisp_User_Ptr
|
|||
bool_bf gcmarkbit : 1;
|
||||
unsigned spacer : 15;
|
||||
|
||||
void (*finalizer) (void*);
|
||||
void (*finalizer) (void *);
|
||||
void *p;
|
||||
};
|
||||
#endif
|
||||
|
@ -2347,7 +2347,6 @@ XUSER_PTR (Lisp_Object a)
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Forwarding pointer to an int variable.
|
||||
This is allowed only in the value cell of a symbol,
|
||||
|
|
729
src/module.c
729
src/module.c
File diff suppressed because it is too large
Load diff
257
src/module.h
257
src/module.h
|
@ -24,206 +24,179 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#if defined __cplusplus && __cplusplus >= 201103L
|
||||
# define EMACS_NOEXCEPT noexcept
|
||||
#else
|
||||
# define EMACS_NOEXCEPT
|
||||
#endif
|
||||
|
||||
#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
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
||||
#define EMACS_NOEXCEPT noexcept
|
||||
#else
|
||||
#define EMACS_NOEXCEPT
|
||||
#endif
|
||||
|
||||
EMACS_EXTERN_C_BEGIN
|
||||
|
||||
/* Current environement */
|
||||
/* Current environment. */
|
||||
typedef struct emacs_env_25 emacs_env;
|
||||
|
||||
/* Opaque structure pointer representing an Emacs Lisp value */
|
||||
typedef struct emacs_value_tag* emacs_value;
|
||||
/* Opaque structure pointer representing an Emacs Lisp value. */
|
||||
typedef struct emacs_value_tag *emacs_value;
|
||||
|
||||
enum emacs_arity {
|
||||
emacs_variadic_function = -2
|
||||
};
|
||||
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) */
|
||||
/* 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 */
|
||||
/* 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);
|
||||
/* Return 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 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 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*);
|
||||
/* 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. */
|
||||
/* 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'. */
|
||||
|
||||
/* Function has signaled an error using `signal'. */
|
||||
emacs_funcall_exit_signal = 1,
|
||||
/* Function has exit using `throw'. */
|
||||
|
||||
/* Function has exit using `throw'. */
|
||||
emacs_funcall_exit_throw = 2,
|
||||
};
|
||||
|
||||
struct emacs_env_25 {
|
||||
/*
|
||||
* Structure size (for version checking)
|
||||
*/
|
||||
|
||||
struct emacs_env_25
|
||||
{
|
||||
/* Structure size (for version checking). */
|
||||
size_t size;
|
||||
|
||||
/* Private data; users should not touch this */
|
||||
/* Private data; users should not touch this. */
|
||||
struct emacs_env_private *private_members;
|
||||
|
||||
/*
|
||||
* Memory management
|
||||
*/
|
||||
/* Memory management. */
|
||||
|
||||
emacs_value (*make_global_ref) (emacs_env *env,
|
||||
emacs_value any_reference);
|
||||
|
||||
emacs_value (*make_global_ref)(emacs_env *env,
|
||||
emacs_value any_reference);
|
||||
void (*free_global_ref) (emacs_env *env,
|
||||
emacs_value global_reference);
|
||||
|
||||
void (*free_global_ref)(emacs_env *env,
|
||||
emacs_value global_reference);
|
||||
/* Non-local exit handling. */
|
||||
|
||||
/*
|
||||
* Non-local exit handling
|
||||
*/
|
||||
enum emacs_funcall_exit (*non_local_exit_check) (emacs_env *env);
|
||||
|
||||
enum emacs_funcall_exit (*non_local_exit_check)(emacs_env *env);
|
||||
void (*non_local_exit_clear) (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);
|
||||
|
||||
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_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);
|
||||
|
||||
void (*non_local_exit_throw)(emacs_env *env,
|
||||
emacs_value tag,
|
||||
emacs_value value);
|
||||
/* Function registration. */
|
||||
|
||||
/*
|
||||
* 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 (*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 (*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)(emacs_env *env,
|
||||
const char *symbol_name);
|
||||
/* Type conversion. */
|
||||
|
||||
/*
|
||||
* Type conversion
|
||||
*/
|
||||
emacs_value (*type_of) (emacs_env *env,
|
||||
emacs_value value);
|
||||
|
||||
emacs_value (*type_of)(emacs_env *env,
|
||||
emacs_value value);
|
||||
bool (*is_not_nil) (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);
|
||||
|
||||
bool (*eq)(emacs_env *env, emacs_value a, emacs_value b);
|
||||
int_fast64_t (*extract_integer) (emacs_env *env,
|
||||
emacs_value value);
|
||||
|
||||
int64_t (*extract_integer)(emacs_env *env,
|
||||
emacs_value value);
|
||||
emacs_value (*make_integer) (emacs_env *env, int_fast64_t value);
|
||||
|
||||
emacs_value (*make_integer)(emacs_env *env,
|
||||
int64_t value);
|
||||
double (*extract_float) (emacs_env *env, emacs_value value);
|
||||
|
||||
double (*extract_float)(emacs_env *env,
|
||||
emacs_value value);
|
||||
emacs_value (*make_float) (emacs_env *env, double 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.
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
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.
|
||||
|
||||
bool (*copy_string_contents)(emacs_env *env,
|
||||
emacs_value value,
|
||||
char *buffer,
|
||||
size_t *size_inout);
|
||||
Note that SIZE must include the last null byte (e.g. "abc" needs
|
||||
a buffer of size 4).
|
||||
|
||||
/*
|
||||
* Create a lisp string from a utf8 encoded string.
|
||||
*/
|
||||
emacs_value (*make_string)(emacs_env *env,
|
||||
const char *contents, size_t length);
|
||||
Return true if the string was successfully copied. */
|
||||
|
||||
/*
|
||||
* Embedded pointer type
|
||||
*/
|
||||
emacs_value (*make_user_ptr)(emacs_env *env,
|
||||
void (*fin)(void *) EMACS_NOEXCEPT,
|
||||
void *ptr);
|
||||
bool (*copy_string_contents) (emacs_env *env,
|
||||
emacs_value value,
|
||||
char *buffer,
|
||||
size_t *size_inout);
|
||||
|
||||
void* (*get_user_ptr)(emacs_env *env, emacs_value uptr);
|
||||
void (*set_user_ptr)(emacs_env *env, emacs_value uptr, void *ptr);
|
||||
/* Create a Lisp string from a utf8 encoded string. */
|
||||
emacs_value (*make_string) (emacs_env *env,
|
||||
const char *contents, size_t length);
|
||||
|
||||
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);
|
||||
/* Embedded pointer type. */
|
||||
emacs_value (*make_user_ptr) (emacs_env *env,
|
||||
void (*fin) (void *) EMACS_NOEXCEPT,
|
||||
void *ptr);
|
||||
|
||||
/*
|
||||
* Vector functions
|
||||
*/
|
||||
emacs_value (*vec_get) (emacs_env *env,
|
||||
emacs_value vec,
|
||||
size_t i);
|
||||
void *(*get_user_ptr) (emacs_env *env, emacs_value uptr);
|
||||
void (*set_user_ptr) (emacs_env *env, emacs_value uptr, void *ptr);
|
||||
|
||||
void (*vec_set) (emacs_env *env,
|
||||
emacs_value vec,
|
||||
size_t i,
|
||||
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);
|
||||
size_t (*vec_size) (emacs_env *env, emacs_value vec);
|
||||
};
|
||||
|
||||
EMACS_EXTERN_C_END
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EMACS_MODULE_H */
|
||||
|
|
Loading…
Add table
Reference in a new issue