mirror of
https://github.com/json-c/json-c.git
synced 2026-03-20 13:39:06 +08:00
This is a recent regression since commit
6359b79847 which added various assert(0)
calls (often replacing return-s).
With Ming-W64 compiler, json-c build was failing with various errors of
the sort:
> /home/jehan/dev/src/json-c/json_object.c: In function 'json_object_int_inc':
> /home/jehan/dev/src/json-c/json_object.c:841:1: error: control reaches end of non-void function [-Werror=return-type]
> 841 | }
> | ^
> In file included from /home/jehan/dev/src/json-c/json_object.c:17:
> /home/jehan/dev/src/json-c/json_object.c: In function 'json_object_get_double':
> /home/jehan/.local/share/crossroad/roads/w64/json-c/include/assert.h:76:4: error: this statement may fall through [-Werror=implicit-fallthrough=]
> 76 | (_assert(#_Expression,__FILE__,__LINE__),0))
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /home/jehan/dev/src/json-c/json_object.c:1070:7: note: in expansion of macro 'assert'
> 1070 | assert(0);
> | ^~~~~~
> /home/jehan/dev/src/json-c/json_object.c:1072:3: note: here
> 1072 | case json_type_boolean:
> | ^~~~
The problem is that Mingw-w64 does not consider assert() as a noreturn
(even assert(0)), because it has to be compatible by Microsoft
libraries. See the discussion here:
https://sourceforge.net/p/mingw-w64/bugs/306/
Instead let's create a new json_abort() function which is basically just
an abort() function with an optional message, for such cases where
abortion was non-conditional (using assert() and using the assertion
condition as a message here was clearly a misuse of the function). And
mark json_abort() as 'noreturn', as well as 'cold' for optimization
purpose (this is code we expect to never run, unless there is a bug,
that is).
Finally let's use this json_abort() instead of previous misused assert()
calls.
137 lines
4.0 KiB
C
137 lines
4.0 KiB
C
/*
|
|
* $Id: json_util.h,v 1.4 2006/01/30 23:07:57 mclark Exp $
|
|
*
|
|
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
|
* Michael Clark <michael@metaparadigm.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See COPYING for details.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Miscllaneous utility functions and macros.
|
|
*/
|
|
#ifndef _json_util_h_
|
|
#define _json_util_h_
|
|
|
|
#include "json_object.h"
|
|
|
|
#ifndef json_min
|
|
#define json_min(a,b) ((a) < (b) ? (a) : (b))
|
|
#endif
|
|
|
|
#ifndef json_max
|
|
#define json_max(a,b) ((a) > (b) ? (a) : (b))
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define JSON_FILE_BUF_SIZE 4096
|
|
|
|
/* utility functions */
|
|
/**
|
|
* Read the full contents of the given file, then convert it to a
|
|
* json_object using json_tokener_parse().
|
|
*
|
|
* Returns NULL on failure. See json_util_get_last_err() for details.
|
|
*/
|
|
JSON_EXPORT struct json_object* json_object_from_file(const char *filename);
|
|
|
|
/**
|
|
* Create a JSON object from already opened file descriptor.
|
|
*
|
|
* This function can be helpful, when you opened the file already,
|
|
* e.g. when you have a temp file.
|
|
* Note, that the fd must be readable at the actual position, i.e.
|
|
* use lseek(fd, 0, SEEK_SET) before.
|
|
*
|
|
* The depth argument specifies the maximum object depth to pass to
|
|
* json_tokener_new_ex(). When depth == -1, JSON_TOKENER_DEFAULT_DEPTH
|
|
* is used instead.
|
|
*
|
|
* Returns NULL on failure. See json_util_get_last_err() for details.
|
|
*/
|
|
JSON_EXPORT struct json_object* json_object_from_fd_ex(int fd, int depth);
|
|
|
|
/**
|
|
* Create a JSON object from an already opened file descriptor, using
|
|
* the default maximum object depth. (JSON_TOKENER_DEFAULT_DEPTH)
|
|
*
|
|
* See json_object_from_fd_ex() for details.
|
|
*/
|
|
JSON_EXPORT struct json_object* json_object_from_fd(int fd);
|
|
|
|
/**
|
|
* Equivalent to:
|
|
* json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
|
|
*
|
|
* Returns -1 if something fails. See json_util_get_last_err() for details.
|
|
*/
|
|
JSON_EXPORT int json_object_to_file(const char *filename, struct json_object *obj);
|
|
|
|
/**
|
|
* Open and truncate the given file, creating it if necessary, then
|
|
* convert the json_object to a string and write it to the file.
|
|
*
|
|
* Returns -1 if something fails. See json_util_get_last_err() for details.
|
|
*/
|
|
JSON_EXPORT int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags);
|
|
|
|
/**
|
|
* Convert the json_object to a string and write it to the file descriptor.
|
|
* Handles partial writes and will keep writing until done, or an error
|
|
* occurs.
|
|
*
|
|
* @param fd an open, writable file descriptor to write to
|
|
* @param obj the object to serializer and write
|
|
* @param flags flags to pass to json_object_to_json_string_ext()
|
|
* @return -1 if something fails. See json_util_get_last_err() for details.
|
|
*/
|
|
JSON_EXPORT int json_object_to_fd(int fd, struct json_object *obj, int flags);
|
|
|
|
/**
|
|
* Return the last error from various json-c functions, including:
|
|
* json_object_to_file{,_ext}, json_object_to_fd() or
|
|
* json_object_from_{file,fd}, or NULL if there is none.
|
|
*/
|
|
JSON_EXPORT const char *json_util_get_last_err(void);
|
|
|
|
|
|
JSON_EXPORT int json_parse_int64(const char *buf, int64_t *retval);
|
|
JSON_EXPORT int json_parse_uint64(const char *buf, uint64_t *retval);
|
|
JSON_EXPORT int json_parse_double(const char *buf, double *retval);
|
|
|
|
/**
|
|
* Return a string describing the type of the object.
|
|
* e.g. "int", or "object", etc...
|
|
*/
|
|
JSON_EXPORT const char *json_type_to_name(enum json_type o_type);
|
|
|
|
#ifndef JSON_NORETURN
|
|
#if defined(_MSC_VER)
|
|
#define JSON_NORETURN __declspec(noreturn)
|
|
#else
|
|
/* 'cold' attribute is for optimization, telling the computer this code
|
|
* path is unlikely.
|
|
*/
|
|
#define JSON_NORETURN __attribute__ ((noreturn, cold))
|
|
#endif
|
|
#endif
|
|
/**
|
|
* Abort and optionally print a message on standard error.
|
|
* This should be used rather than assert() for unconditional abortion
|
|
* (in particular for code paths which are never supposed to be run).
|
|
* */
|
|
JSON_NORETURN JSON_EXPORT void json_abort(const char *message);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|