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;
}
Exemple #2
0
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