Ejemplo n.º 1
0
size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const std::string& _szDirectory, u64 _NameTableOffset)
{
	size_t CurrentIndex = _FirstIndex;

	while (CurrentIndex < _LastIndex)
	{
		SFileInfo& rFileInfo = m_FileInfoVector[CurrentIndex];
		u64 const uOffset = _NameTableOffset + (rFileInfo.m_NameOffset & 0xFFFFFF);

		rFileInfo.m_FullPath = _szDirectory + GetStringFromOffset(uOffset);

		// check next index
		if (rFileInfo.IsDirectory())
		{
			rFileInfo.m_FullPath += '/';
			CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset);
		}
		else
		{
			++CurrentIndex;
		}
	}

	return CurrentIndex;
}
Ejemplo n.º 2
0
size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const std::string& _szDirectory, u64 _NameTableOffset)
{
	size_t CurrentIndex = _FirstIndex;

	while (CurrentIndex < _LastIndex)
	{
		SFileInfo& rFileInfo = m_FileInfoVector[CurrentIndex];
		u64 const uOffset = _NameTableOffset + (rFileInfo.m_NameOffset & 0xFFFFFF);
		std::string const offset_str { GetStringFromOffset(uOffset) };
		bool const is_dir = rFileInfo.IsDirectory();
		rFileInfo.m_FullPath.reserve(_szDirectory.size() + offset_str.size());

		rFileInfo.m_FullPath.append(_szDirectory.data(), _szDirectory.size())
		                    .append(offset_str.data(), offset_str.size())
		                    .append("/", size_t(is_dir));

		if (!is_dir)
		{
			++CurrentIndex;
			continue;
		}

		// check next index
		CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset);
	}

	return CurrentIndex;
}
Ejemplo n.º 3
0
// Changed this stuff from C++ string to C strings for speed in debug mode. Doesn't matter in release, but
// std::string is SLOW in debug mode.
size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const char* _szDirectory, u64 _NameTableOffset)
{
	size_t CurrentIndex = _FirstIndex;

	while (CurrentIndex < _LastIndex)
	{
		SFileInfo *rFileInfo = &m_FileInfoVector[CurrentIndex];
		u64 uOffset = _NameTableOffset + (rFileInfo->m_NameOffset & 0xFFFFFF);
		std::string filename = GetStringFromOffset(uOffset);

		// check next index
		if (rFileInfo->IsDirectory())
		{
			// this is a directory, build up the new szDirectory
			if (_szDirectory != NULL)
				CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s/", _szDirectory, filename.c_str());
			else
				CharArrayFromFormat(rFileInfo->m_FullPath, "%s/", filename.c_str());

			CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo->m_FileSize, rFileInfo->m_FullPath, _NameTableOffset);
		}
		else
		{
			// this is a filename
			if (_szDirectory != NULL)
				CharArrayFromFormat(rFileInfo->m_FullPath, "%s%s", _szDirectory, filename.c_str());
			else
				CharArrayFromFormat(rFileInfo->m_FullPath, "%s", filename.c_str());

			CurrentIndex++;
		}
	}

	return CurrentIndex;
}
Ejemplo n.º 4
0
size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const std::string& _szDirectory, u64 _NameTableOffset)
{
	size_t CurrentIndex = _FirstIndex;

	while (CurrentIndex < _LastIndex)
	{
		SFileInfo *rFileInfo = &m_FileInfoVector[CurrentIndex];
		u64 uOffset = _NameTableOffset + (rFileInfo->m_NameOffset & 0xFFFFFF);
		std::string filename = GetStringFromOffset(uOffset);

		// check next index
		if (rFileInfo->IsDirectory())
		{
			if (_szDirectory.empty())
				rFileInfo->m_FullPath += StringFromFormat("%s/", filename.c_str());
			else
				rFileInfo->m_FullPath += StringFromFormat("%s%s/", _szDirectory.c_str(), filename.c_str());

			CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo->m_FileSize, rFileInfo->m_FullPath, _NameTableOffset);
		}
		else // This is a filename
		{
			if (_szDirectory.empty())
				rFileInfo->m_FullPath += filename;
			else
				rFileInfo->m_FullPath += StringFromFormat("%s%s", _szDirectory.c_str(), filename.c_str());

			CurrentIndex++;
		}
	}

	return CurrentIndex;
}
Ejemplo n.º 5
0
void
JavaJncReader::DumpStringTable(FILE* f)
{
    string str;
    unsigned int offset = 0;

    fprintf(f, "DumpStringTable - (size:%u) \n", m_string_table_size);

    while (offset < m_string_table_size)
    {
        GetStringFromOffset(offset, str);
        fprintf(f, " %4u:%s\n", offset, str.c_str());
        offset += str.length() + 1;
    }

    fprintf(f, "DumpStringTable: END\n");
}
Ejemplo n.º 6
0
bool
JavaJncReader::_process_bc2src_section()
{
    bool ret = false;

    // Recreate and output bc2src section
    void* line_number_table_buf = nullptr;
    void* method_table_buf = nullptr;

    jint method_table_size;
    jint line_number_table_size;
    jint method_table_with_header_size;
    int offset;

    gtUByte* tmpBuf = m_pBc2srcBuf;

    method_table_size = *((jint*)tmpBuf);
    tmpBuf += sizeof(jint);

    // Only for debug purpose
    line_number_table_size = *((jint*)tmpBuf);
    // fprintf(stdout,
    //        "method_table_size %d line_number_table_size %d\n",
    //        method_table_size, line_number_table_size);

    method_table_with_header_size = 2 * sizeof(jint) + method_table_size;

    // Get Method table stuff
    method_table_buf = (void*)m_pBc2srcBuf;

    // Get Line number stuff
    tmpBuf = m_pBc2srcBuf;
    tmpBuf += method_table_with_header_size;
    line_number_table_buf = (void*)tmpBuf;

    // Populate information in JNCMethodMap
    offset = 2 * sizeof(jint);

    while (offset < method_table_with_header_size)
    {
        AddressRange range;
        memcpy(&range, (char*)method_table_buf + offset, sizeof(AddressRange));

        if (m_jncMethodMap.find(range.id) == m_jncMethodMap.end())
        {
            JncMethod jncMethod;
            jncMethod.id = range.id;

            GetStringFromOffset(range.method_name_offset,
                                jncMethod.name);

            GetStringFromOffset(range.method_signature_offset,
                                jncMethod.signature);

            GetStringFromOffset(range.source_name_offset,
                                jncMethod.sourceName);

            // fprintf(stderr,
            //        "DEBUG: offset = %u\n", range.line_number_table_offset);

            unsigned int numLineNumber =
                *((jint*)((char*)line_number_table_buf +
                          range.line_number_table_offset -
                          method_table_with_header_size));

            // fprintf(stderr,
            //        "DEBUG: numLineNumber = %u\n", numLineNumber);

            JncJvmtiLineNumberEntry* pEnt =
                (JncJvmtiLineNumberEntry*)((char*)line_number_table_buf +
                                           range.line_number_table_offset +
                                           sizeof(jint) -
                                           method_table_with_header_size);

            // for (unsigned int i = 0 ; i < numLineNumber; i++, pEnt++)
            for (unsigned int i = 0 ; i < numLineNumber; i++, pEnt++)
            {
                jncMethod.lineNumberVec.push_back(*pEnt);
                // fprintf(stderr, "pEnt=%p, start_loc=%d, line=%l\n",
                //        pEnt, pEnt->start_location, pEnt->line_number);
            }

            gtSort(jncMethod.lineNumberVec.begin(), jncMethod.lineNumberVec.end());

            m_jncMethodMap[range.id] = jncMethod;
        }

        JncAddressRange jncRng;
        jncRng.id       = range.id;
        jncRng.pc_start = range.pc_start;
        jncRng.pc_end   = range.pc_end;

        m_addressRangeTable.push_back(jncRng);
        offset += sizeof(AddressRange);
    }

    gtSort(m_addressRangeTable.begin(), m_addressRangeTable.end());
    ret = true;

    return ret;
}