#ifndef ECEX_PLUGIN_H #define ECEX_PLUGIN_H #include "types.h" #include #include #define ECEX_PLUGIN_API_VERSION 1 #define ECEX_PLUGIN_EXPORT_READ 1 typedef struct ecex_plugin ecex_plugin_t; typedef struct ecex_plugin_runtime ecex_plugin_runtime_t; typedef enum ecex_plugin_value_type { ECEX_PLUGIN_BYTES = 0, ECEX_PLUGIN_I32 = 1, ECEX_PLUGIN_U32 = 2, ECEX_PLUGIN_I64 = 3, ECEX_PLUGIN_PTR = 4, } ecex_plugin_value_type_t; ecex_plugin_runtime_t *ecex_plugin_runtime_new(void); void ecex_plugin_runtime_free(ecex_plugin_runtime_t *runtime); ecex_plugin_t *ecex_plugin_register(ecex_t *ed, const char *id, int api_version); ecex_plugin_t *ecex_plugin_require(ecex_t *ed, const char *id, int api_version); ecex_plugin_t *ecex_plugin_find(ecex_t *ed, const char *id); const char *ecex_plugin_id(ecex_plugin_t *plugin); /* Plugin slots are named, plugin-private arrays unless explicitly exported. */ void *ecex_plugin_slot_alloc(ecex_plugin_t *plugin, const char *name, size_t count, size_t elem_size); void *ecex_plugin_slot_get(ecex_plugin_t *plugin, const char *name); int ecex_plugin_slot_free(ecex_plugin_t *plugin, const char *name); int ecex_plugin_slot_set_export_flags(ecex_plugin_t *plugin, const char *name, int type, int flags); int ecex_plugin_slot_read_exported(ecex_t *ed, const char *plugin_id, const char *name, void *out, size_t out_cap, size_t *out_len); int ecex_plugin_slot_i32_get_scalar(ecex_plugin_t *plugin, const char *name, int fallback); int ecex_plugin_slot_i32_get(ecex_plugin_t *plugin, const char *name, size_t index, int fallback); int ecex_plugin_slot_i32_set(ecex_plugin_t *plugin, const char *name, size_t index, int value); int ecex_plugin_slot_i32_get_2d(ecex_plugin_t *plugin, const char *name, size_t width, size_t x, size_t y, int fallback); int ecex_plugin_slot_i32_set_2d(ecex_plugin_t *plugin, const char *name, size_t width, size_t x, size_t y, int value); int ecex_plugin_slot_i32_set_scalar(ecex_plugin_t *plugin, const char *name, int value); /* Plugin objects are tracked allocations intended for callback userdata. */ void *ecex_plugin_object_alloc(ecex_plugin_t *plugin, const char *name, size_t size); void *ecex_plugin_object_calloc(ecex_plugin_t *plugin, const char *name, size_t count, size_t size); int ecex_plugin_object_free(ecex_plugin_t *plugin, void *object); int ecex_plugin_object_valid(ecex_plugin_t *plugin, void *object); int ecex_plugin_object_i32_get(ecex_plugin_t *plugin, void *object, size_t byte_offset, int fallback); int ecex_plugin_object_i32_set(ecex_plugin_t *plugin, void *object, size_t byte_offset, int value); void *ecex_plugin_object_ptr_get(ecex_plugin_t *plugin, void *object, size_t byte_offset); int ecex_plugin_object_ptr_set(ecex_plugin_t *plugin, void *object, size_t byte_offset, void *value); /* Plugin text stores host-owned strings for later draw-time lookup. */ int ecex_plugin_text_set(ecex_plugin_t *plugin, int id, const char *text, int len); int ecex_plugin_text_set_from_buffer_title(ecex_plugin_t *plugin, int id, buffer_t *buffer); int ecex_plugin_text_free(ecex_plugin_t *plugin, int id); int ecex_plugin_text_free_all(ecex_plugin_t *plugin); const char *ecex_plugin_text_get_drawable(ecex_t *ed, void *owner, int id); int ecex_plugin_file_handler_register(ecex_plugin_t *plugin, const char *extension, ecex_file_handler_fn fn); int ecex_plugin_file_handlers_run(ecex_t *ed, buffer_t *buffer); #endif