Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/workflows/Test_windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: SWPacker Windows
on:
push:
branches:
- main
- develop
pull_request:
branches:
- main
- develop
workflow_dispatch:

env:
BUILD_TYPE: Release

jobs:
Test_windows:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Config executables
run: |
mkdir build && cd build
cmake -B ${{github.workspace}}\build -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ..

- name: Build executables
run: |
cd ${{github.workspace}}\build
cmake --build ${{github.workspace}}\build --config ${{env.BUILD_TYPE}}

- name: Archive Executable
uses: actions/upload-artifact@v3
with:
name: SWPacker
path: ${{github.workspace}}\out\0.1\Release\
36 changes: 36 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
## CMAKE VAR
## <=====================================>
cmake_minimum_required( VERSION 3.17...3.22 )
set( CMAKE_CXX_STANDARD 20 )
set( CMAKE_CXX_STANDARD_REQUIRED True )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out/ )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out/ )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out/ )
## <=====================================>

project( "SW Packer"
VERSION
0.1
DESCRIPTION
"Pack all resources into one file"
LANGUAGES
CXX
)

set( CMAKE_CXX_STANDARD 20 )
set( CMAKE_CXX_STANDARD_REQUIRED True )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${CMAKE_PROJECT_VERSION} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${CMAKE_PROJECT_VERSION} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/${CMAKE_PROJECT_VERSION} )
set(PREFIX_MESSAGE "[${PROJECT_NAME}] ")

## <=====================================>

message(${PREFIX_MESSAGE} "Build type set to: " ${CMAKE_BUILD_TYPE})
message(${PREFIX_MESSAGE} "Current cmake location: " ${CMAKE_CURRENT_SOURCE_DIR})
message(${PREFIX_MESSAGE} "Project location: " ${CMAKE_SOURCE_DIR})
message(${PREFIX_MESSAGE} "Project system: " ${CMAKE_SYSTEM_NAME})


include(cmake/Packer.cmake)
include(cmake/UnPacker.cmake)
30 changes: 29 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,29 @@
# packer
# SWPacker
## Description
SWPacker is program that allow to pack all files from a directory.
It builds a single file `.swfp` with all resources inside.

## Compilation
The compilation is simple, you can choose between two target: Packer and Unpacker.
```shell
mkdir "build" && cd build
cmake -G "Visual Studio 17 2022" - DCMAKE_BUILD_TYPE=[Debug/Release] ..
cmake --build . --target SWEngine-[packer/unpacker]_0.1 --config [Debug/Release]
```

## Usage
### Packer
Simply run the executable and give the directory you want to pack.
```shell
./SWEngine-packer_0.1 [PATH_TO_DIRECTORY]
```

### UnPacker
Simply run the executable and give the directory where the file `.swfp` file is.
```shell
./SWEngine-unpacker_0.1 [PATH_TO_SWFP_FILE]
```

## Authors
The project is made by [Guillaume Soisson](https://github.com/Alvarwow69). \
This project is based on raysan5 works for [rres](https://github.com/raysan5/rres)
54 changes: 54 additions & 0 deletions cmake/Packer.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
## PROJECT VAR
## <=====================================>
set( EXEC "SWEngine-packer_${CMAKE_PROJECT_VERSION}" )
set( EXT cpp )
## <=====================================>

## SOURCE FOLDERS
set( SRC_FOLDERS
${CMAKE_CURRENT_SOURCE_DIR}/sources/
${CMAKE_CURRENT_SOURCE_DIR}/sources/file/
${CMAKE_CURRENT_SOURCE_DIR}/sources/pack/
)
## INCLUDE FOLDERS
set( INC_FOLDERS
${CMAKE_CURRENT_SOURCE_DIR}/includes/
${CMAKE_CURRENT_SOURCE_DIR}/includes/file/
${CMAKE_CURRENT_SOURCE_DIR}/includes/pack/
)

## GET SOURCES
## <=====================================>
set(TMP "")
foreach(filePath ${SRC_FOLDERS})
string(APPEND TMP "${filePath}*.${EXT};")
endforeach()
file(GLOB SRC ${TMP})
## <=====================================>


## OUTPUT
## <=====================================>
## EXECUTABLE
add_executable(${EXEC} ${SRC})
## <=====================================>

target_compile_definitions(${EXEC} PUBLIC "SWFP_PACKER")


## ADD INCLUDES
## <=====================================>
target_include_directories(${EXEC} PUBLIC ${INC_FOLDERS})
## <=====================================>

## ADD PARAMETER
## <=====================================>
if(MSVC)
target_compile_options(${EXEC} PRIVATE "/MP")
endif()
## <=====================================>

if (${CMAKE_BUILD_TYPE} MATCHES Debug)
set_target_properties(${EXEC} PROPERTIES
DEBUG_POSTFIX "d")
endif()
53 changes: 53 additions & 0 deletions cmake/UnPacker.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
## PROJECT VAR
## <=====================================>
set( EXEC "SWEngine-unpacker_${CMAKE_PROJECT_VERSION}" )
set( EXT cpp )
## <=====================================>

## SOURCE FOLDERS
set( SRC_FOLDERS
${CMAKE_CURRENT_SOURCE_DIR}/sources/
${CMAKE_CURRENT_SOURCE_DIR}/sources/file/
${CMAKE_CURRENT_SOURCE_DIR}/sources/unpack/
)
## INCLUDE FOLDERS
set( INC_FOLDERS
${CMAKE_CURRENT_SOURCE_DIR}/includes/
${CMAKE_CURRENT_SOURCE_DIR}/includes/file/
${CMAKE_CURRENT_SOURCE_DIR}/includes/unpack/
)

## GET SOURCES
## <=====================================>
set(TMP "")
foreach(filePath ${SRC_FOLDERS})
string(APPEND TMP "${filePath}*.${EXT};")
endforeach()
file(GLOB SRC ${TMP})
## <=====================================>


## OUTPUT
## <=====================================>
## EXECUTABLE
add_executable(${EXEC} ${SRC})
## <=====================================>

target_compile_definitions(${EXEC} PUBLIC "SWFP_UNPACKER")

## ADD INCLUDES
## <=====================================>
target_include_directories(${EXEC} PUBLIC ${INC_FOLDERS})
## <=====================================>

## ADD PARAMETER
## <=====================================>
if(MSVC)
target_compile_options(${EXEC} PRIVATE "/MP")
endif()
## <=====================================>

if (${CMAKE_BUILD_TYPE} MATCHES Debug)
set_target_properties(${EXEC} PROPERTIES
DEBUG_POSTFIX "d")
endif()
56 changes: 56 additions & 0 deletions includes/csc32.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
** SWPacker , 2023
** csc.hpp
*/

#ifndef SW_PACKER_CSC_HPP
#define SW_PACKER_CSC_HPP

#include <string>

namespace sw
{
/// \brief Generate a CSC32 from the given buffer
///
/// \param buffer - unsigned char *
/// \param size - unsigned int
/// \return unsigned int
unsigned int computeCsc32(unsigned char *buffer, unsigned int size);

static unsigned int crcTable[256] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
}

#endif //SW_PACKER_CSC_HPP
48 changes: 48 additions & 0 deletions includes/file/Chunk.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
** SWPacker , 2023
** ChunkHeader.hpp
*/

#ifndef SW_PACKER_CHUNK_HPP
#define SW_PACKER_CHUNK_HPP

namespace sw
{
/// \brief Define all data type supported. Few for now
/// but will add more later
enum resourceDataType {
DATA_NULL = 0,
DATA_RAW = 1,
};

/// \brief Define all data in the header for a single chunk.
/// \b comp and \b nextOffset will be added later
struct chunkHeader {
unsigned char type[4]; // chunk type
unsigned int id; // chunk identifier
//unsigned char comp; // compression algorithm
unsigned int sizePack; // compressed size
unsigned int sizeBase; // base size
//unsigned int nextOffset; // next resource chunk
unsigned int crc32; // data crc32
};

/// \brief Define all data needed un a chunk.
/// \b Props is useless a the moment but useful later
/// \b Path is useful only for a DEVPACK
struct chunkData {
unsigned int propsCount; // Number of props uin the chunk
unsigned int pathCount; // Length of the path
unsigned int *props; // List of props
char *path; // Path
void *data; // Raw data
};

/// \brief Structure for a chunk, composed of one header and one data
struct resourceChunk {
chunkHeader header;
chunkData data;
};
}

#endif //SW_PACKER_CHUNK_HPP
72 changes: 72 additions & 0 deletions includes/file/File.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
** SWPacker , 2023
** file.hpp
*/

#ifndef SW_PACKER_FILE_HPP
#define SW_PACKER_FILE_HPP

#include <string>
#include <fstream>
#include <vector>

#include "Chunk.hpp"

namespace sw {

/// \brief Define the type of the file
/// \def GAMEPACK - File build for an Engine/Game not made to be unpack
/// \def DEVPACK - File build to pack files and made to be unpacked
enum fileType {
GAMEPACK,
DEVPACK
};

/// \brief Define the file header
struct filePackHeader {
unsigned char id[4]; // Id of the file: swfp
unsigned short version; // Version of the packer
unsigned char fileType; // File type
unsigned short resourcesCount; // Number of resources in the file
unsigned int reserved[2]; // reserved for more data
};

class File {
public:
/// \brief Generate the output file and his header
///
/// \param fileName - std::string
/// \param path - std::string
/// \param discard - boolean
static void generateFile(std::string&& fileName = "packages", std::string&& path = "./", bool discard = false);

/// \brief Save and close the file
static void saveFile();

/// \brief Write in the current file the given chunk
///
/// \param chunk - sw::resourceChunk
static void writeInFile(const sw::resourceChunk& chunk);

/// \brief Count the number of files in the path (dir and subdir)
///
/// \param path - std::string
static void countFiles(std::string path);
private:
static filePackHeader m_header;
static std::fstream m_file;

/// \brief Fill the header
static void createHeader();

/// \brief Check the file name exist, if yes find the one who doesn't exist
///
/// \param fileName - std::string
/// \param path - std::string
/// \return std::string
static std::string computeFileName(std::string& fileName, std::string& path);
};

} // sw

#endif //SW_PACKER_FILE_HPP
Loading