finctype.c

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

C
130
字号
#include <finc/finctype.h>#include <finc/finccontext.h>extern FinCContext* g_finc_context;FinCType* finc_type_new (FinCTypeType p_type, FinCArrayType p_array_type, unsigned int p_array_size){	FinCType *self;	self = (FinCType*)mem_new(sizeof(FinCType));	object_init_object (OBJECT (self), finc_type_destroy);	self->name = string_new_str("unknown");	self->type = p_type;	self->array_type = p_array_type;	self->array_size = p_array_size;	return self;}FinCType* finc_type_new_copy(FinCType* other){	FinCType* self;	self = (FinCType*)mem_new(sizeof(FinCType));	object_init_object ((Object*)self, finc_type_destroy);	self->name = string_new_str(string_get_str(other->name));	self->type = other->type;	self->array_type = other->array_type;	self->array_size = other->array_size;	return self;}FinCType* finc_type_new_name (unsigned char* p_name, FinCArrayType p_array_type, unsigned int p_array_size){	FinCType* l_type;	if (strcmp (p_name, "void") == 0)		return finc_type_new (FinCType_Void, p_array_type, p_array_size);	if (strcmp (p_name, "char") == 0)		return finc_type_new (FinCType_Char, p_array_type, p_array_size);	if (strcmp (p_name, "short") == 0)		return finc_type_new (FinCType_Short, p_array_type, p_array_size);	if (strcmp (p_name, "int") == 0)		return finc_type_new (FinCType_Int, p_array_type, p_array_size);	#ifdef USING_FLOAT	if (strcmp (p_name, "float") == 0)		return finc_type_new (FinCType_Float, p_array_type, p_array_size);	#endif	#ifdef USING_DOUBLE	if (strcmp (p_name, "double") == 0)		return finc_type_new (FinCType_Double, p_array_type, p_array_size);	#endif	if (strcmp (p_name, "bool") == 0)		return finc_type_new (FinCType_Bool, p_array_type, p_array_size);	if (strcmp (p_name, "pointer") == 0)		return finc_type_new (FinCType_Pointer, p_array_type, p_array_size);	if (strcmp (p_name, "string") == 0)		return finc_type_new (FinCType_String, p_array_type, p_array_size);	/*if not base data type, that will be a struct data type*/	l_type = finc_type_new (FinCType_Struct, p_array_type, p_array_size);	string_set_str (l_type->name, p_name);	return l_type;}void finc_type_destroy (Object* self){	unref(((FinCType*)self)->name);	mem_destroy (self);}unsigned int finc_type_get_size (FinCType* self){	FinCStruct* l_struct;	int l_array;	int l_struct_size;	if ( self->array_size ) l_array = self->array_size;	else l_array =1;	switch ( self->type )	{	case FinCType_Char:		return sizeof(char)*l_array;	case FinCType_Short:		return sizeof(short)*l_array;	case FinCType_Int:		return sizeof(int)*l_array;	#ifdef USING_FLOAT	case FinCType_Float:		return sizeof(float)*l_array;	#endif	#ifdef USING_DOUBLE	case FinCType_Double:		return sizeof(double)*l_array;	#endif	case FinCType_Bool:		return sizeof(Bool)*l_array;	case FinCType_Pointer:	case FinCType_Func:		return sizeof(void*)*l_array;	case FinCType_String:		return sizeof(unsigned char*)*l_array;	case FinCType_Struct:		l_struct = finc_context_get_struct(g_finc_context, self->name);		if ( !l_struct )		{			printf("Error: struct %s not founded.\n", string_get_str (self->name));			return 0;		}		l_struct_size = l_struct->size;		unref(l_struct);		return l_struct_size*l_array;	default:		return 0;	}}

⌨️ 快捷键说明

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