cMCP 0.4.1
Model Context Protocol library in pure C11
Loading...
Searching...
No Matches
Data Structures | Enumerations | Functions
cmcp_json.h File Reference

Hand-rolled JSON value tree, parser, and emitter. More...

#include <stddef.h>

Go to the source code of this file.

Data Structures

struct  cmcp_json_t
 Opaque-by-convention JSON tree node. More...
 

Enumerations

enum  cmcp_json_type_t {
  CMCP_JSON_NULL , CMCP_JSON_BOOL , CMCP_JSON_INT , CMCP_JSON_DOUBLE ,
  CMCP_JSON_STRING , CMCP_JSON_ARRAY , CMCP_JSON_OBJECT
}
 Tag of a JSON value tree node. More...
 

Functions

void cmcp_json_redact (cmcp_json_t *v)
 In-place scrub of credential-shaped values (Tier 6 axis 6.5.4).
 
Constructors

Allocate a fresh node.

Caller owns the returned pointer. Strings are copied in. NULL on allocation failure.

cmcp_json_t * cmcp_json_new_null (void)
 
cmcp_json_t * cmcp_json_new_bool (int b)
 
cmcp_json_t * cmcp_json_new_int (long long i)
 
cmcp_json_t * cmcp_json_new_double (double d)
 
cmcp_json_t * cmcp_json_new_string (const char *s)
 
cmcp_json_t * cmcp_json_new_string_n (const char *s, size_t n)
 
cmcp_json_t * cmcp_json_new_array (void)
 
cmcp_json_t * cmcp_json_new_object (void)
 
Mutators (take ownership of <tt>v</tt>)

Append / insert.

The container takes ownership of the value pointer — do not free v after a successful call. Return CMCP_OK or a negative error code.

int cmcp_json_array_append (cmcp_json_t *arr, cmcp_json_t *v)
 
int cmcp_json_object_set (cmcp_json_t *obj, const char *key, cmcp_json_t *v)
 
int cmcp_json_object_set_n (cmcp_json_t *obj, const char *key, size_t key_len, cmcp_json_t *v)
 
Accessors (borrowed views; never free)
const cmcp_json_t * cmcp_json_object_get (const cmcp_json_t *obj, const char *key)
 
const cmcp_json_t * cmcp_json_array_at (const cmcp_json_t *arr, size_t i)
 
size_t cmcp_json_array_len (const cmcp_json_t *arr)
 
size_t cmcp_json_object_len (const cmcp_json_t *obj)
 
const char * cmcp_json_string (const cmcp_json_t *v)
 
size_t cmcp_json_string_len (const cmcp_json_t *v)
 
long long cmcp_json_int (const cmcp_json_t *v)
 
double cmcp_json_double (const cmcp_json_t *v)
 
int cmcp_json_bool (const cmcp_json_t *v)
 
int cmcp_json_is_null (const cmcp_json_t *v)
 
Parse / emit

_stable orders object keys lexicographically — use it for golden-file fixtures and replay gates.

The default emitter preserves insertion order, which is cheaper.

cmcp_json_t * cmcp_json_parse (const char *text, size_t len)
 
cmcp_json_t * cmcp_json_parse_cstr (const char *text)
 
char * cmcp_json_emit (const cmcp_json_t *v)
 
char * cmcp_json_emit_stable (const cmcp_json_t *v)
 
Tree lifecycle
void cmcp_json_free (cmcp_json_t *v)
 
cmcp_json_t * cmcp_json_clone (const cmcp_json_t *v)
 
int cmcp_json_equal (const cmcp_json_t *a, const cmcp_json_t *b)
 
String escaping helpers (rarely needed by callers)
int cmcp_json_escape (const char *in, char *out, size_t out_sz)
 
char * cmcp_json_escape_dup (const char *in)
 

Detailed Description

Hand-rolled JSON value tree, parser, and emitter.

Library-wide JSON representation. Every JSON-RPC message that crosses a transport boundary is parsed into / built from a tree of cmcp_json_t nodes. The parser is strict (RFC 8259 subset — no trailing commas, no comments, no NaN/Inf) and the emitter has a _stable variant that orders object keys deterministically for test fixtures and replay gates.

Memory ownership: every cmcp_json_new_* returns a freshly allocated node the caller owns. cmcp_json_array_append and cmcp_json_object_set take ownership of the value pointer (the container will free it). cmcp_json_free recursively frees a node and everything it contains.

Definition in file cmcp_json.h.

Enumeration Type Documentation

◆ cmcp_json_type_t

Tag of a JSON value tree node.

Enumerator
CMCP_JSON_NULL 

null

CMCP_JSON_BOOL 

true / false

CMCP_JSON_INT 

Integer that fit in long long.

CMCP_JSON_DOUBLE 

Fractional or out-of-int64 numeric.

CMCP_JSON_STRING 

UTF-8 string (length-prefixed; embedded NULs allowed).

CMCP_JSON_ARRAY 

Ordered list of values.

CMCP_JSON_OBJECT 

Key/value bag (insertion order preserved).

Definition at line 24 of file cmcp_json.h.

Function Documentation

◆ cmcp_json_new_null()

cmcp_json_t * cmcp_json_new_null ( void  )

◆ cmcp_json_new_bool()

cmcp_json_t * cmcp_json_new_bool ( int  b)

◆ cmcp_json_new_int()

cmcp_json_t * cmcp_json_new_int ( long long  i)

◆ cmcp_json_new_double()

cmcp_json_t * cmcp_json_new_double ( double  d)

◆ cmcp_json_new_string()

cmcp_json_t * cmcp_json_new_string ( const char *  s)

◆ cmcp_json_new_string_n()

cmcp_json_t * cmcp_json_new_string_n ( const char *  s,
size_t  n 
)

◆ cmcp_json_new_array()

cmcp_json_t * cmcp_json_new_array ( void  )

◆ cmcp_json_new_object()

cmcp_json_t * cmcp_json_new_object ( void  )

◆ cmcp_json_array_append()

int cmcp_json_array_append ( cmcp_json_t *  arr,
cmcp_json_t *  v 
)

◆ cmcp_json_object_set()

int cmcp_json_object_set ( cmcp_json_t *  obj,
const char *  key,
cmcp_json_t *  v 
)

◆ cmcp_json_object_set_n()

int cmcp_json_object_set_n ( cmcp_json_t *  obj,
const char *  key,
size_t  key_len,
cmcp_json_t *  v 
)

◆ cmcp_json_object_get()

const cmcp_json_t * cmcp_json_object_get ( const cmcp_json_t *  obj,
const char *  key 
)

◆ cmcp_json_array_at()

const cmcp_json_t * cmcp_json_array_at ( const cmcp_json_t *  arr,
size_t  i 
)

◆ cmcp_json_array_len()

size_t cmcp_json_array_len ( const cmcp_json_t *  arr)

◆ cmcp_json_object_len()

size_t cmcp_json_object_len ( const cmcp_json_t *  obj)

◆ cmcp_json_string()

const char * cmcp_json_string ( const cmcp_json_t *  v)

◆ cmcp_json_string_len()

size_t cmcp_json_string_len ( const cmcp_json_t *  v)

◆ cmcp_json_int()

long long cmcp_json_int ( const cmcp_json_t *  v)

◆ cmcp_json_double()

double cmcp_json_double ( const cmcp_json_t *  v)

◆ cmcp_json_bool()

int cmcp_json_bool ( const cmcp_json_t *  v)

◆ cmcp_json_is_null()

int cmcp_json_is_null ( const cmcp_json_t *  v)

◆ cmcp_json_parse()

cmcp_json_t * cmcp_json_parse ( const char *  text,
size_t  len 
)

◆ cmcp_json_parse_cstr()

cmcp_json_t * cmcp_json_parse_cstr ( const char *  text)

◆ cmcp_json_emit()

char * cmcp_json_emit ( const cmcp_json_t *  v)

◆ cmcp_json_emit_stable()

char * cmcp_json_emit_stable ( const cmcp_json_t *  v)

◆ cmcp_json_free()

void cmcp_json_free ( cmcp_json_t *  v)

◆ cmcp_json_clone()

cmcp_json_t * cmcp_json_clone ( const cmcp_json_t *  v)

◆ cmcp_json_equal()

int cmcp_json_equal ( const cmcp_json_t *  a,
const cmcp_json_t *  b 
)

◆ cmcp_json_escape()

int cmcp_json_escape ( const char *  in,
char *  out,
size_t  out_sz 
)

◆ cmcp_json_escape_dup()

char * cmcp_json_escape_dup ( const char *  in)

◆ cmcp_json_redact()

void cmcp_json_redact ( cmcp_json_t *  v)

In-place scrub of credential-shaped values (Tier 6 axis 6.5.4).

Recursively walks v. For any object entry whose key matches a sensitive name (password, passwd, token, secret, apikey, authorization, bearer, credential — matched case-insensitively against the key with non-alphanumeric characters stripped, so api_key, API-Key, apiKey all hit), the value is replaced with the string "[REDACTED]" regardless of its original type. Other entries are unchanged and recursed into.

The match is substring on the normalized key: myApiKey and customer_secret both redact.

Caller retains ownership of v. Safe on NULL or scalar values (no-op). Allocation failure during replacement leaves the original value in place (best-effort, never aborts).