Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
dulingzhi committed Oct 30, 2023
1 parent 2fa1786 commit abc634a
Show file tree
Hide file tree
Showing 319 changed files with 43,886 additions and 75,518 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "deps/StormLib"]
path = deps/StormLib
url = https://github.com/ladislav-zezula/StormLib.git
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ authors = ["Jai <814683@qq.com>"]
edition = "2018"

[dependencies]
ceres-mpq = {path = "libs/ceres-mpq"}
storm-sys = {path = "libs/storm-sys"}
stormlib-sys = {path = "crates/stormlib-sys"}
stormlib = {path = "crates/stormlib"}

failure = "0.1.8"
clap = "2.33.1"
Expand Down
10 changes: 10 additions & 0 deletions crates/stormlib-bindgen/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
name = "stormlib-bindgen"
version = "0.1.0"
authors = ["Flux Xu <fluxxu@gmail.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
bindgen = "0.59.2"
220 changes: 220 additions & 0 deletions crates/stormlib-bindgen/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
use std::path::PathBuf;

fn main() {
// The bindgen::Builder is the main entry point
// to bindgen, and lets you build up options for
// the resulting bindings.
let mut bindings = bindgen::Builder::default()
// The input header we would like to generate
// bindings for.
.clang_arg("-I./deps/StormLib/src")
.header("./crates/stormlib-bindgen/src/wrapper.hpp")
// Tell cargo to invalidate the built crate whenever any of the
// included header files changed.
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.whitelist_type("^S[A-Z].+")
.whitelist_function("^S[A-Z].+")
.whitelist_var("^ERROR_.+");

for var in VARS {
bindings = bindings.whitelist_var(var);
}

#[cfg(target_os = "windows")]
let bindings = bindings.blacklist_function("SetLastError");

let bindings = bindings
// Finish the builder and generate the bindings.
.generate()
// Unwrap the Result and panic on failure.
.expect("Unable to generate bindings");

// Write the bindings to the $OUT_DIR/bindings.rs file.
let out_path = PathBuf::from("./crates/stormlib-sys/src");
#[cfg(target_os = "windows")]
let file_name = "bindings_windows.rs";
#[cfg(target_os = "linux")]
let file_name = "bindings_linux.rs";
#[cfg(target_os = "macos")]
let file_name = "bindings_macos.rs";
bindings
.write_to_file(out_path.join(file_name))
.expect("Couldn't write bindings!");
}

const VARS: &[&str] = &[
"STORMLIB_VERSION",
"STORMLIB_VERSION_STRING",
"ID_MPQ",
"ID_MPQ_USERDATA",
"ID_MPK",
"ERROR_AVI_FILE",
"ERROR_UNKNOWN_FILE_KEY",
"ERROR_CHECKSUM_ERROR",
"ERROR_INTERNAL_FILE",
"ERROR_BASE_FILE_MISSING",
"ERROR_MARKED_FOR_DELETE",
"ERROR_FILE_INCOMPLETE",
"ERROR_UNKNOWN_FILE_NAMES",
"ERROR_CANT_FIND_PATCH_PREFIX",
"HASH_TABLE_SIZE_MIN",
"HASH_TABLE_SIZE_DEFAULT",
"HASH_TABLE_SIZE_MAX",
"HASH_ENTRY_DELETED",
"HASH_ENTRY_FREE",
"HET_ENTRY_DELETED",
"HET_ENTRY_FREE",
"HASH_STATE_SIZE",
"SFILE_OPEN_HARD_DISK_FILE",
"SFILE_OPEN_CDROM_FILE",
"SFILE_OPEN_FROM_MPQ",
"SFILE_OPEN_CHECK_EXISTS",
"SFILE_OPEN_BASE_FILE",
"SFILE_OPEN_ANY_LOCALE",
"SFILE_OPEN_LOCAL_FILE",
"MPQ_FLAG_READ_ONLY",
"MPQ_FLAG_CHANGED",
"MPQ_FLAG_MALFORMED",
"MPQ_FLAG_HASH_TABLE_CUT",
"MPQ_FLAG_BLOCK_TABLE_CUT",
"MPQ_FLAG_CHECK_SECTOR_CRC",
"MPQ_FLAG_SAVING_TABLES",
"MPQ_FLAG_PATCH",
"MPQ_FLAG_WAR3_MAP",
"MPQ_FLAG_LISTFILE_NONE",
"MPQ_FLAG_LISTFILE_NEW",
"MPQ_FLAG_LISTFILE_FORCE",
"MPQ_FLAG_ATTRIBUTES_NONE",
"MPQ_FLAG_ATTRIBUTES_NEW",
"MPQ_FLAG_SIGNATURE_NONE",
"MPQ_FLAG_SIGNATURE_NEW",
"MPQ_SUBTYPE_MPQ",
"MPQ_SUBTYPE_SQP",
"MPQ_SUBTYPE_MPK",
"SFILE_INVALID_SIZE",
"SFILE_INVALID_POS",
"SFILE_INVALID_ATTRIBUTES",
"MPQ_FILE_IMPLODE",
"MPQ_FILE_COMPRESS",
"MPQ_FILE_ENCRYPTED",
"MPQ_FILE_FIX_KEY",
"MPQ_FILE_PATCH_FILE",
"MPQ_FILE_SINGLE_UNIT",
"MPQ_FILE_DELETE_MARKER",
"MPQ_FILE_SECTOR_CRC",
"MPQ_FILE_SIGNATURE",
"MPQ_FILE_EXISTS",
"MPQ_FILE_REPLACEEXISTING",
"MPQ_FILE_COMPRESS_MASK",
"MPQ_FILE_DEFAULT_INTERNAL",
"MPQ_FILE_VALID_FLAGS",
"MPQ_FILE_VALID_FLAGS_W3X",
"BLOCK_INDEX_MASK",
"MPQ_COMPRESSION_HUFFMANN",
"MPQ_COMPRESSION_ZLIB",
"MPQ_COMPRESSION_PKWARE",
"MPQ_COMPRESSION_BZIP2",
"MPQ_COMPRESSION_SPARSE",
"MPQ_COMPRESSION_ADPCM_MONO",
"MPQ_COMPRESSION_ADPCM_STEREO",
"MPQ_COMPRESSION_LZMA",
"MPQ_COMPRESSION_NEXT_SAME",
"MPQ_WAVE_QUALITY_HIGH",
"MPQ_WAVE_QUALITY_MEDIUM",
"MPQ_WAVE_QUALITY_LOW",
"HET_TABLE_SIGNATURE",
"BET_TABLE_SIGNATURE",
"MPQ_KEY_HASH_TABLE",
"MPQ_KEY_BLOCK_TABLE",
"LISTFILE_NAME",
"SIGNATURE_NAME",
"ATTRIBUTES_NAME",
"PATCH_METADATA_NAME",
"MPQ_FORMAT_VERSION_1",
"MPQ_FORMAT_VERSION_2",
"MPQ_FORMAT_VERSION_3",
"MPQ_FORMAT_VERSION_4",
"MPQ_ATTRIBUTE_CRC32",
"MPQ_ATTRIBUTE_FILETIME",
"MPQ_ATTRIBUTE_MD5",
"MPQ_ATTRIBUTE_PATCH_BIT",
"MPQ_ATTRIBUTE_ALL",
"MPQ_ATTRIBUTES_V1",
"BASE_PROVIDER_FILE",
"BASE_PROVIDER_MAP",
"BASE_PROVIDER_HTTP",
"BASE_PROVIDER_MASK",
"STREAM_PROVIDER_FLAT",
"STREAM_PROVIDER_PARTIAL",
"STREAM_PROVIDER_MPQE",
"STREAM_PROVIDER_BLOCK4",
"STREAM_PROVIDER_MASK",
"STREAM_FLAG_READ_ONLY",
"STREAM_FLAG_WRITE_SHARE",
"STREAM_FLAG_USE_BITMAP",
"STREAM_OPTIONS_MASK",
"STREAM_PROVIDERS_MASK",
"STREAM_FLAGS_MASK",
"MPQ_OPEN_NO_LISTFILE",
"MPQ_OPEN_NO_ATTRIBUTES",
"MPQ_OPEN_NO_HEADER_SEARCH",
"MPQ_OPEN_FORCE_MPQ_V1",
"MPQ_OPEN_CHECK_SECTOR_CRC",
"MPQ_OPEN_PATCH",
"MPQ_OPEN_FORCE_LISTFILE",
"MPQ_OPEN_READ_ONLY",
"MPQ_CREATE_LISTFILE",
"MPQ_CREATE_ATTRIBUTES",
"MPQ_CREATE_SIGNATURE",
"MPQ_CREATE_ARCHIVE_V1",
"MPQ_CREATE_ARCHIVE_V2",
"MPQ_CREATE_ARCHIVE_V3",
"MPQ_CREATE_ARCHIVE_V4",
"MPQ_CREATE_ARCHIVE_VMASK",
"FLAGS_TO_FORMAT_SHIFT",
"SFILE_VERIFY_SECTOR_CRC",
"SFILE_VERIFY_FILE_CRC",
"SFILE_VERIFY_FILE_MD5",
"SFILE_VERIFY_RAW_MD5",
"SFILE_VERIFY_ALL",
"VERIFY_OPEN_ERROR",
"VERIFY_READ_ERROR",
"VERIFY_FILE_HAS_SECTOR_CRC",
"VERIFY_FILE_SECTOR_CRC_ERROR",
"VERIFY_FILE_HAS_CHECKSUM",
"VERIFY_FILE_CHECKSUM_ERROR",
"VERIFY_FILE_HAS_MD5",
"VERIFY_FILE_MD5_ERROR",
"VERIFY_FILE_HAS_RAW_MD5",
"VERIFY_FILE_RAW_MD5_ERROR",
"VERIFY_FILE_ERROR_MASK",
"SFILE_VERIFY_MPQ_HEADER",
"SFILE_VERIFY_HET_TABLE",
"SFILE_VERIFY_BET_TABLE",
"SFILE_VERIFY_HASH_TABLE",
"SFILE_VERIFY_BLOCK_TABLE",
"SFILE_VERIFY_HIBLOCK_TABLE",
"SFILE_VERIFY_FILE",
"SIGNATURE_TYPE_NONE",
"SIGNATURE_TYPE_WEAK",
"SIGNATURE_TYPE_STRONG",
"ERROR_NO_SIGNATURE",
"ERROR_VERIFY_FAILED",
"ERROR_WEAK_SIGNATURE_OK",
"ERROR_WEAK_SIGNATURE_ERROR",
"ERROR_STRONG_SIGNATURE_OK",
"ERROR_STRONG_SIGNATURE_ERROR",
"MD5_DIGEST_SIZE",
"SHA1_DIGEST_SIZE",
"LANG_NEUTRAL",
"CCB_CHECKING_FILES",
"CCB_CHECKING_HASH_TABLE",
"CCB_COPYING_NON_MPQ_DATA",
"CCB_COMPACTING_FILES",
"CCB_CLOSING_ARCHIVE",
"MPQ_HEADER_SIZE_V1",
"MPQ_HEADER_SIZE_V2",
"MPQ_HEADER_SIZE_V3",
"MPQ_HEADER_SIZE_V4",
"MPQ_HEADER_DWORDS",
];
4 changes: 4 additions & 0 deletions crates/stormlib-bindgen/src/wrapper.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#define _UNICODE
#define UNICODE

#include "StormLib.h"
13 changes: 13 additions & 0 deletions crates/stormlib-sys/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "stormlib-sys"
version = "0.1.1"
authors = ["Flux Xu <fluxxu@gmail.com>"]
build = "build.rs"
edition = "2018"

[dependencies]
libc = "0.2"
bitflags = "1.2"

[build-dependencies]
cmake = "0.1"
55 changes: 55 additions & 0 deletions crates/stormlib-sys/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
extern crate cmake;

use std::env;

fn main() {
// Gets StormLib source path from env STORMLIB_DIR
let stormlib_path = env::var("STORMLIB_DIR").unwrap_or("../../deps/StormLib".to_string());

println!("cargo:rerun-if-changed={}", stormlib_path);

// Builds StormLib using cmake
let mut cfg = cmake::Config::new(&stormlib_path);

#[cfg(target_os = "windows")]
{
cfg.cxxflag("-D UNICODE")
.cxxflag("-D _UNICODE");
}

#[cfg(target_os = "macos")]
{
cfg.cflag("-Wno-implicit-function-declaration");
}

let dst = cfg
.define("BUILD_SHARED_LIBS", "OFF")
.build();

let lib = dst.join("lib");

// For gcc should link static storm first! (before adding -l flags)
// That's very important and I've wasted an hour finding it >_<
// source: https://stackoverflow.com/questions/29199107/c-lz-library-link-order-undefined-reference-to-symbol-inflateinit2
println!("cargo:rustc-link-search=native={}", lib.display());
println!("cargo:rustc-link-lib=static=stormlib");

#[cfg(target_os = "windows")]
{
println!("cargo:rustc-link-lib=user32");
}

#[cfg(target_os = "macos")]
{
println!("cargo:rustc-link-lib=dylib=c++");
println!("cargo:rustc-link-lib=z");
println!("cargo:rustc-link-lib=bz2");
}

#[cfg(target_os = "linux")]
{
println!("cargo:rustc-link-lib=stdc++");
println!("cargo:rustc-link-lib=z");
println!("cargo:rustc-link-lib=bz2");
}
}
Loading

0 comments on commit abc634a

Please sign in to comment.