commit 1d95f1fa99f14fc0360660a84ad3e4f247efa772
parent 806a6ea150d4e8c1ee65410921b33236d84b274c
Author: garbeam <garbeam@localhost.localdomain>
Date: Tue, 6 Dec 2005 16:56:57 +0200
added new container data structure which is much better than those ugly arrays
Diffstat:
8 files changed, 153 insertions(+), 27 deletions(-)
diff --git a/libcext/cext.h b/libcext/cext.h
@@ -21,43 +21,48 @@ typedef struct CItem CItem;
struct CItem {
void *item;
- CItem *prev;
CItem *next;
+ CItem *up;
+ CItem *down;
};
struct Container {
CItem *list;
CItem *stack;
-} Container;
-
-void attach_item
-void *item_at(
+};
+void cext_attach_item(Container *c, void *item);
+void cext_detach_item(Container *c, void *item);
+void *cext_find_item(Container *c, void *pattern, int (*comp)(void *pattern, void *item));
+void cext_top_item(Container *c, void *item);
+void *cext_get_top_item(Container *c);
+void *cext_get_down_item(Container *c, void *item);
+void *cext_get_up_item(Container *c, void *item);
+void *cext_get_item(Container *c, size_t index);
+size_t cext_sizeof(Container *c);
-void **attach_item_end(void **old, void *item, size_t size_item);
void **attach_item_begin(void **old, void *item, size_t size_item);
+void **attach_item_end(void **old, void *item, size_t size_item);
void **detach_item(void **old, void *item, size_t size_item);
int index_item(void **items, void *item);
+int count_items(void **items);
int index_next_item(void **items, void *item);
int index_prev_item(void **items, void *item);
-int count_items(void **items);
/* emalloc.c */
-void *emalloc(size_t size);
+void *cext_emalloc(size_t size);
/* estrdup.c */
-char *estrdup(const char *s);
+char *cext_estrdup(const char *s);
/* strlcat.c */
-size_t _strlcat(char *dst, const char *src, size_t siz);
+size_t cext_strlcat(char *dst, const char *src, size_t siz);
/* strlcpy.c */
-size_t _strlcpy(char *dst, const char *src, size_t siz);
+size_t cext_strlcpy(char *dst, const char *src, size_t siz);
/* strtonum.c */
-long long
-__strtonum(const char *numstr, long long minval,
- long long maxval, const char **errstrp);
+long long cext_strtonum(const char *numstr, long long minval, long long maxval, const char **errstrp);
/* tokenize.c */
-size_t tokenize(char **result, size_t reslen, char *str, char delim);
+size_t cext_tokenize(char **result, size_t reslen, char *str, char delim);
diff --git a/libcext/container.c b/libcext/container.c
@@ -7,16 +7,139 @@
#include "cext.h"
+static CItem zero_item = { 0 };
+static int comp_ptr(void *p1, void *p2)
+{
+ return p1 == p2;
+}
+
+static void detach_from_stack(CItem *i)
+{
+ /* remove from stack */
+ if (i->up)
+ i->up->down = i->down;
+ if (i->down)
+ i->down->up = i->up;
+}
+
+static void attach_to_stack(Container *c, CItem *i)
+{
+ if (!c->stack)
+ c->stack = i;
+ else {
+ i->down = c->stack;
+ c->stack->up = i;
+ c->stack = i;
+ }
+}
+
+void cext_attach_item(Container *c, void *item)
+{
+ CItem *i, *new = cext_emalloc(sizeof(CItem));
+ *new = zero_item;
+ new->item = item;
+ for (i = c->list; i && i->next; i = i->next);
+ if (!c->list)
+ c->list = new;
+ else
+ i->next = new;
+
+ attach_to_stack(c, new);
+}
+
+void cext_detach_item(Container *c, void *item)
+{
+ CItem *i = c->list;
+
+ if (!i)
+ return;
+
+ /* remove from list */
+ if (i->item == item)
+ c->list = c->list->next;
+ else {
+ for (; i->next && i->next->item != item; i = i->next);
+ if (!i->next)
+ return;
+ i->next = i->next->next;
+ }
+
+ detach_from_stack(i);
+ free(i);
+}
+
+void *cext_find_item(Container *c, void *pattern, int (*comp)(void *pattern, void *item))
+{
+ CItem *i;
+ for (i = c->list; i && comp(pattern, i->item); i = i->next);
+ return i ? i->item : nil;
+}
+void cext_top_item(Container *c, void *item)
+{
+ CItem *i = cext_find_item(c, item, comp_ptr);
+ if (!i)
+ return;
+
+ detach_from_stack(i);
+ attach_to_stack(c, i);
+}
+
+void *cext_get_top_item(Container *c)
+{
+ return c->stack ? c->stack->item : nil;
+}
+
+void *cext_get_down_item(Container *c, void *item)
+{
+ CItem *i = cext_find_item(c, item, comp_ptr);
+ if (!i)
+ return nil;
+ return i->down ? i->down->item : c->stack->item;
+}
+
+void *cext_get_up_item(Container *c, void *item)
+{
+ CItem *i = cext_find_item(c, item, comp_ptr);
+ CItem *bottom;
+ if (!i)
+ return nil;
+ for (bottom = c->stack; bottom && bottom->down; bottom = bottom->down);
+ return i->up ? i->up->item : bottom->item;
+}
+
+void *cext_get_item(Container *c, size_t index)
+{
+ size_t idx = 0;
+ CItem *i;
+
+ for (i = c->list; i && index != idx; i = i->next)
+ idx++;
+
+ return i ? i->item : nil;
+}
+
+size_t cext_sizeof(Container *c)
+{
+ size_t idx = 0;
+ CItem *i;
+
+ for (i = c->list; i; i = i->next)
+ idx++;
+
+ return idx;
+}
+
+/* old obsolete stuff follows */
void **attach_item_begin(void **old, void *item, size_t size_item)
{
int i, size_old;
void **result = 0;
for (size_old = 0; old && old[size_old]; size_old++);
- result = emalloc(size_item * (size_old + 2));
+ result = cext_emalloc(size_item * (size_old + 2));
result[0] = item;
for (i = 0; old && old[i]; i++)
result[i + 1] = old[i];
@@ -31,7 +154,7 @@ void **attach_item_end(void **old, void *item, size_t size_item)
int i, size_old;
void **result = 0;
for (size_old = 0; old && old[size_old]; size_old++);
- result = emalloc(size_item * (size_old + 2));
+ result = cext_emalloc(size_item * (size_old + 2));
for (i = 0; old && old[i]; i++)
result[i] = old[i];
result[i++] = item;
@@ -47,7 +170,7 @@ void **detach_item(void **old, void *item, size_t size_item)
void **result = 0;
for (size_old = 0; old && old[size_old]; size_old++);
if (size_old != 1) {
- result = emalloc(size_item * size_old);
+ result = cext_emalloc(size_item * size_old);
for (i = 0; old[i]; i++)
if (old[i] != item)
result[j++] = old[i];
diff --git a/libcext/emalloc.c b/libcext/emalloc.c
@@ -8,7 +8,7 @@
#include "cext.h"
-void *emalloc(size_t size)
+void *cext_emalloc(size_t size)
{
void *res = malloc(size);
diff --git a/libcext/estrdup.c b/libcext/estrdup.c
@@ -9,11 +9,11 @@
#include "cext.h"
-char *estrdup(const char *s)
+char *cext_estrdup(const char *s)
{
char *tmp;
- tmp = (char *) emalloc(strlen(s) + 1);
+ tmp = (char *) cext_emalloc(strlen(s) + 1);
strcpy(tmp, (char *) s);
return tmp;
diff --git a/libcext/strlcat.c b/libcext/strlcat.c
@@ -26,7 +26,7 @@
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
* If retval >= siz, truncation occurred.
*/
-size_t _strlcat(char *dst, const char *src, size_t siz)
+size_t cext_strlcat(char *dst, const char *src, size_t siz)
{
register char *d = dst;
register const char *s = src;
diff --git a/libcext/strlcpy.c b/libcext/strlcpy.c
@@ -23,7 +23,7 @@
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
-size_t _strlcpy(char *dst, const char *src, size_t siz)
+size_t cext_strlcpy(char *dst, const char *src, size_t siz)
{
register char *d = dst;
register const char *s = src;
diff --git a/libcext/strtonum.c b/libcext/strtonum.c
@@ -23,9 +23,7 @@
#define TOOSMALL 2
#define TOOLARGE 3
-long long
-__strtonum(const char *numstr, long long minval, long long maxval,
- const char **errstrp)
+long long cext_strtonum(const char *numstr, long long minval, long long maxval, const char **errstrp)
{
long long ll = 0;
char *ep;
diff --git a/libcext/tokenize.c b/libcext/tokenize.c
@@ -7,7 +7,7 @@
#include "cext.h"
-size_t tokenize(char **result, size_t reslen, char *str, char delim)
+size_t cext_tokenize(char **result, size_t reslen, char *str, char delim)
{
char *p, *n;
size_t i = 0;