mirror of
https://github.com/DarkStore-3DS/Project_CTR.git
synced 2026-07-03 16:59:04 +00:00
Break out libblz as an external dependency for makerom.
This commit is contained in:
@@ -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
|
||||
@@ -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)";)
|
||||
@@ -0,0 +1,338 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/*-- blz.c - Bottom LZ coding for Nintendo GBA/DS --*/
|
||||
/*-- Copyright (C) 2011 CUE --*/
|
||||
/*-- --*/
|
||||
/*-- This program is free software: you can redistribute it and/or modify --*/
|
||||
/*-- it under the terms of the GNU General Public License as published by --*/
|
||||
/*-- the Free Software Foundation, either version 3 of the License, or --*/
|
||||
/*-- (at your option) any later version. --*/
|
||||
/*-- --*/
|
||||
/*-- This program is distributed in the hope that it will be useful, --*/
|
||||
/*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/
|
||||
/*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/
|
||||
/*-- GNU General Public License for more details. --*/
|
||||
/*-- --*/
|
||||
/*-- You should have received a copy of the GNU General Public License --*/
|
||||
/*-- along with this program. If not, see <http://www.gnu.org/licenses/>. --*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <blz.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define CMD_DECODE 0x00 // decode
|
||||
#define CMD_ENCODE 0x01 // encode
|
||||
|
||||
#define BLZ_SHIFT 1 // bits to shift
|
||||
#define BLZ_MASK 0x80 // bits to check:
|
||||
// ((((1 << BLZ_SHIFT) - 1) << (8 - BLZ_SHIFT)
|
||||
|
||||
#define BLZ_THRESHOLD 2 // max number of bytes to not encode
|
||||
#define BLZ_N 0x1002 // max offset ((1 << 12) + 2)
|
||||
#define BLZ_F 0x12 // max coded ((1 << 4) + BLZ_THRESHOLD)
|
||||
|
||||
#define RAW_MINIM 0x00000000 // empty file, 0 bytes
|
||||
#define RAW_MAXIM 0x00FFFFFF // 3-bytes length, 16MB - 1
|
||||
|
||||
#define BLZ_MINIM 0x00000004 // header only (empty RAW file)
|
||||
#define BLZ_MAXIM 0x01400000 // 0x0120000A, padded to 20MB:
|
||||
// * length, RAW_MAXIM
|
||||
// * flags, (RAW_MAXIM + 7) / 8
|
||||
// * header, 11
|
||||
// 0x00FFFFFF + 0x00200000 + 12 + padding
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define BREAK(text) { printf(text); return; }
|
||||
#define EXIT(text) { printf(text); exit(-1); }
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
uint8_t *Memory(int length, int size);
|
||||
|
||||
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);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
uint8_t *Memory(int length, int size) {
|
||||
uint8_t *fb;
|
||||
|
||||
fb = (uint8_t *) calloc(length * size, size);
|
||||
if (fb == NULL) EXIT("\nMemory error\n");
|
||||
|
||||
return(fb);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void BLZ_Decode(char *filename) {
|
||||
// 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 = *(uint32_t *)(pak_buffer + pak_len - 4);
|
||||
// if (!inc_len) {
|
||||
// enc_len = 0;
|
||||
// dec_len = pak_len - 4;
|
||||
// pak_len = 0;
|
||||
// raw_len = dec_len;
|
||||
// } else {
|
||||
// if (pak_len < 8) EXIT("File has a bad header\n");
|
||||
// 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 = *(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 = (uint8_t *) Memory(raw_len, sizeof(char));
|
||||
|
||||
// pak = pak_buffer;
|
||||
// raw = raw_buffer;
|
||||
// pak_end = pak_buffer + dec_len + pak_len;
|
||||
// raw_end = raw_buffer + raw_len;
|
||||
|
||||
// for (len = 0; len < dec_len; len++) *(raw++) = *(pak++);
|
||||
|
||||
// BLZ_Invert(pak_buffer + dec_len, pak_len);
|
||||
|
||||
// mask = 0;
|
||||
|
||||
// while (raw < raw_end) {
|
||||
// if (!(mask >>= BLZ_SHIFT)) {
|
||||
// if (pak == pak_end) break;
|
||||
// flags = *pak++;
|
||||
// mask = BLZ_MASK;
|
||||
// }
|
||||
|
||||
// if (!(flags & mask)) {
|
||||
// if (pak == pak_end) break;
|
||||
// *raw++ = *pak++;
|
||||
// } else {
|
||||
// if (pak + 1 >= pak_end) break;
|
||||
// pos = *pak++ << 8;
|
||||
// pos |= *pak++;
|
||||
// len = (pos >> 12) + BLZ_THRESHOLD + 1;
|
||||
// if (raw + len > raw_end) {
|
||||
// printf(", WARNING: wrong decoded length!");
|
||||
// len = raw_end - raw;
|
||||
// }
|
||||
// pos = (pos & 0xFFF) + 3;
|
||||
// while (len--) *(raw++) = *(raw - pos);
|
||||
// }
|
||||
// }
|
||||
|
||||
// BLZ_Invert(raw_buffer + dec_len, raw_len - dec_len);
|
||||
|
||||
// raw_len = raw - raw_buffer;
|
||||
|
||||
// if (raw != raw_end) printf(", WARNING: unexpected end of encoded file!");
|
||||
|
||||
// // Save(filename, raw_buffer, raw_len);
|
||||
|
||||
// free(raw_buffer);
|
||||
// free(pak_buffer);
|
||||
|
||||
// printf("\n");
|
||||
}
|
||||
|
||||
uint8_t *Load(char *filename, uint32_t *length, int min, int max) {
|
||||
FILE *fp;
|
||||
int fs;
|
||||
uint8_t *fb;
|
||||
|
||||
if ((fp = fopen(filename, "rb")) == NULL) EXIT("\nFile open error\n");
|
||||
fseek(fp, 0, SEEK_END);
|
||||
fs = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
if ((fs < min) || (fs > max)) EXIT("\nFile size error\n");
|
||||
fb = Memory(fs + 3, sizeof(char));
|
||||
if (fread(fb, 1, fs, fp) != fs) EXIT("\nFile read error\n");
|
||||
if (fclose(fp) == EOF) EXIT("\nFile close error\n");
|
||||
|
||||
*length = fs;
|
||||
|
||||
return(fb);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
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);
|
||||
|
||||
pak_buffer = NULL;
|
||||
*pak_len = BLZ_MAXIM + 1;
|
||||
|
||||
new_buffer = BLZ_Code(raw_buffer, raw_len, &new_len, mode);
|
||||
if (new_len < *pak_len) {
|
||||
if (pak_buffer != NULL) free(pak_buffer);
|
||||
pak_buffer = new_buffer;
|
||||
*pak_len = new_len;
|
||||
}
|
||||
|
||||
return pak_buffer;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
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; \
|
||||
\
|
||||
max = raw - raw_buffer >= BLZ_N ? BLZ_N : raw - raw_buffer; \
|
||||
for (pos = 3; pos <= max; pos++) { \
|
||||
for (len = 0; len < BLZ_F; len++) { \
|
||||
if (raw + len == raw_end) break; \
|
||||
if (len >= pos) break; \
|
||||
if (*(raw + len) != *(raw + len - pos)) break; \
|
||||
} \
|
||||
\
|
||||
if (len > l) { \
|
||||
p = pos; \
|
||||
if ((l = len) == BLZ_F) break; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
pak_tmp = 0;
|
||||
raw_tmp = raw_len;
|
||||
|
||||
pak_len = raw_len + ((raw_len + 7) / 8) + 11;
|
||||
pak_buffer = (uint8_t *) Memory(pak_len, sizeof(char));
|
||||
|
||||
BLZ_Invert(raw_buffer, raw_len);
|
||||
|
||||
pak = pak_buffer;
|
||||
raw = raw_buffer;
|
||||
raw_end = raw_buffer + raw_len;
|
||||
|
||||
mask = 0;
|
||||
|
||||
while (raw < raw_end) {
|
||||
if (!(mask >>= BLZ_SHIFT)) {
|
||||
*(flg = pak++) = 0;
|
||||
mask = BLZ_MASK;
|
||||
}
|
||||
|
||||
SEARCH(len_best, pos_best);
|
||||
|
||||
// LZ-CUE optimization start
|
||||
if (best) {
|
||||
if (len_best > BLZ_THRESHOLD) {
|
||||
if (raw + len_best < raw_end) {
|
||||
raw += len_best;
|
||||
SEARCH(len_next, pos_next);
|
||||
raw -= len_best - 1;
|
||||
SEARCH(len_post, pos_post);
|
||||
raw--;
|
||||
|
||||
if (len_next <= BLZ_THRESHOLD) len_next = 1;
|
||||
if (len_post <= BLZ_THRESHOLD) len_post = 1;
|
||||
|
||||
if (len_best + len_next <= 1 + len_post) len_best = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
// LZ-CUE optimization end
|
||||
|
||||
*flg <<= 1;
|
||||
if (len_best > BLZ_THRESHOLD) {
|
||||
raw += len_best;
|
||||
*flg |= 1;
|
||||
*pak++ = ((len_best - (BLZ_THRESHOLD+1)) << 4) | ((pos_best - 3) >> 8);
|
||||
*pak++ = (pos_best - 3) & 0xFF;
|
||||
} else {
|
||||
*pak++ = *raw++;
|
||||
}
|
||||
|
||||
if (pak - pak_buffer + raw_len - (raw - raw_buffer) < pak_tmp + raw_tmp) {
|
||||
pak_tmp = pak - pak_buffer;
|
||||
raw_tmp = raw_len - (raw - raw_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
while (mask && (mask != 1)) {
|
||||
mask >>= BLZ_SHIFT;
|
||||
*flg <<= 1;
|
||||
}
|
||||
|
||||
pak_len = pak - pak_buffer;
|
||||
|
||||
BLZ_Invert(raw_buffer, raw_len);
|
||||
BLZ_Invert(pak_buffer, pak_len);
|
||||
|
||||
if (!pak_tmp || (raw_len + 4 < ((pak_tmp + raw_tmp + 3) & -4) + 8)) {
|
||||
pak = pak_buffer;
|
||||
raw = raw_buffer;
|
||||
raw_end = raw_buffer + raw_len;
|
||||
|
||||
while (raw < raw_end) *pak++ = *raw++;
|
||||
|
||||
while ((pak - pak_buffer) & 3) *pak++ = 0;
|
||||
|
||||
*(uint32_t *)pak = 0; pak += 4;
|
||||
} else {
|
||||
tmp = (uint8_t *) Memory(raw_tmp + pak_tmp + 11, sizeof(char));
|
||||
|
||||
for (len = 0; len < raw_tmp; len++)
|
||||
tmp[len] = raw_buffer[len];
|
||||
|
||||
for (len = 0; len < pak_tmp; len++)
|
||||
tmp[raw_tmp + len] = pak_buffer[len + pak_len - pak_tmp];
|
||||
|
||||
pak = pak_buffer;
|
||||
pak_buffer = tmp;
|
||||
|
||||
free(pak);
|
||||
|
||||
pak = pak_buffer + raw_tmp + pak_tmp;
|
||||
|
||||
enc_len = pak_tmp;
|
||||
hdr_len = 8;
|
||||
inc_len = raw_len - pak_tmp - raw_tmp;
|
||||
|
||||
while ((pak - pak_buffer) & 3) {
|
||||
*pak++ = 0xFF;
|
||||
hdr_len++;
|
||||
}
|
||||
|
||||
*(uint32_t *)pak = enc_len + hdr_len; pak += 3;
|
||||
*pak++ = hdr_len;
|
||||
*(uint32_t *)pak = inc_len - hdr_len; pak += 4;
|
||||
}
|
||||
|
||||
*new_len = pak - pak_buffer;
|
||||
|
||||
return(pak_buffer);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void BLZ_Invert(uint8_t *buffer, int length) {
|
||||
uint8_t *bottom, ch;
|
||||
|
||||
bottom = buffer + length - 1;
|
||||
|
||||
while (buffer < bottom) {
|
||||
ch = *buffer;
|
||||
*buffer++ = *bottom;
|
||||
*bottom-- = ch;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/*-- EOF Copyright (C) 2011 CUE --*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
Reference in New Issue
Block a user