Changeset 387 in dev for trunk/abdev/BasicCompiler_Common/src/DataTable.cpp
- Timestamp:
- Feb 11, 2008, 12:06:15 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/DataTable.cpp
r370 r387 65 65 return retSize; 66 66 } 67 int DataTable::AddString( const char *str ){ 68 int retSize = size; 69 AddString( str, lstrlen( str ) ); 70 return retSize; 67 int DataTable::AddString( const char *str ) 68 { 69 return AddString( str, lstrlen( str ) ); 70 } 71 int DataTable::AddString( const std::string &str ) 72 { 73 return AddString( str.c_str(), static_cast<int>(str.length()) ); 74 } 75 int DataTable::AddSpace( int size ) 76 { 77 int retSize = this->size; 78 Realloc( this->size + size ); 79 return retSize; 80 } 81 void DataTable::AddAlignment( int size ) 82 { 83 if( this->size % size == 0 ) 84 { 85 // 既に境界のとき 86 return; 87 } 88 Realloc( this->size + ( size - (int)(this->size%size) ) ); 71 89 } 72 90 … … 262 280 RemoveStringBracket( buffer ); 263 281 264 void *binary = malloc( 1 ); 265 int num = 0; 266 282 Jenga::Common::Strings parameters; 283 SplitParameter( buffer, parameters ); 284 285 // アラインメント 286 AddAlignment( tempBaseType.GetSize() ); 287 288 // データテーブルに空間を確保 289 dataTableOffset = AddSpace( static_cast<int>(tempBaseType.GetSize() * parameters.size()) ); 290 291 bool isSuccessful = true; 267 292 int i = 0; 268 bool isSuccessful = true; 269 while( buffer[i] ){ 270 char temporary[1024]; 271 272 i = GetOneParameter( buffer, i, temporary ); 273 if( buffer[i] == ',' ){ 274 i++; 275 } 276 277 Type resultType; 278 _int64 i64data; 279 if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){ 280 isSuccessful = false; 281 break; 282 } 283 if( !resultType.IsWhole() ){ 284 // TODO: 実数に未対応 285 SetError(); 286 isSuccessful = false; 287 break; 288 } 289 290 binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() ); 291 memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() ); 292 num++; 293 BOOST_FOREACH( const std::string ¶mStr, parameters ) 294 { 295 if( paramStr[0] == '\"' ) 296 { 297 // 文字列 298 std::string tempParamStr = paramStr; 299 if( !RemoveStringQuotes( tempParamStr ) ) 300 { 301 SetError(); 302 } 303 304 // 文字列を追加 305 _int64 strOffset = this->AddString( tempParamStr ); 306 307 // ポインタ値を上書き 308 int tempOffset = dataTableOffset + i * tempBaseType.GetSize(); 309 this->OverwriteBinary( tempOffset, &strOffset, tempBaseType.GetSize() ); 310 311 // DataTableスケジュール 312 this->schedules.push_back( Schedule( Schedule::DataTable, tempOffset ) ); 313 } 314 else 315 { 316 // 数値 317 Type resultType; 318 _int64 i64data; 319 if( !StaticCalculation( true, paramStr.c_str(), tempBaseType.GetBasicType(), &i64data, resultType ) ){ 320 isSuccessful = false; 321 break; 322 } 323 if( !resultType.IsWhole() ){ 324 // TODO: 実数に未対応 325 SetError(); 326 isSuccessful = false; 327 break; 328 } 329 330 // 上書き 331 this->OverwriteBinary( dataTableOffset + i * tempBaseType.GetSize(), &i64data, tempBaseType.GetSize() ); 332 } 333 334 i++; 293 335 } 294 336 295 337 free( buffer ); 296 297 dataTableOffset = this->AddBinary( binary, num * tempBaseType.GetSize() );298 299 free( binary );300 338 301 339 return isSuccessful;
Note:
See TracChangeset
for help on using the changeset viewer.