fincsys.c
来自「FinC编译器源代码」· C语言 代码 · 共 2,013 行 · 第 1/4 页
C
2,013 行
l_test = FinC_NODE ( vector_at ( p_node->vector_node, 0 ) ); l_code = FinC_NODE ( vector_at ( p_node->vector_node, 1 ) ); finc_node_evaluate ( l_test ); old_continue = g_finc_context->script_continue; old_break = g_finc_context->script_break; old_in_cycle = g_finc_context->script_in_cycle; while ( finc_access ( finc_data_get_raw_data ( l_test->data ), 0, Bool ) ) { g_finc_context->script_in_cycle = TRUE; finc_node_evaluate ( l_code ); if (g_finc_context->script_break) { g_finc_context->script_break = FALSE; g_finc_context->script_in_cycle = FALSE; break; } g_finc_context->script_continue = FALSE; finc_node_evaluate ( l_test ); g_finc_context->script_in_cycle = FALSE; } unref ( l_test ); unref ( l_code ); g_finc_context->script_continue = old_continue; g_finc_context->script_break = old_break; g_finc_context->script_in_cycle = old_in_cycle;}void finc_sys_return ( FinCNode* p_node ){ FinCNode * l_node; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); if (l_node) g_finc_func_return = addref ( FinCData, l_node->data ); else g_finc_func_return = NULL; unref ( l_node ); g_finc_context->script_return = TRUE;}void finc_sys_continue ( FinCNode* p_node ){ if ( g_finc_context->script_in_cycle ) { g_finc_context->script_continue = TRUE; return; } printf("Runtime Error: can't use continue not in a cycle.\n"); finc_context_error_inc( g_finc_context );}void finc_sys_break ( FinCNode* p_node ){ if ( g_finc_context->script_in_cycle ) { g_finc_context->script_break = TRUE; return; } printf("Runtime Error: can't use break not in a cycle.\n"); finc_context_error_inc( g_finc_context );}void finc_sys_preinc ( FinCNode* p_node){ FinCNode * l_node; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) = finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) + 1; unref(p_node->data); p_node->data = finc_data_new_copy(l_node->data); unref ( l_node );}void finc_sys_inc ( FinCNode* p_node ){ FinCNode * l_node; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); unref(p_node->data); p_node->data = finc_data_new_copy(l_node->data); finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) = finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) + 1; unref ( l_node );}void finc_sys_predec ( FinCNode* p_node ){ FinCNode * l_node; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) = finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) - 1; unref(p_node->data); p_node->data = finc_data_new_copy(l_node->data); unref ( l_node );}void finc_sys_dec ( FinCNode* p_node ){ FinCNode * l_node; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); p_node->data = finc_data_new_copy(l_node->data); finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) = finc_access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) - 1; unref ( l_node );}void finc_sys_cmp_l ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); if ( finc_access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int ) < finc_access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) ) finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE; else finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = FALSE; unref (l_left); unref (l_right); unref (l_data_left); unref (l_data_right); unref (p_node->data); p_node->data = l_data;}void finc_sys_cmp_g ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); if ( finc_access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int ) > finc_access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) ) finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE; else finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = FALSE; unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_cmp_le ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); if ( finc_access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int ) <= finc_access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) ) finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE; else finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = FALSE; unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_cmp_ge ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); if ( finc_access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int ) >= finc_access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) ) finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE; else finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = FALSE; unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_cmp_ne ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); if ( finc_access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int ) != finc_access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) ) finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE; else finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = FALSE; unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_cmp_e ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); if ( finc_access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int ) == finc_access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) ) finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE; else finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = FALSE; unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_block ( FinCNode* p_node ){ FinCNode * l_node; unsigned int l_size; unsigned int i; l_size = vector_get_size ( p_node->vector_node ); for ( i = 0; i < l_size; i++ ) { l_node = (FinCNode*)vector_at ( p_node->vector_node, i ); finc_node_evaluate ( l_node ); unref ( l_node ); }}void finc_sys_comma( FinCNode* p_node){ FinCNode* l_node1; FinCNode* l_node2; FinCType* l_type; FinCData* l_data; l_node1 = (FinCNode*)vector_at (p_node->vector_node, 0); l_node2 = (FinCNode*)vector_at (p_node->vector_node, 1); finc_node_evaluate (l_node1); finc_node_evaluate (l_node2); l_type = finc_type_new (l_node2->data->type->type, FinCArrayType_None, 0); l_data = finc_data_new (l_type, NULL); unref(l_type); unref(l_node1); unref(p_node->data); finc_data_assign(l_data, l_node2->data); unref(l_node2); p_node->data = l_data;}void finc_sys_condition( FinCNode* p_node ){ FinCNode* l_node1; FinCNode* l_node2; FinCNode* l_node3; FinCType* l_type; FinCData* l_data; l_node1 = (FinCNode*)vector_at (p_node->vector_node, 0); l_node2 = (FinCNode*)vector_at (p_node->vector_node, 1); l_node3 = (FinCNode*)vector_at (p_node->vector_node, 2); finc_node_evaluate (l_node1); if ( finc_access ( finc_data_get_raw_data ( l_node1->data ), 0, Bool ) ) { finc_node_evaluate ( l_node2 ); l_type = finc_type_new(l_node2->data->type->type, FinCArrayType_None, 0); l_data = finc_data_new(l_type, NULL); unref(l_type); finc_data_assign(l_data, l_node2->data); p_node->data = l_data; } else { finc_node_evaluate ( l_node3 ); l_type = finc_type_new(l_node3->data->type->type, FinCArrayType_None, 0); l_data = finc_data_new(l_type, NULL); unref(l_type); finc_data_assign(l_data, l_node3->data); p_node->data = l_data; } unref(l_node1); unref(l_node2); unref(l_node3);}void finc_sys_logic_or ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, int ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, int ) || finc_access ( finc_data_get_raw_data ( l_data_right ), 0, int ); unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_logic_and ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data; FinCData* l_data_left; FinCData* l_data_right; l_left = (FinCNode*)vector_at ( p_node->vector_node, 0 ); l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_left ); l_data_left = finc_node_take_data (l_left); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, int ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, int ) && finc_access ( finc_data_get_raw_data ( l_data_right ), 0, int ); unref ( l_left ); unref ( l_right ); unref (l_data_left); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_not ( FinCNode* p_node ){ FinCNode * l_node; FinCType* l_type; FinCData* l_data; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); l_type = finc_type_new ( FinCType_Bool, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); finc_access ( finc_data_get_raw_data ( l_data ), 0, Bool )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?