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 + -
显示快捷键?