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