static struct jx_item * jx_parse_item_list( struct jx_parser *s ) { jx_token_t t = jx_scan(s); if(t==JX_TOKEN_RBRACKET) { // empty list return 0; } jx_unscan(s,t); struct jx_item *i = jx_item(0,0); i->value = jx_parse(s); if(!i->value) { // error set by deeper layer jx_item_delete(i); return 0; } t = jx_scan(s); if(t==JX_TOKEN_COMMA) { i->next = jx_parse_item_list(s); } else if(t==JX_TOKEN_RBRACKET) { i->next = 0; } else { jx_parse_error(s,"array items missing a comma or closing brace"); jx_item_delete(i); return 0; } return i; }
void jx_delete( struct jx *j ) { if(!j) return; switch(j->type) { case JX_DOUBLE: case JX_BOOLEAN: case JX_INTEGER: case JX_NULL: break; case JX_SYMBOL: free(j->u.symbol_name); break; case JX_STRING: free(j->u.string_value); break; case JX_ARRAY: jx_item_delete(j->u.items); break; case JX_OBJECT: jx_pair_delete(j->u.pairs); break; case JX_OPERATOR: jx_delete(j->u.oper.left); jx_delete(j->u.oper.right); break; case JX_FUNCTION: jx_delete(j->u.func.arguments); break; case JX_ERROR: jx_delete(j->u.err); break; } free(j); }
void jx_item_delete( struct jx_item *item ) { if(!item) return; jx_delete(item->value); jx_item_delete(item->next); free(item); }