| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | #include <stdio.h> |
| | #include <stdlib.h> |
| | #include <string.h> |
| | #include <assert.h> |
| |
|
| | #include "util/glist.h" |
| | #include "util/ckd_alloc.h" |
| |
|
| |
|
| | glist_t |
| | glist_add_ptr(glist_t g, void *ptr) |
| | { |
| | gnode_t *gn; |
| |
|
| | gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | gn->data.ptr = ptr; |
| | gn->next = g; |
| | return ((glist_t) gn); |
| | } |
| |
|
| |
|
| | glist_t |
| | glist_add_int32(glist_t g, int32 val) |
| | { |
| | gnode_t *gn; |
| |
|
| | gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | gn->data.i = (long)val; |
| | gn->next = g; |
| | return ((glist_t) gn); |
| | } |
| |
|
| |
|
| | glist_t |
| | glist_add_uint32(glist_t g, uint32 val) |
| | { |
| | gnode_t *gn; |
| |
|
| | gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | gn->data.ui = (unsigned long)val; |
| | gn->next = g; |
| | return ((glist_t) gn); |
| | } |
| |
|
| |
|
| | glist_t |
| | glist_add_float32(glist_t g, float32 val) |
| | { |
| | gnode_t *gn; |
| |
|
| | gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | gn->data.fl = (double)val; |
| | gn->next = g; |
| | return ((glist_t) gn); |
| | } |
| |
|
| |
|
| | glist_t |
| | glist_add_float64(glist_t g, float64 val) |
| | { |
| | gnode_t *gn; |
| |
|
| | gn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | gn->data.fl = (double)val; |
| | gn->next = g; |
| | return ((glist_t) gn); |
| | } |
| |
|
| | void |
| | glist_free(glist_t g) |
| | { |
| | gnode_t *gn; |
| |
|
| | while (g) { |
| | gn = g; |
| | g = gn->next; |
| | ckd_free((void *) gn); |
| | } |
| | } |
| |
|
| | int32 |
| | glist_count(glist_t g) |
| | { |
| | gnode_t *gn; |
| | int32 n; |
| |
|
| | for (gn = g, n = 0; gn; gn = gn->next, n++); |
| | return n; |
| | } |
| |
|
| |
|
| | gnode_t * |
| | glist_tail(glist_t g) |
| | { |
| | gnode_t *gn; |
| |
|
| | if (!g) |
| | return NULL; |
| |
|
| | for (gn = g; gn->next; gn = gn->next); |
| | return gn; |
| | } |
| |
|
| |
|
| | glist_t |
| | glist_reverse(glist_t g) |
| | { |
| | gnode_t *gn, *nextgn; |
| | gnode_t *rev; |
| |
|
| | rev = NULL; |
| | for (gn = g; gn; gn = nextgn) { |
| | nextgn = gn->next; |
| |
|
| | gn->next = rev; |
| | rev = gn; |
| | } |
| |
|
| | return rev; |
| | } |
| |
|
| |
|
| | gnode_t * |
| | glist_insert_ptr(gnode_t * gn, void *ptr) |
| | { |
| | gnode_t *newgn; |
| |
|
| | newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | newgn->data.ptr = ptr; |
| | newgn->next = gn->next; |
| | gn->next = newgn; |
| |
|
| | return newgn; |
| | } |
| |
|
| |
|
| | gnode_t * |
| | glist_insert_int32(gnode_t * gn, int32 val) |
| | { |
| | gnode_t *newgn; |
| |
|
| | newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | newgn->data.i = val; |
| | newgn->next = gn->next; |
| | gn->next = newgn; |
| |
|
| | return newgn; |
| | } |
| |
|
| |
|
| | gnode_t * |
| | glist_insert_uint32(gnode_t * gn, uint32 val) |
| | { |
| | gnode_t *newgn; |
| |
|
| | newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | newgn->data.ui = val; |
| | newgn->next = gn->next; |
| |
|
| | gn->next = newgn; |
| |
|
| | return newgn; |
| | } |
| |
|
| |
|
| | gnode_t * |
| | glist_insert_float32(gnode_t * gn, float32 val) |
| | { |
| | gnode_t *newgn; |
| |
|
| | newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | newgn->data.fl = (double)val; |
| | newgn->next = gn->next; |
| | gn->next = newgn; |
| |
|
| | return newgn; |
| | } |
| |
|
| |
|
| | gnode_t * |
| | glist_insert_float64(gnode_t * gn, float64 val) |
| | { |
| | gnode_t *newgn; |
| |
|
| | newgn = (gnode_t *) ckd_calloc(1, sizeof(gnode_t)); |
| | newgn->data.fl = (double)val; |
| | newgn->next = gn->next; |
| | gn->next = newgn; |
| |
|
| | return newgn; |
| | } |
| |
|
| | gnode_t * |
| | gnode_free(gnode_t * gn, gnode_t * pred) |
| | { |
| | gnode_t *next; |
| |
|
| | next = gn->next; |
| | if (pred) { |
| | assert(pred->next == gn); |
| |
|
| | pred->next = next; |
| | } |
| |
|
| | ckd_free((char *) gn); |
| |
|
| | return next; |
| | } |
| |
|