Browse Source

Merge branch 'doctaweeks-fixes-for-upstream'

tags/json-c-0.13-20171207
Eric Haszlakiewicz 9 years ago
parent
commit
f4ca1325ae
8 changed files with 160 additions and 33 deletions
  1. +21
    -13
      arraylist.c
  2. +6
    -6
      arraylist.h
  3. +2
    -1
      autoconf-archive/README.txt
  4. +114
    -0
      autoconf-archive/m4/ax_compile_check_sizeof.m4
  5. +4
    -0
      configure.ac
  6. +6
    -6
      json_object.c
  7. +4
    -4
      json_object.h
  8. +3
    -3
      tests/test1.c

+ 21
- 13
arraylist.c View File

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


+ 6
- 6
arraylist.h View File

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


+ 2
- 1
autoconf-archive/README.txt View File

@@ -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
- 0
autoconf-archive/m4/ax_compile_check_sizeof.m4 View 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
])

+ 4
- 0
configure.ac View File

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


+ 6
- 6
json_object.c View File

@@ -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);
}

+ 4
- 4
json_object.h View File

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



+ 3
- 3
tests/test1.c View File

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


Loading…
Cancel
Save