Enlightenment CVS committal
Author : mej
Project : eterm
Module : libast
Dir : eterm/libast/src
Modified Files:
array.c dlinked_list.c mem.c
Log Message:
Wed Mar 10 17:58:14 2004 Michael Jennings (mej)
Added array and dlinked_list implementations of the map interface.
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/array.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- array.c 4 Feb 2004 17:51:23 -0000 1.16
+++ array.c 10 Mar 2004 22:50:21 -0000 1.17
@@ -21,7 +21,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-static const char cvs_ident[] = "$Id: array.c,v 1.16 2004/02/04 17:51:23 mej Exp $";
+static const char cvs_ident[] = "$Id: array.c,v 1.17 2004/03/10 22:50:21 mej Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -39,14 +39,17 @@
static spif_array_t spif_array_list_new(void);
static spif_array_t spif_array_vector_new(void);
+static spif_array_t spif_array_map_new(void);
static spif_bool_t spif_array_list_init(spif_array_t);
static spif_bool_t spif_array_vector_init(spif_array_t);
+static spif_bool_t spif_array_map_init(spif_array_t);
static spif_bool_t spif_array_done(spif_array_t);
static spif_bool_t spif_array_del(spif_array_t);
static spif_str_t spif_array_show(spif_array_t, spif_charptr_t, spif_str_t, size_t);
static spif_cmp_t spif_array_comp(spif_array_t, spif_array_t);
static spif_array_t spif_array_list_dup(spif_array_t);
static spif_array_t spif_array_vector_dup(spif_array_t);
+static spif_array_t spif_array_map_dup(spif_array_t);
static spif_classname_t spif_array_type(spif_array_t);
static spif_bool_t spif_array_append(spif_array_t, spif_obj_t);
static spif_bool_t spif_array_list_contains(spif_array_t, spif_obj_t);
@@ -55,6 +58,12 @@
static spif_obj_t spif_array_list_find(spif_array_t, spif_obj_t);
static spif_obj_t spif_array_vector_find(spif_array_t, spif_obj_t);
static spif_obj_t spif_array_get(spif_array_t, spif_listidx_t);
+static spif_obj_t spif_array_map_get(spif_array_t self, spif_obj_t key);
+static spif_list_t spif_array_get_keys(spif_array_t self, spif_list_t key_list);
+static spif_list_t spif_array_get_pairs(spif_array_t self, spif_list_t pair_list);
+static spif_list_t spif_array_get_values(spif_array_t self, spif_list_t value_list);
+static spif_bool_t spif_array_has_key(spif_array_t self, spif_obj_t key);
+static spif_bool_t spif_array_has_value(spif_array_t self, spif_obj_t value);
static spif_listidx_t spif_array_index(spif_array_t, spif_obj_t);
static spif_bool_t spif_array_insert(spif_array_t, spif_obj_t);
static spif_bool_t spif_array_insert_at(spif_array_t, spif_obj_t, spif_listidx_t);
@@ -62,7 +71,9 @@
static spif_bool_t spif_array_prepend(spif_array_t, spif_obj_t);
static spif_obj_t spif_array_remove(spif_array_t, spif_obj_t);
static spif_obj_t spif_array_remove_at(spif_array_t, spif_listidx_t);
+static spif_obj_t spif_array_map_remove(spif_array_t self, spif_obj_t item);
static spif_bool_t spif_array_reverse(spif_array_t);
+static spif_bool_t spif_array_set(spif_array_t self, spif_obj_t key, spif_obj_t
value);
static spif_obj_t *spif_array_to_array(spif_array_t);
static spif_array_iterator_t spif_array_iterator_new(spif_array_t subject);
static spif_bool_t spif_array_iterator_init(spif_array_iterator_t self, spif_array_t
subject);
@@ -127,6 +138,31 @@
};
spif_vectorclass_t SPIF_VECTORCLASS_VAR(array) = &av_class;
+static spif_const_mapclass_t am_class = {
+ {
+ SPIF_DECL_CLASSNAME(array),
+ (spif_func_t) spif_array_map_new,
+ (spif_func_t) spif_array_map_init,
+ (spif_func_t) spif_array_done,
+ (spif_func_t) spif_array_del,
+ (spif_func_t) spif_array_show,
+ (spif_func_t) spif_array_comp,
+ (spif_func_t) spif_array_map_dup,
+ (spif_func_t) spif_array_type
+ },
+ (spif_func_t) spif_array_count,
+ (spif_func_t) spif_array_map_get,
+ (spif_func_t) spif_array_get_keys,
+ (spif_func_t) spif_array_get_pairs,
+ (spif_func_t) spif_array_get_values,
+ (spif_func_t) spif_array_has_key,
+ (spif_func_t) spif_array_has_value,
+ (spif_func_t) spif_array_iterator,
+ (spif_func_t) spif_array_map_remove,
+ (spif_func_t) spif_array_set
+};
+spif_mapclass_t SPIF_MAPCLASS_VAR(array) = &am_class;
+
static spif_const_iteratorclass_t ai_class = {
{
SPIF_DECL_CLASSNAME(array),
@@ -185,6 +221,19 @@
return self;
}
+static spif_array_t
+spif_array_map_new(void)
+{
+ spif_array_t self;
+
+ self = SPIF_ALLOC(array);
+ if (!spif_array_map_init(self)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(array);
+ }
+ return self;
+}
+
static spif_bool_t
spif_array_vector_init(spif_array_t self)
{
@@ -200,6 +249,20 @@
}
static spif_bool_t
+spif_array_map_init(spif_array_t self)
+{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
+ if (!spif_obj_init(SPIF_OBJ(self))) {
+ return FALSE;
+ } else if (!spif_obj_set_class(SPIF_OBJ(self),
SPIF_CLASS(SPIF_MAPCLASS_VAR(array)))) {
+ return FALSE;
+ }
+ self->len = 0;
+ self->items = SPIF_NULL_TYPE_C(spif_obj_t *);
+ return TRUE;
+}
+
+static spif_bool_t
spif_array_done(spif_array_t self)
{
spif_listidx_t i;
@@ -327,6 +390,24 @@
return tmp;
}
+static spif_array_t
+spif_array_map_dup(spif_array_t self)
+{
+ spif_array_t tmp;
+ spif_listidx_t i;
+
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(array));
+
+ tmp = spif_array_map_new();
+ REQUIRE_RVAL(!SPIF_ARRAY_ISNULL(tmp), SPIF_NULL_TYPE(array));
+ memcpy(tmp, self, SPIF_SIZEOF_TYPE(array));
+ tmp->items = SPIF_CAST_C(spif_obj_t *) MALLOC(SPIF_SIZEOF_TYPE(obj) * self->len);
+ for (i = 0; i < self->len; i++) {
+ tmp->items[i] = SPIF_CAST(obj) SPIF_OBJ_DUP(SPIF_OBJ(self->items[i]));
+ }
+ return tmp;
+}
+
static spif_classname_t
spif_array_type(spif_array_t self)
{
@@ -424,6 +505,107 @@
return (((idx >= 0) && (idx < self->len)) ? (self->items[idx]) :
(SPIF_NULL_TYPE(obj)));
}
+static spif_obj_t
+spif_array_map_get(spif_array_t self, spif_obj_t key)
+{
+ spif_listidx_t start, end, mid;
+ spif_cmp_t diff;
+
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(key), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(self->len > 0, SPIF_NULL_TYPE(obj));
+
+ for (start = 0, end = self->len - 1; start <= end; ) {
+ mid = (end - start) / 2 + start;
+ diff = SPIF_OBJ_COMP(self->items[mid], key);
+ if (SPIF_CMP_IS_EQUAL(diff)) {
+ return SPIF_OBJPAIR(self->items[mid])->value;
+ } else if (SPIF_CMP_IS_LESS(diff)) {
+ start = mid + 1;
+ } else {
+ end = mid - 1;
+ if (end == SPIF_CAST(listidx) -1) {
+ break;
+ }
+ }
+ }
+ return SPIF_NULL_TYPE(obj);
+}
+
+static spif_list_t
+spif_array_get_keys(spif_array_t self, spif_list_t key_list)
+{
+ spif_listidx_t i;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(list));
+ if (SPIF_LIST_ISNULL(key_list)) {
+ key_list = SPIF_LIST_NEW(array);
+ }
+
+ for (i = 0; i < self->len; i++) {
+ SPIF_LIST_APPEND(key_list, SPIF_OBJ_DUP(SPIF_OBJPAIR(self->items[i])->key));
+ }
+ return key_list;
+}
+
+static spif_list_t
+spif_array_get_pairs(spif_array_t self, spif_list_t pair_list)
+{
+ spif_listidx_t i;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(list));
+ if (SPIF_LIST_ISNULL(pair_list)) {
+ pair_list = SPIF_LIST_NEW(array);
+ }
+
+ for (i = 0; i < self->len; i++) {
+ SPIF_LIST_APPEND(pair_list, SPIF_OBJ_DUP(SPIF_OBJPAIR(self->items[i])));
+ }
+ return pair_list;
+}
+
+static spif_list_t
+spif_array_get_values(spif_array_t self, spif_list_t value_list)
+{
+ spif_listidx_t i;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(list));
+ if (SPIF_LIST_ISNULL(value_list)) {
+ value_list = SPIF_LIST_NEW(array);
+ }
+
+ for (i = 0; i < self->len; i++) {
+ SPIF_LIST_APPEND(value_list,
SPIF_OBJ_DUP(SPIF_OBJPAIR(self->items[i])->value));
+ }
+ return value_list;
+}
+
+static spif_bool_t
+spif_array_has_key(spif_array_t self, spif_obj_t key)
+{
+ return ((SPIF_OBJ_ISNULL(spif_array_map_get(self, key))) ? FALSE : TRUE);
+}
+
+static spif_bool_t
+spif_array_has_value(spif_array_t self, spif_obj_t value)
+{
+ spif_listidx_t i;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), FALSE);
+
+ for (i = 0; i < self->len; i++) {
+ spif_objpair_t pair;
+
+ pair = SPIF_OBJPAIR(self->items[i]);
+ if (SPIF_OBJ_ISNULL(value) && SPIF_OBJ_ISNULL(pair->value)) {
+ return TRUE;
+ } else if (SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(pair->value, value))) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static spif_listidx_t
spif_array_index(spif_array_t self, spif_obj_t obj)
{
@@ -553,6 +735,27 @@
}
static spif_obj_t
+spif_array_map_remove(spif_array_t self, spif_obj_t item)
+{
+ spif_obj_t tmp;
+ spif_listidx_t i, left;
+
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(item), SPIF_NULL_TYPE(obj));
+ for (i = 0; i < self->len && !SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(self->items[i],
item)); i++);
+ if (i == self->len) {
+ return SPIF_NULL_TYPE(obj);
+ }
+
+ left = self->len - i - 1;
+ tmp = self->items[i];
+ memmove(self->items + i, self->items + i + 1, SPIF_SIZEOF_TYPE(obj) * left);
+ self->items = SPIF_CAST_C(spif_obj_t *) REALLOC(self->items,
SPIF_SIZEOF_TYPE(obj) * (--(self->len)));
+
+ return tmp;
+}
+
+static spif_obj_t
spif_array_remove_at(spif_array_t self, spif_listidx_t idx)
{
spif_obj_t tmp;
@@ -587,6 +790,29 @@
return TRUE;
}
+static spif_bool_t
+spif_array_set(spif_array_t self, spif_obj_t key, spif_obj_t value)
+{
+ spif_listidx_t i;
+
+ ASSERT_RVAL(!SPIF_LIST_ISNULL(self), FALSE);
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(key), FALSE);
+
+ if (SPIF_OBJ_IS_OBJPAIR(key) && SPIF_OBJ_ISNULL(value)) {
+ value = SPIF_OBJ(SPIF_OBJPAIR(key)->value);
+ key = SPIF_OBJ(SPIF_OBJPAIR(key)->key);
+ }
+
+ for (i = 0; i < self->len && !SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(self->items[i],
key)); i++);
+ if (i == self->len) {
+ spif_array_insert(self, SPIF_OBJ(spif_objpair_new_from_both(key, value)));
+ return FALSE;
+ } else {
+ spif_objpair_set_value(SPIF_OBJPAIR(self->items[i]), SPIF_OBJ_DUP(value));
+ return TRUE;
+ }
+}
+
static spif_obj_t *
spif_array_to_array(spif_array_t self)
{
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/dlinked_list.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- dlinked_list.c 4 Feb 2004 17:51:26 -0000 1.19
+++ dlinked_list.c 10 Mar 2004 22:50:21 -0000 1.20
@@ -21,7 +21,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-static const char cvs_ident[] = "$Id: dlinked_list.c,v 1.19 2004/02/04 17:51:26 mej
Exp $";
+static const char cvs_ident[] = "$Id: dlinked_list.c,v 1.20 2004/03/10 22:50:21 mej
Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -51,31 +51,42 @@
static spif_dlinked_list_t spif_dlinked_list_new(void);
static spif_dlinked_list_t spif_dlinked_list_vector_new(void);
+static spif_dlinked_list_t spif_dlinked_list_map_new(void);
static spif_bool_t spif_dlinked_list_init(spif_dlinked_list_t);
static spif_bool_t spif_dlinked_list_vector_init(spif_dlinked_list_t);
+static spif_bool_t spif_dlinked_list_map_init(spif_dlinked_list_t);
static spif_bool_t spif_dlinked_list_done(spif_dlinked_list_t);
static spif_bool_t spif_dlinked_list_del(spif_dlinked_list_t);
static spif_str_t spif_dlinked_list_show(spif_dlinked_list_t, spif_charptr_t,
spif_str_t, size_t);
static spif_cmp_t spif_dlinked_list_comp(spif_dlinked_list_t, spif_dlinked_list_t);
static spif_dlinked_list_t spif_dlinked_list_dup(spif_dlinked_list_t);
static spif_dlinked_list_t spif_dlinked_list_vector_dup(spif_dlinked_list_t);
+static spif_dlinked_list_t spif_dlinked_list_map_dup(spif_dlinked_list_t);
static spif_classname_t spif_dlinked_list_type(spif_dlinked_list_t);
-static spif_bool_t spif_dlinked_list_append(spif_dlinked_list_t, spif_obj_t);
-static spif_bool_t spif_dlinked_list_contains(spif_dlinked_list_t, spif_obj_t);
-static spif_bool_t spif_dlinked_list_vector_contains(spif_dlinked_list_t, spif_obj_t);
-static spif_listidx_t spif_dlinked_list_count(spif_dlinked_list_t);
-static spif_obj_t spif_dlinked_list_find(spif_dlinked_list_t, spif_obj_t);
-static spif_obj_t spif_dlinked_list_vector_find(spif_dlinked_list_t, spif_obj_t);
-static spif_obj_t spif_dlinked_list_get(spif_dlinked_list_t, spif_listidx_t);
-static spif_listidx_t spif_dlinked_list_index(spif_dlinked_list_t, spif_obj_t);
-static spif_bool_t spif_dlinked_list_insert(spif_dlinked_list_t, spif_obj_t);
-static spif_bool_t spif_dlinked_list_insert_at(spif_dlinked_list_t, spif_obj_t,
spif_listidx_t);
-static spif_iterator_t spif_dlinked_list_iterator(spif_dlinked_list_t);
-static spif_bool_t spif_dlinked_list_prepend(spif_dlinked_list_t, spif_obj_t);
-static spif_obj_t spif_dlinked_list_remove(spif_dlinked_list_t, spif_obj_t);
-static spif_obj_t spif_dlinked_list_remove_at(spif_dlinked_list_t, spif_listidx_t);
-static spif_bool_t spif_dlinked_list_reverse(spif_dlinked_list_t);
-static spif_obj_t *spif_dlinked_list_to_array(spif_dlinked_list_t);
+static spif_bool_t spif_dlinked_list_append(spif_dlinked_list_t self, spif_obj_t obj);
+static spif_bool_t spif_dlinked_list_contains(spif_dlinked_list_t self, spif_obj_t
obj);
+static spif_bool_t spif_dlinked_list_vector_contains(spif_dlinked_list_t self,
spif_obj_t obj);
+static spif_listidx_t spif_dlinked_list_count(spif_dlinked_list_t self);
+static spif_obj_t spif_dlinked_list_find(spif_dlinked_list_t self, spif_obj_t obj);
+static spif_obj_t spif_dlinked_list_vector_find(spif_dlinked_list_t self, spif_obj_t
obj);
+static spif_obj_t spif_dlinked_list_get(spif_dlinked_list_t self, spif_listidx_t idx);
+static spif_obj_t spif_dlinked_list_map_get(spif_dlinked_list_t self, spif_obj_t key);
+static spif_list_t spif_dlinked_list_get_keys(spif_dlinked_list_t self, spif_list_t
key_list);
+static spif_list_t spif_dlinked_list_get_pairs(spif_dlinked_list_t self, spif_list_t
pair_list);
+static spif_list_t spif_dlinked_list_get_values(spif_dlinked_list_t self, spif_list_t
value_list);
+static spif_bool_t spif_dlinked_list_has_key(spif_dlinked_list_t self, spif_obj_t
key);
+static spif_bool_t spif_dlinked_list_has_value(spif_dlinked_list_t self, spif_obj_t
value);
+static spif_listidx_t spif_dlinked_list_index(spif_dlinked_list_t self, spif_obj_t
obj);
+static spif_bool_t spif_dlinked_list_insert(spif_dlinked_list_t self, spif_obj_t obj);
+static spif_bool_t spif_dlinked_list_insert_at(spif_dlinked_list_t self, spif_obj_t
obj, spif_listidx_t idx);
+static spif_iterator_t spif_dlinked_list_iterator(spif_dlinked_list_t self);
+static spif_bool_t spif_dlinked_list_prepend(spif_dlinked_list_t self, spif_obj_t
obj);
+static spif_obj_t spif_dlinked_list_remove(spif_dlinked_list_t self, spif_obj_t item);
+static spif_obj_t spif_dlinked_list_map_remove(spif_dlinked_list_t self, spif_obj_t
item);
+static spif_obj_t spif_dlinked_list_remove_at(spif_dlinked_list_t self,
spif_listidx_t idx);
+static spif_bool_t spif_dlinked_list_reverse(spif_dlinked_list_t self);
+static spif_bool_t spif_dlinked_list_set(spif_dlinked_list_t self, spif_obj_t key,
spif_obj_t value);
+static spif_obj_t * spif_dlinked_list_to_array(spif_dlinked_list_t self);
SPIF_DECL_PROPERTY_FUNC(dlinked_list, listidx, len);
SPIF_DECL_PROPERTY_FUNC(dlinked_list, dlinked_list_item, head);
SPIF_DECL_PROPERTY_FUNC(dlinked_list, dlinked_list_item, tail);
@@ -158,6 +169,31 @@
};
spif_vectorclass_t SPIF_VECTORCLASS_VAR(dlinked_list) = &dlv_class;
+static spif_const_mapclass_t dllm_class = {
+ {
+ SPIF_DECL_CLASSNAME(dlinked_list),
+ (spif_func_t) spif_dlinked_list_map_new,
+ (spif_func_t) spif_dlinked_list_map_init,
+ (spif_func_t) spif_dlinked_list_done,
+ (spif_func_t) spif_dlinked_list_del,
+ (spif_func_t) spif_dlinked_list_show,
+ (spif_func_t) spif_dlinked_list_comp,
+ (spif_func_t) spif_dlinked_list_map_dup,
+ (spif_func_t) spif_dlinked_list_type
+ },
+ (spif_func_t) spif_dlinked_list_count,
+ (spif_func_t) spif_dlinked_list_map_get,
+ (spif_func_t) spif_dlinked_list_get_keys,
+ (spif_func_t) spif_dlinked_list_get_pairs,
+ (spif_func_t) spif_dlinked_list_get_values,
+ (spif_func_t) spif_dlinked_list_has_key,
+ (spif_func_t) spif_dlinked_list_has_value,
+ (spif_func_t) spif_dlinked_list_iterator,
+ (spif_func_t) spif_dlinked_list_map_remove,
+ (spif_func_t) spif_dlinked_list_set
+};
+spif_mapclass_t SPIF_MAPCLASS_VAR(dlinked_list) = &dllm_class;
+
static spif_const_iteratorclass_t dlli_class = {
{
SPIF_DECL_CLASSNAME(dlinked_list),
@@ -303,6 +339,19 @@
return self;
}
+static spif_dlinked_list_t
+spif_dlinked_list_map_new(void)
+{
+ spif_dlinked_list_t self;
+
+ self = SPIF_ALLOC(dlinked_list);
+ if (!spif_dlinked_list_map_init(self)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(dlinked_list);
+ }
+ return self;
+}
+
static spif_bool_t
spif_dlinked_list_init(spif_dlinked_list_t self)
{
@@ -328,6 +377,18 @@
}
static spif_bool_t
+spif_dlinked_list_map_init(spif_dlinked_list_t self)
+{
+ ASSERT_RVAL(!SPIF_MAP_ISNULL(self), FALSE);
+ /* ***NOT NEEDED*** spif_obj_init(SPIF_OBJ(self)); */
+ spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS(SPIF_MAPCLASS_VAR(dlinked_list)));
+ self->len = 0;
+ self->head = SPIF_NULL_TYPE(dlinked_list_item);
+ self->tail = SPIF_NULL_TYPE(dlinked_list_item);
+ return TRUE;
+}
+
+static spif_bool_t
spif_dlinked_list_done(spif_dlinked_list_t self)
{
spif_dlinked_list_item_t current;
@@ -441,6 +502,27 @@
return tmp;
}
+static spif_dlinked_list_t
+spif_dlinked_list_map_dup(spif_dlinked_list_t self)
+{
+ spif_dlinked_list_t tmp;
+ spif_dlinked_list_item_t src, dest, prev;
+
+ ASSERT_RVAL(!SPIF_MAP_ISNULL(self), SPIF_NULL_TYPE(dlinked_list));
+ tmp = spif_dlinked_list_map_new();
+ memcpy(tmp, self, SPIF_SIZEOF_TYPE(dlinked_list));
+ tmp->head = spif_dlinked_list_item_dup(self->head);
+ for (src = self->head, dest = tmp->head, prev = SPIF_NULL_TYPE(dlinked_list_item);
+ src->next;
+ src = src->next, prev = dest, dest = dest->next) {
+ dest->next = spif_dlinked_list_item_dup(src->next);
+ dest->prev = prev;
+ }
+ dest->next = SPIF_NULL_TYPE(dlinked_list_item);
+ tmp->tail = prev;
+ return tmp;
+}
+
static spif_classname_t
spif_dlinked_list_type(spif_dlinked_list_t self)
{
@@ -551,6 +633,103 @@
}
}
+static spif_obj_t
+spif_dlinked_list_map_get(spif_dlinked_list_t self, spif_obj_t key)
+{
+ spif_dlinked_list_item_t current;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(key), SPIF_NULL_TYPE(obj));
+ for (current = self->head; current; current = current->next) {
+ spif_cmp_t c;
+
+ /* current->data is always non-NULL in maps. */
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(current->data), SPIF_NULL_TYPE(obj));
+ c = SPIF_OBJ_COMP(current->data, key);
+ if (SPIF_CMP_IS_EQUAL(c)) {
+ return SPIF_OBJPAIR(current->data)->value;
+ } else if (SPIF_CMP_IS_GREATER(c)) {
+ break;
+ }
+ }
+ return SPIF_NULL_TYPE(obj);
+}
+
+static spif_list_t
+spif_dlinked_list_get_keys(spif_dlinked_list_t self, spif_list_t key_list)
+{
+ spif_dlinked_list_item_t current;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(list));
+ if (SPIF_LIST_ISNULL(key_list)) {
+ key_list = SPIF_LIST_NEW(linked_list);
+ }
+ for (current = self->head; current; current = current->next) {
+ /* current->data is always non-NULL in maps. */
+ SPIF_LIST_APPEND(key_list, SPIF_OBJ_DUP(SPIF_OBJPAIR(current->data)->key));
+ }
+ return key_list;
+}
+
+static spif_list_t
+spif_dlinked_list_get_pairs(spif_dlinked_list_t self, spif_list_t pair_list)
+{
+ spif_dlinked_list_item_t current;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(list));
+ if (SPIF_LIST_ISNULL(pair_list)) {
+ pair_list = SPIF_LIST_NEW(linked_list);
+ }
+ for (current = self->head; current; current = current->next) {
+ /* current->data is always non-NULL in maps. */
+ SPIF_LIST_APPEND(pair_list, SPIF_OBJ_DUP(SPIF_OBJPAIR(current->data)));
+ }
+ return pair_list;
+}
+
+static spif_list_t
+spif_dlinked_list_get_values(spif_dlinked_list_t self, spif_list_t value_list)
+{
+ spif_dlinked_list_item_t current;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), SPIF_NULL_TYPE(list));
+ if (SPIF_LIST_ISNULL(value_list)) {
+ value_list = SPIF_LIST_NEW(linked_list);
+ }
+ for (current = self->head; current; current = current->next) {
+ /* current->data is always non-NULL in maps. */
+ SPIF_LIST_APPEND(value_list,
SPIF_OBJ_DUP(SPIF_OBJPAIR(current->data)->value));
+ }
+ return value_list;
+}
+
+static spif_bool_t
+spif_dlinked_list_has_key(spif_dlinked_list_t self, spif_obj_t key)
+{
+ return ((SPIF_OBJ_ISNULL(spif_dlinked_list_map_get(self, key))) ? FALSE : TRUE);
+}
+
+static spif_bool_t
+spif_dlinked_list_has_value(spif_dlinked_list_t self, spif_obj_t value)
+{
+ spif_dlinked_list_item_t current;
+
+ ASSERT_RVAL(!SPIF_VECTOR_ISNULL(self), FALSE);
+
+ for (current = self->head; current; current = current->next) {
+ spif_objpair_t pair;
+
+ /* current->data is always non-NULL in maps. */
+ pair = SPIF_OBJPAIR(current->data);
+ if (SPIF_OBJ_ISNULL(value) && SPIF_OBJ_ISNULL(pair->value)) {
+ return TRUE;
+ } else if (SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(pair->value, value))) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static spif_listidx_t
spif_dlinked_list_index(spif_dlinked_list_t self, spif_obj_t obj)
{
@@ -704,6 +883,35 @@
}
static spif_obj_t
+spif_dlinked_list_map_remove(spif_dlinked_list_t self, spif_obj_t item)
+{
+ spif_dlinked_list_item_t current, tmp;
+
+ ASSERT_RVAL(!SPIF_LIST_ISNULL(self), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(item), SPIF_NULL_TYPE(obj));
+ if (SPIF_DLINKED_LIST_ITEM_ISNULL(self->head)) {
+ return SPIF_NULL_TYPE(obj);
+ } else if (SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(self->head->data, item))) {
+ tmp = self->head;
+ self->head = self->head->next;
+ } else {
+ for (current = self->head; current->next &&
!SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(current->next->data, item)); current = current->next);
+ if (current->next) {
+ tmp = current->next;
+ current->next = current->next->next;
+ } else {
+ return SPIF_NULL_TYPE(obj);
+ }
+ }
+ item = tmp->data;
+ tmp->data = SPIF_NULL_TYPE(obj);
+ spif_dlinked_list_item_del(tmp);
+
+ self->len--;
+ return item;
+}
+
+static spif_obj_t
spif_dlinked_list_remove_at(spif_dlinked_list_t self, spif_listidx_t idx)
{
spif_listidx_t i;
@@ -767,6 +975,33 @@
return TRUE;
}
+static spif_bool_t
+spif_dlinked_list_set(spif_dlinked_list_t self, spif_obj_t key, spif_obj_t value)
+{
+ spif_dlinked_list_item_t current;
+
+ ASSERT_RVAL(!SPIF_LIST_ISNULL(self), FALSE);
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(key), FALSE);
+
+ if (SPIF_OBJ_IS_OBJPAIR(key) && SPIF_OBJ_ISNULL(value)) {
+ value = SPIF_OBJ(SPIF_OBJPAIR(key)->value);
+ key = SPIF_OBJ(SPIF_OBJPAIR(key)->key);
+ }
+ for (current = self->head; current; current = current->next) {
+ if (SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(current->data, key))) {
+ break;
+ }
+ }
+
+ if (SPIF_DLINKED_LIST_ITEM_ISNULL(current)) {
+ spif_dlinked_list_insert(self, SPIF_OBJ(spif_objpair_new_from_both(key,
value)));
+ return FALSE;
+ } else {
+ spif_objpair_set_value(SPIF_OBJPAIR(current->data), SPIF_OBJ_DUP(value));
+ return TRUE;
+ }
+}
+
static spif_obj_t *
spif_dlinked_list_to_array(spif_dlinked_list_t self)
{
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/mem.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- mem.c 3 Feb 2004 23:16:59 -0000 1.19
+++ mem.c 10 Mar 2004 22:50:21 -0000 1.20
@@ -28,11 +28,11 @@
* This file contains the memory management subsystem.
*
* @author Michael Jennings <[EMAIL PROTECTED]>
- * $Revision: 1.19 $
- * $Date: 2004/02/03 23:16:59 $
+ * $Revision: 1.20 $
+ * $Date: 2004/03/10 22:50:21 $
*/
-static const char cvs_ident[] = "$Id: mem.c,v 1.19 2004/02/03 23:16:59 mej Exp $";
+static const char cvs_ident[] = "$Id: mem.c,v 1.20 2004/03/10 22:50:21 mej Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -466,7 +466,10 @@
D_MEM(("Variable %s (%10p -> %lu) at %s:%lu\n", var, ptr, (unsigned long) size,
NONULL(filename), line));
if (ptr == NULL) {
- temp = (void *) spifmem_malloc(__FILE__, __LINE__, size);
+ temp = (void *) spifmem_malloc(filename, line, size);
+ } else if (size == 0) {
+ spifmem_free(var, filename, line, ptr);
+ temp = NULL;
} else {
temp = (void *) realloc(ptr, size);
ASSERT_RVAL(!SPIF_PTR_ISNULL(temp), SPIF_NULL_TYPE(ptr));
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs