static struct jx_pair * jx_eval_pair( struct jx_pair *pair, struct jx *context ) { if(!pair) return 0; return jx_pair( jx_eval(pair->key,context), jx_eval(pair->value,context), jx_eval_pair(pair->next,context) ); }
static struct jx_pair * jx_parse_pair_list( struct jx_parser *s ) { jx_token_t t = jx_scan(s); if(t==JX_TOKEN_RBRACE) { // empty list return 0; } jx_unscan(s,t); struct jx_pair *p = jx_pair(0,0,0); p->key = jx_parse(s); if(!p->key) { // error set by deeper layer jx_pair_delete(p); return 0; } if(s->strict_mode) { if(p->key->type!=JX_STRING) { jx_parse_error(s,"key-value pair must have a string as the key"); jx_pair_delete(p); return 0; } } t = jx_scan(s); if(t!=JX_TOKEN_COLON) { jx_parse_error(s,"key-value pair must be separated by a colon"); jx_pair_delete(p); return 0; } p->value = jx_parse(s); if(!p->value) { // error set by deeper layer jx_pair_delete(p); return 0; } t = jx_scan(s); if(t==JX_TOKEN_COMMA) { p->next = jx_parse_pair_list(s); } else if(t==JX_TOKEN_RBRACE) { p->next = 0; } else { jx_parse_error(s,"key-value pairs missing a comma or closing brace"); jx_pair_delete(p); return 0; } return p; }
int jx_insert( struct jx *j, struct jx *key, struct jx *value ) { if(!j || j->type!=JX_OBJECT) return 0; j->u.pairs = jx_pair(key,value,j->u.pairs); return 1; }