Enlightenment CVS committal
Author : mej
Project : eterm
Module : libast
Dir : eterm/libast/src
Modified Files:
array.c dlinked_list.c linked_list.c obj.c objpair.c tok.c
Log Message:
Fri Jan 30 17:55:47 2004 Michael Jennings (mej)
Working on adding assertions/requires for NULL object checks.
Also making sure list elements can be NULL so insert_at() can resize
a list.
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/array.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- array.c 24 Jan 2004 19:55:02 -0000 1.13
+++ array.c 30 Jan 2004 22:55:18 -0000 1.14
@@ -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.13 2004/01/24 19:55:02 mej Exp $";
+static const char cvs_ident[] = "$Id: array.c,v 1.14 2004/01/30 22:55:18 mej Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -151,15 +151,22 @@
spif_array_t self;
self = SPIF_ALLOC(array);
- spif_array_list_init(self);
+ if (!spif_array_list_init(self)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(array);
+ }
return self;
}
static spif_bool_t
spif_array_list_init(spif_array_t self)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS(SPIF_LISTCLASS_VAR(array)));
+ 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_LISTCLASS_VAR(array)))) {
+ return FALSE;
+ }
self->len = 0;
self->items = SPIF_NULL_TYPE_C(spif_obj_t *);
return TRUE;
@@ -171,15 +178,22 @@
spif_array_t self;
self = SPIF_ALLOC(array);
- spif_array_vector_init(self);
+ if (!spif_array_vector_init(self)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(array);
+ }
return self;
}
static spif_bool_t
spif_array_vector_init(spif_array_t self)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS(SPIF_VECTORCLASS_VAR(array)));
+ 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_VECTORCLASS_VAR(array)))) {
+ return FALSE;
+ }
self->len = 0;
self->items = SPIF_NULL_TYPE_C(spif_obj_t *);
return TRUE;
@@ -190,6 +204,7 @@
{
spif_listidx_t i;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
for (i = 0; i < self->len; i++) {
if (!SPIF_OBJ_ISNULL(self->items[i])) {
SPIF_OBJ_DEL(self->items[i]);
@@ -203,9 +218,12 @@
static spif_bool_t
spif_array_del(spif_array_t self)
{
- spif_array_done(self);
+ spif_bool_t t;
+
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
+ t = spif_array_done(self);
SPIF_DEALLOC(self);
- return TRUE;
+ return t;
}
static spif_str_t
@@ -233,7 +251,13 @@
for (i = 0; i < self->len; i++) {
spif_obj_t o = self->items[i];
sprintf(tmp, "item %d", i);
- buff = SPIF_OBJ_CALL_METHOD(o, show)(o, tmp, buff, indent + 2);
+ if (SPIF_OBJ_ISNULL(o)) {
+ char tmp2[4096];
+
+ SPIF_OBJ_SHOW_NULL(obj, tmp, buff, indent + 2, tmp2);
+ } else {
+ buff = SPIF_OBJ_CALL_METHOD(o, show)(o, tmp, buff, indent + 2);
+ }
}
}
@@ -248,12 +272,29 @@
{
spif_listidx_t i;
+ if (SPIF_ARRAY_ISNULL(self) && SPIF_ARRAY_ISNULL(other)) {
+ return SPIF_CMP_EQUAL;
+ } else if (SPIF_ARRAY_ISNULL(self)) {
+ return SPIF_CMP_LESS;
+ } else if (SPIF_ARRAY_ISNULL(other)) {
+ return SPIF_CMP_GREATER;
+ }
for (i = 0; i < self->len; i++) {
- if (!SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(self->items[i], other->items[i]))) {
- return FALSE;
+ spif_cmp_t c;
+
+ if (SPIF_OBJ_ISNULL(self->items[i]) && SPIF_OBJ_ISNULL(other->items[i])) {
+ continue;
+ } else if (SPIF_OBJ_ISNULL(self->items[i])) {
+ return SPIF_CMP_LESS;
+ } else if (SPIF_OBJ_ISNULL(other->items[i])) {
+ return SPIF_CMP_GREATER;
+ }
+ c = SPIF_OBJ_COMP(self->items[i], other->items[i]);
+ if (!SPIF_CMP_IS_EQUAL(c)) {
+ return c;
}
}
- return TRUE;
+ return SPIF_CMP_EQUAL;
}
static spif_array_t
@@ -262,7 +303,10 @@
spif_array_t tmp;
spif_listidx_t i;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(array));
+
tmp = spif_array_list_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++) {
@@ -277,7 +321,10 @@
spif_array_t tmp;
spif_listidx_t i;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(array));
+
tmp = spif_array_vector_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++) {
@@ -289,12 +336,14 @@
static spif_classname_t
spif_array_type(spif_array_t self)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(classname));
return SPIF_OBJ_CLASSNAME(self);
}
static spif_bool_t
spif_array_append(spif_array_t self, spif_obj_t obj)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
self->len++;
if (self->items) {
self->items = SPIF_CAST_C(spif_obj_t *) REALLOC(self->items,
SPIF_SIZEOF_TYPE(obj) * self->len);
@@ -308,18 +357,21 @@
static spif_bool_t
spif_array_list_contains(spif_array_t self, spif_obj_t obj)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
return ((SPIF_LIST_ISNULL(spif_array_list_find(self, obj))) ? (FALSE) : (TRUE));
}
static spif_bool_t
spif_array_vector_contains(spif_array_t self, spif_obj_t obj)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
return ((SPIF_VECTOR_ISNULL(spif_array_vector_find(self, obj))) ? (FALSE) :
(TRUE));
}
static spif_listidx_t
spif_array_count(spif_array_t self)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(listidx));
return self->len;
}
@@ -328,7 +380,12 @@
{
spif_listidx_t i;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(obj), SPIF_NULL_TYPE(obj));
for (i = 0; i < self->len; i++) {
+ if (SPIF_OBJ_ISNULL(self->items[i])) {
+ continue;
+ }
if (SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(self->items[i], obj))) {
return self->items[i];
}
@@ -342,9 +399,10 @@
spif_listidx_t start, end, mid;
spif_cmp_t diff;
- if (self->len == 0) {
- return SPIF_NULL_TYPE(obj);
- }
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(obj), 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], obj);
@@ -354,7 +412,7 @@
start = mid + 1;
} else {
end = mid - 1;
- if (end == (spif_listidx_t) -1) {
+ if (end == SPIF_CAST(listidx) -1) {
break;
}
}
@@ -365,7 +423,11 @@
static spif_obj_t
spif_array_get(spif_array_t self, spif_listidx_t idx)
{
- return ((idx < self->len) ? (self->items[idx]) : (SPIF_NULL_TYPE(obj)));
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(obj));
+ if (idx < 0) {
+ idx += self->len;
+ }
+ return (((idx > 0) && (idx < self->len)) ? (self->items[idx]) :
(SPIF_NULL_TYPE(obj)));
}
static spif_listidx_t
@@ -373,12 +435,19 @@
{
spif_listidx_t i;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_CAST(listidx) -1);
for (i = 0; i < self->len; i++) {
+ if (SPIF_OBJ_ISNULL(self->items[i])) {
+ if (SPIF_OBJ_ISNULL(obj)) {
+ return i;
+ }
+ continue;
+ }
if (SPIF_CMP_IS_EQUAL(SPIF_OBJ_COMP(self->items[i], obj))) {
return i;
}
}
- return SPIF_CAST_C(spif_listidx_t) (-1);
+ return SPIF_CAST(listidx) (-1);
}
static spif_bool_t
@@ -386,6 +455,8 @@
{
spif_listidx_t i, left;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(obj), FALSE);
if (self->items) {
self->items = SPIF_CAST_C(spif_obj_t *) REALLOC(self->items,
SPIF_SIZEOF_TYPE(obj) * (self->len + 1));
} else {
@@ -407,7 +478,21 @@
{
spif_listidx_t left;
- left = self->len - idx;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(obj), FALSE);
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL((idx + 1) >= 0, FALSE);
+
+ if (idx > self->len) {
+ /* The array is going to grow by more than 1; we'll need to pad with NULL's.
*/
+ left = -(idx - self->len);
+ self->len = idx;
+ } else {
+ left = self->len - idx;
+ }
if (self->items) {
self->items = SPIF_CAST_C(spif_obj_t *) REALLOC(self->items,
SPIF_SIZEOF_TYPE(obj) * (self->len + 1));
@@ -415,8 +500,13 @@
self->items = SPIF_CAST_C(spif_obj_t *) MALLOC(SPIF_SIZEOF_TYPE(obj) *
(self->len + 1));
}
- if (left) {
+ if (left > 0) {
+ /* Move the stuff to the right of idx over one. */
memmove(self->items + idx + 1, self->items + idx, SPIF_SIZEOF_TYPE(obj) *
left);
+ } else if (left < 0) {
+ /* NULL out the new gap in the list. */
+ left = -left;
+ MEMSET(self->items + (idx - left), 0, SPIF_SIZEOF_TYPE(obj) * left);
}
self->items[idx] = obj;
self->len++;
@@ -426,12 +516,15 @@
static spif_iterator_t
spif_array_iterator(spif_array_t self)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(iterator));
return SPIF_CAST(iterator) spif_array_iterator_new(self);
}
static spif_bool_t
spif_array_prepend(spif_array_t self, spif_obj_t obj)
{
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
+ REQUIRE_RVAL(!SPIF_OBJ_ISNULL(obj), FALSE);
if (self->items) {
self->items = SPIF_CAST_C(spif_obj_t *) REALLOC(self->items,
SPIF_SIZEOF_TYPE(obj) * (self->len + 1));
} else {
@@ -450,6 +543,8 @@
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(item,
self->items[i])); i++);
if (i == self->len) {
return SPIF_NULL_TYPE(obj);
@@ -469,7 +564,12 @@
spif_obj_t tmp;
spif_listidx_t left;
- if (idx >= self->len) {
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE(obj));
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ if ((idx < 0) || (idx >= self->len)) {
return SPIF_NULL_TYPE(obj);
}
@@ -486,6 +586,7 @@
{
spif_listidx_t i, j;
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), FALSE);
for (i = 0, j = self->len - 1; i < j; i++, j--) {
BINSWAP(self->items[i], self->items[j]);
}
@@ -498,9 +599,10 @@
spif_obj_t *tmp;
spif_listidx_t i;
- tmp = SPIF_CAST_C(spif_obj_t *) MALLOC(SPIF_SIZEOF_TYPE(obj) * self->len);
+ ASSERT_RVAL(!SPIF_ARRAY_ISNULL(self), SPIF_NULL_TYPE_PTR(obj));
+ tmp = SPIF_CAST_PTR(obj) MALLOC(SPIF_SIZEOF_TYPE(obj) * self->len);
for (i = 0; i < self->len; i++) {
- tmp[i] = SPIF_CAST(obj) SPIF_OBJ(self->items[i]);
+ tmp[i] = SPIF_OBJ(self->items[i]);
}
return tmp;
}
@@ -511,15 +613,22 @@
spif_array_iterator_t self;
self = SPIF_ALLOC(array_iterator);
- spif_array_iterator_init(self, subject);
+ if (!spif_array_iterator_init(self, subject)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(array_iterator);
+ }
return self;
}
static spif_bool_t
spif_array_iterator_init(spif_array_iterator_t self, spif_array_t subject)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS(SPIF_ITERATORCLASS_VAR(array)));
+ ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), FALSE);
+ if (!spif_obj_init(SPIF_OBJ(self))) {
+ return FALSE;
+ } else if (!spif_obj_set_class(SPIF_OBJ(self),
SPIF_CLASS(SPIF_ITERATORCLASS_VAR(array)))) {
+ return FALSE;
+ }
self->subject = subject;
self->current_index = 0;
return TRUE;
@@ -528,6 +637,7 @@
static spif_bool_t
spif_array_iterator_done(spif_array_iterator_t self)
{
+ ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), FALSE);
self->subject = SPIF_NULL_TYPE(array);
self->current_index = 0;
return TRUE;
@@ -536,9 +646,12 @@
static spif_bool_t
spif_array_iterator_del(spif_array_iterator_t self)
{
- spif_array_iterator_done(self);
+ spif_bool_t t;
+
+ ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), FALSE);
+ t = spif_array_iterator_done(self);
SPIF_DEALLOC(self);
- return TRUE;
+ return t;
}
static spif_str_t
@@ -574,7 +687,21 @@
static spif_cmp_t
spif_array_iterator_comp(spif_array_iterator_t self, spif_array_iterator_t other)
{
- return SPIF_CMP_FROM_INT((int) (self->current_index - other->current_index));
+ spif_cmp_t c;
+
+ if (SPIF_ITERATOR_ISNULL(self) && SPIF_ITERATOR_ISNULL(other)) {
+ return SPIF_CMP_EQUAL;
+ } else if (SPIF_ITERATOR_ISNULL(self)) {
+ return SPIF_CMP_LESS;
+ } else if (SPIF_ITERATOR_ISNULL(other)) {
+ return SPIF_CMP_GREATER;
+ }
+ c = spif_array_comp(self->subject, other->subject);
+ if (SPIF_CMP_IS_EQUAL(c)) {
+ return SPIF_CMP_FROM_INT((int) (self->current_index - other->current_index));
+ } else {
+ return c;
+ }
}
static spif_array_iterator_t
@@ -582,6 +709,7 @@
{
spif_array_iterator_t tmp;
+ ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), SPIF_NULL_TYPE(array_iterator));
tmp = spif_array_iterator_new(self->subject);
tmp->current_index = self->current_index;
return tmp;
@@ -590,6 +718,7 @@
static spif_classname_t
spif_array_iterator_type(spif_array_iterator_t self)
{
+ ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), SPIF_NULL_TYPE(classname));
return SPIF_OBJ_CLASSNAME(self);
}
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/dlinked_list.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- dlinked_list.c 24 Jan 2004 19:55:23 -0000 1.15
+++ dlinked_list.c 30 Jan 2004 22:55:18 -0000 1.16
@@ -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.15 2004/01/24 19:55:23 mej
Exp $";
+static const char cvs_ident[] = "$Id: dlinked_list.c,v 1.16 2004/01/30 22:55:18 mej
Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -495,9 +495,14 @@
spif_listidx_t i;
spif_dlinked_list_item_t current;
- if (idx >= self->len) {
- return SPIF_NULL_TYPE(obj);
- } else if (idx > (self->len / 2)) {
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL(idx >= 0, SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(idx < self->len, SPIF_NULL_TYPE(obj));
+
+ if (idx > (self->len / 2)) {
for (current = self->tail, i = self->len - 1; current && i > idx; i--,
current = current->prev);
return (current ? (current->data) : SPIF_NULL_TYPE(obj));
} else {
@@ -553,10 +558,21 @@
spif_listidx_t i;
spif_dlinked_list_item_t item, current;
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL((idx + 1) >= 0, FALSE);
+
if (idx == 0 || SPIF_DLINKED_LIST_ITEM_ISNULL(self->head)) {
return spif_dlinked_list_prepend(self, obj);
} else if (idx == (self->len - 1) || SPIF_DLINKED_LIST_ITEM_ISNULL(self->tail)) {
return spif_dlinked_list_append(self, obj);
+ } else if (idx > self->len) {
+ for (i = self->len; i < idx; i++) {
+ spif_dlinked_list_append(self, SPIF_NULL_TYPE(obj));
+ }
+ return spif_dlinked_list_append(self, obj);
} else if (idx > (self->len / 2)) {
for (current = self->tail, i = self->len - 1; current->prev && i > idx; i--,
current = current->prev);
if (i != idx) {
@@ -652,6 +668,13 @@
return SPIF_NULL_TYPE(obj);
}
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL(idx >= 0, SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(idx < self->len, SPIF_NULL_TYPE(obj));
+
if (idx > (self->len / 2)) {
for (current = self->tail, i = self->len - 1; current && i > idx; i--,
current = current->prev);
} else {
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/linked_list.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- linked_list.c 24 Jan 2004 19:55:40 -0000 1.18
+++ linked_list.c 30 Jan 2004 22:55:19 -0000 1.19
@@ -21,7 +21,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-static const char cvs_ident[] = "$Id: linked_list.c,v 1.18 2004/01/24 19:55:40 mej
Exp $";
+static const char cvs_ident[] = "$Id: linked_list.c,v 1.19 2004/01/30 22:55:19 mej
Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -483,6 +483,12 @@
spif_listidx_t i;
spif_linked_list_item_t current;
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL(idx >= 0, SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(idx < self->len, SPIF_NULL_TYPE(obj));
for (current = self->head, i = 0; current && i < idx; i++, current =
current->next);
return (current ? (current->data) : SPIF_NULL_TYPE(obj));
}
@@ -527,21 +533,28 @@
spif_listidx_t i;
spif_linked_list_item_t item, current;
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL((idx + 1) >= 0, FALSE);
+
if (idx == 0 || SPIF_LINKED_LIST_ITEM_ISNULL(self->head)) {
return spif_linked_list_prepend(self, obj);
}
for (current = self->head, i = 1; current->next && i < idx; i++, current =
current->next);
- if (i == idx) {
- item = spif_linked_list_item_new();
- spif_linked_list_item_set_data(item, obj);
-
- item->next = current->next;
- current->next = item;
+ for (; i < idx; i++, current = current->next) {
+ current->next = spif_linked_list_item_new();
self->len++;
- return TRUE;
- } else {
- return FALSE;
}
+
+ item = spif_linked_list_item_new();
+ spif_linked_list_item_set_data(item, obj);
+
+ item->next = current->next;
+ current->next = item;
+ self->len++;
+ return TRUE;
}
static spif_iterator_t
@@ -602,6 +615,13 @@
spif_linked_list_item_t item, current;
spif_obj_t tmp;
+ if (idx < 0) {
+ /* Negative indexes go backward from the end of the list. */
+ idx += self->len;
+ }
+ REQUIRE_RVAL(idx >= 0, SPIF_NULL_TYPE(obj));
+ REQUIRE_RVAL(idx < self->len, SPIF_NULL_TYPE(obj));
+
if (SPIF_LINKED_LIST_ITEM_ISNULL(self->head)) {
return SPIF_NULL_TYPE(obj);
} else if (idx == 0) {
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/obj.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- obj.c 10 Jan 2004 21:15:17 -0000 1.22
+++ obj.c 30 Jan 2004 22:55:19 -0000 1.23
@@ -28,11 +28,11 @@
* This file contains the basic object class.
*
* @author Michael Jennings <[EMAIL PROTECTED]>
- * $Revision: 1.22 $
- * $Date: 2004/01/10 21:15:17 $
+ * $Revision: 1.23 $
+ * $Date: 2004/01/30 22:55:19 $
*/
-static const char cvs_ident[] = "$Id: obj.c,v 1.22 2004/01/10 21:15:17 mej Exp $";
+static const char cvs_ident[] = "$Id: obj.c,v 1.23 2004/01/30 22:55:19 mej Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -119,7 +119,10 @@
spif_obj_t self;
self = SPIF_ALLOC(obj);
- spif_obj_init(self);
+ if (!spif_obj_init(self)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(obj);
+ }
return self;
}
@@ -139,10 +142,13 @@
spif_bool_t
spif_obj_del(spif_obj_t self)
{
- D_OBJ(("Deleting object %010p\n", self));
- spif_obj_done(self);
+ spif_bool_t t;
+
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), FALSE);
+
+ t = spif_obj_done(self);
SPIF_DEALLOC(self);
- return TRUE;
+ return t;
}
/**
@@ -170,6 +176,7 @@
spif_bool_t
spif_obj_init(spif_obj_t self)
{
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), FALSE);
spif_obj_set_class(self, SPIF_CLASS_VAR(obj));
return TRUE;
}
@@ -189,7 +196,7 @@
spif_bool_t
spif_obj_done(spif_obj_t self)
{
- USE_VAR(self);
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), FALSE);
return TRUE;
}
@@ -301,6 +308,7 @@
{
spif_obj_t tmp;
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), SPIF_NULL_TYPE(obj));
tmp = spif_obj_new();
memcpy(tmp, self, SPIF_SIZEOF_TYPE(obj));
return tmp;
@@ -323,6 +331,7 @@
spif_classname_t
spif_obj_type(spif_obj_t self)
{
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), SPIF_NULL_TYPE(classname));
return SPIF_OBJ_CLASSNAME(self);
}
@@ -349,7 +358,8 @@
spif_class_t
spif_obj_get_class(spif_obj_t self)
{
- return ((self) ? SPIF_OBJ_CLASS(self) : SPIF_NULL_TYPE(class));
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), SPIF_NULL_TYPE(class));
+ return SPIF_OBJ_CLASS(self);
}
/**
@@ -376,9 +386,7 @@
spif_bool_t
spif_obj_set_class(spif_obj_t self, spif_class_t cls)
{
- if (SPIF_OBJ_ISNULL(self)) {
- return FALSE;
- }
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(self), FALSE);
SPIF_OBJ_CLASS(self) = cls;
return TRUE;
}
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/objpair.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- objpair.c 24 Jan 2004 19:56:23 -0000 1.1
+++ objpair.c 30 Jan 2004 22:55:19 -0000 1.2
@@ -28,11 +28,11 @@
* This file contains the objpair class.
*
* @author Michael Jennings <[EMAIL PROTECTED]>
- * $Revision: 1.1 $
- * $Date: 2004/01/24 19:56:23 $
+ * $Revision: 1.2 $
+ * $Date: 2004/01/30 22:55:19 $
*/
-static const char cvs_ident[] = "$Id: objpair.c,v 1.1 2004/01/24 19:56:23 mej Exp $";
+static const char cvs_ident[] = "$Id: objpair.c,v 1.2 2004/01/30 22:55:19 mej Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -124,6 +124,71 @@
}
/**
+ * Create a new @c objpair instance with a left object.
+ *
+ * This function creates and returns a new instance of an @c objpair
+ * with a given left object.
+ *
+ * @param left The left object for the pair.
+ * @return A new @c objpair instance whose left object is @a left.
+ *
+ * @see @link DOXGRP_OBJPAIR Paired Objects @endlink
+ */
+spif_objpair_t
+spif_objpair_new_from_left(spif_obj_t left)
+{
+ spif_objpair_t self;
+
+ self = SPIF_ALLOC(objpair);
+ spif_objpair_init_from_left(self, left);
+ return self;
+}
+
+/**
+ * Create a new @c objpair instance with a right object.
+ *
+ * This function creates and returns a new instance of an @c objpair
+ * with a given right object.
+ *
+ * @param right The right object for the pair.
+ * @return A new @c objpair instance whose right object is @a right.
+ *
+ * @see @link DOXGRP_OBJPAIR Paired Objects @endlink
+ */
+spif_objpair_t
+spif_objpair_new_from_right(spif_obj_t right)
+{
+ spif_objpair_t self;
+
+ self = SPIF_ALLOC(objpair);
+ spif_objpair_init_from_right(self, right);
+ return self;
+}
+
+/**
+ * Create a new @c objpair instance with both left and right objects.
+ *
+ * This function creates and returns a new instance of an @c objpair
+ * with given left and right objects.
+ *
+ * @param left The left object for the pair.
+ * @param right The right object for the pair.
+ * @return A new @c objpair instance whose left and right objects
+ * are @a left and @a right, respectively.
+ *
+ * @see @link DOXGRP_OBJPAIR Paired Objects @endlink
+ */
+spif_objpair_t
+spif_objpair_new_from_both(spif_obj_t left, spif_obj_t right)
+{
+ spif_objpair_t self;
+
+ self = SPIF_ALLOC(objpair);
+ spif_objpair_init_from_both(self, left, right);
+ return self;
+}
+
+/**
* Delete an @c objpair instance.
*
* This function deletes an instance of an @c objpair. The done method,
@@ -164,6 +229,84 @@
}
/**
+ * Initialize an @c objpair instance with a given left object.
+ *
+ * This function initializes the member variables of the @c objpair
+ * instance to their appropriate "bootstrap" values, assigning @a left
+ * to the left property of @a self.
+ *
+ * @param self The @c objpair instance to be initialized.
+ * @param left The left object for the pair.
+ * @return #TRUE if successful, #FALSE otherwise.
+ *
+ * @see @link DOXGRP_OBJPAIR Paired Objects @endlink
+ * @ingroup DOXGRP_OBJPAIR
+ */
+spif_bool_t
+spif_objpair_init_from_left(spif_objpair_t self, spif_obj_t left)
+{
+ ASSERT_RVAL(!SPIF_OBJPAIR_ISNULL(self), FALSE);
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(left), FALSE);
+ spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(objpair));
+ self->left = SPIF_OBJ_DUP(SPIF_OBJ(left));
+ self->right = SPIF_NULL_TYPE(obj);
+ return TRUE;
+}
+
+/**
+ * Initialize an @c objpair instance with a given right object.
+ *
+ * This function initializes the member variables of the @c objpair
+ * instance to their appropriate "bootstrap" values, assigning @a right
+ * to the right property of @a self.
+ *
+ * @param self The @c objpair instance to be initialized.
+ * @param right The right object for the pair.
+ * @return #TRUE if successful, #FALSE otherwise.
+ *
+ * @see @link DOXGRP_OBJPAIR Paired Objects @endlink
+ * @ingroup DOXGRP_OBJPAIR
+ */
+spif_bool_t
+spif_objpair_init_from_right(spif_objpair_t self, spif_obj_t right)
+{
+ ASSERT_RVAL(!SPIF_OBJPAIR_ISNULL(self), FALSE);
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(right), FALSE);
+ spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(objpair));
+ self->left = SPIF_NULL_TYPE(obj);
+ self->right = SPIF_OBJ_DUP(SPIF_OBJ(right));
+ return TRUE;
+}
+
+/**
+ * Initialize an @c objpair instance with both left and right
+ * objects.
+ *
+ * This function initializes the member variables of the @c objpair
+ * instance to their appropriate "bootstrap" values, assigning @a left
+ * to the left property of @self and @a right to the right property.
+ *
+ * @param self The @c objpair instance to be initialized.
+ * @param left The left object for the pair.
+ * @param right The right object for the pair.
+ * @return #TRUE if successful, #FALSE otherwise.
+ *
+ * @see @link DOXGRP_OBJPAIR Paired Objects @endlink
+ * @ingroup DOXGRP_OBJPAIR
+ */
+spif_bool_t
+spif_objpair_init_from_both(spif_objpair_t self, spif_obj_t left, spif_obj_t right)
+{
+ ASSERT_RVAL(!SPIF_OBJPAIR_ISNULL(self), FALSE);
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(left), FALSE);
+ ASSERT_RVAL(!SPIF_OBJ_ISNULL(right), FALSE);
+ spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(objpair));
+ self->left = SPIF_OBJ_DUP(SPIF_OBJ(left));
+ self->right = SPIF_OBJ_DUP(SPIF_OBJ(right));
+ return TRUE;
+}
+
+/**
* Deallocate and reinitialize @c objpair resources.
*
* This function frees up any object resources and re-initializes them
@@ -178,7 +321,16 @@
spif_bool_t
spif_objpair_done(spif_objpair_t self)
{
- USE_VAR(self);
+ ASSERT_RVAL(!SPIF_OBJPAIR_ISNULL(self), FALSE);
+ if (!SPIF_OBJ_ISNULL(SPIF_OBJ(self->left))) {
+ SPIF_OBJ_DEL(SPIF_OBJ(self->left));
+ }
+ self->left = SPIF_NULL_TYPE(obj);
+ if (!SPIF_OBJ_ISNULL(SPIF_OBJ(self->right))) {
+ SPIF_OBJ_DEL(SPIF_OBJ(self->right));
+ }
+ self->right = SPIF_NULL_TYPE(obj);
+
return TRUE;
}
@@ -234,7 +386,13 @@
spif_cmp_t
spif_objpair_comp(spif_objpair_t self, spif_objpair_t other)
{
- return (self == other);
+ spif_cmp_t c;
+
+ c = SPIF_OBJ_COMP(self->left, other->left);
+ if (SPIF_CMP_IS_EQUAL(c)) {
+ c = SPIF_OBJ_COMP(self->right, other->right);
+ }
+ return c;
}
/**
@@ -253,11 +411,7 @@
spif_objpair_t
spif_objpair_dup(spif_objpair_t self)
{
- spif_objpair_t tmp;
-
- tmp = spif_objpair_new();
- memcpy(tmp, self, SPIF_SIZEOF_TYPE(objpair));
- return tmp;
+ return spif_objpair_new_from_both(self->left, self->right);
}
/**
@@ -275,7 +429,7 @@
spif_classname_t
spif_objpair_type(spif_objpair_t self)
{
- return SPIF_OBJ_CLASSNAME(self);
+ return SPIF_OBJ_CLASSNAME(SPIF_OBJ(self));
}
SPIF_DEFINE_PROPERTY_FUNC(objpair, obj, left);
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/tok.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- tok.c 10 Jan 2004 21:15:17 -0000 1.18
+++ tok.c 30 Jan 2004 22:55:19 -0000 1.19
@@ -21,7 +21,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-static const char cvs_ident[] = "$Id: tok.c,v 1.18 2004/01/10 21:15:17 mej Exp $";
+static const char cvs_ident[] = "$Id: tok.c,v 1.19 2004/01/30 22:55:19 mej Exp $";
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -50,7 +50,10 @@
spif_tok_t self;
self = SPIF_ALLOC(tok);
- spif_tok_init(self);
+ if (!spif_tok_init(self)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(tok);
+ }
return self;
}
@@ -60,7 +63,10 @@
spif_tok_t self;
self = SPIF_ALLOC(tok);
- spif_tok_init_from_ptr(self, old);
+ if (!spif_tok_init_from_ptr(self, old)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(tok);
+ }
return self;
}
@@ -70,7 +76,10 @@
spif_tok_t self;
self = SPIF_ALLOC(tok);
- spif_tok_init_from_fp(self, fp);
+ if (!spif_tok_init_from_fp(self, fp)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(tok);
+ }
return self;
}
@@ -80,23 +89,33 @@
spif_tok_t self;
self = SPIF_ALLOC(tok);
- spif_tok_init_from_fd(self, fd);
+ if (!spif_tok_init_from_fd(self, fd)) {
+ SPIF_DEALLOC(self);
+ self = SPIF_NULL_TYPE(tok);
+ }
return self;
}
spif_bool_t
spif_tok_del(spif_tok_t self)
{
- spif_tok_done(self);
+ spif_bool_t t;
+
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
+ t = spif_tok_done(self);
SPIF_DEALLOC(self);
- return TRUE;
+ return t;
}
spif_bool_t
spif_tok_init(spif_tok_t self)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok));
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
+ if (!spif_obj_init(SPIF_OBJ(self))) {
+ return FALSE;
+ } else if (!spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok))) {
+ return FALSE;
+ }
self->src = SPIF_NULL_TYPE(str);
self->quote = '\'';
self->dquote = '\"';
@@ -109,48 +128,61 @@
spif_bool_t
spif_tok_init_from_ptr(spif_tok_t self, spif_charptr_t old)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok));
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
+ if (!spif_obj_init(SPIF_OBJ(self))) {
+ return FALSE;
+ } else if (!spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok))) {
+ return FALSE;
+ }
self->src = spif_str_new_from_ptr(old);
self->quote = '\'';
self->dquote = '\"';
self->escape = '\\';
self->tokens = SPIF_NULL_TYPE(list);
self->sep = SPIF_NULL_TYPE(str);
- return TRUE;
+ return ((SPIF_STR_ISNULL(self->src)) ? (FALSE) : (TRUE));
}
spif_bool_t
spif_tok_init_from_fp(spif_tok_t self, FILE * fp)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok));
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
+ if (!spif_obj_init(SPIF_OBJ(self))) {
+ return FALSE;
+ } else if (!spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok))) {
+ return FALSE;
+ }
self->src = spif_str_new_from_fp(fp);
self->quote = '\'';
self->dquote = '\"';
self->escape = '\\';
self->tokens = SPIF_NULL_TYPE(list);
self->sep = SPIF_NULL_TYPE(str);
- return TRUE;
+ return ((SPIF_STR_ISNULL(self->src)) ? (FALSE) : (TRUE));
}
spif_bool_t
spif_tok_init_from_fd(spif_tok_t self, int fd)
{
- spif_obj_init(SPIF_OBJ(self));
- spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok));
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
+ if (!spif_obj_init(SPIF_OBJ(self))) {
+ return FALSE;
+ } else if (!spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS_VAR(tok))) {
+ return FALSE;
+ }
self->src = spif_str_new_from_fd(fd);
self->quote = '\'';
self->dquote = '\"';
self->escape = '\\';
self->tokens = SPIF_NULL_TYPE(list);
self->sep = SPIF_NULL_TYPE(str);
- return TRUE;
+ return ((SPIF_STR_ISNULL(self->src)) ? (FALSE) : (TRUE));
}
spif_bool_t
spif_tok_done(spif_tok_t self)
{
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
if (!SPIF_LIST_ISNULL(self->tokens)) {
SPIF_LIST_DEL(self->tokens);
self->tokens = SPIF_NULL_TYPE(list);
@@ -169,80 +201,6 @@
return TRUE;
}
-#define IS_DELIM(c) ((delim != NULL) ? (strchr(delim, (c)) != NULL) : (isspace(c)))
-#define IS_QUOTE(c) (quote && quote == (c))
-
-spif_bool_t
-spif_tok_eval(spif_tok_t self)
-{
- const char *pstr, *delim = NULL;
- spif_str_t tmp;
- char quote;
- size_t len;
-
- if (SPIF_STR_ISNULL(self->src)) {
- return FALSE;
- }
- pstr = SPIF_CAST_C(const char *) SPIF_STR_STR(SPIF_STR(self->src));
- len = spif_str_get_len(SPIF_STR(self->src));
-
- if (!SPIF_STR_ISNULL(self->sep)) {
- delim = SPIF_CAST_C(const char *) SPIF_STR_STR(SPIF_STR(self->sep));
- }
-
- if (!SPIF_LIST_ISNULL(self->tokens)) {
- SPIF_LIST_DEL(self->tokens);
- }
- self->tokens = SPIF_LIST_NEW(dlinked_list);
-
- /* Before we do anything, skip leading "whitespace." */
- for (; *pstr && IS_DELIM(*pstr); pstr++);
-
- /* The outermost for loop is where we traverse the string. Each new
- word brings us back to the top where we resize our string list. */
- for (quote = 0; *pstr; ) {
- tmp = spif_str_new_from_buff("", len);
- spif_str_clear(tmp, 0);
-
- /* This for loop is where we process each character. */
- for (; *pstr && (quote || !IS_DELIM(*pstr));) {
- if (*pstr == self->dquote || *pstr == self->quote) {
- /* It's a quote character, so set or reset the quote variable. */
- if (quote) {
- if (quote == *pstr) {
- quote = 0;
- } else {
- /* It's a single quote inside double quotes, or vice versa.
Leave it alone. */
- spif_str_append_char(tmp, *pstr);
- }
- } else {
- quote = *pstr;
- }
- pstr++;
- } else {
- /* Handle any backslashes that are escaping delimiters or quotes. */
- if ((*pstr == self->escape) && (IS_DELIM(*(pstr + 1)) ||
IS_QUOTE(*(pstr + 1)))) {
- /* Incrementing pstr here moves us past the backslash so that the
line
- below will copy the next character to the new token, no
questions asked. */
- pstr++;
- }
- spif_str_append_char(tmp, *pstr++);
- }
- }
-
- /* Reallocate the new string to be just the right size. */
- spif_str_trim(tmp);
- len -= spif_str_get_len(tmp);
-
- /* Add it to the list */
- SPIF_LIST_APPEND(self->tokens, tmp);
-
- /* Move past any trailing "whitespace." */
- for (; *pstr && IS_DELIM(*pstr); pstr++);
- }
- return TRUE;
-}
-
spif_str_t
spif_tok_show(spif_tok_t self, spif_charptr_t name, spif_str_t buff, size_t indent)
{
@@ -286,7 +244,14 @@
spif_cmp_t
spif_tok_comp(spif_tok_t self, spif_tok_t other)
{
- return spif_str_cmp(SPIF_STR(self), SPIF_STR(other));
+ if (SPIF_TOK_ISNULL(self) && SPIF_TOK_ISNULL(other)) {
+ return SPIF_CMP_EQUAL;
+ } else if (SPIF_TOK_ISNULL(self)) {
+ return SPIF_CMP_LESS;
+ } else if (SPIF_TOK_ISNULL(other)) {
+ return SPIF_CMP_GREATER;
+ }
+ return spif_str_cmp(self->src, other->src);
}
spif_tok_t
@@ -294,6 +259,7 @@
{
spif_tok_t tmp;
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), SPIF_NULL_TYPE(tok));
tmp = spif_tok_new();
tmp->src = spif_str_dup(SPIF_STR(self->src));
tmp->quote = self->quote;
@@ -308,108 +274,87 @@
spif_classname_t
spif_tok_type(spif_tok_t self)
{
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), SPIF_NULL_TYPE(classname));
return SPIF_OBJ_CLASSNAME(self);
}
-spif_str_t
-spif_tok_get_src(spif_tok_t self)
-{
- return ((SPIF_OBJ_IS_TOK(self)) ? (SPIF_STR(self->src)) : (SPIF_NULL_TYPE(str)));
-}
+#define IS_DELIM(c) ((delim != NULL) ? (strchr(delim, (c)) != NULL) : (isspace(c)))
+#define IS_QUOTE(c) (quote && quote == (c))
spif_bool_t
-spif_tok_set_src(spif_tok_t self, spif_str_t new_src)
-{
- if (SPIF_OBJ_IS_TOK(self) && SPIF_OBJ_IS_STR(new_src)) {
- if (!SPIF_STR_ISNULL(self->src)) {
- spif_str_done(self->src);
- }
- self->src = spif_str_dup(new_src);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-spif_char_t
-spif_tok_get_quote(spif_tok_t self)
+spif_tok_eval(spif_tok_t self)
{
- return ((SPIF_OBJ_IS_TOK(self)) ? (SPIF_CAST(char) self->quote) :
(SPIF_CAST(char) 0));
-}
+ const char *pstr, *delim = NULL;
+ spif_str_t tmp;
+ char quote;
+ size_t len;
-spif_bool_t
-spif_tok_set_quote(spif_tok_t self, spif_char_t c)
-{
- if (SPIF_OBJ_IS_TOK(self)) {
- self->quote = c;
- return TRUE;
- } else {
- return FALSE;
- }
-}
+ ASSERT_RVAL(!SPIF_TOK_ISNULL(self), FALSE);
+ REQUIRE_RVAL(!SPIF_STR_ISNULL(self->src), FALSE);
-spif_char_t
-spif_tok_get_dquote(spif_tok_t self)
-{
- return ((SPIF_OBJ_IS_TOK(self)) ? (SPIF_CAST(char) self->dquote) :
(SPIF_CAST(char) 0));
-}
+ pstr = SPIF_CAST_C(const char *) SPIF_STR_STR(SPIF_STR(self->src));
+ len = spif_str_get_len(SPIF_STR(self->src));
-spif_bool_t
-spif_tok_set_dquote(spif_tok_t self, spif_char_t c)
-{
- if (SPIF_OBJ_IS_TOK(self)) {
- self->dquote = c;
- return TRUE;
- } else {
- return FALSE;
+ if (!SPIF_STR_ISNULL(self->sep)) {
+ delim = SPIF_CAST_C(const char *) SPIF_STR_STR(SPIF_STR(self->sep));
}
-}
-
-spif_char_t
-spif_tok_get_escape(spif_tok_t self)
-{
- return ((SPIF_OBJ_IS_TOK(self)) ? (SPIF_CAST(char) self->escape) :
(SPIF_CAST(char) 0));
-}
-spif_bool_t
-spif_tok_set_escape(spif_tok_t self, spif_char_t c)
-{
- if (SPIF_OBJ_IS_TOK(self)) {
- self->escape = c;
- return TRUE;
- } else {
- return FALSE;
+ if (!SPIF_LIST_ISNULL(self->tokens)) {
+ SPIF_LIST_DEL(self->tokens);
}
-}
+ self->tokens = SPIF_LIST_NEW(dlinked_list);
-spif_str_t
-spif_tok_get_sep(spif_tok_t self)
-{
- return ((SPIF_OBJ_IS_TOK(self)) ? (SPIF_STR(self->sep)) : (SPIF_NULL_TYPE(str)));
-}
+ /* Before we do anything, skip leading "whitespace." */
+ for (; *pstr && IS_DELIM(*pstr); pstr++);
-spif_bool_t
-spif_tok_set_sep(spif_tok_t self, spif_str_t new_sep)
-{
- if (SPIF_OBJ_IS_TOK(self) && SPIF_OBJ_IS_STR(new_sep)) {
- if (!SPIF_STR_ISNULL(self->sep)) {
- spif_str_done(self->sep);
+ /* The outermost for loop is where we traverse the string. Each new
+ word brings us back to the top where we resize our string list. */
+ for (quote = 0; *pstr; ) {
+ tmp = spif_str_new_from_buff("", len);
+ spif_str_clear(tmp, 0);
+
+ /* This for loop is where we process each character. */
+ for (; *pstr && (quote || !IS_DELIM(*pstr));) {
+ if (*pstr == self->dquote || *pstr == self->quote) {
+ /* It's a quote character, so set or reset the quote variable. */
+ if (quote) {
+ if (quote == *pstr) {
+ quote = 0;
+ } else {
+ /* It's a single quote inside double quotes, or vice versa.
Leave it alone. */
+ spif_str_append_char(tmp, *pstr);
+ }
+ } else {
+ quote = *pstr;
+ }
+ pstr++;
+ } else {
+ /* Handle any backslashes that are escaping delimiters or quotes. */
+ if ((*pstr == self->escape) && (IS_DELIM(*(pstr + 1)) ||
IS_QUOTE(*(pstr + 1)))) {
+ /* Incrementing pstr here moves us past the backslash so that the
line
+ below will copy the next character to the new token, no
questions asked. */
+ pstr++;
+ }
+ spif_str_append_char(tmp, *pstr++);
+ }
}
- self->sep = spif_str_dup(new_sep);
- return TRUE;
- } else {
- return FALSE;
- }
-}
-spif_list_t
-spif_tok_get_tokens(spif_tok_t self)
-{
- if (!SPIF_OBJ_IS_TOK(self)) {
- return SPIF_NULL_TYPE(list);
- }
- if (SPIF_LIST_ISNULL(self->tokens)) {
- spif_tok_eval(self);
+ /* Reallocate the new string to be just the right size. */
+ spif_str_trim(tmp);
+ len -= spif_str_get_len(tmp);
+
+ /* Add it to the list */
+ SPIF_LIST_APPEND(self->tokens, tmp);
+
+ /* Move past any trailing "whitespace." */
+ for (; *pstr && IS_DELIM(*pstr); pstr++);
}
- return self->tokens;
+ return TRUE;
}
+
+SPIF_DEFINE_PROPERTY_FUNC(tok, str, src);
+SPIF_DEFINE_PROPERTY_FUNC_NONOBJ(tok, char, quote);
+SPIF_DEFINE_PROPERTY_FUNC_NONOBJ(tok, char, dquote);
+SPIF_DEFINE_PROPERTY_FUNC_NONOBJ(tok, char, escape);
+SPIF_DEFINE_PROPERTY_FUNC(tok, str, sep);
+SPIF_DEFINE_PROPERTY_FUNC(tok, list, tokens);
-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs