wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

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:
libcext/cext.h | 35++++++++++++++++++++---------------
libcext/container.c | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
libcext/emalloc.c | 2+-
libcext/estrdup.c | 4++--
libcext/strlcat.c | 2+-
libcext/strlcpy.c | 2+-
libcext/strtonum.c | 4+---
libcext/tokenize.c | 2+-
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;