| @@ -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* | ||||
| @@ -64,8 +72,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) | |||||
| size_t 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, size_t 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; | ||||
| @@ -84,7 +92,7 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) | |||||
| int | int | ||||
| array_list_put_idx(struct array_list *arr, size_t 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; | ||||
| @@ -118,9 +126,9 @@ array_list_length(struct array_list *arr) | |||||
| } | } | ||||
| 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; | ||||
| @@ -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 | ||||
| @@ -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); | ||||
| } | } | ||||
| @@ -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 | ||||