| @@ -22,6 +22,14 @@ | |||
| # include <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" | |||
| struct array_list* | |||
| @@ -64,8 +72,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) | |||
| size_t new_size; | |||
| 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; | |||
| else | |||
| { | |||
| @@ -73,8 +81,8 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) | |||
| if (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; | |||
| (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); | |||
| arr->size = new_size; | |||
| @@ -84,7 +92,7 @@ static int array_list_expand_internal(struct array_list *arr, size_t max) | |||
| int | |||
| 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(arr->array[idx]) arr->free_fn(arr->array[idx]); | |||
| arr->array[idx] = data; | |||
| @@ -118,9 +126,9 @@ array_list_length(struct array_list *arr) | |||
| } | |||
| 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; | |||
| 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 *)); | |||
| 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 | |||
| } | |||
| @@ -3,5 +3,6 @@ Autoconf Archive fetched from: | |||
| 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([-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([ | |||
| Makefile | |||
| 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, | |||
| struct json_object* jso2) | |||
| { | |||
| int len, i; | |||
| size_t len, i; | |||
| len = json_object_array_length(jso1); | |||
| 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; | |||
| } | |||
| 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); | |||
| } | |||
| @@ -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 | |||
| * @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 */ | |||
| @@ -53,8 +53,8 @@ void test_array_del_idx(void); | |||
| void test_array_del_idx() | |||
| { | |||
| int rc; | |||
| int ii; | |||
| int orig_array_len; | |||
| size_t ii; | |||
| size_t orig_array_len; | |||
| json_object *my_array; | |||
| #ifdef TEST_FORMATTED | |||
| int sflags = 0; | |||
| @@ -105,7 +105,7 @@ void test_array_del_idx() | |||
| int main(int argc, char **argv) | |||
| { | |||
| json_object *my_string, *my_int, *my_object, *my_array; | |||
| int i; | |||
| size_t i; | |||
| #ifdef TEST_FORMATTED | |||
| int sflags = 0; | |||
| #endif | |||