示例#1
0
文件: common.cpp 项目: Godzil/osXdk
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";
}