finclib.c

来自「FinC编译器源代码」· C语言 代码 · 共 226 行

C
226
字号
#include <finc/finclib.h>#include <finc/fincsys.h>#define	HERE	kprintf("here, %s:%d\n", __FILE__, __LINE__)FinC* finc_init(){    FinC* self;    self = (FinC*)mem_new(sizeof(FinC));    self->env = finc_lang_new();    self->sys_func = finc_sys_new();    self->context = finc_context_new();    g_finc_context = self->context;    g_finc_lang_env = self->env;    finc_sys_init(self->sys_func);    return self;}void finc_exit(FinC* self){    unref(self->env);    unref(self->sys_func);    unref(self->context);    mem_destroy(self);}void finc_insert_var(FinC* self, unsigned char* type, unsigned char* name, ADT data){    FinCType* l_type;    FinCVar* l_var;    String* l_name;    FinCData* l_data;    l_name = string_new_str(name);    l_var = finc_context_get_var(g_finc_context, l_name);    if ( l_var )    {		printf("Error: can't insert variable for %s, the variable already exist in environment.\n", name);		unref(l_var);		unref(l_name);		return;    }    else    {		l_type = finc_type_new_name(type, FinCArrayType_None, 0);		l_data = finc_data_new (l_type, data);		l_var = finc_var_new (l_name, l_data);		finc_context_add_var(g_finc_context, l_var, TRUE);		unref(l_type);		unref(l_var);		unref(l_data);		unref(l_name);    }}void finc_remove_var(FinC* self, unsigned char* name){}ADT finc_get_var(FinC* self, unsigned char* name){    ADT result;    FinCVar* l_var;    String* l_name;    result = NULL;    l_name = string_new_str (name);    l_var = finc_context_get_var(g_finc_context, l_name);    if (l_var)    {		result = l_var->data->raw;		unref(l_var);    }    unref(l_name);    return result;}void finc_insert_sys_api(FinC* self, unsigned char* p_name, void* p_func, unsigned char* p_rettype){    FinCFunc* l_func;    l_func = finc_context_add_func_sys_api (g_finc_context, p_name, p_func);    l_func->ret_type = finc_type_new_name (p_rettype, FinCArrayType_None, 0);}void finc_insert_func(FinC* self, unsigned char* p_name, void* p_func, unsigned char* p_rettype, ...){    va_list lst;    FinCFunc* l_func;    FinCField* l_field;    FinCType* l_type;    String* l_name;    unsigned char* l_paramtype;    unsigned char* l_paramname;    l_func = finc_context_add_func_native (g_finc_context, p_name, p_func);    l_func->ret_type = finc_type_new_name (p_rettype, FinCArrayType_None, 0);    va_start (lst, p_rettype);    l_paramtype = va_arg(lst, unsigned char*);    while (l_paramtype)    {		if (strcmp (l_paramtype, "...") == 0)		{			l_func->opt_param = TRUE;		}		else		{			l_paramname = va_arg (lst, unsigned char*);			l_type = finc_type_new_name (l_paramtype, FinCArrayType_None, 0);			l_name = string_new_str ( l_paramname);			l_field = finc_field_new (l_name, l_type);			unref (l_type);			unref (l_name);			finc_func_add_param (l_func, l_field);			unref (l_field);		}		l_paramtype = va_arg(lst, unsigned char*);    }    va_end (lst);}ADT finc_call_func(FinC* self, unsigned char* func){    return NULL;}void finc_proc_method_table(FinC* self, FinCMethodTable table, int size){	int i;	for ( i=0; i<size; i++)	{		finc_insert_func(self, table[i].method_name, table[i].method_ptr, "void", "void", NULL);	}}#ifdef USING_FILEvoid finc_run_script(FinC* self, unsigned char* filename){    FinCNode* l_node;    FinCFunc* l_func;    String* l_name;    FinCData* data_return;    FinCParser* parser;    parser = finc_parser_new();    finc_parser_set_env(parser, self->env);    finc_parser_parser_file(parser, filename);    l_node =  addref(FinCNode, parser->tree_root);    unref(parser);    if (l_node)    {		finc_node_evaluate (l_node);		unref (l_node);			if ( g_finc_context->error != 0 )		{		    printf("\t%d error founded.\n", g_finc_context->error);		    return ;		}		else		{		    l_name = string_new ();		    string_set_str (l_name, "main");		    l_func = finc_context_get_func (g_finc_context, l_name);		    unref (l_name);		    if (l_func)		    {				data_return = finc_func_call (l_func, NULL);				unref (l_func);				unref (data_return);		    }		    else		    {				printf ("Runtime Error:function 'main' not founded\n");				finc_context_error_inc( g_finc_context );		    }		}    }}#endifvoid finc_run_string(FinC* self, unsigned char* str){    FinCNode* l_node;    String* l_str;    FinCParser* parser;    parser = finc_parser_new();    finc_parser_set_env(parser, self->env);    l_str = string_new_str(str);		finc_parser_parser_string(parser, l_str);    l_node =  addref(FinCNode, parser->tree_root);    unref(parser);    if ( g_finc_context->error !=0 )    {		printf("\t%d error founded, stopped...\n", g_finc_context->error);		unref(l_node);		return;    }    if (l_node)    {		finc_node_evaluate (l_node);		unref (l_node);    }}

⌨️ 快捷键说明

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