summaryrefslogtreecommitdiffstats
path: root/src/namereg.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2004-06-27 22:42:17 +0000
committerLennart Poettering <lennart@poettering.net>2004-06-27 22:42:17 +0000
commita74cd2a1bd92eac6a4140d0794ac4b557be6c133 (patch)
treefdb341d0c7fecdbafc8f42cdc612076ebb23e024 /src/namereg.c
parent010378643e89e2ca4ea3502cb7dc6d8e16480832 (diff)
add name registrar
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@39 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/namereg.c')
-rw-r--r--src/namereg.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/namereg.c b/src/namereg.c
new file mode 100644
index 00000000..b286171d
--- /dev/null
+++ b/src/namereg.c
@@ -0,0 +1,97 @@
+#include <string.h>
+#include <assert.h>
+#include <string.h>
+#include <malloc.h>
+#include <stdio.h>
+
+#include "namereg.h"
+
+struct namereg_entry {
+ enum namereg_type type;
+ char *name;
+ void *data;
+};
+
+void namereg_free(struct core *c) {
+ assert(c);
+ if (!c->namereg)
+ return;
+ assert(hashset_ncontents(c->namereg) == 0);
+ hashset_free(c->namereg, NULL, NULL);
+}
+
+const char *namereg_register(struct core *c, const char *name, enum namereg_type type, void *data, int fail) {
+ struct namereg_entry *e;
+ char *n = NULL;
+ int r;
+
+ assert(c && name && data);
+
+ if (!c->namereg) {
+ c->namereg = hashset_new(idxset_string_hash_func, idxset_string_compare_func);
+ assert(c->namereg);
+ }
+
+ if ((e = hashset_get(c->namereg, name)) && fail)
+ return NULL;
+
+ if (!e)
+ n = strdup(name);
+ else {
+ unsigned i;
+ size_t l = strlen(name);
+ n = malloc(l+3);
+ assert(n);
+
+ for (i = 1; i <= 99; i++) {
+ snprintf(n, l+2, "%s%u", name, i);
+
+ if (!(e = hashset_get(c->namereg, n)))
+ break;
+ }
+
+ if (e) {
+ free(n);
+ return NULL;
+ }
+ }
+
+ assert(n);
+ e = malloc(sizeof(struct namereg_entry));
+ assert(e);
+ e->type = type;
+ e->name = n;
+ e->data = data;
+
+ r = hashset_put(c->namereg, e->name, e);
+ assert (r >= 0);
+
+ return e->name;
+
+}
+
+void namereg_unregister(struct core *c, const char *name) {
+ struct namereg_entry *e;
+ int r;
+ assert(c && name);
+
+ e = hashset_get(c->namereg, name);
+ assert(e);
+
+ r = hashset_remove(c->namereg, name);
+ assert(r >= 0);
+
+ free(e->name);
+ free(e);
+}
+
+void* namereg_get(struct core *c, const char *name, enum namereg_type type) {
+ struct namereg_entry *e;
+ assert(c && name);
+
+ if (!(e = hashset_get(c->namereg, name)))
+ if (e->type == e->type)
+ return e->data;
+
+ return NULL;
+}