📄 fincnode.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 + -