Break out libblz as an external dependency for makerom.

This commit is contained in:
jakcron
2022-04-15 11:01:18 +08:00
parent d8739cf2f3
commit 7e123be54a
6 changed files with 251 additions and 41 deletions
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define BLZ_NORMAL 0 // normal mode
#define BLZ_BEST 1 // best mode
uint8_t *BLZ_Code(uint8_t *raw_buffer, int raw_len, uint32_t *new_len, int best);
#ifdef __cplusplus
}
#endif
+198
View File
@@ -0,0 +1,198 @@
# C++/C Recursive Project Makefile
# (c) Jack
# Version 7 (20220413)
# Project Name
PROJECT_NAME = libblz
# Project Relative Paths
PROJECT_PATH = $(CURDIR)
PROJECT_SRC_PATH = src
PROJECT_SRC_SUBDIRS = $(PROJECT_SRC_PATH)
PROJECT_INCLUDE_PATH = include
#PROJECT_TESTSRC_PATH = test
#PROJECT_TESTSRC_SUBDIRS = $(PROJECT_TESTSRC_PATH)
PROJECT_BIN_PATH = bin
#PROJECT_DOCS_PATH = docs
#PROJECT_DOXYFILE_PATH = Doxyfile
# Determine if the root makefile has been established, and if not establish this makefile as the root makefile
ifeq ($(ROOT_PROJECT_NAME),)
export ROOT_PROJECT_NAME = $(PROJECT_NAME)
export ROOT_PROJECT_PATH = $(PROJECT_PATH)
export ROOT_PROJECT_DEPENDENCY_PATH = $(ROOT_PROJECT_PATH)/deps
endif
# Project Dependencies
PROJECT_DEPEND =
PROJECT_DEPEND_LOCAL_DIR =
# Generate compiler flags for including project include path
ifneq ($(PROJECT_INCLUDE_PATH),)
INC += -I"$(PROJECT_INCLUDE_PATH)"
endif
# Generate compiler flags for local included dependencies
ifneq ($(PROJECT_DEPEND_LOCAL_DIR),)
LIB += $(foreach dep,$(PROJECT_DEPEND_LOCAL_DIR), -L"$(ROOT_PROJECT_DEPENDENCY_PATH)/$(dep)/bin")
INC += $(foreach dep,$(PROJECT_DEPEND_LOCAL_DIR), -I"$(ROOT_PROJECT_DEPENDENCY_PATH)/$(dep)/include")
endif
# Generate compiler flags for external dependencies
ifneq ($(PROJECT_DEPEND),)
LIB += $(foreach dep,$(PROJECT_DEPEND), -l$(dep))
endif
# Detect Platform
ifeq ($(PROJECT_PLATFORM),)
ifeq ($(OS), Windows_NT)
export PROJECT_PLATFORM = WIN32
else
UNAME = $(shell uname -s)
ifeq ($(UNAME), Darwin)
export PROJECT_PLATFORM = MACOS
else ifneq (, $(findstring CYGWIN_NT, $(UNAME)))
export PROJECT_PLATFORM = CYGWIN_NT
else
export PROJECT_PLATFORM = GNU
endif
endif
endif
# Detect Architecture
ifeq ($(PROJECT_PLATFORM_ARCH),)
ifeq ($(PROJECT_PLATFORM), WIN32)
export PROJECT_PLATFORM_ARCH = x86_64
else ifeq ($(PROJECT_PLATFORM), GNU)
export PROJECT_PLATFORM_ARCH = $(shell uname -m)
else ifeq ($(PROJECT_PLATFORM), MACOS)
export PROJECT_PLATFORM_ARCH = $(shell uname -m)
else ifeq ($(PROJECT_PLATFORM), CYGWIN_NT)
export PROJECT_PLATFORM_ARCH = $(shell uname -m)
else
export PROJECT_PLATFORM_ARCH = x86_64
endif
endif
# Generate platform specific compiler flags
ifeq ($(PROJECT_PLATFORM), WIN32)
# Windows Flags/Libs
CC = x86_64-w64-mingw32-gcc
CXX = x86_64-w64-mingw32-g++
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
ARCHFLAGS =
INC +=
LIB += -static
ARFLAGS = cr -o
else ifeq ($(PROJECT_PLATFORM), GNU)
# GNU/Linux Flags/Libs
#CC =
#CXX =
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
ARCHFLAGS =
INC +=
LIB +=
ARFLAGS = cr -o
else ifeq ($(PROJECT_PLATFORM), MACOS)
# MacOS Flags/Libs
#CC =
#CXX =
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-private-field
ARCHFLAGS = -arch $(PROJECT_PLATFORM_ARCH)
INC +=
LIB +=
ARFLAGS = rc
else ifeq ($(PROJECT_PLATFORM), CYGWIN_NT)
# CygWin Flags/Libs
#CC =
#CXX =
WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable
ARCHFLAGS =
INC +=
LIB +=
ARFLAGS = cr -o
endif
# Compiler Flags
CXXFLAGS = -std=c++11 $(INC) $(WARNFLAGS) $(ARCHFLAGS) -fPIC
CFLAGS = -std=c11 $(INC) $(WARNFLAGS) $(ARCHFLAGS) -fPIC
# Object Files
SRC_OBJ = $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .cc,.o,$(wildcard $(dir)/*.cc))) $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .c,.o,$(wildcard $(dir)/*.c)))
TESTSRC_OBJ = $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .cc,.o,$(wildcard $(dir)/*.cc))) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .c,.o,$(wildcard $(dir)/*.c)))
# all is the default, user should specify what the default should do
# - 'static_lib' for building source as a static library
# - 'program' for building source as executable program
# - 'test_program' for building the test program
# test_program can be used with program or static_lib, but program and static_lib cannot be used together
all: static_lib
clean: clean_object_files remove_binary_dir
# Object Compile Rules
%.o: %.c
@echo CC $<
@$(CC) $(CFLAGS) -c $< -o $@
%.o: %.cpp
@echo CXX $<
@$(CXX) $(CXXFLAGS) -c $< -o $@
%.o: %.cc
@echo CXX $<
@$(CXX) $(CXXFLAGS) -c $< -o $@
# Binary Directory
.PHONY: create_binary_dir
create_binary_dir:
@mkdir -p "$(PROJECT_BIN_PATH)"
.PHONY: remove_binary_dir
remove_binary_dir:
ifneq ($(PROJECT_BIN_PATH),)
@rm -rf "$(PROJECT_BIN_PATH)"
endif
.PHONY: clean_object_files
clean_object_files:
@rm -f $(SRC_OBJ) $(TESTSRC_OBJ)
# Build Library
static_lib: $(SRC_OBJ) create_binary_dir
@echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME).a
@ar $(ARFLAGS) "$(PROJECT_BIN_PATH)/$(PROJECT_NAME).a" $(SRC_OBJ)
# Build Program
program: $(SRC_OBJ) create_binary_dir
@echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME)
@$(CXX) $(ARCHFLAGS) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)"
# Build Test Program
test_program: $(TESTSRC_OBJ) $(SRC_OBJ) create_binary_dir
ifneq ($(PROJECT_TESTSRC_PATH),)
@echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test
@$(CXX) $(ARCHFLAGS) $(TESTSRC_OBJ) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test"
endif
# Documentation
.PHONY: docs
docs:
ifneq ($(PROJECT_DOCS_PATH),)
doxygen "$(PROJECT_DOXYFILE_PATH)"
endif
.PHONY: clean_docs
clean_docs:
ifneq ($(PROJECT_DOCS_PATH),)
@rm -rf "$(PROJECT_DOCS_PATH)"
endif
# Dependencies
.PHONY: deps
deps:
@$(foreach lib,$(PROJECT_DEPEND_LOCAL_DIR), cd "$(ROOT_PROJECT_DEPENDENCY_PATH)/$(lib)" && $(MAKE) static_lib && cd "$(PROJECT_PATH)";)
.PHONY: clean_deps
clean_deps:
@$(foreach lib,$(PROJECT_DEPEND_LOCAL_DIR), cd "$(ROOT_PROJECT_DEPENDENCY_PATH)/$(lib)" && $(MAKE) clean && cd "$(PROJECT_PATH)";)
@@ -17,8 +17,10 @@
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
#include "lib.h"
#include "blz.h"
#include <stdio.h>
#include <stdlib.h>
#include <blz.h>
/*----------------------------------------------------------------------------*/
#define CMD_DECODE 0x00 // decode
@@ -47,16 +49,16 @@
#define EXIT(text) { printf(text); exit(-1); }
/*----------------------------------------------------------------------------*/
u8 *Memory(int length, int size);
uint8_t *Memory(int length, int size);
u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best);
void BLZ_Invert(u8 *buffer, int length);
uint8_t *BLZ_Code(uint8_t *raw_buffer, int raw_len, uint32_t *new_len, int best);
void BLZ_Invert(uint8_t *buffer, int length);
/*----------------------------------------------------------------------------*/
u8 *Memory(int length, int size) {
u8 *fb;
uint8_t *Memory(int length, int size) {
uint8_t *fb;
fb = (u8 *) calloc(length * size, size);
fb = (uint8_t *) calloc(length * size, size);
if (fb == NULL) EXIT("\nMemory error\n");
return(fb);
@@ -64,15 +66,15 @@ u8 *Memory(int length, int size) {
/*----------------------------------------------------------------------------*/
void BLZ_Decode(char *filename) {
// u8 *pak_buffer, *raw_buffer, *pak, *raw, *pak_end, *raw_end;
// u32 pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len;
// u8 flags, mask;
// uint8_t *pak_buffer, *raw_buffer, *pak, *raw, *pak_end, *raw_end;
// uint32_t pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len;
// uint8_t flags, mask;
// printf("- decoding '%s'", filename);
// // pak_buffer = Load(filename, &pak_len, BLZ_MINIM, BLZ_MAXIM);
// inc_len = *(u32 *)(pak_buffer + pak_len - 4);
// inc_len = *(uint32_t *)(pak_buffer + pak_len - 4);
// if (!inc_len) {
// enc_len = 0;
// dec_len = pak_len - 4;
@@ -83,14 +85,14 @@ void BLZ_Decode(char *filename) {
// hdr_len = pak_buffer[pak_len - 5];
// if ((hdr_len < 0x08) || (hdr_len > 0x0B)) EXIT("Bad header length\n");
// if (pak_len <= hdr_len) EXIT("Bad length\n");
// enc_len = *(u32 *)(pak_buffer + pak_len - 8) & 0x00FFFFFF;
// enc_len = *(uint32_t *)(pak_buffer + pak_len - 8) & 0x00FFFFFF;
// dec_len = pak_len - enc_len;
// pak_len = enc_len - hdr_len;
// raw_len = dec_len + enc_len + inc_len;
// if (raw_len > RAW_MAXIM) EXIT("Bad decoded length\n");
// }
// raw_buffer = (u8 *) Memory(raw_len, sizeof(char));
// raw_buffer = (uint8_t *) Memory(raw_len, sizeof(char));
// pak = pak_buffer;
// raw = raw_buffer;
@@ -141,10 +143,10 @@ void BLZ_Decode(char *filename) {
// printf("\n");
}
u8 *Load(char *filename, u32 *length, int min, int max) {
uint8_t *Load(char *filename, uint32_t *length, int min, int max) {
FILE *fp;
int fs;
u8 *fb;
uint8_t *fb;
if ((fp = fopen(filename, "rb")) == NULL) EXIT("\nFile open error\n");
fseek(fp, 0, SEEK_END);
@@ -161,9 +163,9 @@ u8 *Load(char *filename, u32 *length, int min, int max) {
}
/*----------------------------------------------------------------------------*/
u8* BLZ_Encode(char *filename, u32* pak_len, int mode) {
u8 *raw_buffer, *pak_buffer, *new_buffer;
u32 raw_len, new_len;
uint8_t* BLZ_Encode(char *filename, uint32_t* pak_len, int mode) {
uint8_t *raw_buffer, *pak_buffer, *new_buffer;
uint32_t raw_len, new_len;
raw_buffer = Load(filename, &raw_len, RAW_MINIM, RAW_MAXIM);
@@ -181,12 +183,12 @@ u8* BLZ_Encode(char *filename, u32* pak_len, int mode) {
}
/*----------------------------------------------------------------------------*/
u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) {
u8 *pak_buffer, *pak, *raw, *raw_end, *flg = NULL, *tmp;
u32 pak_len, inc_len, hdr_len, enc_len, len, pos, max;
u32 len_best, pos_best = 0, len_next, pos_next, len_post, pos_post;
u32 pak_tmp, raw_tmp;
u8 mask;
uint8_t *BLZ_Code(uint8_t *raw_buffer, int raw_len, uint32_t *new_len, int best) {
uint8_t *pak_buffer, *pak, *raw, *raw_end, *flg = NULL, *tmp;
uint32_t pak_len, inc_len, hdr_len, enc_len, len, pos, max;
uint32_t len_best, pos_best = 0, len_next, pos_next, len_post, pos_post;
uint32_t pak_tmp, raw_tmp;
uint8_t mask;
#define SEARCH(l,p) { \
l = BLZ_THRESHOLD; \
@@ -210,7 +212,7 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) {
raw_tmp = raw_len;
pak_len = raw_len + ((raw_len + 7) / 8) + 11;
pak_buffer = (u8 *) Memory(pak_len, sizeof(char));
pak_buffer = (uint8_t *) Memory(pak_len, sizeof(char));
BLZ_Invert(raw_buffer, raw_len);
@@ -282,9 +284,9 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) {
while ((pak - pak_buffer) & 3) *pak++ = 0;
*(u32 *)pak = 0; pak += 4;
*(uint32_t *)pak = 0; pak += 4;
} else {
tmp = (u8 *) Memory(raw_tmp + pak_tmp + 11, sizeof(char));
tmp = (uint8_t *) Memory(raw_tmp + pak_tmp + 11, sizeof(char));
for (len = 0; len < raw_tmp; len++)
tmp[len] = raw_buffer[len];
@@ -308,9 +310,9 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) {
hdr_len++;
}
*(u32 *)pak = enc_len + hdr_len; pak += 3;
*(uint32_t *)pak = enc_len + hdr_len; pak += 3;
*pak++ = hdr_len;
*(u32 *)pak = inc_len - hdr_len; pak += 4;
*(uint32_t *)pak = inc_len - hdr_len; pak += 4;
}
*new_len = pak - pak_buffer;
@@ -319,8 +321,8 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) {
}
/*----------------------------------------------------------------------------*/
void BLZ_Invert(u8 *buffer, int length) {
u8 *bottom, ch;
void BLZ_Invert(uint8_t *buffer, int length) {
uint8_t *bottom, ch;
bottom = buffer + length - 1;
+2 -2
View File
@@ -24,8 +24,8 @@ ifeq ($(ROOT_PROJECT_NAME),)
endif
# Project Dependencies
PROJECT_DEPEND = mbedtls polarssl yaml
PROJECT_DEPEND_LOCAL_DIR = libmbedtls libpolarssl libyaml
PROJECT_DEPEND = mbedtls polarssl blz yaml
PROJECT_DEPEND_LOCAL_DIR = libmbedtls libpolarssl libblz libyaml
# Generate compiler flags for including project include path
ifneq ($(PROJECT_INCLUDE_PATH),)
-6
View File
@@ -1,6 +0,0 @@
#pragma once
#define BLZ_NORMAL 0 // normal mode
#define BLZ_BEST 1 // best mode
u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best);
+2 -1
View File
@@ -1,10 +1,11 @@
#include "lib.h"
#include "elf.h"
#include "blz.h"
#include "ncch_build.h"
#include "exheader_read.h"
#include "code.h"
#include <blz.h>
const u32 CTR_PAGE_SIZE = 0x1000;
const u32 DEFAULT_STACK_SIZE = 0x4000; // 10KB