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