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

Reply via email to