fincsys.c

来自「FinC is Fava in C! A C-like syntax langu」· C语言 代码 · 共 1,211 行 · 第 1/3 页

C
1,211
字号
void finc_sys_if ( FinCNode* p_node ){	FinCNode * l_test;	FinCNode* l_true;	FinCNode* l_false;	l_test = FinC_NODE ( vector_at ( p_node->vector_node, 0 ) );	l_true = FinC_NODE ( vector_at ( p_node->vector_node, 1 ) );	l_false = FinC_NODE ( vector_at ( p_node->vector_node, 2 ) );	finc_node_evaluate ( l_test );	if ( access ( finc_data_get_raw_data ( l_test->data ), 0, Bool ) )	{		finc_node_evaluate ( l_true );	}	else	{		if ( l_false )			finc_node_evaluate ( l_false );	}	unref ( l_test );	unref ( l_true );	unref ( l_false );}void finc_sys_for ( FinCNode* p_node ){	FinCNode * node1;	FinCNode* node2;	FinCNode* node3;	FinCNode* code;	Bool old_continue, old_break, old_in_cycle;	node1 = FinC_NODE ( vector_at ( p_node->vector_node, 0 ) );	node2 = FinC_NODE ( vector_at ( p_node->vector_node, 1 ) );	node3 = FinC_NODE ( vector_at ( p_node->vector_node, 2 ) );	code = FinC_NODE ( vector_at ( p_node->vector_node, 3 ) );	finc_node_evaluate ( node1 );	finc_node_evaluate ( node2 );	old_continue = g_finc_app_continue;	old_break = g_finc_app_break;	old_in_cycle = g_finc_app_in_cycle;	while ( access ( finc_data_get_raw_data ( node2->data ), 0, Bool ) )	{		g_finc_app_in_cycle = TRUE;		finc_node_evaluate ( code );		if (g_finc_app_break)		{			g_finc_app_break = FALSE;			g_finc_app_in_cycle = FALSE;			break;		}		g_finc_app_continue = FALSE;		finc_node_evaluate ( node3 );		finc_node_evaluate ( node2 );		g_finc_app_in_cycle = FALSE;	}	unref ( node1 );	unref ( node2 );	unref ( node3 );	unref ( code );	g_finc_app_continue = old_continue;	g_finc_app_break = old_break;	g_finc_app_in_cycle = old_in_cycle;}void finc_sys_while ( FinCNode* p_node ){	FinCNode * l_test;	FinCNode* l_code;	Bool old_continue, old_break, old_in_cycle;	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_app_continue;	old_break = g_finc_app_break;	old_in_cycle = g_finc_app_in_cycle;	while ( access ( finc_data_get_raw_data ( l_test->data ), 0, Bool ) )	{		g_finc_app_in_cycle = TRUE;		finc_node_evaluate ( l_code );		if (g_finc_app_break)		{			g_finc_app_break = FALSE;			g_finc_app_in_cycle = FALSE;			break;		}		g_finc_app_continue = FALSE;		finc_node_evaluate ( l_test );		g_finc_app_in_cycle = FALSE;	}	unref ( l_test );	unref ( l_code );	g_finc_app_continue = old_continue;	g_finc_app_break = old_break;	g_finc_app_in_cycle = old_in_cycle;}void finc_sys_return ( FinCNode* p_node ){	FinCNode * l_node;	l_node = FinC_NODE ( vector_at ( p_node->vector_node, 0 ) );	finc_node_evaluate ( l_node );	g_finc_func_return = addref ( FinCData, l_node->data );	/*g_finc_func_return = finc_data_new_copy (l_node->data);*/	unref ( l_node );	g_finc_func_halt = TRUE;}void finc_sys_continue ( FinCNode* p_node ){	if ( g_finc_app_in_cycle )	{		g_finc_app_continue = TRUE;		return;	}	printf("Runtime Error: can't use continue not in a cycle.\n");}void finc_sys_break ( FinCNode* p_node ){	if ( g_finc_app_in_cycle )	{		g_finc_app_break = TRUE;		return;	}	printf("Runtime Error: can't use break not in a cycle.\n");}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 );	p_node->data = finc_data_new_copy(l_node->data);	unref ( l_node );	access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int )		= access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) + 1;}void finc_sys_dec ( FinCNode* p_node ){	FinCNode * l_node;	l_node = (FinCNode*)vector_at ( p_node->vector_node, 0 );	p_node->data = finc_data_new_copy(l_node->data);	finc_node_evaluate ( l_node );	unref ( l_node );	access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) 		= access ( finc_data_get_raw_data ( l_node->data ), 0, unsigned int ) - 1;}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 ( access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int )	        < access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) )		access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE;	else		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 ( access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int )	        > access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) )		access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE;	else		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 ( access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int )	        <= access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) )		access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE;	else		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 ( access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int )	        >= access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) )		access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE;	else		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 ( access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int )	        != access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) )		access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE;	else		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 ( access ( finc_data_get_raw_data ( l_data_left ), 0, unsigned int )	        == access ( finc_data_get_raw_data ( l_data_right ), 0, unsigned int ) )		access ( finc_data_get_raw_data ( l_data ), 0, Bool ) = TRUE;	else		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 );	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?