]> code.delx.au - pulseaudio/blob - src/namereg.c
add name registrar
[pulseaudio] / src / namereg.c
1 #include <string.h>
2 #include <assert.h>
3 #include <string.h>
4 #include <malloc.h>
5 #include <stdio.h>
6
7 #include "namereg.h"
8
9 struct namereg_entry {
10 enum namereg_type type;
11 char *name;
12 void *data;
13 };
14
15 void namereg_free(struct core *c) {
16 assert(c);
17 if (!c->namereg)
18 return;
19 assert(hashset_ncontents(c->namereg) == 0);
20 hashset_free(c->namereg, NULL, NULL);
21 }
22
23 const char *namereg_register(struct core *c, const char *name, enum namereg_type type, void *data, int fail) {
24 struct namereg_entry *e;
25 char *n = NULL;
26 int r;
27
28 assert(c && name && data);
29
30 if (!c->namereg) {
31 c->namereg = hashset_new(idxset_string_hash_func, idxset_string_compare_func);
32 assert(c->namereg);
33 }
34
35 if ((e = hashset_get(c->namereg, name)) && fail)
36 return NULL;
37
38 if (!e)
39 n = strdup(name);
40 else {
41 unsigned i;
42 size_t l = strlen(name);
43 n = malloc(l+3);
44 assert(n);
45
46 for (i = 1; i <= 99; i++) {
47 snprintf(n, l+2, "%s%u", name, i);
48
49 if (!(e = hashset_get(c->namereg, n)))
50 break;
51 }
52
53 if (e) {
54 free(n);
55 return NULL;
56 }
57 }
58
59 assert(n);
60 e = malloc(sizeof(struct namereg_entry));
61 assert(e);
62 e->type = type;
63 e->name = n;
64 e->data = data;
65
66 r = hashset_put(c->namereg, e->name, e);
67 assert (r >= 0);
68
69 return e->name;
70
71 }
72
73 void namereg_unregister(struct core *c, const char *name) {
74 struct namereg_entry *e;
75 int r;
76 assert(c && name);
77
78 e = hashset_get(c->namereg, name);
79 assert(e);
80
81 r = hashset_remove(c->namereg, name);
82 assert(r >= 0);
83
84 free(e->name);
85 free(e);
86 }
87
88 void* namereg_get(struct core *c, const char *name, enum namereg_type type) {
89 struct namereg_entry *e;
90 assert(c && name);
91
92 if (!(e = hashset_get(c->namereg, name)))
93 if (e->type == e->type)
94 return e->data;
95
96 return NULL;
97 }