Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated spatter #20

Merged
merged 1 commit into from
Aug 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,517 changes: 794 additions & 723 deletions clients/spatter/json.c

Large diffs are not rendered by default.

292 changes: 164 additions & 128 deletions clients/spatter/json.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,212 +32,248 @@
#define _JSON_H

#ifndef json_char
#define json_char char
#define json_char char
#endif

#ifndef json_int_t
#ifndef _MSC_VER
#include <inttypes.h>
#define json_int_t int64_t
#else
#define json_int_t __int64
#endif
#ifndef _MSC_VER
#include <inttypes.h>
#define json_int_t int64_t
#else
#define json_int_t __int64
#endif
#endif

#include <stdlib.h>

#ifdef __cplusplus

#include <string.h>
#include <string.h>

extern "C" {
extern "C"
{

#endif

typedef struct {
unsigned long max_memory;
int settings;
typedef struct
{
unsigned long max_memory;
int settings;

/* Custom allocator support (leave null to use malloc/free)
*/
/* Custom allocator support (leave null to use malloc/free)
*/

void *(*mem_alloc)(size_t, int zero, void *user_data);
void (*mem_free)(void *, void *user_data);
void * (* mem_alloc) (size_t, int zero, void * user_data);
void (* mem_free) (void *, void * user_data);

void *user_data; /* will be passed to mem_alloc and mem_free */
void * user_data; /* will be passed to mem_alloc and mem_free */

size_t value_extra; /* how much extra space to allocate for values? */
size_t value_extra; /* how much extra space to allocate for values? */

} json_settings;

#define json_enable_comments 0x01
#define json_enable_comments 0x01

typedef enum {
json_none,
json_object,
json_array,
json_integer,
json_double,
json_string,
json_boolean,
json_null
typedef enum
{
json_none,
json_object,
json_array,
json_integer,
json_double,
json_string,
json_boolean,
json_null

} json_type;

extern const struct _json_value json_value_none;

typedef struct _json_object_entry {
json_char *name;
unsigned int name_length;
typedef struct _json_object_entry
{
json_char * name;
unsigned int name_length;

struct _json_value *value;
struct _json_value * value;

} json_object_entry;

typedef struct _json_value {
struct _json_value *parent;
typedef struct _json_value
{
struct _json_value * parent;

json_type type;
json_type type;

union {
int boolean;
json_int_t integer;
double dbl;
union
{
int boolean;
json_int_t integer;
double dbl;

struct {
unsigned int length;
json_char *ptr; /* null terminated */
struct
{
unsigned int length;
json_char * ptr; /* null terminated */

} string;
} string;

struct {
unsigned int length;
struct
{
unsigned int length;

json_object_entry *values;
json_object_entry * values;

#if defined(__cplusplus) && __cplusplus >= 201103L
decltype(values) begin() const { return values; }
decltype(values) end() const { return values + length; }
#endif
#if defined(__cplusplus) && __cplusplus >= 201103L
decltype(values) begin () const
{ return values;
}
decltype(values) end () const
{ return values + length;
}
#endif

} object;
} object;

struct {
unsigned int length;
struct _json_value **values;
struct
{
unsigned int length;
struct _json_value ** values;

#if defined(__cplusplus) && __cplusplus >= 201103L
decltype(values) begin() const { return values; }
decltype(values) end() const { return values + length; }
#endif
#if defined(__cplusplus) && __cplusplus >= 201103L
decltype(values) begin () const
{ return values;
}
decltype(values) end () const
{ return values + length;
}
#endif

} array;
} array;

} u;
} u;

union {
struct _json_value *next_alloc;
void *object_mem;
union
{
struct _json_value * next_alloc;
void * object_mem;

} _reserved;
} _reserved;

#ifdef JSON_TRACK_SOURCE
#ifdef JSON_TRACK_SOURCE

/* Location of the value in the source JSON
*/
unsigned int line, col;
/* Location of the value in the source JSON
*/
unsigned int line, col;

#endif
#endif

/* Some C++ operator sugar */
/* Some C++ operator sugar */

#ifdef __cplusplus
#ifdef __cplusplus

public:
inline _json_value() { memset(this, 0, sizeof(_json_value)); }
public:

inline const struct _json_value &operator[](int index) const {
if (type != json_array || index < 0 ||
((unsigned int)index) >= u.array.length) {
return json_value_none;
}
inline _json_value ()
{ memset (this, 0, sizeof (_json_value));
}

return *u.array.values[index];
}
inline const struct _json_value &operator [] (int index) const
{
if (type != json_array || index < 0
|| ((unsigned int) index) >= u.array.length)
{
return json_value_none;
}

inline const struct _json_value &operator[](const char *index) const {
if (type != json_object)
return json_value_none;
return *u.array.values [index];
}

for (unsigned int i = 0; i < u.object.length; ++i)
if (!strcmp(u.object.values[i].name, index))
return *u.object.values[i].value;
inline const struct _json_value &operator [] (const char * index) const
{
if (type != json_object)
return json_value_none;

return json_value_none;
}
for (unsigned int i = 0; i < u.object.length; ++ i)
if (!strcmp (u.object.values [i].name, index))
return *u.object.values [i].value;

inline operator const char *() const {
switch (type) {
case json_string:
return u.string.ptr;
return json_value_none;
}

default:
return "";
};
}
inline operator const char * () const
{
switch (type)
{
case json_string:
return u.string.ptr;

inline operator json_int_t() const {
switch (type) {
case json_integer:
return u.integer;
default:
return "";
};
}

case json_double:
return (json_int_t)u.dbl;
inline operator json_int_t () const
{
switch (type)
{
case json_integer:
return u.integer;

default:
return 0;
};
}
case json_double:
return (json_int_t) u.dbl;

inline operator bool() const {
if (type != json_boolean)
return false;
default:
return 0;
};
}

return u.boolean != 0;
}
inline operator bool () const
{
if (type != json_boolean)
return false;

inline operator double() const {
switch (type) {
case json_integer:
return (double)u.integer;
return u.boolean != 0;
}

case json_double:
return u.dbl;
inline operator double () const
{
switch (type)
{
case json_integer:
return (double) u.integer;

default:
return 0;
};
}
case json_double:
return u.dbl;

#endif
default:
return 0;
};
}

#endif

} json_value;

json_value *json_parse(const json_char *json, size_t length);
json_value * json_parse (const json_char * json,
size_t length);

#define json_error_max 128
json_value *json_parse_ex(json_settings *settings, const json_char *json,
size_t length, char *error);
json_value * json_parse_ex (json_settings * settings,
const json_char * json,
size_t length,
char * error);

void json_value_free(json_value *);
void json_value_free (json_value *);

/* Not usually necessary, unless you used a custom mem_alloc and now want to
* use a custom mem_free.
*/
void json_value_free_ex(json_settings *settings, json_value *);
void json_value_free_ex (json_settings * settings,
json_value *);


#ifdef __cplusplus
} /* extern "C" */
} /* extern "C" */
#endif

#endif
Loading