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