static void module_load_exports(struct obs_module *mod, struct darray *output_array, const char *type, const size_t data_size, void *callback_ptr) { bool (*enum_func)(size_t idx, const char **name); bool (*callback)(void*, const char*, const char*, void*); struct dstr enum_name; const char *name; size_t i = 0; callback = callback_ptr; dstr_init_copy(&enum_name, "enum_"); dstr_cat(&enum_name, type); enum_func = os_dlsym(mod->module, enum_name.array); if (!enum_func) goto complete; while (enum_func(i++, &name)) { void *info = bmalloc(data_size); if (!callback(mod->module, mod->name, name, info)) blog(LOG_ERROR, "Couldn't load '%s' because it " "was missing required functions", name); else darray_push_back(data_size, output_array, info); bfree(info); } complete: dstr_free(&enum_name); }
static void enum_files(obs_data_t *package, bool (*enum_func)(void *param, obs_data_t *file), void *param) { obs_data_array_t *array = obs_data_get_array(package, "files"); size_t num; if (!array) return; num = obs_data_array_count(array); for (size_t i = 0; i < num; i++) { obs_data_t *file = obs_data_array_item(array, i); bool continue_enum = enum_func(param, file); obs_data_release(file); if (!continue_enum) break; } obs_data_array_release(array); }