int o_json_parse_null(void * ctx) { o_json_parse_context * pc = (o_json_parse_context *) ctx; orderly_json * n = orderly_alloc_json(pc->alloc, orderly_json_null); PUSH_NODE(pc, n); return 1; }
int o_json_parse_boolean(void * ctx, int val) { o_json_parse_context * pc = (o_json_parse_context *) ctx; orderly_json * n = orderly_alloc_json(pc->alloc, orderly_json_boolean); n->v.b = val; PUSH_NODE(pc, n); return 1; }
int o_json_parse_double(void * ctx, double d) { o_json_parse_context * pc = (o_json_parse_context *) ctx; orderly_json * n = orderly_alloc_json(pc->alloc, orderly_json_number); n->v.n = d; PUSH_NODE(pc, n); return 1; }
int o_json_parse_integer(void * ctx, long l) { o_json_parse_context * pc = (o_json_parse_context *) ctx; orderly_json * n = orderly_alloc_json(pc->alloc, orderly_json_integer); n->v.i = l; PUSH_NODE(pc, n); return 1; }
int o_json_parse_string(void * ctx, const unsigned char * v, unsigned int l) { o_json_parse_context * pc = (o_json_parse_context *) ctx; orderly_json * n = orderly_alloc_json(pc->alloc, orderly_json_string); BUF_STRDUP(n->v.s, pc->alloc, v, l); PUSH_NODE(pc, n); return 1; }
int o_json_parse_end_map(void * ctx) { o_json_parse_context * pc = (o_json_parse_context *) ctx; orderly_json * n = orderly_ps_current(pc->nodeStack); orderly_ps_pop(pc->nodeStack); PUSH_NODE(pc, n); return 1; }
static void dumpPTreeNode( // DUMP A PARSE TREE NODE PTREE node ) // - node in parse tree { static char buffer[128]; // - debugging buffer char *node_name; // - name of node VSTK_CTL ctl; // - VSTK control information (nodes) VSTK_CTL dup; // - VSTK control information (duplicates) int dup_out; // - last duplicate printed VstkOpen( &ctl, sizeof( PTREE ), 32 ); VstkOpen( &dup, sizeof( PTREE ), 8 ); dup_out = -1; for( ; ; ) { switch( node->op ) { case PT_ERROR : printf( "PT_ERROR" F_BADDR " ***** ERROR TREE *****" F_EOL , node ); break; case PT_INT_CONSTANT : node_name = "PT_INT_CONSTANT"; printf( F_NAME F_BADDR " flags" F_HEX_4 " type" F_PTR , node_name , node , node->flags , node->type ); if( NULL == Integral64Type( node->type ) ) { printf( " integer" F_HEX_4 , node->u.int_constant ); } else { printf( " integer-64" F_S64 , VAL64( node->u.int64_constant ) ); } dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); break; case PT_FLOATING_CONSTANT : { char buffer[256]; BFCnvFS( node->u.floating_constant, buffer, 256 ); printf( "PT_FLOATING_CONSTANT" F_BADDR " flags" F_HEX_4 " float" F_CPP_FLOAT , node , node->flags , buffer ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); } break; case PT_STRING_CONSTANT : stvcpy( buffer, node->u.string->string, node->u.string->len ); printf( "PT_STRING_CONSTANT" F_BADDR " flags" F_HEX_4 " string" F_STRING , node , node->flags , buffer ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); break; case PT_ID : printf( "PT_ID" F_BADDR " flags" F_HEX_4 " cgop" F_STRING F_NL " id" F_PTR "=" F_STRING " id_cgop" F_STRING " u.id.scope" F_PTR , node , node->flags , DbgOperator( node->cgop ) , node->u.id.name , NameStr( node->u.id.name ) , DbgOperator( node->id_cgop ) , node->u.id.scope ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); break; case PT_TYPE : printf( "PT_TYPE" F_BADDR " cgop" F_STRING " flags" F_HEX_4 " next" F_PTR " scope" F_PTR , node , DbgOperator( node->cgop ) , node->flags , node->u.type.next , node->u.type.scope ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); break; case PT_SYMBOL : if( node->cgop == CO_NAME_THIS ) { printf( "PT_SYMBOL" F_BADDR " flags" F_HEX_4 " this " , node , node->flags ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); } else if( node->cgop == CO_NAME_CDTOR_EXTRA ) { printf( "PT_SYMBOL" F_BADDR " flags" F_HEX_4 " cdtor_extra_parm " , node , node->flags ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); } else { printf( "PT_SYMBOL" F_BADDR " flags" F_HEX_4 " cgop" F_STRING F_NL " symbol" F_PTR " result" F_PTR , node , node->flags , DbgOperator( node->cgop ) , node->u.symcg.symbol , node->u.symcg.result ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); DumpSymbol( node->u.symcg.symbol ); } break; case PT_UNARY : printf( "PT_UNARY" F_BADDR F_POINTS F_ADDR " flags" F_HEX_4 " cgop" F_STRING , node , node->u.subtree[0] , node->flags , DbgOperator( node->cgop ) ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); PUSH_NODE( ctl, node->u.subtree[0] ); break; case PT_BINARY : printf( "PT_BINARY" F_BADDR F_POINTS F_ADDR "," F_ADDR " flags" F_HEX_4 " cgop" F_STRING , node , node->u.subtree[0] , node->u.subtree[1] , node->flags , DbgOperator( node->cgop ) ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); PUSH_NODE( ctl, node->u.subtree[1] ); PUSH_NODE( ctl, node->u.subtree[0] ); break; case PT_DUP_EXPR : { PTREE *duped; // - duplicated expression printf( "PT_DUP_EXPR" F_BADDR F_POINTS F_ADDR " flags" F_HEX_4 " node" F_ADDR , node , node->u.dup.subtree[0] , node->flags , node->u.dup.node ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); if( node->u.subtree[0] != NULL ) { for( duped = VstkTop( &dup ) ; ; duped = VstkNext( &dup, duped ) ) { if( duped == NULL ) { PUSH_NODE( dup, node->u.subtree[0] ); } else if( *duped == node->u.subtree[0] ) { break; } } } } break; case PT_IC : printf( "PT_IC" F_BADDR " " F_NAME " value" F_ADDR , node , DbgIcOpcode( node->u.ic.opcode ) , node->u.ic.value.pvalue ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); break; default : printf( "***INVALID***" F_BADDR " flags" F_HEX_4 " op" F_HEX_1 , node , node->flags , node->op ); dumpNodeType( node ); dumpLocation( &node->locn ); dumpPtreeFlags( node ); break; } { PTREE *next; // - addr[next node] next = VstkPop( &ctl ); if( next != NULL ) { node = *next; } else { ++dup_out; if( dup_out > VstkDimension( &dup ) ) break; next = VstkIndex( &dup, dup_out ); printf( "--------------- duplicate ------------\n" ); node = *next; } } } VstkClose( &ctl ); VstkClose( &dup ); }