|
@@ -0,0 +1,104 @@
|
|
|
+
|
|
|
+#include "zori.h"
|
|
|
+#include "zori_registry.h"
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+int zori_registry_entry_compare(const void * v1, const void * v2) {
|
|
|
+ const struct zori_registry_entry * entry1 = v1;
|
|
|
+ const struct zori_registry_entry * entry2 = v2;
|
|
|
+ return (entry2->id - entry1->id);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+zori_id zori_registry_init(struct zori_registry * registry) {
|
|
|
+ miao_init(registry);
|
|
|
+ return ZORI_ID_OK;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void zori_registry_destroy(struct zori_registry * registry) {
|
|
|
+ if(registry) {
|
|
|
+ miao_done(registry);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+zori_id
|
|
|
+zori_registry_add(struct zori_registry * registry, zori_id id,
|
|
|
+struct zori_widget * widget) {
|
|
|
+ struct zori_registry_entry entry = { id, widget };
|
|
|
+ if (miao_push(registry, entry)) {
|
|
|
+ miao_qsort(registry, zori_registry_entry_compare);
|
|
|
+ return ZORI_ID_OK;
|
|
|
+ }
|
|
|
+ return ZORI_ID_ENOMEM;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+struct zori_registry_entry *
|
|
|
+zori_registry_lookup_entry(struct zori_registry * registry, zori_id id) {
|
|
|
+ struct zori_registry_entry key = { id, NULL };
|
|
|
+ return miao_bsearch(registry, zori_registry_entry_compare, &key);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+struct zori_widget *
|
|
|
+zori_registry_lookup(struct zori_registry * registry, zori_id id) {
|
|
|
+ struct zori_widget * result = NULL;
|
|
|
+ struct zori_registry_entry * entry = NULL;
|
|
|
+
|
|
|
+ entry = zori_registry_lookup_entry(registry, id);
|
|
|
+ if (entry) {
|
|
|
+ result = entry->widget;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+zori_id
|
|
|
+zori_registry_remove(struct zori_registry * registry, zori_id id) {
|
|
|
+ struct zori_registry_entry * entry = NULL;
|
|
|
+ entry = zori_registry_lookup_entry(registry, id);
|
|
|
+ if (entry) {
|
|
|
+ miao_delete_entry(registry, entry);
|
|
|
+ }
|
|
|
+ return ZORI_ID_OK;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static struct zori_registry * the_zori_registry = NULL;
|
|
|
+
|
|
|
+
|
|
|
+zori_id zori_initialize_registry() {
|
|
|
+ the_zori_registry = calloc(1, sizeof(*the_zori_registry));
|
|
|
+ if (!the_zori_registry) return ZORI_ID_ENOMEM;
|
|
|
+ return zori_registry_init(the_zori_registry);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+zori_id zori_destroy_registry() {
|
|
|
+ zori_registry_destroy(the_zori_registry);
|
|
|
+ free(the_zori_registry);
|
|
|
+ the_zori_registry = NULL;
|
|
|
+ return ZORI_ID_OK;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+struct zori_registry * zori_get_registry() {
|
|
|
+ return the_zori_registry;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|