int CBlockMember::ReadMember( char **stream, int *streamPos ) { m_id = LittleLong(*(int *) (*stream + *((int *)streamPos))); *streamPos += sizeof( int ); if ( m_id == ID_RANDOM ) {//special case, need to initialize this member's data to Q3_INFINITE so we can randomize the number only the first time random is checked when inside a wait m_size = sizeof( float ); *streamPos += sizeof( int ); m_data = ICARUS_Malloc( m_size ); float infinite = Q3_INFINITE; memcpy( m_data, &infinite, m_size ); } else { m_size = LittleLong(*(int *) (*stream + *streamPos)); *streamPos += sizeof( int ); m_data = ICARUS_Malloc( m_size ); memcpy( m_data, (*stream + *streamPos), m_size ); #ifdef Q3_BIG_ENDIAN // only TK_INT, TK_VECTOR and TK_FLOAT has to be swapped, but just in case if (m_size == 4 && m_id != TK_STRING && m_id != TK_IDENTIFIER && m_id != TK_CHAR) *(int *)m_data = LittleLong(*(int *)m_data); #endif } *streamPos += m_size; return true; }
void CBlockMember::SetData( void *data, int size ) { if ( m_data ) ICARUS_Free( m_data ); m_data = ICARUS_Malloc( size ); memcpy( m_data, data, size ); m_size = size; }
int CBlockMember::ReadMember( char **stream, int *streamPos ) { m_id = *(int *) (*stream + *((int *)streamPos)); *streamPos += sizeof( int ); if ( m_id == ID_RANDOM ) {//special case, need to initialize this member's data to Q3_INFINITE so we can randomize the number only the first time random is checked when inside a wait m_size = sizeof( float ); *streamPos += sizeof( int ); m_data = ICARUS_Malloc( m_size ); float infinite = Q3_INFINITE; memcpy( m_data, &infinite, m_size ); } else { m_size = *(int *) (*stream + *streamPos); *streamPos += sizeof( int ); m_data = ICARUS_Malloc( m_size ); memcpy( m_data, (*stream + *streamPos), m_size ); } *streamPos += m_size; return true; }