Skip to content

Commit

Permalink
NGN_FileSystem v1.3.3-stable patch
Browse files Browse the repository at this point in the history
- Corregido un BUG en la utilidad NGN_FileSystem, el cual, en algunos casos,
  no ordenaba correctamente la lista de archivos, provocando la creación de
  una FAT incorrecta en el archivo de empaquetado generado.
  • Loading branch information
knightfox75 committed Apr 30, 2023
1 parent 86052cb commit 4b4ba1a
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 23 deletions.
2 changes: 1 addition & 1 deletion Tools/NGN_FileSystem/source/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ const std::string PROGRAM_NAME = "N'gine file system manager"; // Nombr
const std::string CPR_YEARS = "2021-2023"; // Años en el texto de CopyRight
const int32_t PROGRAM_VERSION_MAJOR = 1; // Version mayor
const int32_t PROGRAM_VERSION_MINOR = 3; // Version menor
const int32_t PROGRAM_VERSION_PATCH = 2; // Version parche
const int32_t PROGRAM_VERSION_PATCH = 3; // Version parche
const std::string PROGRAM_VERSION_METADATA = "stable"; // Version metadatos
const std::string MAGIC_STRING = "NGN FILE SYSTEM"; // Magic string
const uint8_t MS_LENGTH = 15; // Logitud del magic string
Expand Down
49 changes: 29 additions & 20 deletions Tools/NGN_FileSystem/source/file_system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,17 @@ int32_t FileSystem::CreateFatFromDir() {
// Informa del numero de archivos encontrados
std::cout << "[" << arg_in_dir.value << "] contains " << file_list.size() << " files." << std::endl;

// Ordena la lista de archivos alfabeticamente en orden ascendente (A-Z)
struct {
bool operator() (std::string a, std::string b) {
return ((a.compare(b)) < 0);
}
} comp;
std::cout << "Sorting file list entries in ascending order (A to Z)... ";
std::sort(file_list.begin(), file_list.end(), comp);
std::cout << "Ok." << std::endl;
//for (uint32_t k = 0; k < fat.size(); k ++) std::cout << fat[k].file_name << std::endl;

// Prepara la FAT
fat.clear();

Expand All @@ -270,7 +281,7 @@ int32_t FileSystem::CreateFatFromDir() {
node.next_node_offset = sizeof(file_header);
// Offset de posicion del archivo (de momento, 0)
node.file_offset = 0;
// Estimacion de tama�o de la FAT y de los datos
// Estimacion de tamaño de la FAT y de los datos
fat_size = 0;
data_size = 0;
// Checksum del archivo
Expand All @@ -279,7 +290,7 @@ int32_t FileSystem::CreateFatFromDir() {
std::vector<uint8_t> buffer;
buffer.clear();

// Recore la lista de archivos, analizando el tama�o de cada uno de ellos y creando el nodo correspondiente en la FAT
// Recore la lista de archivos, analizando el tamaño de cada uno de ellos y creando el nodo correspondiente en la FAT
std::cout << "FAT creation started... ";
for (uint32_t i = 0; i < file_list.size(); i ++) {

Expand All @@ -288,10 +299,19 @@ int32_t FileSystem::CreateFatFromDir() {
node.path_length = node.file_name.length(); // Numero de caracteres en la ruta
node.next_node_offset += NODE_SIZE + node.path_length; // Offset al siguiente nodo

// Registra el tama�o del nodo
/*
std::cout << "****************************************" << std::endl;
std::cout << "Position: " << i << std::endl;
std::cout << "Node name: " << node.file_name << std::endl;
std::cout << "Name length: " << node.path_length << std::endl;
std::cout << "Node next pos: " << node.next_node_offset << std::endl;
std::cout << "****************************************" << std::endl;
*/

// Registra el tamaño del nodo
fat_size += NODE_SIZE + node.path_length;

// Intenta abrir el archivo para guardar su tama�o
// Intenta abrir el archivo para guardar su tamaño
const char* path = node.file_name.c_str();

// Intenta abrir el archivo en modo binario
Expand All @@ -300,7 +320,7 @@ int32_t FileSystem::CreateFatFromDir() {

// Segun si has podido o no abrirlo...
if (file.is_open()) {
// Calcula el tama�o del archivo
// Calcula el tamaño del archivo
file.seekg(0, file.end); // Avanza hasta el final del archivo
node.file_size = file.tellg(); // Consulta el numero de bytes recorridos
file.seekg(0, file.beg); // Rebobina el archivo
Expand All @@ -310,7 +330,7 @@ int32_t FileSystem::CreateFatFromDir() {
checksum = Checksum(buffer);
buffer.clear();
file.close(); // Cierra el archivo
// Registra el tama�o de archivo
// Registra el tamaño de archivo
data_size += node.file_size;
// Registra el checksum del archivo
for (uint8_t i = 0; i < CHK_SIZE; i ++) node.checksum[i] = checksum[i];
Expand All @@ -326,23 +346,12 @@ int32_t FileSystem::CreateFatFromDir() {
// Verifica si es el ultimo nodo para marcarlo (offset a 0)
if (i == file_list.size() - 1) node.next_node_offset = 0;

// A�ade el nodo creado a la FAT
// Añade el nodo creado a la FAT
fat.push_back(node);

}
std::cout << "Ok." << std::endl;

// Ordena la FAT alfabeticamente en orden ascendente (A-Z)
struct {
bool operator() (FatNode node_a, FatNode node_b) {
return ((node_a.file_name.compare(node_b.file_name)) < 0);
}
} comp;
std::cout << "Sorting FAT entries in ascending order (A to Z)... ";
std::sort(fat.begin(), fat.end(), comp);
std::cout << "Ok." << std::endl;
//for (uint32_t k = 0; k < fat.size(); k ++) std::cout << fat[k].file_name << std::endl;

// Con la FAT creada y los datos analizados, calcula ahora la posicion que ocupara cada archivo en la seccion de datos
uint32_t offset = sizeof(file_header) + fat_size;
for (uint32_t i = 0; i < fat.size(); i ++) {
Expand Down Expand Up @@ -468,7 +477,7 @@ int32_t FileSystem::WritePackageFile(std::string filepath) {
const char* infile_name = fat[i].file_name.c_str();
infile.open(infile_name, std::ifstream::in | std::ifstream::binary);

// A�adiendo el archivo...
// Añadiendo el archivo...
std::cout << "Adding";
if (arg_key.state) std::cout << " and encrypting";
std::cout << " [" << fat[i].file_name << "]... ";
Expand Down Expand Up @@ -609,7 +618,7 @@ int32_t FileSystem::CreateFatFromPackage() {
for (uint8_t n = 0; n < CHK_SIZE; n ++) node.checksum[n] = checksum[n];
std::string str(file_name.begin(), file_name.end());
node.file_name = str;
// A�ade el nodo temporal a la FAT
// Añade el nodo temporal a la FAT
fat.push_back(node);
} while (node.next_node_offset > 0);

Expand Down
4 changes: 2 additions & 2 deletions Tools/NGN_FileSystem/source/fs_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ void FsManager::GetFilesRecursive(std::string path, std::vector<std::string> &fi
/// Esta correccion es de caracter experimental para verificar si se soluciona el problema.
const uint8_t slash = 0x2F;
const uint8_t back_slash = 0x5C;
//std::cout << "IN: " << path << std::endl;
// std::cout << "IN: " << path << std::endl;
for (uint32_t k = 0; k < path.size(); k ++) if (path[k] == back_slash) path[k] = slash;
//std::cout << "OUT: " << path << std::endl;
// std::cout << "OUT: " << path << std::endl;

// Convierte la ruta de archivo a constante
const char* _path = path.c_str();
Expand Down

0 comments on commit 4b4ba1a

Please sign in to comment.