summaryrefslogtreecommitdiffstats
path: root/ref.c
diff options
context:
space:
mode:
Diffstat (limited to 'ref.c')
-rw-r--r--ref.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/ref.c b/ref.c
new file mode 100644
index 0000000..c961dd7
--- /dev/null
+++ b/ref.c
@@ -0,0 +1,68 @@
+#include "ref.h"
+#include "util.h"
+
+struct ref *
+ref_init(void *data)
+{
+ struct ref *ref;
+
+ ref = malloc(sizeof(struct ref));
+ ASSERT(ref != NULL);
+ ref->link = LINK_EMPTY;
+ ref->data = data;
+ return ref;
+}
+
+void
+ref_free(struct ref *ref)
+{
+ free(ref);
+}
+
+void
+refs_free(struct link *head)
+{
+ struct link *cur;
+
+ while (head->next) {
+ cur = link_pop(head->next);
+ ref_free(UPCAST(cur, struct ref));
+ }
+}
+
+static struct link *
+refs_ffind(struct link *head, void *data)
+{
+ struct link *iter;
+
+ for (iter = head->next; iter; iter = iter->next) {
+ if (UPCAST(iter, struct ref)->data == data)
+ return iter;
+ }
+
+ return NULL;
+}
+
+int
+refs_incl(struct link *head, void *data)
+{
+ struct link *ref;
+
+ ref = refs_ffind(head, data);
+ return ref != NULL;
+}
+
+void
+refs_rm(struct link *head, void *data)
+{
+ struct link *ref;
+ struct ref *dataref;
+
+ ref = refs_ffind(head, data);
+ if (!ref) return;
+
+ dataref = UPCAST(ref, struct ref);
+ link_pop(ref);
+ free(dataref);
+}
+