mirror of
https://github.com/json-c/json-c.git
synced 2026-03-22 06:29:06 +08:00
Merge branch 'doctaweeks-fixes-for-upstream'
This commit is contained in:
34
arraylist.c
34
arraylist.c
@@ -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*
|
||||
@@ -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;
|
||||
|
||||
12
arraylist.h
12
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
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
114
autoconf-archive/m4/ax_compile_check_sizeof.m4
Normal file
114
autoconf-archive/m4/ax_compile_check_sizeof.m4
Normal file
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user