| @@ -22,6 +22,14 @@ | |||||
| # include <strings.h> | # include <strings.h> | ||||
| #endif /* HAVE_STRINGS_H */ | #endif /* HAVE_STRINGS_H */ | ||||
| #if SIZEOF_SIZE_T == SIZEOF_INT | |||||
| #define SIZE_T_MAX UINT_MAX | |||||
| #elif SIZEOF_SIZE_T == SIZEOF_LONG | |||||
| #define SIZE_T_MAX ULONG_MAX | |||||
| #else | |||||
| #error Unable to determine size of size_t | |||||
| #endif | |||||
| #include "arraylist.h" | #include "arraylist.h" | ||||
| struct array_list* | struct array_list* | ||||
| @@ -44,7 +52,7 @@ array_list_new(array_list_free_fn *free_fn) | |||||
| extern void | extern void | ||||
| array_list_free(struct array_list *arr) | array_list_free(struct array_list *arr) | ||||
| { | { | ||||
| int i; | |||||
| size_t i; | |||||
| for(i = 0; i < arr->length; i++) | for(i = 0; i < arr->length; i++) | ||||
| if(arr->array[i]) arr->free_fn(arr->array[i]); | if(arr->array[i]) arr->free_fn(arr->array[i]); | ||||
| free(arr->array); | free(arr->array); | ||||
| @@ -52,20 +60,20 @@ array_list_free(struct array_list *arr) | |||||
| } | } | ||||
| void* | void* | ||||
| array_list_get_idx(struct array_list *arr, int i) | |||||
| array_list_get_idx(struct array_list *arr, size_t i) | |||||
| { | { | ||||
| if(i >= arr->length) return NULL; | if(i >= arr->length) return NULL; | ||||
| return arr->array[i]; | return arr->array[i]; | ||||
| } | } | ||||
| static int array_list_expand_internal(struct array_list *arr, int max) | |||||
| static int array_list_expand_internal(struct array_list *arr, size_t max) | |||||
| { | { | ||||
| void *t; | void *t; | ||||
| int new_size; | |||||
| size_t new_size; | |||||
| if(max < arr->size) return 0; | if(max < arr->size) return 0; | ||||
| /* Avoid undefined behaviour on int32 overflow */ | |||||
| if( arr->size >= INT_MAX / 2 ) | |||||
| /* Avoid undefined behaviour on size_t overflow */ | |||||
| if( arr->size >= SIZE_T_MAX / 2 ) | |||||
| new_size = max; | new_size = max; | ||||
| else | else | ||||
| { | { | ||||
| @@ -73,8 +81,8 @@ static int array_list_expand_internal(struct array_list *arr, int max) | |||||
| if (new_size < max) | if (new_size < max) | ||||
| new_size = max; | new_size = max; | ||||
| } | } | ||||
| if((size_t)new_size > (~((size_t)0)) / sizeof(void*)) return -1; | |||||
| if(!(t = realloc(arr->array, ((size_t)new_size)*sizeof(void*)))) return -1; | |||||
| if (new_size > (~((size_t)0)) / sizeof(void*)) return -1; | |||||
| if (!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1; | |||||
| arr->array = (void**)t; | arr->array = (void**)t; | ||||
| (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); | (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); | ||||
| arr->size = new_size; | arr->size = new_size; | ||||
| @@ -82,9 +90,9 @@ static int array_list_expand_internal(struct array_list *arr, int max) | |||||
| } | } | ||||
| int | int | ||||
| array_list_put_idx(struct array_list *arr, int idx, void *data) | |||||
| array_list_put_idx(struct array_list *arr, size_t idx, void *data) | |||||
| { | { | ||||
| if( idx < 0 || idx > INT_MAX - 1 ) return -1; | |||||
| if (idx > SIZE_T_MAX - 1 ) return -1; | |||||
| if(array_list_expand_internal(arr, idx+1)) return -1; | if(array_list_expand_internal(arr, idx+1)) return -1; | ||||
| if(arr->array[idx]) arr->free_fn(arr->array[idx]); | if(arr->array[idx]) arr->free_fn(arr->array[idx]); | ||||
| arr->array[idx] = data; | arr->array[idx] = data; | ||||
| @@ -111,16 +119,16 @@ void* array_list_bsearch(const void **key, struct array_list *arr, | |||||
| sort_fn); | sort_fn); | ||||
| } | } | ||||
| int | |||||
| size_t | |||||
| array_list_length(struct array_list *arr) | array_list_length(struct array_list *arr) | ||||
| { | { | ||||
| return arr->length; | return arr->length; | ||||
| } | } | ||||
| int | int | ||||
| array_list_del_idx( struct array_list *arr, int idx, int count ) | |||||
| array_list_del_idx( struct array_list *arr, size_t idx, size_t count ) | |||||
| { | { | ||||
| int i, stop; | |||||
| size_t i, stop; | |||||
| stop = idx + count; | stop = idx + count; | ||||
| if ( idx >= arr->length || stop > arr->length ) return -1; | if ( idx >= arr->length || stop > arr->length ) return -1; | ||||
| @@ -23,8 +23,8 @@ typedef void (array_list_free_fn) (void *data); | |||||
| struct array_list | struct array_list | ||||
| { | { | ||||
| void **array; | void **array; | ||||
| int length; | |||||
| int size; | |||||
| size_t length; | |||||
| size_t size; | |||||
| array_list_free_fn *free_fn; | array_list_free_fn *free_fn; | ||||
| }; | }; | ||||
| @@ -35,15 +35,15 @@ extern void | |||||
| array_list_free(struct array_list *al); | array_list_free(struct array_list *al); | ||||
| extern void* | extern void* | ||||
| array_list_get_idx(struct array_list *al, int i); | |||||
| array_list_get_idx(struct array_list *al, size_t i); | |||||
| extern int | extern int | ||||
| array_list_put_idx(struct array_list *al, int i, void *data); | |||||
| array_list_put_idx(struct array_list *al, size_t i, void *data); | |||||
| extern int | extern int | ||||
| array_list_add(struct array_list *al, void *data); | array_list_add(struct array_list *al, void *data); | ||||
| extern int | |||||
| extern size_t | |||||
| array_list_length(struct array_list *al); | array_list_length(struct array_list *al); | ||||
| extern void | extern void | ||||
| @@ -54,7 +54,7 @@ extern void* array_list_bsearch(const void **key, | |||||
| int (*sort_fn)(const void *, const void *)); | int (*sort_fn)(const void *, const void *)); | ||||
| extern int | extern int | ||||
| array_list_del_idx(struct array_list *arr, int i, int count); | |||||
| array_list_del_idx(struct array_list *arr, size_t idx, size_t count); | |||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| @@ -3,5 +3,6 @@ Autoconf Archive fetched from: | |||||
| http://gnu.mirror.iweb.com/autoconf-archive/autoconf-archive-2015.09.25.tar.xz | http://gnu.mirror.iweb.com/autoconf-archive/autoconf-archive-2015.09.25.tar.xz | ||||
| Grabbed the minimum files needed for the AX_APPEND_COMPILE_FLAGS macro. | |||||
| Grabbed the minimum files needed for the AX_APPEND_COMPILE_FLAGS and | |||||
| AX_COMPILE_CHECK_SIZEOF macros. | |||||
| @@ -0,0 +1,114 @@ | |||||
| # =========================================================================== | |||||
| # http://www.gnu.org/software/autoconf-archive/ax_compile_check_sizeof.html | |||||
| # =========================================================================== | |||||
| # | |||||
| # SYNOPSIS | |||||
| # | |||||
| # AX_COMPILE_CHECK_SIZEOF(TYPE [, HEADERS [, EXTRA_SIZES...]]) | |||||
| # | |||||
| # DESCRIPTION | |||||
| # | |||||
| # This macro checks for the size of TYPE using compile checks, not run | |||||
| # checks. You can supply extra HEADERS to look into. the check will cycle | |||||
| # through 1 2 4 8 16 and any EXTRA_SIZES the user supplies. If a match is | |||||
| # found, it will #define SIZEOF_`TYPE' to that value. Otherwise it will | |||||
| # emit a configure time error indicating the size of the type could not be | |||||
| # determined. | |||||
| # | |||||
| # The trick is that C will not allow duplicate case labels. While this is | |||||
| # valid C code: | |||||
| # | |||||
| # switch (0) case 0: case 1:; | |||||
| # | |||||
| # The following is not: | |||||
| # | |||||
| # switch (0) case 0: case 0:; | |||||
| # | |||||
| # Thus, the AC_TRY_COMPILE will fail if the currently tried size does not | |||||
| # match. | |||||
| # | |||||
| # Here is an example skeleton configure.in script, demonstrating the | |||||
| # macro's usage: | |||||
| # | |||||
| # AC_PROG_CC | |||||
| # AC_CHECK_HEADERS(stddef.h unistd.h) | |||||
| # AC_TYPE_SIZE_T | |||||
| # AC_CHECK_TYPE(ssize_t, int) | |||||
| # | |||||
| # headers='#ifdef HAVE_STDDEF_H | |||||
| # #include <stddef.h> | |||||
| # #endif | |||||
| # #ifdef HAVE_UNISTD_H | |||||
| # #include <unistd.h> | |||||
| # #endif | |||||
| # ' | |||||
| # | |||||
| # AX_COMPILE_CHECK_SIZEOF(char) | |||||
| # AX_COMPILE_CHECK_SIZEOF(short) | |||||
| # AX_COMPILE_CHECK_SIZEOF(int) | |||||
| # AX_COMPILE_CHECK_SIZEOF(long) | |||||
| # AX_COMPILE_CHECK_SIZEOF(unsigned char *) | |||||
| # AX_COMPILE_CHECK_SIZEOF(void *) | |||||
| # AX_COMPILE_CHECK_SIZEOF(size_t, $headers) | |||||
| # AX_COMPILE_CHECK_SIZEOF(ssize_t, $headers) | |||||
| # AX_COMPILE_CHECK_SIZEOF(ptrdiff_t, $headers) | |||||
| # AX_COMPILE_CHECK_SIZEOF(off_t, $headers) | |||||
| # | |||||
| # LICENSE | |||||
| # | |||||
| # Copyright (c) 2008 Kaveh Ghazi <ghazi@caip.rutgers.edu> | |||||
| # | |||||
| # This program is free software: you can redistribute it and/or modify it | |||||
| # under the terms of the GNU General Public License as published by the | |||||
| # Free Software Foundation, either version 3 of the License, or (at your | |||||
| # option) any later version. | |||||
| # | |||||
| # This program is distributed in the hope that it will be useful, but | |||||
| # WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | |||||
| # Public License for more details. | |||||
| # | |||||
| # You should have received a copy of the GNU General Public License along | |||||
| # with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
| # | |||||
| # As a special exception, the respective Autoconf Macro's copyright owner | |||||
| # gives unlimited permission to copy, distribute and modify the configure | |||||
| # scripts that are the output of Autoconf when processing the Macro. You | |||||
| # need not follow the terms of the GNU General Public License when using | |||||
| # or distributing such scripts, even though portions of the text of the | |||||
| # Macro appear in them. The GNU General Public License (GPL) does govern | |||||
| # all other use of the material that constitutes the Autoconf Macro. | |||||
| # | |||||
| # This special exception to the GPL applies to versions of the Autoconf | |||||
| # Macro released by the Autoconf Archive. When you make and distribute a | |||||
| # modified version of the Autoconf Macro, you may extend this special | |||||
| # exception to the GPL to apply to your modified version as well. | |||||
| #serial 5 | |||||
| AU_ALIAS([AC_COMPILE_CHECK_SIZEOF], [AX_COMPILE_CHECK_SIZEOF]) | |||||
| AC_DEFUN([AX_COMPILE_CHECK_SIZEOF], | |||||
| [changequote(<<, >>)dnl | |||||
| dnl The name to #define. | |||||
| define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl | |||||
| dnl The cache variable name. | |||||
| define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl | |||||
| changequote([, ])dnl | |||||
| AC_MSG_CHECKING(size of $1) | |||||
| AC_CACHE_VAL(AC_CV_NAME, | |||||
| [for ac_size in 4 8 1 2 16 $3 ; do # List sizes in rough order of prevalence. | |||||
| AC_TRY_COMPILE([#include "confdefs.h" | |||||
| #include <sys/types.h> | |||||
| $2 | |||||
| ], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) | |||||
| if test x$AC_CV_NAME != x ; then break; fi | |||||
| done | |||||
| ]) | |||||
| if test x$AC_CV_NAME = x ; then | |||||
| AC_MSG_ERROR([cannot determine a size for $1]) | |||||
| fi | |||||
| AC_MSG_RESULT($AC_CV_NAME) | |||||
| AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) | |||||
| undefine([AC_TYPE_NAME])dnl | |||||
| undefine([AC_CV_NAME])dnl | |||||
| ]) | |||||
| @@ -107,6 +107,10 @@ AX_APPEND_COMPILE_FLAGS([-Wall -Werror -Wno-error=deprecated-declarations]) | |||||
| AX_APPEND_COMPILE_FLAGS([-Wextra -Wwrite-string -Wno-unused-parameter]) | AX_APPEND_COMPILE_FLAGS([-Wextra -Wwrite-string -Wno-unused-parameter]) | ||||
| AX_APPEND_COMPILE_FLAGS([-D_GNU_SOURCE -D_REENTRANT]) | AX_APPEND_COMPILE_FLAGS([-D_GNU_SOURCE -D_REENTRANT]) | ||||
| AX_COMPILE_CHECK_SIZEOF(int) | |||||
| AX_COMPILE_CHECK_SIZEOF(long) | |||||
| AX_COMPILE_CHECK_SIZEOF(size_t, [#include "json_inttypes.h"]) | |||||
| AC_CONFIG_FILES([ | AC_CONFIG_FILES([ | ||||
| Makefile | Makefile | ||||
| json-c.pc | json-c.pc | ||||
| @@ -879,7 +879,7 @@ static int json_object_array_to_json_string(struct json_object* jso, | |||||
| int flags) | int flags) | ||||
| { | { | ||||
| int had_children = 0; | int had_children = 0; | ||||
| int ii; | |||||
| size_t ii; | |||||
| sprintbuf(pb, "["); | sprintbuf(pb, "["); | ||||
| if (flags & JSON_C_TO_STRING_PRETTY) | if (flags & JSON_C_TO_STRING_PRETTY) | ||||
| sprintbuf(pb, "\n"); | sprintbuf(pb, "\n"); | ||||
| @@ -975,7 +975,7 @@ struct json_object* json_object_array_bsearch( | |||||
| return *result; | return *result; | ||||
| } | } | ||||
| int json_object_array_length(const struct json_object *jso) | |||||
| size_t json_object_array_length(const struct json_object *jso) | |||||
| { | { | ||||
| return array_list_length(jso->o.c_array); | return array_list_length(jso->o.c_array); | ||||
| } | } | ||||
| @@ -985,14 +985,14 @@ int json_object_array_add(struct json_object *jso,struct json_object *val) | |||||
| return array_list_add(jso->o.c_array, val); | return array_list_add(jso->o.c_array, val); | ||||
| } | } | ||||
| int json_object_array_put_idx(struct json_object *jso, int idx, | |||||
| int json_object_array_put_idx(struct json_object *jso, size_t idx, | |||||
| struct json_object *val) | struct json_object *val) | ||||
| { | { | ||||
| return array_list_put_idx(jso->o.c_array, idx, val); | return array_list_put_idx(jso->o.c_array, idx, val); | ||||
| } | } | ||||
| struct json_object* json_object_array_get_idx(const struct json_object *jso, | struct json_object* json_object_array_get_idx(const struct json_object *jso, | ||||
| int idx) | |||||
| size_t idx) | |||||
| { | { | ||||
| return (struct json_object*)array_list_get_idx(jso->o.c_array, idx); | return (struct json_object*)array_list_get_idx(jso->o.c_array, idx); | ||||
| } | } | ||||
| @@ -1000,7 +1000,7 @@ struct json_object* json_object_array_get_idx(const struct json_object *jso, | |||||
| static int json_array_equal(struct json_object* jso1, | static int json_array_equal(struct json_object* jso1, | ||||
| struct json_object* jso2) | struct json_object* jso2) | ||||
| { | { | ||||
| int len, i; | |||||
| size_t len, i; | |||||
| len = json_object_array_length(jso1); | len = json_object_array_length(jso1); | ||||
| if (len != json_object_array_length(jso2)) | if (len != json_object_array_length(jso2)) | ||||
| @@ -1079,7 +1079,7 @@ int json_object_equal(struct json_object* jso1, struct json_object* jso2) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int json_object_array_del_idx(struct json_object *jso, int idx, int count) | |||||
| int json_object_array_del_idx(struct json_object *jso, size_t idx, size_t count) | |||||
| { | { | ||||
| return array_list_del_idx(jso->o.c_array, idx, count); | return array_list_del_idx(jso->o.c_array, idx, count); | ||||
| } | } | ||||
| @@ -457,7 +457,7 @@ extern struct array_list* json_object_get_array(const struct json_object *obj); | |||||
| * @param obj the json_object instance | * @param obj the json_object instance | ||||
| * @returns an int | * @returns an int | ||||
| */ | */ | ||||
| extern int json_object_array_length(const struct json_object *obj); | |||||
| extern size_t json_object_array_length(const struct json_object *obj); | |||||
| /** Sorts the elements of jso of type json_type_array | /** Sorts the elements of jso of type json_type_array | ||||
| * | * | ||||
| @@ -515,7 +515,7 @@ extern int json_object_array_add(struct json_object *obj, | |||||
| * @param idx the index to insert the element at | * @param idx the index to insert the element at | ||||
| * @param val the json_object to be added | * @param val the json_object to be added | ||||
| */ | */ | ||||
| extern int json_object_array_put_idx(struct json_object *obj, int idx, | |||||
| extern int json_object_array_put_idx(struct json_object *obj, size_t idx, | |||||
| struct json_object *val); | struct json_object *val); | ||||
| /** Get the element at specificed index of the array (a json_object of type json_type_array) | /** Get the element at specificed index of the array (a json_object of type json_type_array) | ||||
| @@ -524,7 +524,7 @@ extern int json_object_array_put_idx(struct json_object *obj, int idx, | |||||
| * @returns the json_object at the specified index (or NULL) | * @returns the json_object at the specified index (or NULL) | ||||
| */ | */ | ||||
| extern struct json_object* json_object_array_get_idx(const struct json_object *obj, | extern struct json_object* json_object_array_get_idx(const struct json_object *obj, | ||||
| int idx); | |||||
| size_t idx); | |||||
| /** Delete an elements from a specified index in an array (a json_object of type json_type_array) | /** Delete an elements from a specified index in an array (a json_object of type json_type_array) | ||||
| * | * | ||||
| @@ -537,7 +537,7 @@ extern struct json_object* json_object_array_get_idx(const struct json_object *o | |||||
| * @param count the number of elements to delete | * @param count the number of elements to delete | ||||
| * @returns 0 if the elements were successfully deleted | * @returns 0 if the elements were successfully deleted | ||||
| */ | */ | ||||
| extern int json_object_array_del_idx(struct json_object *obj, int idx, int count); | |||||
| extern int json_object_array_del_idx(struct json_object *obj, size_t idx, size_t count); | |||||
| /* json_bool type methods */ | /* json_bool type methods */ | ||||
| @@ -53,8 +53,8 @@ void test_array_del_idx(void); | |||||
| void test_array_del_idx() | void test_array_del_idx() | ||||
| { | { | ||||
| int rc; | int rc; | ||||
| int ii; | |||||
| int orig_array_len; | |||||
| size_t ii; | |||||
| size_t orig_array_len; | |||||
| json_object *my_array; | json_object *my_array; | ||||
| #ifdef TEST_FORMATTED | #ifdef TEST_FORMATTED | ||||
| int sflags = 0; | int sflags = 0; | ||||
| @@ -105,7 +105,7 @@ void test_array_del_idx() | |||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| { | { | ||||
| json_object *my_string, *my_int, *my_object, *my_array; | json_object *my_string, *my_int, *my_object, *my_array; | ||||
| int i; | |||||
| size_t i; | |||||
| #ifdef TEST_FORMATTED | #ifdef TEST_FORMATTED | ||||
| int sflags = 0; | int sflags = 0; | ||||
| #endif | #endif | ||||