// take (and remove) the first number from the string and return it // XXX should be more clever parsing floating point numbers // (e.g. bogus 1.2e2.1e3 is currently accepted) double TakeNumber(wxString& data) { wxString s; data = TrimWs(data); if (data.IsEmpty()) return 0.0; // some error if (IsNumberChar(data[0])) { s += data[0]; data = data.Mid(1); while (data.Length() > 0 && IsNumberDigit(data[0])) { s += data[0]; if (data[0] == 'e' || data[0] == 'E') { data = data.Mid(1); if (data.Length() < 1) break; if (data[0] == '+' || data[0] == '-') { s += data[0]; data = data.Mid(1); } } else { data = data.Mid(1); } } } double f; s.ToDouble(&f); return f; }
//------------------------------------------------------------------------ static char* GetSLKNumValue( char* pData, char* pOutValue, bool& pIsEnd ) //------------------------------------------------------------------------ { char* ptrValue = pOutValue; char* ptrData = pData; int len = 0; for(;;) { if( '\n' == *ptrData++ ) return ptrData; if('\0' == *ptrData) { pIsEnd = true; return ptrData; } if( ';' == *ptrData) { return ptrData; } if( !IsNumberChar( *ptrData ) ) return ptrData; if( len < MAX_SLK_NUM_STRING_LEN-1 ) *(ptrValue++) = *(ptrData); else { assert( "数字长度错误!" && false ); } len++; } return NULL; }
//------------------------------------------------------------------------ char* CFileReadSLK::FetchKnownKeyValue( char* pData, bool& pIsEnd ) //------------------------------------------------------------------------ { char* ptrData = pData; ++ptrData; if( ';' != *ptrData) { pIsEnd = true; return ptrData; } for(;;) { if('\n' == *ptrData++ ) { return ptrData; } if('\0' == *ptrData) { pIsEnd = true; return ptrData; } emSlkValueType valueType = GetValueType( *ptrData ); switch( valueType ) { case ESVT_X: { char strValue[MAX_SLK_NUM_STRING_LEN]; memset( strValue, 0, sizeof(char)*MAX_SLK_NUM_STRING_LEN ); ptrData = GetSLKNumValue( ptrData, strValue, pIsEnd ); if( 0 < strlen(strValue) && strlen(strValue) < 11) { m_curCol = atoi( strValue ) -1; if(m_curCol > 300) { m_curCol = 0; } if( m_curCol < 0 ) { m_curCol = 0; //ZM::Log::global().log( "<<<ERROR>>> Error SLK File." ); } } else { ErrorLog(3,"---------slkerrr-----------"); } } break; case ESVT_Y: { char strValue[MAX_SLK_NUM_STRING_LEN]; memset( strValue, 0, sizeof(char)*MAX_SLK_NUM_STRING_LEN ); ptrData = GetSLKNumValue( ptrData, strValue, pIsEnd ); if( 0 < strlen(strValue) && strlen(strValue) < 11) { m_curRow = atoi( strValue ) - 1; if(m_curRow > 5000) { m_curRow = 0; } if( m_curRow < 0 ) { m_curRow = 0; //ZM::Log::global().log( "<<<ERROR>>> Error SLK File." ); } //OutputDebugString("\n"); } else { ErrorLog(3,"1111111111---------slkerrr-----------"); } } break; case ESVT_K: { if( '"' != *(ptrData+1) ) { if( IsNumberChar( *(ptrData+1) ) ) { char strValue[MAX_SLK_NUM_STRING_LEN]; memset( strValue, 0, sizeof(char)*MAX_SLK_NUM_STRING_LEN ); ptrData = GetSLKNumValue( ptrData, strValue, pIsEnd ); m_row = max( m_curRow+1, m_row ); m_col = max( m_curCol+1, m_col ); _TSLKValue* value = new _TSLKValue; value->col = m_curCol; value->row = m_curRow; value->value.intValue = atoi( strValue ); value->value.floatValue = atof( strValue ); size_t len = strlen( strValue ); if( MAX_SLK_NUM_STRING_LEN <= len ) { ErrorLog(3,"222222222---------slkerrr-----------"); } value->value.stringValue= new char[len+2]; memset( value->value.stringValue, 0, (len+2)*sizeof(char) ); strcpy( value->value.stringValue, strValue ); _TSLKValueArray.push_back( value ); //OutputDebugString(strValue); //OutputDebugString("\t"); //ZM::Log::global().log( "[%d,%d](%f)\n", m_curRow, m_curCol, atof( strValue ) ); } } else { char strValue[MAX_SLK_VALUE_STRING]; memset( strValue, 0, sizeof(char)*MAX_SLK_VALUE_STRING ); ptrData = GetSLKStringValue( ptrData, strValue, pIsEnd ); m_row = max( m_curRow+1, m_row ); m_col = max( m_curCol+1, m_col ); _TSLKValue* value = new _TSLKValue; value->col = m_curCol; value->row = m_curRow; value->value.intValue = atoi( strValue ); value->value.floatValue = atof( strValue ); size_t len = strlen( strValue ); if( MAX_SLK_VALUE_STRING <= len ) { ErrorLog(3,"3333---------slkerrr-----------"); } value->value.stringValue= new char[len+2]; memset( value->value.stringValue, 0, (len+2)*sizeof(char) ); strcpy( value->value.stringValue, strValue ); _TSLKValueArray.push_back( value ); //OutputDebugString(strValue); //OutputDebugString("\t"); //ZM::Log::global().log( "[%d,%d](%s)\n", m_curRow, m_curCol, strValue ); } } break; case ESVT_A: while('\n'!= *ptrData && '\0'!= *ptrData)ptrData++; break; case ESVT_Unkown: break; } } }