]> granicus.if.org Git - json-c/commitdiff
Add new json_object_array_sort function
authorFrederik Deweerdt <frederik.deweerdt@gmail.com>
Fri, 7 Oct 2011 19:07:18 +0000 (21:07 +0200)
committerFrederik Deweerdt <frederik.deweerdt@gmail.com>
Fri, 7 Oct 2011 19:07:18 +0000 (21:07 +0200)
 - uses libc's qsort to sort the arraylist
 - add test in test1.c

arraylist.c
arraylist.h
json_object.c
json_object.h
test1.c
test1.expected

index cd04eea1cc0acf611548e717c0af5fbda0ecab62..9a673d6756bef66d848489b112b0355584f2b5a1 100644 (file)
@@ -87,6 +87,13 @@ array_list_add(struct array_list *arr, void *data)
   return array_list_put_idx(arr, arr->length, data);
 }
 
+void
+array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *))
+{
+  qsort(arr->array, arr->length, sizeof(arr->array[0]),
+       (int (*)(const void *, const void *))sort_fn);
+}
+
 int
 array_list_length(struct array_list *arr)
 {
index bc85c80bb0d6586d476dd13f44b092662de36aff..4f3113c0949de1560b70821ee209c88fc8641c9c 100644 (file)
@@ -46,6 +46,9 @@ array_list_add(struct array_list *al, void *data);
 extern int
 array_list_length(struct array_list *al);
 
+extern void
+array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
+
 #ifdef __cplusplus
 }
 #endif
index fc52f5cd70e0b3d5f43e5fc50f7dc80029cda134..482c5e3d947d1d1c7a25389a624c7fdd0fa52a2e 100644 (file)
@@ -534,6 +534,11 @@ struct array_list* json_object_get_array(struct json_object *jso)
   }
 }
 
+void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *))
+{
+  array_list_sort(jso->o.c_array, sort_fn);
+}
+
 int json_object_array_length(struct json_object *jso)
 {
   return array_list_length(jso->o.c_array);
index 9f9ca4009fffc742261ccc568e41566b2f322757..d56d12c4c38d805f55f4dca544ceae20e5378438 100644 (file)
@@ -195,6 +195,16 @@ extern struct array_list* json_object_get_array(struct json_object *obj);
  */
 extern int json_object_array_length(struct json_object *obj);
 
+/** Sorts the elements of jso of type json_type_array
+*
+* Pointers to the json_object pointers will be passed as the two arguments
+* to @sort_fn
+*
+* @param obj the json_object instance
+* @param sort_fn a sorting function
+*/
+extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
+
 /** Add an element to the end of a json_object of type json_type_array
  *
  * The reference count will *not* be incremented. This is to make adding
diff --git a/test1.c b/test1.c
index ac1b882cf992b570faec290b2e9624a8ae17b9b9..2a4daf02a2177143326e0bf4cbba1176a30f66ed 100644 (file)
--- a/test1.c
+++ b/test1.c
@@ -6,6 +6,29 @@
 
 #include "json.h"
 
+static int sort_fn (const void *j1, const void *j2)
+{
+  json_object **jso1, **jso2;
+  int i1, i2;
+
+  jso1 = j1;
+  jso2 = j2;
+  if (!*jso1 && !*jso2) {
+    return 0;
+  }
+  if (!*jso1) {
+    return -1;
+  }
+  if (!*jso2) {
+    return 1;
+  }
+
+  i1 = json_object_get_int(*jso1);
+  i2 = json_object_get_int(*jso2);
+
+  return i1 - i2;
+}
+
 int main(int argc, char **argv)
 {
   json_tokener *tok;
@@ -45,6 +68,27 @@ int main(int argc, char **argv)
   }
   printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
 
+  json_object_put(my_array);
+
+  my_array = json_object_new_array();
+  json_object_array_add(my_array, json_object_new_int(3));
+  json_object_array_add(my_array, json_object_new_int(1));
+  json_object_array_add(my_array, json_object_new_int(2));
+  json_object_array_put_idx(my_array, 4, json_object_new_int(0));
+  printf("my_array=\n");
+  for(i=0; i < json_object_array_length(my_array); i++) {
+    json_object *obj = json_object_array_get_idx(my_array, i);
+    printf("\t[%d]=%s\n", i, json_object_to_json_string(obj));
+  }
+  printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+  json_object_array_sort(my_array, sort_fn);
+  printf("my_array=\n");
+  for(i=0; i < json_object_array_length(my_array); i++) {
+    json_object *obj = json_object_array_get_idx(my_array, i);
+    printf("\t[%d]=%s\n", i, json_object_to_json_string(obj));
+  }
+  printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));    
+
   my_object = json_object_new_object();
   json_object_object_add(my_object, "abc", json_object_new_int(12));
   json_object_object_add(my_object, "foo", json_object_new_string("bar"));
index e38ef5024385b814c4c555581a4d25fcbb6fcedd..aad9af0c05d07741d6e2fb1e1b28dd4ff1342f6f 100644 (file)
@@ -13,6 +13,20 @@ my_array=
        [3]=null
        [4]=5
 my_array.to_string()=[ 1, 2, 3, null, 5 ]
+my_array=
+       [0]=3
+       [1]=1
+       [2]=2
+       [3]=null
+       [4]=0
+my_array.to_string()=[ 3, 1, 2, null, 0 ]
+my_array=
+       [0]=null
+       [1]=0
+       [2]=1
+       [3]=2
+       [4]=3
+my_array.to_string()=[ null, 0, 1, 2, 3 ]
 my_object=
        abc: 12
        foo: "bar"