fincdata.c

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

C
402
字号
#include <finc/fincdata.h>#include <finc/fincfield.h>#include <finc/fincstruct.h>#include <finc/finccontext.h>#include <finc/finclib.h>FinCData* finc_data_new ( FinCType* p_type, ADT p_ref ){    FinCData * self;    self = (FinCData*)mem_new(sizeof(FinCData));    object_init_object ( (Object*) self, finc_data_destroy );    self->type = addref ( FinCType, p_type );    self->pointer = NULL;	self->vector_child = NULL;	self->array_stand = 0;    if ( p_ref )    {    	self->ref = TRUE;    	self->raw = p_ref;	    finc_data_init_data ( self, p_ref );    	return self;    }    self->ref = FALSE;    self->raw = NULL;    finc_data_init_data ( self, NULL );    return self;}FinCData* finc_data_new_data ( FinCType* p_type, ADT p_ref ){    FinCData * self;	if (!p_ref) return NULL;	self = (FinCData*)mem_new(sizeof(FinCData));    object_init_object ( (Object*) self, finc_data_destroy );    self->type = addref ( FinCType, p_type );    self->pointer = NULL;	self->vector_child = NULL;	self->ref = FALSE;	self->raw = p_ref;	finc_data_init_data ( self, p_ref );	return self;}/*copy p_data to new data, but without its ref.struct type:*/FinCData* finc_data_new_copy (FinCData* p_data){	FinCData* self;	self = finc_data_new (p_data->type, NULL);	mem_copy(p_data->raw, self->raw, finc_type_get_size(p_data->type));	if ( p_data->pointer )	{		self->pointer = addref(FinCData, p_data->pointer);	}	return self;}/*use p_str to generate a string type data.*/FinCData* finc_data_new_string (unsigned char* p_str){	FinCData* self;	FinCData* l_str;	FinCType* l_type;	l_type = finc_type_new ( FinCType_String, FinCArrayType_None, 0);	self = finc_data_new( l_type, NULL);	unref(l_type);	l_str = finc_data_new_raw_string (p_str);	mem_copy(&l_str->raw, self->raw, sizeof(ADT));	self->pointer = addref(FinCData, l_str);	unref(l_str);	return self;}/*use p_str to generate a raw string data, it will copy p_str to new raw data.*/FinCData* finc_data_new_raw_string (unsigned char* p_str){	FinCData* self;	FinCType* l_type;	int l_size;	l_size = strlen(p_str)+1;	l_type = finc_type_new (FinCType_Char, FinCArrayType_Fixed, l_size);	self = finc_data_new( l_type, NULL);	unref(l_type);	mem_copy( p_str, self->raw, l_size);	return self;}void finc_data_destroy ( Object* self ){	FinCData* l_self;	FinCFunc* func;		l_self = (FinCData*)self;		unref(l_self->vector_child);	if ( (l_self->type->type & FinCType_String)||(l_self->type->type & FinCType_Pointer) )	{		unref(l_self->pointer);	}	else if ( l_self->type->type & FinCType_Func )	{		func = (FinCFunc*)finc_access( l_self->raw, 0, ADT);		unref(func);	}	if ( !l_self->ref ) mem_destroy(l_self->raw);	l_self->raw = NULL;	unref(l_self->type);	mem_destroy ( l_self );}void finc_data_init_data ( ADT self, ADT data ){    FinCData* l_data;    int i;    unsigned int l_array;    FinCStruct* l_struct;    l_data = ( FinCData* ) self;    if ( l_data->type->array_type == FinCArrayType_None )        l_array = 1;    else        l_array = l_data->type->array_size;    /*alloc new data block*/	if ( data )	{		l_data->raw = data;	}    else	{		l_data->raw = (ADT) mem_new ( finc_type_get_size(l_data->type) );		if (( l_data->type->type & FinCType_String )||( l_data->type->type & FinCType_Pointer ))		{			for ( i = 0; i < l_array; i++ )				finc_access ( l_data->raw, i * sizeof( ADT ), unsigned char* ) = NULL;		}		else if ( l_data->type->type & FinCType_Int )		{			for ( i = 0; i < l_array; i++ )				finc_access ( l_data->raw, i*sizeof(int), int ) = 0;		}		#ifdef USING_FLOAT		else if ( l_data->type->type & FinCType_Float )		{			for ( i = 0; i < l_array; i++ )				finc_access ( l_data->raw, i*sizeof(float), float ) = 0.0;		}		#endif		else if ( l_data->type->type & FinCType_Bool )		{			for ( i = 0; i < l_array; i++ )				finc_access ( l_data->raw, i*sizeof(Bool), Bool ) = FALSE;		}	}	if ( l_data->type->type & FinCType_Struct )	{		l_struct = finc_context_get_struct (g_finc_context, l_data->type->name);		l_data->vector_child = finc_struct_init_data(l_struct, l_data->raw);		unref(l_struct);	}}String* finc_data_get_string ( FinCData* self ){	String * l_text;	l_text = string_new ();	string_set_str ( l_text, finc_access ( self->raw, 0, char* ) );	return l_text;}void finc_data_set_string ( FinCData* self, String* p_value ){	int l_size;	FinCData* l_string;	FinCType* l_type;	l_size = string_get_size ( p_value )+1;	l_type = finc_type_new(FinCType_Char, FinCArrayType_Fixed, l_size);	l_string = finc_data_new(l_type, NULL);	mem_copy ( string_get_str(p_value), l_string->raw, l_size);	if(self->pointer)unref(self->pointer);	self->pointer = addref(FinCData, l_string);	self->raw = l_string->raw;	unref(l_string);}void finc_data_assign ( FinCData* self, FinCData* p_src ){	FinCData* l_data;	char l_str[ 1000 ];	if ( !p_src )	{		printf ("Runtime Error: source data not available\n" );		finc_context_error_inc( g_finc_context );		return ;	}	if ( !self )	{		printf ("Runtime Error: destination data not available\n" );		finc_context_error_inc( g_finc_context );		return ;	}	if ( self->type->type & FinCType_String )	{		if ( p_src->type->type & FinCType_String )		{			if ( p_src->pointer )			{				l_data = finc_data_new_copy(p_src->pointer);				unref(self->pointer);				self->pointer = addref(FinCData, l_data);				unref(l_data);				mem_copy(&self->pointer->raw, self->raw, sizeof(ADT));			}			else			{				unref(self->pointer);				self->pointer = NULL;				mem_copy(p_src->raw, self->raw, sizeof(ADT));			}		}		if ( p_src->type->type & FinCType_Int )		{			sprintf ( l_str, "%d", finc_access ( p_src->raw, 0, unsigned int ) );			l_data = finc_data_new_string (l_str);			unref(self->pointer);			self->pointer = addref(FinCData, l_data->pointer);			unref(l_data);			mem_copy(&self->pointer->raw, self->raw, sizeof(ADT));		}		#ifdef USING_FLOAT		if ( p_src->type->type & FinCType_Float )		{			sprintf ( l_str, "%f", finc_access ( p_src->raw, 0, float ) );			l_data = finc_data_new_string (l_str);			unref(self->pointer);			self->pointer = addref(FinCData, l_data->pointer);			unref(l_data);			mem_copy(&self->pointer->raw, self->raw, sizeof(ADT));		}		#endif		#ifdef USING_DOUBLE		if ( p_src->type->type & FinCType_Double )		{			sprintf ( l_str, "%f", finc_access ( p_src->raw, 0, double ) );			l_data = finc_data_new_string (l_str);			unref(self->pointer);			self->pointer = addref(FinCData, l_data->pointer);			unref(l_data);			mem_copy(&self->pointer->raw, self->raw, sizeof(ADT));		}		#endif	}	if ( self->type->type & FinCType_Char)	{		finc_access ( self->raw, 0, char ) = finc_access ( p_src->raw, 0, char );	}	if ( self->type->type & FinCType_Int )	{		finc_access ( self->raw, 0, int ) = finc_access ( p_src->raw, 0, int );	}	if ( self->type->type & FinCType_Short )	{		finc_access ( self->raw, 0, short ) = finc_access ( p_src->raw, 0, short );	}	#ifdef USING_FLOAT	if ( self->type->type & FinCType_Float )	{		finc_access ( self->raw, 0, float ) = finc_access ( p_src->raw, 0, float );	}	#endif	if ( self->type->type & FinCType_Pointer )	{		if ( p_src->pointer )		{			finc_data_set_pointer( self, p_src->pointer);		}		else		{			unref ( self->pointer );			self->pointer = NULL;			mem_copy(p_src->raw, self->raw, sizeof(ADT));		}	}	if ( self->type->type & FinCType_Struct )	{		printf("not implement yet!\n");	}}/*used by array data type*/FinCData* finc_data_get_index ( FinCData* self, int p_index ){	FinCData * l_data;	FinCType* l_type;	if (self->type->type & FinCType_Pointer) return NULL; /* do not support get offset of pointer */	if (self->type->type & FinCType_String)	{		if (self->type->array_type != FinCArrayType_None)		{		/*		    l_type = finc_type_new(FinCType_String, FinCArrayType_None, 0 );	    	l_data = finc_data_new(l_type, &finc_access(self->raw, p_index * sizeof(ADT), ADT));			unref(l_type);		*/			return NULL;		}		else		{		    l_type = finc_type_new(FinCType_Char, FinCArrayType_None, 0 );		    l_data = finc_data_new(l_type, &(((char*)finc_access(self->raw, 0, ADT))[p_index]));			unref(l_type);		}	}	else	{	    l_type = finc_type_new(self->type->type, FinCArrayType_None, 0 );	    l_data = finc_data_new(l_type, &finc_access(self->raw, p_index * sizeof(ADT), ADT));	    unref(l_type);	}	return l_data;}void finc_data_set_pointer ( FinCData* self, FinCData* p_raw ){    if ( !self )    {		printf("Runtime Error: pointer source data unavailable.\n");		finc_context_error_inc( g_finc_context );		return;    }        if(self->pointer)unref(self->pointer);        if (p_raw)    {		self->pointer = addref(FinCData, p_raw);		mem_copy(&p_raw->raw, self->raw, sizeof(ADT));    }    else self->pointer = NULL;}FinCData* finc_data_get_field (FinCData* self, int p_index){    if (!self) return NULL;    if (!( self->type->type & FinCType_Struct )) return NULL;         return vector_at(self->vector_child, p_index);}

⌨️ 快捷键说明

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