diff --git a/arraylist.c b/arraylist.c index 1789ad2..0d01069 100644 --- a/arraylist.c +++ b/arraylist.c @@ -22,6 +22,14 @@ # include #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* @@ -44,7 +52,7 @@ array_list_new(array_list_free_fn *free_fn) extern void array_list_free(struct array_list *arr) { - int i; + size_t i; for(i = 0; i < arr->length; i++) if(arr->array[i]) arr->free_fn(arr->array[i]); free(arr->array); @@ -52,20 +60,20 @@ array_list_free(struct array_list *arr) } 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; 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; - int new_size; + 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, int 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; @@ -82,9 +90,9 @@ static int array_list_expand_internal(struct array_list *arr, int max) } 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(arr->array[idx]) arr->free_fn(arr->array[idx]); arr->array[idx] = data; @@ -111,16 +119,16 @@ void* array_list_bsearch(const void **key, struct array_list *arr, sort_fn); } -int +size_t array_list_length(struct array_list *arr) { return arr->length; } 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; diff --git a/arraylist.h b/arraylist.h index 9d2db5b..bc10903 100644 --- a/arraylist.h +++ b/arraylist.h @@ -23,8 +23,8 @@ typedef void (array_list_free_fn) (void *data); struct array_list { void **array; - int length; - int size; + size_t length; + size_t size; array_list_free_fn *free_fn; }; @@ -35,15 +35,15 @@ extern void array_list_free(struct array_list *al); 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 -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 array_list_add(struct array_list *al, void *data); -extern int +extern size_t array_list_length(struct array_list *al); extern void @@ -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 } diff --git a/autoconf-archive/README.txt b/autoconf-archive/README.txt index de65ae3..936582a 100644 --- a/autoconf-archive/README.txt +++ b/autoconf-archive/README.txt @@ -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. diff --git a/autoconf-archive/m4/ax_compile_check_sizeof.m4 b/autoconf-archive/m4/ax_compile_check_sizeof.m4 new file mode 100644 index 0000000..00d0bcc --- /dev/null +++ b/autoconf-archive/m4/ax_compile_check_sizeof.m4 @@ -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 +# #endif +# #ifdef HAVE_UNISTD_H +# #include +# #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 +# +# 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 . +# +# 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(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl +dnl The cache variable name. +define(<>, 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 +$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 +]) diff --git a/configure.ac b/configure.ac index ed86210..631464d 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/json_object.c b/json_object.c index 46701e7..f0d1251 100644 --- a/json_object.c +++ b/json_object.c @@ -879,7 +879,7 @@ static int json_object_array_to_json_string(struct json_object* jso, int flags) { int had_children = 0; - int ii; + size_t ii; sprintbuf(pb, "["); if (flags & JSON_C_TO_STRING_PRETTY) sprintbuf(pb, "\n"); @@ -975,7 +975,7 @@ struct json_object* json_object_array_bsearch( 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); } @@ -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); } -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) { return array_list_put_idx(jso->o.c_array, idx, val); } 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); } @@ -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); } diff --git a/json_object.h b/json_object.h index a89de44..669f8d2 100644 --- a/json_object.h +++ b/json_object.h @@ -457,7 +457,7 @@ extern struct array_list* json_object_get_array(const struct json_object *obj); * @param obj the json_object instance * @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 * @@ -515,7 +515,7 @@ extern int json_object_array_add(struct json_object *obj, * @param idx the index to insert the element at * @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); /** 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) */ 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) * @@ -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 */ diff --git a/tests/test1.c b/tests/test1.c index 2446a10..3d5b09a 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -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