1. Create a new osrfListExtract function, which removes an item
authorscottmk <scottmk@9efc2488-bf62-4759-914b-345cdb29e865>
Tue, 31 Mar 2009 18:30:10 +0000 (18:30 +0000)
committerscottmk <scottmk@9efc2488-bf62-4759-914b-345cdb29e865>
Tue, 31 Mar 2009 18:30:10 +0000 (18:30 +0000)
from an osrfList without destroying it, and returns a pointer to
the item thus removed.

2. Create a new jsonObjectExtractIndex, which removes a
specified entry in a JSON_ARRAY, and returns a pointer
to it, without destroying it.

3. In osrf_json.h: Corrected an inaccurate comment about
jsonObjectRemoveIndex().  Contrary to the original comment, this
function does not shift other objects down to fill the gap.

git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1689 9efc2488-bf62-4759-914b-345cdb29e865

include/opensrf/osrf_json.h
include/opensrf/osrf_list.h
src/libopensrf/osrf_json_object.c
src/libopensrf/osrf_list.c

index 8ac7d70..0c67699 100644 (file)
@@ -284,11 +284,16 @@ jsonObject* jsonObjectGetIndex( const jsonObject* obj, unsigned long index );
  */
 unsigned long jsonObjectSetIndex(jsonObject* dest, unsigned long index, jsonObject* newObj);
 
-/* removes the object at the given index and, if more items exist,
- * re-indexes (shifts down by 1) the rest of the objects in the array
+/* removes and deallocates the object at the given index, replacing
+   it with a NULL pointer
  */
 unsigned long jsonObjectRemoveIndex(jsonObject* dest, unsigned long index);
 
+/* removes (but does not deallocate) the object at the given index,
+ * replacing it with a NULL pointer; returns a pointer to the object removed
+ */
+jsonObject* jsonObjectExtractIndex(jsonObject* dest, unsigned long index);
+
 /* removes (and deallocates) the object with key 'key' if it exists */
 unsigned long jsonObjectRemoveKey( jsonObject* dest, const char* key);
 
index aeaf357..06145b4 100644 (file)
@@ -113,6 +113,15 @@ void osrfListFree( osrfList* list );
 void* osrfListRemove( osrfList* list, unsigned int position );
 
 /**
+  Removes the list item at the given index, without freeing it
+  @param list The list
+  @param position The position of the item to remove
+  @return A pointer to the item extracted, or NULL
+  if there is nothing to extract
+ */
+void* osrfListExtract( osrfList* list, unsigned int position );
+               
+/**
   Finds the list item whose void* is the same as the one passed in
   @param list The list
   @param addr The pointer connected to the list item we're to find
index 1eddd9c..75785d7 100644 (file)
@@ -352,7 +352,7 @@ static void add_json_to_buffer( const jsonObject* obj,
                        while( (item = osrfHashIteratorNext(itr)) ) {
                                if(i++ > 0) OSRF_BUFFER_ADD_CHAR(buf, ',');
                                OSRF_BUFFER_ADD_CHAR(buf, '"');
-                buffer_append_utf8(buf, osrfHashIteratorKey(itr));
+                               buffer_append_utf8(buf, osrfHashIteratorKey(itr));
                                OSRF_BUFFER_ADD(buf, "\":");
                                add_json_to_buffer( item, buf, do_classname, second_pass );
                        }
@@ -440,6 +440,14 @@ unsigned long jsonObjectRemoveIndex(jsonObject* dest, unsigned long index) {
 }
 
 
+jsonObject* jsonObjectExtractIndex(jsonObject* dest, unsigned long index) {
+       if( dest && dest->type == JSON_ARRAY ) {
+               return osrfListExtract(dest->value.l, index);
+       } else
+               return NULL;
+}
+
+
 unsigned long jsonObjectRemoveKey( jsonObject* dest, const char* key) {
        if( dest && key && dest->type == JSON_HASH ) {
                osrfHashRemove(dest->value.h, key);
index a95691b..16090ce 100644 (file)
@@ -107,6 +107,16 @@ void* osrfListRemove( osrfList* list, unsigned int position ) {
        return olditem;
 }
 
+void* osrfListExtract( osrfList* list, unsigned int position ) {
+       if(!list || position >= list->size || position < 0) return NULL;
+
+       void* olditem = list->arrlist[position];
+       list->arrlist[position] = NULL;
+
+       if( position == list->size - 1 ) list->size--;
+       return olditem;
+}
+
 
 int osrfListFind( const osrfList* list, void* addr ) {
        if(!(list && addr)) return -1;