void TextFileGenerator::ConvertData(std::string& cDestString,const void* pSourceData,size_t nFileSize) { if ( ((nFileSize/m_nDataSize)*m_nDataSize)!=nFileSize) { ShowError("The filesize must be a multiple of the data size."); } DataReader cDataReader; cDataReader.SetPointer(pSourceData); if (m_nEndianness==_eEndianness_Big) { cDataReader.SetEndian(true); } else { cDataReader.SetEndian(false); } std::string cHeaderFormatString; std::string cFooterFormatString; std::string cHeaderPreLine; std::string cEntryFormat; std::string cEntrySeparator; bool bAddSeparatorOnEndOfLine=false; switch (m_nFileType) { default: break; case eLanguage_C: cHeaderPreLine="\t"; cEntrySeparator=","; bAddSeparatorOnEndOfLine=true; m_bEnableLineNumber=false; switch (m_nDataSize) { case 1: cHeaderFormatString="unsigned char %s[%d]=\r\n{\r\n"; // unsigned char _SampleQuiTue[]={ cEntryFormat="0x%02x"; break; case 2: cHeaderFormatString="unsigned short %s[%d]=\r\n{\r\n"; // unsigned short _SampleQuiTue[]={ cEntryFormat="0x%04x"; break; case 4: cHeaderFormatString="unsigned long %s[%d]=\r\n{\r\n"; // unsigned long _SampleQuiTue[]={ cEntryFormat="0x%08x"; break; } cFooterFormatString="};"; break; case eLanguage_Assembler: cHeaderFormatString=m_cLabelName+"\r\n"; // _SampleQuiTue cEntrySeparator=","; m_bEnableLineNumber=false; switch (m_nDataSize) { case 1: cHeaderPreLine="\t.byt "; cEntryFormat="$%02x"; break; case 2: cHeaderPreLine="\t.word "; cEntryFormat="$%04x"; break; case 4: cHeaderPreLine="\t.long "; cEntryFormat="$%08x"; break; } break; case eLanguage_BASIC: // Basic supports only uppercase hexadecimal letters ! cHeaderFormatString=StringFormat("%d REM %s \r\n",m_nFirstLineNumber,m_cLabelName.c_str()); // nnnn REM _SampleQuiTue m_nFirstLineNumber+=m_nIncrementLineNumber; cHeaderPreLine="DATA "; cEntryFormat="#%d"; m_bEnableLineNumber=true; switch (m_nDataSize) { case 1: cEntryFormat="#%02X"; break; case 2: cEntryFormat="#%04X"; break; case 4: cEntryFormat="#%08X"; // That one will probably fail on most 8 bits basics break; } cEntrySeparator=","; break; } if (m_nNumericBase==_eNumericBase_Decimal) { // Set to decimal output cEntryFormat="%d"; } int file_size=nFileSize; int nEntryCount=(file_size+m_nDataSize-1)/m_nDataSize; // To avoid numerous memory allocation, pre allocate a string long enough cDestString=""; cDestString.reserve(nFileSize*5); // Block header cDestString+=StringFormat(cHeaderFormatString.c_str(),m_cLabelName.c_str(),nEntryCount); // unsigned char _SampleQuiTue[]={ while (file_size>0) { // Line numbers if (m_bEnableLineNumber) { cDestString+=StringFormat("%d ",m_nFirstLineNumber); m_nFirstLineNumber+=m_nIncrementLineNumber; } // Line header cDestString+=cHeaderPreLine; // Content of the line for (unsigned long x=0;x<m_nValuesPerLine;x++) { unsigned long c=cDataReader.GetValue(m_nDataSize); file_size-=m_nDataSize; cDestString+=StringFormat(cEntryFormat.c_str(),c); if ((x!=(m_nValuesPerLine-1)) && file_size) { cDestString+=cEntrySeparator; } if (file_size<=0) break; } // Optional last separator (for C) if (bAddSeparatorOnEndOfLine && (file_size>0)) { cDestString+=cEntrySeparator; } // End of line carriage return cDestString+="\r\n"; } // Block footer cDestString+=cFooterFormatString; // End of file carriage return cDestString+="\r\n"; }