@@ -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 | ||||