void DaoValue_Print( DaoValue *self, DaoProcess *proc, DaoStream *stream, DMap *cycData ) { DString *name; DaoTypeBase *typer; DMap *cd = cycData; if( self == NULL ){ DaoStream_WriteMBS( stream, "none[0x0]" ); return; } if( cycData == NULL ) cycData = DMap_New(0,0); switch( self->type ){ case DAO_INTEGER : DaoStream_WriteInt( stream, self->xInteger.value ); break; case DAO_FLOAT : DaoStream_WriteFloat( stream, self->xFloat.value ); break; case DAO_DOUBLE : DaoStream_WriteFloat( stream, self->xDouble.value ); break; case DAO_COMPLEX : DaoStream_WriteFloat( stream, self->xComplex.value.real ); if( self->xComplex.value.imag >= -0.0 ) DaoStream_WriteMBS( stream, "+" ); DaoStream_WriteFloat( stream, self->xComplex.value.imag ); DaoStream_WriteMBS( stream, "C" ); break; #ifdef DAO_WITH_LONGINT case DAO_LONG : name = DString_New(1); DLong_Print( self->xLong.value, name ); DaoStream_WriteString( stream, name ); DString_Delete( name ); break; #endif case DAO_ENUM : name = DString_New(1); DaoEnum_MakeName( & self->xEnum, name ); DaoStream_WriteMBS( stream, name->mbs ); DaoStream_WriteMBS( stream, "(" ); DaoStream_WriteInt( stream, self->xEnum.value ); DaoStream_WriteMBS( stream, ")" ); DString_Delete( name ); break; case DAO_STRING : DaoStream_WriteString( stream, self->xString.data ); break; default : typer = DaoVmSpace_GetTyper( self->type ); if( typer->core->Print == DaoValue_Print ){ DaoValue_BasicPrint( self, proc, stream, cycData ); break; } typer->core->Print( self, proc, stream, cycData ); break; } if( cycData != cd ) DMap_Delete( cycData ); }
DString* DaoValue_GetString( DaoValue *self, DString *str ) { char chs[100] = {0}; DString_Clear( str ); switch( self->type ){ case DAO_INTEGER : sprintf( chs, "%" DAO_INT_FORMAT, self->xInteger.value ); break; case DAO_FLOAT : sprintf( chs, "%g", self->xFloat.value ); break; case DAO_DOUBLE : sprintf( chs, "%g", self->xDouble.value ); break; case DAO_COMPLEX : sprintf( chs, (self->xComplex.value.imag < 0) ? "%g%gC" : "%g+%gC", self->xComplex.value.real, self->xComplex.value.imag ); break; #ifdef DAO_WITH_LONGINT case DAO_LONG : DLong_Print( self->xLong.value, str ); break; #endif case DAO_ENUM : DaoEnum_MakeName( & self->xEnum, str ); break; case DAO_STRING : DString_Assign( str, self->xString.data ); break; default : break; } if( self->type <= DAO_COMPLEX ) DString_SetMBS( str, chs ); return str; }
DString* DaoValue_GetString( DaoValue *self, DString *str ) { dao_complex *com; char chs[100] = {0}; DString_Clear( str ); switch( self->type ){ case DAO_COMPLEX : com = & self->xComplex.value; sprintf( chs, (com->imag < 0) ? "%g%gC" : "%g+%gC", com->real, com->imag ); break; case DAO_BOOLEAN : strcat( chs, self->xBoolean.value ? "true" : "false" ); break; case DAO_INTEGER : sprintf( chs, "%"DAO_I64, (long long) self->xInteger.value ); break; case DAO_FLOAT : sprintf( chs, "%g", self->xFloat.value ); break; case DAO_STRING : DString_Assign( str, self->xString.value ); break; case DAO_ENUM : DaoEnum_MakeName( & self->xEnum, str ); break; default : break; } if( self->type <= DAO_COMPLEX ) DString_SetChars( str, chs ); return str; }