aboutsummaryrefslogtreecommitdiffstats
path: root/gawkapi.h
diff options
context:
space:
mode:
Diffstat (limited to 'gawkapi.h')
-rw-r--r--gawkapi.h140
1 files changed, 84 insertions, 56 deletions
diff --git a/gawkapi.h b/gawkapi.h
index 335e9628..76c10260 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -228,6 +228,15 @@ typedef struct gawk_api {
/*
* Lookup a variable, return its value. No messing with the value
* returned. Return value is NULL if the variable doesn't exist.
+ *
+ * Returns a pointer to a static variable. Correct usage is thus:
+ *
+ * awk_value_t val, *vp;
+ * vp = api->sym_lookup(id, name);
+ * if (vp == NULL)
+ * error_code();
+ * val = *vp;
+ * // use val from here on
*/
const awk_value_t *const (*sym_lookup)(awk_ext_id_t id, const char *name);
@@ -241,6 +250,9 @@ typedef struct gawk_api {
/*
* Return the value of an element - read only!
* Use set_array_element to change it.
+ *
+ * As for sym_lookup(), this also returns a static pointer whose
+ * value should be copied before use.
*/
const awk_value_t *const (*get_array_element)(awk_ext_id_t id,
awk_array_t a_cookie, const awk_value_t *const index);
@@ -306,39 +318,55 @@ typedef struct gawk_api {
#define do_debug api->do_flags[gawk_do_debug]
#define do_mpfr api->do_flags[gawk_do_mpfr]
-#define get_curfunc_param api->get_curfunc_param
-#define set_return_value api->set_return_value
+#define get_curfunc_param(count, wanted) \
+ api->get_curfunc_param(ext_id, count, wanted)
+
+#define set_return_value(retval) \
+ api->set_return_value(ext_id, retval)
#define fatal api->api_fatal
#define warning api->api_warning
#define lintwarn api->api_lintwarn
-#define register_open_hook api->register_open_hook
+#define register_open_hook(func) api->register_open_hook(ext_id, func)
-#define update_ERRNO_int api->update_ERRNO_int
-#define update_ERRNO_string api->update_ERRNO_string
+#define update_ERRNO_int(e) api->update_ERRNO_int(ext_id, e)
+#define update_ERRNO_string(str, translate) \
+ api->update_ERRNO_string(ext_id, str, translate)
#define unset_ERRNO api->unset_ERRNO
-#define is_null_string api->is_null_string
+#define add_ext_func(func, ns) api->add_ext_func(ext_id, func, ns)
+#define awk_atexit(funcp, arg0) api->awk_atexit(ext_id, funcp, arg0)
+
+#define sym_lookup(name) api->sym_lookup(ext_id, name)
+#define sym_update(name, value) \
+ api->sym_update(ext_id, name, value)
+
+#define get_array_element(array, element) \
+ api->get_array_element(ext_id, array, element)
+
+#define set_array_element(array, element) \
+ api->set_array_element(ext_id, array, element)
+
+#define del_array_element(array, index) \
+ api->del_array_element(ext_id, array, index)
+
+#define get_element_count(array, count_p) \
+ api->get_element_count(ext_id, array, count_p)
-#define add_ext_func api->add_ext_func
-#define awk_atexit api->awk_atexit
+#define create_array() api->create_array(ext_id)
-#define sym_lookup api->sym_lookup
-#define sym_update api->sym_update
+#define clear_array(array) api->clear_array(ext_id, array)
-#define get_array_element api->get_array_element
-#define set_array_element api->set_array_element
-#define del_array_element api->del_array_element
-#define get_element_count api->get_element_count
-#define clear_array api->clear_array
-#define create_array api->create_array
-#define flatten_array api->flatten_array
-#define release_flattened_array api->release_flattened_array
+#define flatten_array(array, count, data) \
+ api->flatten_array(ext_id, array, count, data)
-#define make_string(id, str, len) api->api_make_string(id, str, len, 0)
-#define dup_string(id, str, len) api->api_make_string(id, str, len, 1)
-#define make_number api->api_make_number
+#define release_flattened_array(array, count, data) \
+ api->release_flattened_array(ext_id, array, count, data)
+
+#define make_string(str, len) api->api_make_string(ext_id, str, len, 0)
+#define dup_string(str, len) api->api_make_string(ext_id, str, len, 1)
+#define make_number(num) api->api_make_number(ext_id, num)
#define emalloc(pointer, type, size, message) \
do { \
@@ -360,48 +388,48 @@ typedef struct gawk_api {
extern int dl_load(const gawk_api_t *const api_p, awk_ext_id_t id);
-
-/* TODO: Turn this into a macro... */
#if 0
/* Boiler plate code: */
-
static gawk_api_t *const api;
static awk_ext_id_t ext_id;
+static awk_ext_func_t func_table[] = {
+ { "name", do_name, 1 },
+ /* ... */
+};
-int dl_load(const gawk_api_t *const api_p, awk_ext_id_t id);
-{
- static awk_ext_func_t func_table[] = {
- { "name", do_name, 1 },
- /* ... */
- };
- size_t i, j;
- int errors = 0;
-
- if (api->major_version != GAWK_API_MAJOR_VERSION
- || api->minor_version < GAWK_API_MINOR_VERSION) {
- fprintf(stderr, "<NAME>: version mismatch with gawk!\n");
- fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n",
- GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION,
- api->major_version, api->minor_version);
- exit(1);
- }
-
- api = api_p;
- ext_id = id;
-
- /* load functions */
- for (i = 0, j = sizeof(func_table) / sizeof(func_table[0]); i < j; i++) {
- if (! add_ext_func(ext_id, & func_table[i], "" /* "NAME" */)) {
- warning(ext_id, "<NAME>: could not add %s\n",
- func_table[i].name);
- errors++;
- }
- }
-
- return (errors == 0);
-}
+dl_load_func(api, ext_id, func_table, some_name, "name_space_in_quotes")
#endif
+#define dl_load_func(global_api_p, global_ext_id, func_table, module, name_space) \
+int dl_load(const gawk_api_t *const api_p, awk_ext_id_t id) \
+{ \
+ size_t i, j; \
+ int errors = 0; \
+ \
+ if (api->major_version != GAWK_API_MAJOR_VERSION \
+ || api->minor_version < GAWK_API_MINOR_VERSION) { \
+ fprintf(stderr, #module ": version mismatch with gawk!\n"); \
+ fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n", \
+ GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION, \
+ api->major_version, api->minor_version); \
+ exit(1); \
+ } \
+ \
+ global_api_p = api_p; \
+ global_ext_id = id; \
+\
+ /* load functions */ \
+ for (i = 0, j = sizeof(func_table) / sizeof(func_table[0]); i < j; i++) { \
+ if (! add_ext_func(& func_table[i], name_space)) { \
+ warning(ext_id, #module ": could not add %s\n", \
+ func_table[i].name); \
+ errors++; \
+ } \
+ } \
+\
+ return (errors == 0); \
+}
+
#ifdef __cplusplus
}
#endif /* C++ */