fincsys.c
来自「FinC编译器源代码」· C语言 代码 · 共 2,013 行 · 第 1/4 页
C
2,013 行
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: l_type = finc_type_new ( FinCType_Double, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, double ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, double ) + finc_access ( finc_data_get_raw_data ( l_data_right ), 0, double ); break; #endif #ifdef USING_FLOAT case FinCType_Float: l_type = finc_type_new ( FinCType_Float, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, float ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, float) + finc_access ( finc_data_get_raw_data ( l_data_right ), 0, float ); 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 ADD 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_sub ( 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: l_type = finc_type_new ( FinCType_Double, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, double ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, double ) - finc_access ( finc_data_get_raw_data ( l_data_right ), 0, double ); break; #endif #ifdef USING_FLOAT case FinCType_Float: l_type = finc_type_new ( FinCType_Float, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, float ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, float) - finc_access ( finc_data_get_raw_data ( l_data_right ), 0, float ); 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 SUB 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_mul ( 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: l_type = finc_type_new ( FinCType_Double, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, double ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, double ) * finc_access ( finc_data_get_raw_data ( l_data_right ), 0, double ); break; #endif #ifdef USING_FLOAT case FinCType_Float: l_type = finc_type_new ( FinCType_Float, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, float ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, float) * finc_access ( finc_data_get_raw_data ( l_data_right ), 0, float ); 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 MUL 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_div ( 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: l_type = finc_type_new ( FinCType_Double, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, double ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, double ) / finc_access ( finc_data_get_raw_data ( l_data_right ), 0, double ); break; #endif #ifdef USING_FLOAT case FinCType_Float: l_type = finc_type_new ( FinCType_Float, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, float ) = finc_access ( finc_data_get_raw_data ( l_data_left ), 0, float) / finc_access ( finc_data_get_raw_data ( l_data_right ), 0, float ); 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 DIV 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_mod ( 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 double mod operator */ break; #endif #ifdef USING_FLOAT case FinCType_Float: /* do not support float mod 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 MOD 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_negative( FinCNode* p_node ){ FinCNode* l_node; FinCType* l_type; FinCData* l_data = NULL; l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 ); finc_node_evaluate ( l_node ); switch ( l_node->data->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_node->data ), 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_node->data ), 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_node->data ), 0, short ); break; #ifdef USING_DOUBLE case FinCType_Double: l_type = finc_type_new ( FinCType_Double, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, double ) = - finc_access ( finc_data_get_raw_data ( l_node->data ), 0, double ); break; #endif #ifdef USING_FLOAT case FinCType_Float: l_type = finc_type_new ( FinCType_Float, FinCArrayType_None, 0 ); l_data = finc_data_new ( l_type, NULL ); unref ( l_type ); finc_access ( finc_data_get_raw_data ( l_data ), 0, float ) = - finc_access ( finc_data_get_raw_data ( l_node->data ), 0, float ); 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_node->data ), 0, long ); break; #endif default: printf("this data type not support MOD operation.\n"); break; } unref ( l_node ); unref(p_node->data); p_node->data = l_data;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?