summaryrefslogtreecommitdiffstats
path: root/ref.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2021-12-16 17:11:12 +0100
committerLouis Burda <quent.burda@gmail.com>2021-12-20 15:31:31 +0100
commit3eea7a245a7ed49127a222628543f9509a6ff2b6 (patch)
tree345a923819b73bc88b551af5f708476239b6b7d9 /ref.c
parent15a8fe2cf2b16af8739a7ec2b64b5c5f184161b8 (diff)
downloadtmus-3eea7a245a7ed49127a222628543f9509a6ff2b6.tar.gz
tmus-3eea7a245a7ed49127a222628543f9509a6ff2b6.zip
Switched most buffers to wide chars, added general ref class, now clear mpd errors, added track and command completion
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);
+}
+