summaryrefslogtreecommitdiff
path: root/app/slist.c
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2015-10-13 02:27:56 +0200
committerChristian Pointner <equinox@spreadspace.org>2015-10-13 02:28:01 +0200
commit6bc291c0fd3e1760ca4bfeaf33b38cbb4b21830c (patch)
tree887c41ec771a48d3323c9d2a2e0d7f6c86c36736 /app/slist.c
parentrenamed files to prepare merge of code dirs (diff)
merged app sources to single folder
Diffstat (limited to 'app/slist.c')
-rw-r--r--app/slist.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/app/slist.c b/app/slist.c
new file mode 100644
index 0000000..b10aca7
--- /dev/null
+++ b/app/slist.c
@@ -0,0 +1,123 @@
+/*
+ * dolmetschctl
+ *
+ *
+ * Copyright (C) 2015 Christian Pointner <equinox@spreadspace.org>
+ *
+ * This file is part of dolmetschctl.
+ *
+ * dolmetschctl is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * any later version.
+ *
+ * dolmetschctl is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with dolmetschctl. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "slist.h"
+
+slist_element_t* slist_get_last(slist_element_t* first)
+{
+ if(!first)
+ return NULL;
+
+ while(first->next_)
+ first = first->next_;
+
+ return first;
+}
+
+void slist_init(slist_t* lst, void (*delete_element)(void*))
+{
+ assert(lst && delete_element);
+
+ lst->delete_element = delete_element;
+ lst->first_ = NULL;
+}
+
+slist_element_t* slist_add(slist_t* lst, void* data)
+{
+ if(!lst || !data)
+ return NULL;
+
+ slist_element_t* new_element = malloc(sizeof(slist_element_t));
+ if(!new_element)
+ return NULL;
+
+ new_element->data_ = data;
+ new_element->next_ = NULL;
+
+ if(!lst->first_)
+ lst->first_ = new_element;
+ else
+ slist_get_last(lst->first_)->next_ = new_element;
+
+ return new_element;
+}
+
+void slist_remove(slist_t* lst, void* data)
+{
+ if(!lst || !lst->first_ || !data)
+ return;
+
+ slist_element_t* tmp = lst->first_->next_;
+ slist_element_t* prev = lst->first_;
+ if(lst->first_->data_ == data) {
+ lst->first_ = tmp;
+ lst->delete_element(prev->data_);
+ free(prev);
+ }
+ else {
+ while(tmp) {
+ if(tmp->data_ == data) {
+ prev->next_ = tmp->next_;
+ lst->delete_element(tmp->data_);
+ free(tmp);
+ return;
+ }
+ prev = tmp;
+ tmp = tmp->next_;
+ }
+ }
+}
+
+void slist_clear(slist_t* lst)
+{
+ if(!lst || !lst->first_)
+ return;
+
+ do {
+ slist_element_t* deletee = lst->first_;
+ lst->first_ = lst->first_->next_;
+ lst->delete_element(deletee->data_);
+ free(deletee);
+ }
+ while(lst->first_);
+
+ lst->first_ = NULL;
+}
+
+int slist_length(slist_t* lst)
+{
+ if(!lst || !lst->first_)
+ return 0;
+
+ int len = 0;
+ slist_element_t* tmp;
+ for(tmp = lst->first_; tmp; tmp = tmp->next_)
+ len++;
+
+ return len;
+}