cctools
|
JSON Expressions (JX) library. More...
#include <stdint.h>
#include <inttypes.h>
Go to the source code of this file.
Data Structures | |
struct | jx_comprehension |
struct | jx_item |
JX item linked-list used by JX_ARRAY and jx::items. More... | |
struct | jx_pair |
JX key-value pairs used by JX_OBJECT and jx::pairs. More... | |
struct | jx_operator |
struct | jx |
JX value representing any expression type. More... | |
Enumerations | |
enum | jx_type_t { JX_NULL = 0, JX_BOOLEAN, JX_INTEGER, JX_DOUBLE, JX_STRING, JX_SYMBOL, JX_ARRAY, JX_OBJECT, JX_OPERATOR, JX_ERROR } |
JX atomic type. More... | |
Functions | |
struct jx * | jx_null () |
Create a JX null value. More... | |
struct jx * | jx_boolean (int boolean_value) |
Create a JX boolean value. More... | |
struct jx * | jx_integer (jx_int_t integer_value) |
Create a JX integer value. More... | |
struct jx * | jx_double (double double_value) |
Create a JX floating point value. More... | |
struct jx * | jx_string (const char *string_value) |
Create a JX string value. More... | |
struct jx * | jx_string_nocopy (char *string_value) |
Create a JX string value without copying (uncommon). More... | |
struct jx * | jx_format (const char *fmt,...) |
Create a JX string value using prinf style formatting. More... | |
struct jx * | jx_symbol (const char *symbol_name) |
Create a JX symbol. More... | |
struct jx * | jx_error (struct jx *err) |
Create a JX_ERROR. More... | |
struct jx * | jx_array (struct jx_item *items) |
Create a JX array. More... | |
struct jx * | jx_arrayv (struct jx *value,...) |
Create a JX array with inline items. More... | |
struct jx * | jx_object (struct jx_pair *pairs) |
Create a JX object. More... | |
struct jx * | jx_objectv (const char *key, struct jx *value,...) |
Create a JX object. More... | |
struct jx * | jx_operator (jx_operator_t oper, struct jx *left, struct jx *right) |
Create a JX binary expression,. More... | |
struct jx_pair * | jx_pair (struct jx *key, struct jx *value, struct jx_pair *next) |
Create a JX key-value pair. More... | |
struct jx_item * | jx_item (struct jx *value, struct jx_item *next) |
Create a JX array item. More... | |
struct jx_comprehension * | jx_comprehension (const char *variable, struct jx *elements, struct jx *condition, struct jx_comprehension *next) |
Create a JX comprehension. More... | |
int | jx_istype (struct jx *j, jx_type_t type) |
Test an expression's type. More... | |
int | jx_isatomic (struct jx *j) |
Test for an atomic value. More... | |
int | jx_istrue (struct jx *j) |
Test an expression for the boolean value TRUE. More... | |
int | jx_isfalse (struct jx *j) |
Test an expression for the boolean value FALSE. More... | |
int | jx_equals (struct jx *j, struct jx *k) |
Test two expressions for equality. More... | |
int | jx_array_length (struct jx *array) |
Get the length of an array. More... | |
struct jx * | jx_copy (struct jx *j) |
Duplicate an expression. More... | |
void | jx_delete (struct jx *j) |
Delete an expression recursively. More... | |
void | jx_pair_delete (struct jx_pair *p) |
Delete a key-value pair. More... | |
void | jx_item_delete (struct jx_item *i) |
Delete an array item. More... | |
void | jx_comprehension_delete (struct jx_comprehension *comp) |
Delete a comprehension. More... | |
struct jx * | jx_remove (struct jx *object, struct jx *key) |
Remove a key-value pair from an object. More... | |
int | jx_insert (struct jx *object, struct jx *key, struct jx *value) |
Insert a key-value pair into an object. More... | |
int | jx_insert_unless_empty (struct jx *object, struct jx *key, struct jx *value) |
Insert a key-value pair into an object, unless the value is an empty collection, in which case delete the key and value. More... | |
void | jx_insert_boolean (struct jx *object, const char *key, int value) |
Insert a boolean value into an object. More... | |
void | jx_insert_integer (struct jx *object, const char *key, jx_int_t value) |
Insert an integer value into an object. More... | |
void | jx_insert_double (struct jx *object, const char *key, double value) |
Insert a double value into an object. More... | |
void | jx_insert_string (struct jx *object, const char *key, const char *value) |
Insert a string value into an object. More... | |
struct jx * | jx_lookup (struct jx *object, const char *key) |
Search for a arbitrary item in an object. More... | |
const char * | jx_lookup_string (struct jx *object, const char *key) |
Search for a string item in an object. More... | |
char * | jx_lookup_string_dup (struct jx *object, const char *key) |
Search for a string item in an object. More... | |
jx_int_t | jx_lookup_integer (struct jx *object, const char *key) |
Search for an integer item in an object. More... | |
int | jx_lookup_boolean (struct jx *object, const char *key) |
Search for a boolean item in an object. More... | |
double | jx_lookup_double (struct jx *object, const char *key) |
Search for a double item in an object. More... | |
void | jx_array_insert (struct jx *array, struct jx *value) |
Insert an item at the beginning of an array. More... | |
void | jx_array_append (struct jx *array, struct jx *value) |
Append an item at the end of an array. More... | |
struct jx * | jx_array_index (struct jx *array, int nth) |
Get the nth item in an array. More... | |
struct jx * | jx_array_concat (struct jx *array,...) |
Concatenate the given arrays into a single array. More... | |
struct jx * | jx_array_shift (struct jx *array) |
Remove and return the first element in the array. More... | |
int | jx_is_constant (struct jx *j) |
Determine if an expression is constant. More... | |
void | jx_export (struct jx *j) |
Export a jx object as a set of environment variables. More... | |
struct jx * | jx_iterate_array (struct jx *j, void **i) |
Iterate over the values in an array. More... | |
struct jx * | jx_iterate_values (struct jx *j, void **i) |
Iterate over the values in an object. More... | |
const char * | jx_iterate_keys (struct jx *j, void **i) |
Iterate over the keys in an object. More... | |
struct jx * | jx_merge (struct jx *j,...) |
Merge an arbitrary number of JX_OBJECTs into a single new one. More... | |
JSON Expressions (JX) library.
This module implements extended JSON expressions as a C library. We use our own custom library to avoid external dependencies and to implement various extensions to strict JSON.
For example, the following bit of code:
struct jx * obj = jx_object( jx_pair( jx_string("hello"), jx_string("world"), 0) );
jx_print_file(jx,stdout);
jx_delete(jx);
Will create the following output:
{ "hello" : "world" }
enum jx_type_t |
JX atomic type.
struct jx* jx_null | ( | ) |
Create a JX null value.
struct jx* jx_boolean | ( | int | boolean_value | ) |
Create a JX boolean value.
boolean_value | A C boolean value. |
struct jx* jx_integer | ( | jx_int_t | integer_value | ) |
Create a JX integer value.
integer_value | A C integer. |
struct jx* jx_double | ( | double | double_value | ) |
Create a JX floating point value.
double_value | A C double precision floating point. |
struct jx* jx_string | ( | const char * | string_value | ) |
Create a JX string value.
string_value | A C string, which will be duplicated via strdup(). |
struct jx* jx_string_nocopy | ( | char * | string_value | ) |
Create a JX string value without copying (uncommon).
string_value | A C string, which will be not be duplicated, but will be freed at object deletion. |
struct jx* jx_format | ( | const char * | fmt, |
... | |||
) |
Create a JX string value using prinf style formatting.
fmt | A printf-style format string, followed by matching arguments. |
struct jx* jx_symbol | ( | const char * | symbol_name | ) |
Create a JX symbol.
Note that symbols are an extension to the JSON standard. A symbol is a reference to an external variable, which can be resolved by using jx_eval.
symbol_name | A C string. |
Create a JX_ERROR.
err | The associated data for the error. This should be a string description of the error. |
Create a JX array with inline items.
value | One or more items of the array must be given, terminated with a null value. |
Create a JX object.
Arguments are alternating string key – *jx values. Must be termianted with a null value. This is syntactic sugar for jx_object(jx_pair(jx_string(k), v, jx_pair(jx_string(k), v, jx_pair( etc.))));
struct jx *j = jx_objectv("A", jx_integer(42), // key and value of A, "B", jx_objectv("C", jx_string("xyz") // key and value of B NULL)); // terminating null value.
key | Name of the first property |
value | Value for the first property |
... | Alternating key-value pairs |
struct jx* jx_operator | ( | jx_operator_t | oper, |
struct jx * | left, | ||
struct jx * | right | ||
) |
Create a JX binary expression,.
oper | The kind of operator. |
left | The left side of the expression. |
right | The right side of the expression. |
Create a JX key-value pair.
key | The key. |
value | The value. |
next | The next item in the linked list. |
Create a JX array item.
value | The value of this item. |
next | The next item in the linked list. |
struct jx_comprehension* jx_comprehension | ( | const char * | variable, |
struct jx * | elements, | ||
struct jx * | condition, | ||
struct jx_comprehension * | next | ||
) |
Create a JX comprehension.
variable | The variable name to bind. |
elements | The elements to bind. |
condition | The boolean filter to evaluate. |
next | Nested comprehension(s). |
Test an expression's type.
j | An expression. |
type | The desired type. |
int jx_isatomic | ( | struct jx * | j | ) |
Test for an atomic value.
j | An expression. |
int jx_istrue | ( | struct jx * | j | ) |
Test an expression for the boolean value TRUE.
j | An expression to test. |
int jx_isfalse | ( | struct jx * | j | ) |
Test an expression for the boolean value FALSE.
j | An expression to test. |
Test two expressions for equality.
j | A constant expression. |
k | A constant expression. |
int jx_array_length | ( | struct jx * | array | ) |
Get the length of an array.
Returns -1 if array is null or not an array.
array | The array to check. |
Duplicate an expression.
j | An expression. |
void jx_delete | ( | struct jx * | j | ) |
Delete an expression recursively.
j | An expression to delete. |
void jx_pair_delete | ( | struct jx_pair * | p | ) |
Delete a key-value pair.
p | The key-value pair to delete. |
void jx_item_delete | ( | struct jx_item * | i | ) |
Delete an array item.
i | The array item to delete. |
void jx_comprehension_delete | ( | struct jx_comprehension * | comp | ) |
Delete a comprehension.
comp | The comprehension to delete. |
Remove a key-value pair from an object.
object | The object. |
key | The key. |
Insert a key-value pair into an object.
object | The object. |
key | The key. |
value | The value. |
Insert a key-value pair into an object, unless the value is an empty collection, in which case delete the key and value.
object | The target object. |
key | The key. |
value | The value. |
void jx_insert_boolean | ( | struct jx * | object, |
const char * | key, | ||
int | value | ||
) |
Insert a boolean value into an object.
object | The object |
key | The key represented as a C string |
value | The boolean value. |
void jx_insert_integer | ( | struct jx * | object, |
const char * | key, | ||
jx_int_t | value | ||
) |
Insert an integer value into an object.
object | The object |
key | The key represented as a C string |
value | The integer value. |
void jx_insert_double | ( | struct jx * | object, |
const char * | key, | ||
double | value | ||
) |
Insert a double value into an object.
object | The object |
key | The key represented as a C string |
value | The double value. |
void jx_insert_string | ( | struct jx * | object, |
const char * | key, | ||
const char * | value | ||
) |
Insert a string value into an object.
object | The object |
key | The key represented as a C string |
value | The C string value. |
Search for a arbitrary item in an object.
The key is an ordinary string value.
object | The object in which to search. |
key | The string key to match. |
const char* jx_lookup_string | ( | struct jx * | object, |
const char * | key | ||
) |
Search for a string item in an object.
The key is an ordinary string value.
object | The object in which to search. |
key | The string key to match. |
char* jx_lookup_string_dup | ( | struct jx * | object, |
const char * | key | ||
) |
Search for a string item in an object.
Behaves the same as jx_lookup_string, but returns a duplicated copy. The result must be deallocated with free().
object | The object in which to search. |
key | The string key to match. |
jx_int_t jx_lookup_integer | ( | struct jx * | object, |
const char * | key | ||
) |
Search for an integer item in an object.
The key is an ordinary string value.
object | The object in which to search. |
key | The string key to match. |
int jx_lookup_boolean | ( | struct jx * | object, |
const char * | key | ||
) |
Search for a boolean item in an object.
The key is an ordinary string value.
object | The object in which to search. |
key | The string key to match. |
double jx_lookup_double | ( | struct jx * | object, |
const char * | key | ||
) |
Search for a double item in an object.
The key is an ordinary string value.
object | The object in which to search. |
key | The string key to match. |
Insert an item at the beginning of an array.
array | The array to modify. |
value | The value to insert. |
Append an item at the end of an array.
array | The array to modify. |
value | The value to append. |
Get the nth item in an array.
array | The array to search. |
nth | The index of the desired value. |
Concatenate the given arrays into a single array.
The passed arrays are consumed.
array | An array to concatenate. The list of arrays must be terminated by NULL. |
Remove and return the first element in the array.
array | The JX_ARRAY to update. |
int jx_is_constant | ( | struct jx * | j | ) |
Determine if an expression is constant.
Traverses the expression recursively, and returns true if it consists only of constant values, arrays, and objects.
j | The expression to evaluate. |
void jx_export | ( | struct jx * | j | ) |
Export a jx object as a set of environment variables.
j | A JX_OBJECT. |
Iterate over the values in an array.
The iteration state is stored by the caller in an opaque pointer variable. When starting iteration, the caller MUST pass the address of a pointer initialized to NULL as i. It is undefined behavior to pass a non-NULL iterator variable not set by a previous call. Subsequent calls should use the same variable to continue iteration. After the initial call, the value of j is ignored.
struct jx *item; for (void *i = NULL; (item = jx_iterate_array(j, &i));) { printf("array item: "); jx_print_stream(item, stdout); printf("\n"); }
j | The JX_ARRAY to iterate over. |
i | A variable to store the iteration state. |
Iterate over the values in an object.
The iteration state is stored by the caller in an opaque pointer variable. When starting iteration, the caller MUST pass the address of a pointer initialized to NULL as i. It is undefined behavior to pass a non-NULL iterator variable not set by a previous call. Subsequent calls should use the same variable to continue iteration. After the initial call, the value of j is ignored.
struct jx *item; void *i = NULL; while ((item = jx_iterate_values(j, &i))) { printf("object value: "); jx_print_stream(item, stdout); printf("\n"); }
j | The JX_OBJECT to iterate over. |
i | A variable to store the iteration state. |
const char* jx_iterate_keys | ( | struct jx * | j, |
void ** | i | ||
) |
Iterate over the keys in an object.
The iteration state is stored by the caller in an opaque pointer variable. When starting iteration, the caller MUST pass the address of a pointer initialized to NULL as i. It is undefined behavior to pass a non-NULL iterator variable not set by a previous call. Subsequent calls should use the same variable to continue iteration. After the initial call, the value of j is ignored.
struct jx *item; void *i = NULL; while ((item = jx_iterate_keys(j, &i))) { printf("object key: "); jx_print_stream(item, stdout); printf("\n"); }
j | The JX_OBJECT to iterate over. |
i | A variable to store the iteration state. |
Merge an arbitrary number of JX_OBJECTs into a single new one.
The constituent objects are not consumed. Objects are merged in the order given, i.e. a key can replace an identical key in a preceding object. The last argument must be NULL to mark the end of the list.