analyzetool/commandlineengine/src/CATParseBinaryFile.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 49 7fdc9a71d314
equal deleted inserted replaced
49:7fdc9a71d314 59:8ad140f3dd41
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Definitions for the class CATParseTraceFile.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "../inc/ATCommonDefines.h"
       
    20 #include "../inc/CATParseBinaryFile.h"
       
    21 #include "../inc/catdatasaver.h"
       
    22 #include "../inc/CATDatParser.h"
       
    23 #include "../inc/CATProcessData.h"
       
    24 
       
    25 #include <time.h>
       
    26 
       
    27 
       
    28 
       
    29 // -----------------------------------------------------------------------------
       
    30 // CATParseBinaryFile::CATParseTraceFile
       
    31 // Constructor.
       
    32 // -----------------------------------------------------------------------------
       
    33 CATParseBinaryFile::CATParseBinaryFile()
       
    34 {
       
    35 	LOG_FUNC_ENTRY("CATParseTraceFile::CATParseTraceFile");
       
    36 	m_DataSaver.SetPrintFlag( false );
       
    37 }
       
    38 
       
    39 // -----------------------------------------------------------------------------
       
    40 // CATParseBinaryFile::StartParse
       
    41 // Main function to start trace parsing.
       
    42 // -----------------------------------------------------------------------------
       
    43 bool CATParseBinaryFile::StartParse( const char* pFileName, const char* pOutputFileName )
       
    44 {
       
    45 	LOG_FUNC_ENTRY("CATParseTraceFile::StartParse");
       
    46 
       
    47 	// Return value, will be changed to true if process start found.
       
    48 	bool bRet = false;
       
    49 
       
    50 	// Check pointers
       
    51 	if ( pFileName == NULL  )
       
    52 		return bRet;
       
    53 
       
    54 
       
    55 	if ( ! FileExists( pFileName ) )
       
    56 	{
       
    57 		cout << AT_MSG << "Error, input file \""
       
    58 			<< pFileName
       
    59 			<< "\" does not exist." << endl;
       
    60 		return bRet;
       
    61 	}
       
    62 
       
    63 	// Open input and output file
       
    64 	ifstream in( pFileName, ios::binary );
       
    65 	ofstream sDataToParse( pOutputFileName );
       
    66 
       
    67 	// Check file opened ok
       
    68 	if ( !in.good() )
       
    69 		return false;
       
    70 
       
    71 	// Get stream size
       
    72 	size_t streamPos = in.tellg();
       
    73 	in.seekg( 0, ios::end);
       
    74 	size_t streamEnd = in.tellg();
       
    75 	in.seekg( 0, ios::beg );
       
    76 
       
    77 	//Origianl characters (not filtered).
       
    78 
       
    79 	unsigned char cDataFromFile[MAX_LINE_LENGTH];
       
    80 
       
    81 	bool bProcessEndReached = false;
       
    82 	bool bError = false;
       
    83 
       
    84 	char messageType = 0;
       
    85 	unsigned __int64 messageTime = 0;
       
    86 
       
    87 	unsigned long iProcessId(0);
       
    88 	int iAddressCount(0);
       
    89 	string sTemp;
       
    90 
       
    91 	//first parse version info
       
    92 	GetString( cDataFromFile, in, streamPos, streamEnd );
       
    93 	//todo check if version is correct	
       
    94 
       
    95 	while( !bError && !bProcessEndReached )
       
    96 	{
       
    97 		// get time
       
    98 		if( !GetNum64( cDataFromFile, in, streamPos, streamEnd ) )
       
    99 		{
       
   100 			bError = true;
       
   101 			break;
       
   102 		}
       
   103 		messageTime = StringToNum64( cDataFromFile );
       
   104 
       
   105 		// get message type
       
   106 		if( !GetNum8( cDataFromFile, in, streamPos, streamEnd ) )
       
   107 		{
       
   108 			bError = true;
       
   109 			break;
       
   110 		}
       
   111 		messageType = (int)cDataFromFile[0];
       
   112 
       
   113 		switch (messageType)
       
   114 		{
       
   115 			case EProcessStart:
       
   116 				{
       
   117 				//temp string to store data until we get to processID
       
   118 				sTemp.clear();
       
   119 
       
   120                 //PCS MemoryLeaker.exe[edf5a8b2]0001 17b 48939b0f5c04f 1 3 1.10.0 1.7.5
       
   121 				sTemp.append( LABEL_PROCESS_START );
       
   122 				sTemp.append( " " );
       
   123 
       
   124 				// get process name
       
   125 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   126 				{
       
   127 					bError = true;
       
   128 					break;
       
   129 				}
       
   130 
       
   131 				sTemp.append( (char *)cDataFromFile );
       
   132 				sTemp.append( " " );
       
   133 
       
   134 				//get process id
       
   135 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   136 			    {
       
   137 					bError = true;
       
   138 					break;
       
   139 				}
       
   140 				iProcessId = StringToNum32(cDataFromFile);
       
   141 
       
   142 				// write stored data
       
   143 				sDataToParse << std::hex << messageTime;
       
   144 				sDataToParse << " ";
       
   145 				sDataToParse << MAIN_ID;
       
   146 				sDataToParse << " ";
       
   147 				sDataToParse << std::hex << iProcessId;
       
   148 				sDataToParse << " ";
       
   149 				sDataToParse << sTemp;
       
   150 				sDataToParse <<  std::hex << iProcessId;
       
   151 				sDataToParse << " ";
       
   152 
       
   153 				//write time
       
   154 				sDataToParse <<  std::hex << messageTime;
       
   155 				sDataToParse << " ";
       
   156 
       
   157 				//get udeb/urel
       
   158 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   159 				{
       
   160 					bError = true;
       
   161 					break;
       
   162 				}
       
   163 				sDataToParse <<  std::dec << StringToNum32(cDataFromFile);
       
   164 				sDataToParse << " ";
       
   165 
       
   166 				//add trace version - TODO check
       
   167 				sDataToParse <<  std::dec << 3;
       
   168 				sDataToParse << " ";
       
   169 
       
   170 				// get atool version
       
   171 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   172 				{
       
   173 					bError = true;
       
   174 					break;
       
   175 				}
       
   176 				sDataToParse << (char *)cDataFromFile;
       
   177 				sDataToParse << " ";
       
   178 
       
   179 				// get api version
       
   180 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   181 				{
       
   182 					bError = true;
       
   183 					break;
       
   184 				}
       
   185 				sDataToParse << (char *)cDataFromFile;
       
   186 				sDataToParse << "\n";
       
   187 
       
   188 				//process start found
       
   189 				bRet = true;
       
   190 
       
   191 				}
       
   192 				break;
       
   193 
       
   194 			case EProcessEnd:
       
   195 				{
       
   196 				sDataToParse << messageTime;
       
   197 				sDataToParse << " ";
       
   198 				sDataToParse << MAIN_ID;
       
   199 				sDataToParse << " ";
       
   200 				sDataToParse << iProcessId;
       
   201 				sDataToParse << " ";
       
   202 				//PCE
       
   203 				sDataToParse << LABEL_PROCESS_END ;
       
   204 				sDataToParse << "\n";
       
   205 				bProcessEndReached = true;
       
   206 				}
       
   207 				break;
       
   208 
       
   209 			case EDllLoad:
       
   210 				{
       
   211 				sDataToParse << std::hex << messageTime;
       
   212 				sDataToParse << " ";
       
   213 				sDataToParse << MAIN_ID;
       
   214 				sDataToParse << " ";
       
   215 				sDataToParse << iProcessId;
       
   216 				sDataToParse << " ";
       
   217 				//DLL AToolMemoryLeakerDll3.dll 3ff80000 3ff92000
       
   218 				sDataToParse << LABEL_DLL_LOAD ;
       
   219 				sDataToParse << " ";
       
   220 
       
   221 				// get dll name
       
   222 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   223 				{
       
   224 					bError = true;
       
   225 					break;
       
   226 				}
       
   227 				sDataToParse << (char *)cDataFromFile;
       
   228 				sDataToParse << " ";
       
   229 
       
   230 				// get start address
       
   231 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   232 				{
       
   233 					bError = true;
       
   234 					break;
       
   235 				}
       
   236 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   237 				sDataToParse << " ";
       
   238 
       
   239 				// get end address
       
   240 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   241 				{
       
   242 					bError = true;
       
   243 					break;
       
   244 				}
       
   245 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   246 				sDataToParse << "\n";
       
   247 				}
       
   248 				break;
       
   249 			
       
   250 			case EDllUnload:
       
   251 				{
       
   252 				sDataToParse << messageTime;
       
   253 				sDataToParse << " ";
       
   254 				sDataToParse << MAIN_ID;
       
   255 				sDataToParse << " ";
       
   256 				sDataToParse << iProcessId;
       
   257 				sDataToParse << " ";
       
   258 				//DLU AToolMemoryLeakerDll3.dll 3ff80000 3ff92000
       
   259 				sDataToParse << LABEL_DLL_UNLOAD ;
       
   260 				sDataToParse << " ";
       
   261 
       
   262 				// get dll name
       
   263 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   264 				{
       
   265 					bError = true;
       
   266 					break;
       
   267 				}
       
   268 				sDataToParse << (char *)cDataFromFile;
       
   269 				sDataToParse << " ";
       
   270 
       
   271 				// get start address
       
   272 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   273 				{
       
   274 					bError = true;
       
   275 					break;
       
   276 				}
       
   277 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   278 				sDataToParse << " ";
       
   279 
       
   280 				// get end address
       
   281 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   282 				{
       
   283 					bError = true;
       
   284 					break;
       
   285 				}
       
   286 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   287 				sDataToParse << "\n";
       
   288 				}
       
   289 				break;
       
   290 
       
   291 			case EAllocH:
       
   292 				{
       
   293 				sDataToParse << messageTime;
       
   294 				sDataToParse << " ";
       
   295 				sDataToParse << MAIN_ID;
       
   296 				sDataToParse << " ";
       
   297 				sDataToParse << iProcessId;
       
   298 				sDataToParse << " ";
       
   299 				//ALH 5a7a6734 5c 17c 11 6003ded4 60010df2 40001bff 40001c39 ...
       
   300 				// no fragments in log file
       
   301 				sDataToParse << ALLOCH_ID ;
       
   302 				sDataToParse << " ";
       
   303 
       
   304 				// get mam address
       
   305 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   306 				{
       
   307 					bError = true;
       
   308 					break;
       
   309 				}
       
   310 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   311 				sDataToParse << " ";
       
   312 
       
   313 				// get size of allocation
       
   314 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   315 				{
       
   316 					bError = true;
       
   317 					break;
       
   318 				}
       
   319 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   320 				sDataToParse << " ";
       
   321 
       
   322 				// get thread id
       
   323 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   324 				{
       
   325 					bError = true;
       
   326 					break;
       
   327 				}
       
   328 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   329 				sDataToParse << " ";
       
   330 
       
   331 				// get address count
       
   332 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   333 				{
       
   334 					bError = true;
       
   335 					break;
       
   336 				}
       
   337 				int iAddressCount = StringToNum32(cDataFromFile);
       
   338 				sDataToParse <<  std::hex << iAddressCount;
       
   339 
       
   340 				// get callstack
       
   341 				for(int i=0; i<iAddressCount; i++)
       
   342 				{
       
   343 					sDataToParse << " ";
       
   344 					if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   345 					{
       
   346 						bError = true;
       
   347 						break;
       
   348 					}
       
   349 				    sDataToParse <<  std::hex << StringToNum32(cDataFromFile); 
       
   350 				}
       
   351 				sDataToParse << "\n";
       
   352 				}
       
   353 				break;
       
   354 
       
   355 			case EFreeH:
       
   356 				{
       
   357 				sDataToParse << std::hex <<messageTime;
       
   358 				sDataToParse << " ";
       
   359 				sDataToParse << MAIN_ID;
       
   360 				sDataToParse << " ";
       
   361 				sDataToParse << iProcessId;
       
   362 				sDataToParse << " ";
       
   363 				//FRH 5a7a679c 17c 0 (6003ded4 60010df2 40001bff 40001c39 ...)
       
   364 				// no fragments in log file
       
   365 				sDataToParse << FREEH_ID ;
       
   366 				sDataToParse << " ";
       
   367 
       
   368 				// get mem address
       
   369 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   370 				{
       
   371 					bError = true;
       
   372 					break;
       
   373 				}
       
   374 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   375 				sDataToParse << " ";
       
   376 
       
   377 				// get thread id
       
   378 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   379 				{
       
   380 					bError = true;
       
   381 					break;
       
   382 				}
       
   383 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   384 				sDataToParse << " ";
       
   385 
       
   386 				// get address count
       
   387 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   388 				{
       
   389 					bError = true;
       
   390 					break;
       
   391 				}
       
   392 				iAddressCount = StringToNum32(cDataFromFile);
       
   393 				sDataToParse <<  std::hex << iAddressCount;
       
   394 
       
   395 				// get callstack
       
   396 				for(int i=0; i<iAddressCount; i++)
       
   397 				{
       
   398 					sDataToParse << " ";
       
   399 					if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   400 					{
       
   401 						bError = true;
       
   402 						break;
       
   403 					}
       
   404 				    sDataToParse <<  std::hex << StringToNum32(cDataFromFile); 
       
   405 				}
       
   406 				sDataToParse << "\n";
       
   407 
       
   408 				break;
       
   409 
       
   410 			case EReallocH:
       
   411 				sDataToParse << std::hex << messageTime;
       
   412 				sDataToParse << " ";
       
   413 				sDataToParse << MAIN_ID;
       
   414 				sDataToParse << " ";
       
   415 				sDataToParse << iProcessId;
       
   416 				sDataToParse << " ";
       
   417 				// RAH 0 5a7a6f30 30 17c 17 6003e02b 60010ef8 600083e5 ...
       
   418 				// no fragments in log file
       
   419 				sDataToParse << REALLOCH_ID ;
       
   420 				sDataToParse << " ";
       
   421 
       
   422 				// get freed mem address
       
   423 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   424 				{
       
   425 					bError = true;
       
   426 					break;
       
   427 				}
       
   428 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   429 				sDataToParse << " ";
       
   430 
       
   431 				// get allocated mem address
       
   432 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   433 				{
       
   434 					bError = true;
       
   435 					break;
       
   436 				}
       
   437 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   438 				sDataToParse << " ";
       
   439 
       
   440 				// get size of allocation
       
   441 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   442 				{
       
   443 					bError = true;
       
   444 					break;
       
   445 				}
       
   446 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   447 				sDataToParse << " ";
       
   448 
       
   449 				// get thread id
       
   450 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   451 				{
       
   452 					bError = true;
       
   453 					break;
       
   454 				}
       
   455 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   456 				sDataToParse << " ";
       
   457 
       
   458 				// get address count
       
   459 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   460 				{
       
   461 					bError = true;
       
   462 					break;
       
   463 				}
       
   464 				iAddressCount = StringToNum32(cDataFromFile);
       
   465 				sDataToParse <<  std::hex << iAddressCount;
       
   466 
       
   467 				// get callstack
       
   468 				for(int i=0; i<iAddressCount; i++)
       
   469 				{
       
   470 					sDataToParse << " ";
       
   471 					if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   472 					{
       
   473 						bError = true;
       
   474 						break;
       
   475 					}
       
   476 				    sDataToParse <<  std::hex << StringToNum32(cDataFromFile); 
       
   477 				}
       
   478 				sDataToParse << "\n";
       
   479 				}
       
   480 				break;
       
   481 
       
   482 			case EHandleLeak:
       
   483 				{
       
   484 				sDataToParse << std::hex << messageTime;
       
   485 				sDataToParse << " ";
       
   486 				sDataToParse << MAIN_ID;
       
   487 				sDataToParse << " ";
       
   488 				sDataToParse << iProcessId;
       
   489 				sDataToParse << " ";
       
   490 				//HDL handleLeakCount
       
   491 				sDataToParse << LABEL_HANDLE_LEAK ;
       
   492 				sDataToParse << " ";
       
   493 
       
   494 				//get handle leak count
       
   495 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   496 				{
       
   497 					bError = true;
       
   498 					break;
       
   499 				}
       
   500 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   501 				sDataToParse << "\n";
       
   502 				}
       
   503 				break;
       
   504 
       
   505 			case EThreadStart:
       
   506 				{
       
   507 				sDataToParse << std::hex << messageTime;
       
   508 				sDataToParse << " ";
       
   509 				sDataToParse << MAIN_ID;
       
   510 				sDataToParse << " ";
       
   511 				sDataToParse << iProcessId;
       
   512 				sDataToParse << " ";
       
   513 				// TDS 17c
       
   514 				sDataToParse << LABEL_THREAD_START;
       
   515 				sDataToParse << " ";
       
   516 
       
   517 				// get thread ID
       
   518 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   519 				{
       
   520 					bError = true;
       
   521 					break;
       
   522 				}
       
   523 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   524 				sDataToParse << "\n";
       
   525 				}
       
   526 				break;
       
   527 
       
   528 			case EThreadEnd:
       
   529 				{
       
   530 				sDataToParse << std::hex << messageTime;
       
   531 				sDataToParse << " ";
       
   532 				sDataToParse << MAIN_ID;
       
   533 				sDataToParse << " ";
       
   534 				sDataToParse << iProcessId;
       
   535 				sDataToParse << " ";
       
   536 				// TDE 17c
       
   537 				sDataToParse << LABEL_THREAD_END;
       
   538 				sDataToParse << " ";
       
   539 
       
   540 				// get thread ID
       
   541 				if( !GetNum32( cDataFromFile, in, streamPos, streamEnd ) )
       
   542 				{
       
   543 					bError = true;
       
   544 					break;
       
   545 				}
       
   546 				sDataToParse <<  std::hex << StringToNum32(cDataFromFile);
       
   547 				sDataToParse << "\n";
       
   548 				}
       
   549 				break;
       
   550 
       
   551 			case EDeviceInfo:
       
   552 				{
       
   553 				// DEVINFO swVersion  romChecksum //both are descriptors
       
   554 				sDataToParse << std::hex << messageTime;
       
   555 				sDataToParse << " ";
       
   556 				sDataToParse << MAIN_ID;
       
   557 				sDataToParse << " ";
       
   558 
       
   559 				sDataToParse << LABEL_DEVICE_INFO;
       
   560 				sDataToParse << " ";
       
   561 
       
   562 				// get swVersion
       
   563 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   564 				{
       
   565 					bError = true;
       
   566 					break;
       
   567 				}			
       
   568 				sDataToParse << (char *)cDataFromFile;
       
   569 				sDataToParse << " ";
       
   570 
       
   571 				// todo check
       
   572 				// get romChecksum
       
   573 				if( !GetString( cDataFromFile, in, streamPos, streamEnd ) )
       
   574 				{
       
   575 					bError = true;
       
   576 					break;
       
   577 				}
       
   578 				
       
   579 				sDataToParse << (char *)cDataFromFile;
       
   580 				sDataToParse << "\n";
       
   581 				}
       
   582 				break;
       
   583 
       
   584 			case EError:
       
   585 				//currently not used
       
   586 				break;
       
   587 			case ETestStart:
       
   588 			case ETestEnd:
       
   589 				// currently can not occure in bin log file, this is added from carbide in traces
       
   590 				break;
       
   591 			default:
       
   592 				bError = true;
       
   593 				break;				
       
   594 		}
       
   595 	}
       
   596 
       
   597 	// Close file.
       
   598 	in.close();
       
   599 
       
   600 	sDataToParse.close();
       
   601 	return !bError;
       
   602 }
       
   603 
       
   604 // -----------------------------------------------------------------------------
       
   605 // CATParseBinaryFile::GetDataSaver
       
   606 // Gets data saver object.
       
   607 // -----------------------------------------------------------------------------
       
   608 CATDataSaver* CATParseBinaryFile::GetDataSaver(void)	
       
   609 {
       
   610 	LOG_LOW_FUNC_ENTRY("CATParseTraceFile::GetDataSaver");
       
   611 	return &m_DataSaver;
       
   612 }
       
   613 
       
   614 // -----------------------------------------------------------------------------
       
   615 // CATParseBinaryFile::StringToNum64
       
   616 // Gets 64bit number from input string
       
   617 // -----------------------------------------------------------------------------
       
   618 unsigned __int64 CATParseBinaryFile::StringToNum64( unsigned char* cVal )
       
   619 {
       
   620 	unsigned __int64 iRetVal(0);
       
   621 
       
   622 	for(int i=7; i>=0; i--)
       
   623 		iRetVal = ( iRetVal << 8 ) + cVal[i];
       
   624 
       
   625 	return iRetVal;
       
   626 }
       
   627 
       
   628 // -----------------------------------------------------------------------------
       
   629 // CATParseBinaryFile::StringToNum32
       
   630 // Gets 32bit number from input string
       
   631 // -----------------------------------------------------------------------------
       
   632 unsigned long CATParseBinaryFile::StringToNum32( unsigned char* cVal )
       
   633 {
       
   634 	unsigned long iRetVal(0);
       
   635 
       
   636 	for(int i=4; i>=0; i--)
       
   637 		iRetVal = ( iRetVal << 8 ) + cVal[i];
       
   638 
       
   639 	return iRetVal;
       
   640 }
       
   641 
       
   642 // -----------------------------------------------------------------------------
       
   643 // CATParseBinaryFile::GetString
       
   644 // Get next string from file
       
   645 // -----------------------------------------------------------------------------
       
   646 bool CATParseBinaryFile::GetString( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
       
   647 {
       
   648 	int	numOfRead = 1;
       
   649 	if(pStreamPos + numOfRead <= pStreamEnd)
       
   650 	{
       
   651 		pIn.read((char*)pData, numOfRead);
       
   652 		pStreamPos = pIn.tellg();
       
   653 	}
       
   654 	else
       
   655 	{
       
   656 		return false;
       
   657 	}
       
   658 
       
   659 	numOfRead = (int)pData[0] >> 2;
       
   660 	if(pStreamPos + numOfRead <= pStreamEnd)
       
   661 	{
       
   662 		pIn.read((char*)pData, numOfRead);
       
   663 		pStreamPos = pIn.tellg();
       
   664 		pData[numOfRead] = 0;
       
   665 	}
       
   666 	else
       
   667 	{
       
   668 		return false;
       
   669 	}
       
   670 
       
   671 	return true;
       
   672 }
       
   673 
       
   674 // -----------------------------------------------------------------------------
       
   675 // CATParseBinaryFile::GetNum8
       
   676 // Get next 8bit number from file
       
   677 // -----------------------------------------------------------------------------
       
   678 bool CATParseBinaryFile::GetNum8( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
       
   679 {
       
   680 	int	numOfRead = 1;
       
   681 	if(pStreamPos + numOfRead <= pStreamEnd)
       
   682 	{
       
   683 		pIn.read((char*)pData, numOfRead);
       
   684 		pStreamPos = pIn.tellg();
       
   685 	}
       
   686 	else
       
   687 	{
       
   688 		return false;
       
   689 	}
       
   690 
       
   691 	return true;
       
   692 }
       
   693 
       
   694 // -----------------------------------------------------------------------------
       
   695 // CATParseBinaryFile::GetNum32
       
   696 // Get next 32bit number from file
       
   697 // -----------------------------------------------------------------------------
       
   698 bool CATParseBinaryFile::GetNum32( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
       
   699 {
       
   700 	int	numOfRead = 4;
       
   701 	if(pStreamPos + numOfRead <= pStreamEnd)
       
   702 	{
       
   703 		pIn.read((char*)pData, numOfRead);
       
   704 		pStreamPos = pIn.tellg();
       
   705 	}
       
   706 	else
       
   707 	{
       
   708 		return false;
       
   709 	}
       
   710 
       
   711 	return true;
       
   712 }
       
   713 
       
   714 // -----------------------------------------------------------------------------
       
   715 // CATParseBinaryFile::GetNum64
       
   716 // Get next 64bit number from file
       
   717 // -----------------------------------------------------------------------------
       
   718 bool CATParseBinaryFile::GetNum64( unsigned char* pData, ifstream &pIn, size_t &pStreamPos, size_t pStreamEnd )
       
   719 {
       
   720 	int	numOfRead = 8;
       
   721 	if(pStreamPos + numOfRead <= pStreamEnd)
       
   722 	{
       
   723 		pIn.read((char*)pData, numOfRead);
       
   724 		pStreamPos = pIn.tellg();
       
   725 	}
       
   726 	else
       
   727 	{
       
   728 		return false;
       
   729 	}
       
   730 
       
   731 	return true;
       
   732 }
       
   733 
       
   734 //EOF