⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fincnode.c

📁 FinC is Fava in C! A C-like syntax language. It s designed to apply to embededd system.
💻 C
字号:
#include <fincnode.h>#include <fincapp.h>FinCNode* finc_node_new (){	FinCNode *self;	self = (FinCNode*)mem_new(sizeof(FinCNode));	object_init_object (OBJECT (self), finc_node_destroy);	self->node_type = FinCNodeType_None;	self->data = NULL;	self->func = NULL;	self->type = NULL;	self->identifier = NULL;	self->source_file = NULL;	self->source_line = 0;	self->check = TRUE;	self->constant = FALSE;	self->vector_node = vector_new ();	return self;}FinCNode* finc_node_new_func ( unsigned char* p_name){	FinCNode* self;	String*	l_name;	self = finc_node_new ();	l_name = string_new ();	string_set_str (l_name, p_name);	finc_node_set_func (self, l_name);	unref (l_name);	return self;}FinCNode* finc_node_new_name ( unsigned char* p_name){	FinCNode* self;	String*	l_name;	self = finc_node_new ();	l_name = string_new ();	string_set_str (l_name, p_name);	finc_node_set_identifier (self, l_name);	unref (l_name);	return self;}void finc_node_destroy (Object* self){	unref ( ((FinCNode*)self)->data);	unref ( ((FinCNode*)self)->func);	unref ( ((FinCNode*)self)->type);	unref ( ((FinCNode*)self)->identifier);	unref ( ((FinCNode*)self)->vector_node);	mem_destroy (self);}void finc_node_add (FinCNode* self, FinCNode* p_node){	vector_append (self->vector_node, OBJECT (p_node));}void finc_node_evaluate (FinCNode* self){	FinCNode* l_subnode;	FinCData* l_data;	FinCVar*  l_var;	unsigned int i, l_size;	if (!self)return;	if (g_finc_func_halt || g_finc_app_continue || g_finc_app_break )return;	switch (self->node_type)	{	case FinCNodeType_None:		break;	case FinCNodeType_Block:		l_size = vector_get_size (self->vector_node);		for (i = 0; i < l_size; i++)		{			l_subnode = (FinCNode*) vector_at (self->vector_node, i);			finc_node_evaluate (l_subnode);			unref (l_subnode);		}		break;	case FinCNodeType_Data:		break;	case FinCNodeType_Identifier:		l_var = finc_app_get_var (g_finc_app_global, self->identifier);		if (l_var)		{			unref (self->data);			self->data = addref (FinCData, l_var->data);			unref (l_var);		}		else		{			printf ("ERROR: variable '%s' not founded\n", string_get_str (self->identifier));		}		break;	case FinCNodeType_Func:		if (!(self->func))			self->func = finc_app_get_func (g_finc_app_global, self->identifier);		if (self->func)		{			unref (self->data);			self->data = NULL;			l_data = finc_func_call (self->func, self);			if (l_data)				self->data = addref (FinCData, l_data);			unref (l_data);		}		else		{			printf ("ERROR: function '%s' not founded\n", string_get_str (self->identifier));			exit (-1);		}		break;	default:		break;	}}Bool finc_node_check (FinCNode* self, FinCNodeType p_type){	if (self->node_type == p_type)		return TRUE;	else		return FALSE;}FinCNode* finc_node_get (FinCNode* self, unsigned int p_index){	return (FinCNode*) vector_at (self->vector_node, p_index);}unsigned int finc_node_get_size (FinCNode* self){	return vector_get_size (self->vector_node);}void finc_node_set_constant (FinCNode* self){	self->constant = TRUE;}void finc_node_set_block (FinCNode* self){	self->node_type = FinCNodeType_Block;}void finc_node_set_data (FinCNode* self, FinCData* p_data){	self->node_type = FinCNodeType_Data;	unref (self->data);	self->data = addref (FinCData, p_data);}FinCData* finc_node_take_data (FinCNode* self){	FinCData* l_data;		if ( self->constant )	{		l_data = finc_data_new_copy(self->data);	}	else	{		l_data = self->data;		self->data = NULL;	}	return l_data;}void finc_node_set_func (FinCNode* self, String* p_name){	self->node_type = FinCNodeType_Func;	unref (self->identifier);	self->identifier = addref (String, p_name);}void finc_node_set_type (FinCNode* self, FinCType* p_type){	self->node_type = FinCNodeType_Type;	unref (self->type);	self->type = addref (FinCType, p_type);}void finc_node_set_identifier (FinCNode* self, String* p_identifier){	self->node_type = FinCNodeType_Identifier;	unref (self->identifier);	self->identifier = addref (String, p_identifier);}void finc_node_update (FinCNode* self){	FinCVar*  l_var;	if (!self)return;	if ( self->node_type == FinCNodeType_Identifier )	{		l_var = finc_app_get_var (g_finc_app_global, self->identifier);		if (l_var)		{			unref (self->data);			self->data = addref (FinCData, l_var->data);			unref (l_var);		}		else		{			printf ("ERROR: variable '%s' update error.\n", string_get_str (self->identifier));		}	}}

⌨️ 快捷键说明

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