fincsys.c
来自「FinC编译器源代码」· C语言 代码 · 共 2,013 行 · 第 1/4 页
C
2,013 行
= ! finc_access ( finc_data_get_raw_data ( l_node->data ), 0, Bool ); unref ( l_node ); unref(p_node->data); p_node->data = l_data;}void finc_sys_or ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; 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); switch ( l_data_left->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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 ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, char ) | finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short: l_type = finc_type_new ( FinCType_Short, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, short ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, short ) | finc_access ( finc_data_get_raw_data ( l_data_right ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: /* do not support or operator */ break; #endif #ifdef USING_LONG case FinCType_Long: l_type = finc_type_new ( FinCType_Long, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, long ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, long ) | finc_access ( finc_data_get_raw_data ( l_data_right ), 0, long ); break; #endif default: printf("this data type not support OR operation.\n"); break; } 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_and ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; 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); switch ( l_data_left->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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 ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, char ) & finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short: l_type = finc_type_new ( FinCType_Short, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, short ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, short ) & finc_access ( finc_data_get_raw_data ( l_data_right ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: /* do not support and operator */ break; #endif #ifdef USING_LONG case FinCType_Long: l_type = finc_type_new ( FinCType_Long, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, long ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, long ) & finc_access ( finc_data_get_raw_data ( l_data_right ), 0, long ); break; #endif default: printf("this data type not support AND operation.\n"); break; } 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_xor ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; 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); switch ( l_data_left->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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 ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, char ) ^ finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short: l_type = finc_type_new ( FinCType_Short, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, short ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, short ) ^ finc_access ( finc_data_get_raw_data ( l_data_right ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: /* do not support xor operator */ break; #endif #ifdef USING_LONG case FinCType_Long: l_type = finc_type_new ( FinCType_Long, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, long ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, long ) ^ finc_access ( finc_data_get_raw_data ( l_data_right ), 0, long ); break; #endif default: printf("this data type not support XOR operation.\n"); break; } 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_bitwise ( FinCNode* p_node ){ FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; FinCData* l_data_right; l_right = (FinCNode*)vector_at ( p_node->vector_node, 1 ); finc_node_evaluate ( l_right ); l_data_right = finc_node_take_data (l_right); switch ( l_data_right->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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_right ), 0, int ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = ~ finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short: l_type = finc_type_new ( FinCType_Short, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, short ) = ~ finc_access ( finc_data_get_raw_data ( l_data_right ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: /* do not support bitwise operator */ break; #endif #ifdef USING_LONG case FinCType_Long: l_type = finc_type_new ( FinCType_Long, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, long ) = ~ finc_access ( finc_data_get_raw_data ( l_data_right ), 0, long ); break; #endif default: printf("this data type not support BIT NEGATIVE operation.\n"); break; } unref ( l_right ); unref (l_data_right); unref ( p_node->data ); p_node->data = l_data;}void finc_sys_shl ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; 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); switch ( l_data_left->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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 ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, char ) << finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short: l_type = finc_type_new ( FinCType_Short, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, short ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, short ) << finc_access ( finc_data_get_raw_data ( l_data_right ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: /* do not support shl operator */ break; #endif #ifdef USING_LONG case FinCType_Long: l_type = finc_type_new ( FinCType_Long, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, long ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, long ) << finc_access ( finc_data_get_raw_data ( l_data_right ), 0, long ); break; #endif default: printf("this data type not support SHIFT LEFT operation.\n"); break; } 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_shr ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; 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); switch ( l_data_left->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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 ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, char ) >> finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short: l_type = finc_type_new ( FinCType_Short, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, short ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, short ) >> finc_access ( finc_data_get_raw_data ( l_data_right ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: /* do not support shr operator */ break; #endif #ifdef USING_LONG case FinCType_Long: l_type = finc_type_new ( FinCType_Long, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, long ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, long ) >> finc_access ( finc_data_get_raw_data ( l_data_right ), 0, long ); break; #endif default: printf("this data type not support SHIFT RIGHT operation.\n"); break; } 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_add ( FinCNode* p_node ){ FinCNode * l_left; FinCNode* l_right; FinCType* l_type; FinCData* l_data = NULL; 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); switch ( l_data_left->type->type ) { case FinCType_Int: l_type = finc_type_new ( FinCType_Int, 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 ); break; case FinCType_Char: l_type = finc_type_new ( FinCType_Char, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, char ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, char ) + finc_access ( finc_data_get_raw_data ( l_data_right ), 0, char ); break; case FinCType_Short:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?