bool SRecordParser::ParsedData( const SRecordData *sRecData ) { if (( m_inSeg ) && ( sRecData->m_addr != ( m_segAddr + m_segLen ))) { Flush(); } if ( !m_inSeg ) { m_inSeg = true; m_segAddr = sRecData->m_addr; m_segLen = 0; if ( !StartSegment( m_segAddr )) { return false; } } if ( !Data( sRecData )) { return false; } m_segLen += sRecData->m_dataLen; return true; }
int ParsedData( void *userData, FILE_ParsedData_t *parsedData ) { FILE_Data_t *fileData = userData; FILE_Block_t *block = fileData->tail; unsigned spaceRemaining = FILE_BLOCK_SIZE - block->blockLen; unsigned offset = 0; // Copy in as much data as will fit unsigned copyLen = parsedData->dataLen; if ( copyLen > spaceRemaining ) { copyLen = spaceRemaining; } if ( copyLen > 0 ) { memcpy( &block->data[ block->blockLen ], &parsedData->data[ 0 ], copyLen ); block->blockLen += copyLen; offset += copyLen; } // NOTE: The following assumes that FILE_BLOCK_SIZE is bigger than what's // parsed on a single line. if ( offset < parsedData->dataLen ) { // We've filled this segment and there's still data left, allocate another StartSegment( fileData, parsedData->addr + offset ); copyLen = parsedData->dataLen - offset; block = fileData->tail; memcpy( &block->data[ 0 ], &parsedData->data[ offset ], copyLen ); block->blockLen = copyLen; } return 1; } // ParsedData