Fixed many issues with utils, v0.2.0

This commit is contained in:
G2-Games 2024-10-18 16:13:29 -05:00
parent db52e23ef7
commit 263a990e6e
5 changed files with 85 additions and 18 deletions

View file

@ -1,7 +1,7 @@
use byteorder::{ReadBytesExt, WriteBytesExt, LE}; use byteorder::{ReadBytesExt, WriteBytesExt, LE};
use std::{ use std::{
collections::HashMap, collections::HashMap,
io::{Cursor, Read, Seek, Write}, io::{Read, Seek, Write},
}; };
use crate::binio::BitIo; use crate::binio::BitIo;
@ -362,8 +362,7 @@ fn compress_lzw2(data: &[u8], last: Vec<u8>) -> (usize, Vec<u8>, Vec<u8>) {
element = last element = last
} }
let output_buf = Vec::new(); let mut bit_io = BitIo::new(vec![0u8; 0xF0000]);
let mut bit_io = BitIo::new(output_buf);
let write_bit = |bit_io: &mut BitIo, code: u64| { let write_bit = |bit_io: &mut BitIo, code: u64| {
if code > 0x7FFF { if code > 0x7FFF {
bit_io.write_bit(1, 1); bit_io.write_bit(1, 1);

View file

@ -1,9 +1,10 @@
[package] [package]
name = "utils" name = "utils"
version = "0.1.2" version = "0.2.0"
edition = "2021" edition = "2021"
license = "GPL-3.0-or-later" license = "GPL-3.0-or-later"
authors.workspace = true authors.workspace = true
build = "build.rs"
[[bin]] [[bin]]
name = "czutil" name = "czutil"
@ -16,7 +17,10 @@ cz = { path = "../cz/", features = ["png"] }
luca_pak = { path = "../luca_pak/" } luca_pak = { path = "../luca_pak/" }
image = { version = "0.25", default-features = false, features = ["png"] } image = { version = "0.25", default-features = false, features = ["png"] }
clap = { version = "4.5.9", features = ["derive"] } clap = { version = "4.5", features = ["derive", "error-context"] }
[build-dependencies]
vergen-git2 = { version = "1.0", features = ["build", "cargo", "rustc", "si"] }
[lints] [lints]
workspace = true workspace = true

17
utils/build.rs Normal file
View file

@ -0,0 +1,17 @@
use vergen_git2::{BuildBuilder, CargoBuilder, Emitter, Git2Builder, RustcBuilder, SysinfoBuilder};
fn main() {
let build = BuildBuilder::all_build().unwrap();
let cargo = CargoBuilder::all_cargo().unwrap();
let git2 = Git2Builder::all_git().unwrap();
let rustc = RustcBuilder::all_rustc().unwrap();
let si = SysinfoBuilder::all_sysinfo().unwrap();
Emitter::default()
.add_instructions(&build).unwrap()
.add_instructions(&cargo).unwrap()
.add_instructions(&git2).unwrap()
.add_instructions(&rustc).unwrap()
.add_instructions(&si).unwrap()
.emit().unwrap();
}

View file

@ -1,17 +1,22 @@
use clap::{error::ErrorKind, Error, Parser, Subcommand}; use clap::{error::ErrorKind, Command, Error, Parser, Subcommand};
use std::{ use std::{
fs, fs,
path::{Path, PathBuf}, path::{Path, PathBuf}, process::exit,
}; };
/// Utility to maniuplate CZ image files from the LUCA System game engine by /// Utility to maniuplate CZ image files from the LUCA System game engine by
/// Prototype Ltd. /// Prototype Ltd.
#[derive(Parser)] #[derive(Parser)]
#[command(name = "CZ Utility")] #[command(name = "CZ Utility")]
#[command(version, about, long_about = None)] #[command(author, version, about, long_about = None, disable_version_flag = true)]
#[command(arg_required_else_help(true))]
struct Cli { struct Cli {
/// Show program version information
#[arg(short('V'), long)]
version: bool,
#[command(subcommand)] #[command(subcommand)]
command: Commands, command: Option<Commands>,
} }
#[derive(Subcommand)] #[derive(Subcommand)]
@ -63,8 +68,24 @@ enum Commands {
fn main() { fn main() {
let cli = Cli::parse(); let cli = Cli::parse();
if cli.version {
println!(
"{}, {} v{}-{}",
env!("CARGO_BIN_NAME"),
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION"),
&env!("VERGEN_GIT_SHA")[0..=6]
);
exit(0);
}
let command = match cli.command {
Some(c) => c,
None => exit(0),
};
// Check what subcommand was run // Check what subcommand was run
match &cli.command { match &command {
Commands::Decode { Commands::Decode {
input, input,
output, output,

View file

@ -3,19 +3,23 @@ use clap::{
Parser, Subcommand, Parser, Subcommand,
}; };
use luca_pak::Pak; use luca_pak::Pak;
use std::{fs, path::PathBuf}; use std::{fs, path::PathBuf, process::exit};
/// Utility to maniuplate PAK archive files from the LUCA System game engine by /// Utility to maniuplate PAK archive files from the LUCA System game engine by
/// Prototype Ltd. /// Prototype Ltd.
#[derive(Parser)] #[derive(Parser)]
#[command(name = "PAK Utility")] #[command(name = "PAK Utility")]
#[command(version, about, long_about = None)] #[command(author, version, about, long_about = None, disable_version_flag = true)]
struct Cli { struct Cli {
#[arg(value_name = "PAK FILE")] /// Show program version information
input: PathBuf, #[arg(short('V'), long)]
version: bool,
#[arg(value_name = "PAK FILE", required_unless_present("version"))]
input: Option<PathBuf>,
#[command(subcommand)] #[command(subcommand)]
command: Commands, command: Option<Commands>,
} }
#[derive(Subcommand)] #[derive(Subcommand)]
@ -59,12 +63,30 @@ enum Commands {
fn main() { fn main() {
let cli = Cli::parse(); let cli = Cli::parse();
let mut pak = match Pak::open(&cli.input) { if cli.version {
println!(
"{}, {} v{}-{}",
env!("CARGO_BIN_NAME"),
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION"),
&env!("VERGEN_GIT_SHA")[0..=6]
);
exit(0);
}
let mut pak = match Pak::open(&cli.input.unwrap()) {
Ok(pak) => pak, Ok(pak) => pak,
Err(err) => fmt_error(&format!("Could not open PAK file: {}", err)).exit(), Err(err) => fmt_error(&format!("Could not open PAK file: {}", err)).exit(),
}; };
match cli.command { let command = match cli.command {
Some(c) => c,
None => {
exit(0);
},
};
match command {
Commands::Extract { output } => { Commands::Extract { output } => {
if output.exists() && !output.is_dir() { if output.exists() && !output.is_dir() {
fmt_error("The output given was not a directory").exit() fmt_error("The output given was not a directory").exit()
@ -74,7 +96,11 @@ fn main() {
for entry in pak.entries() { for entry in pak.entries() {
let mut outpath = output.clone(); let mut outpath = output.clone();
outpath.push(entry.display_name()); if let Some(n) = entry.name() {
outpath.push(n);
} else {
outpath.push(entry.index().to_string())
}
entry.save(&outpath).unwrap(); entry.save(&outpath).unwrap();
} }
} }