libcjsonp/example.c

178 lines
4.6 KiB
C
Raw Permalink Normal View History

2022-08-26 10:10:13 +03:00
/* This software is licensed by the MIT License, see LICENSE file */
/* Copyright © 2022 Gregory Lirent */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "modules/libcdsb/include/string.h"
#include "include/jsonp.h"
#define rfloat() (((vtype_float)rand() / (vtype_float)rand()) * ((rand()&1) ? -1 : 1))
#define rdouble() (((vtype_double)rand() / (vtype_double)rand()) * ((rand()&1) ? -1 : 1))
#define rldouble() (((vtype_ldouble)rand() / (vtype_ldouble)rand()) * ((rand()&1) ? -1 : 1))
#define rs8() ((vtype_int8)rand())
#define rs16() ((vtype_int16)rand())
#define rs32() ((vtype_int32)rand())
#define rs64() (((vtype_int64)rs32()) * ((vtype_int64)rs32()))
#define ru8() ((vtype_uint8)rand())
#define ru16() ((vtype_uint16)rand())
#define ru32() ((vtype_uint32)rand())
#define ru64() ((vtype_uint64)rs64())
static void rand_json_object(vtype_string* x, int rec);
static void rand_json_array(vtype_string* x, int rec);
static void rand_json_spaces(vtype_string* x) {
unsigned char ec = rand()%10;
for (int i = 0; i < ec; ++i) {
switch(rand()%4) {
case 0: string_concat(x, ' '); break;
case 1: string_concat(x, '\t'); break;
case 2: string_concat(x, '\r'); break;
case 3: string_concat(x, '\n'); break;
}
}
}
static void rand_json_number(vtype_string* x) {
union {
long long _lld;
long double _Lf;
char ret[128];
} val;
if (rand()%2) {
val._lld = rs64();
sprintf(val.ret, "%lld", val._lld);
} else {
val._Lf = rldouble();
sprintf(val.ret, "%Lg", val._Lf);
}
string_concat(x, val.ret);
}
static void rand_json_string(vtype_string* x, size_t minn, size_t maxn) {
int n = (rand()%(maxn-minn))+minn;
string_concat(x, '"');
while(n--) {
int c = (rand()%95)+32;
if (c == '"' || c == '\\')
c = ' ';
string_concat(x, c);
}
string_concat(x, '"');
}
static void rand_json_value(vtype_string* x, int rec) {
rand_json_spaces(x);
switch(rand()%((rec < 5) ? 7 : 5)) {
default:
case 0: string_concat(x, "null"); break;
case 1: string_concat(x, "false"); break;
case 2: string_concat(x, "true"); break;
case 3: rand_json_number(x); break;
case 4: rand_json_string(x, 0, 4096>>rec); break;
case 5: rand_json_object(x, ++rec); break;
case 6: rand_json_array(x, ++rec); break;
};
rand_json_spaces(x);
}
static void rand_json_object(vtype_string* x, int rec) {
unsigned char ec = ru8()>>rec;
string_concat(x, '{');
rand_json_spaces(x);
for (int i = 0; i < ec; ++i) {
rand_json_string(x, 1, 256>>rec);
rand_json_spaces(x);
string_concat(x, ':');
rand_json_value(x, rec);
if (i + 1 < ec) {
string_concat(x, ',');
}
rand_json_spaces(x);
}
string_concat(x, '}');
}
static void rand_json_array(vtype_string* x, int rec) {
unsigned char ec = ru8()>>rec;
string_concat(x, '[');
rand_json_spaces(x);
for (int i = 0; i < ec; ++i) {
rand_json_value(x, rec);
if (i + 1 < ec) {
string_concat(x, ',');
}
rand_json_spaces(x);
}
string_concat(x, ']');
}
static void rand_json(vtype_string* x, int rec) {
switch(rand()%10) {
case 0: case 1: case 2: case 3: case 4: case 5:
rand_json_object(x, rec);
break;
case 6: case 7: case 8:
rand_json_array(x, rec);
break;
default: case 9:
rand_json_value(x, rec);
break;
}
}
int main(int argc, char** argv) {
json_t json;
vtype_string x;
time_t seed = time(0);
srand(seed);
printf("SEED: %ld\n\n", seed);
string_init(&x, 0);
rand_json (&x, 3);
puts("\n#####################################################################################################################\n");
puts(x.buffer);
json_parse(&json, &x);
string_free(&x);
puts("\n#####################################################################################################################\n");
x = libcjsonp_json_stringify(json.data, json.type, 4, 0);
puts(x.buffer);
puts("\n#####################################################################################################################\n");
libcjsonp_json_dump(stdout, json.data, json.type, 0, 0);
puts("\n\n#####################################################################################################################\n");
string_free(&x);
json_free(&json);
return 0;
}