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; }
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; }
// 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; }
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; }
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"); }
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; }