/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0.If a copy of the MPL was not distributed with this * file, You can obtain one at http ://mozilla.org/MPL/2.0/. */ #include "ESPReader.h" #include #include #undef NDEBUG #include int main(void) { errno_t ret = 0; // Read in the esp file SizedBuf esp_buf = { 0 }; { FILE *fp; ret = fopen_s(&fp, "Skyrim.esm", "rb"); if (ret || !fp) goto exit1; fseek(fp, 0L, SEEK_END); esp_buf.size = ftell(fp); rewind(fp); esp_buf.data = malloc(esp_buf.size); if (!esp_buf.data) { ret = errno; goto exit1; } size_t read = fread(esp_buf.data, sizeof(char), esp_buf.size, fp); fclose(fp); assert(read == esp_buf.size); } // Calculate esp stats ESPStats stats = espr_stats(esp_buf); // Decompress the esp file SizedBuf decom_buf = { 0 }; { decom_buf.size = stats.decompressed_size; decom_buf.data = malloc(decom_buf.size); if (!decom_buf.data) { ret = errno; goto exit2; } espr_decompress(esp_buf, decom_buf); } // Construct the meta tree SizedBuf tree_buf = { 0 }; MetaTree tree = { 0 }; { tree_buf.size = espr_tree_size(stats); tree_buf.data = malloc(tree_buf.size); if (!tree_buf.data) { ret = errno; goto exit3; } tree = espr_create_tree(decom_buf, tree_buf); } // Serialize and write out the uncompressed esp SizedBuf serialized_buf = { 0 }; { serialized_buf.size = tree.size; serialized_buf.data = malloc(serialized_buf.size); if (!serialized_buf.data) { ret = errno; goto exit4; } espr_serialize(tree, serialized_buf); printf("Serialized.\n"); FILE *fp; ret = fopen_s(&fp, "Test.esm", "wb"); if (ret || !fp) goto exit5; size_t written = fwrite(serialized_buf.data, sizeof(char), serialized_buf.size, fp); fclose(fp); assert(written == serialized_buf.size); printf("Written.\n"); } exit5: free(serialized_buf.data); exit4: free(tree_buf.data); exit3: free(decom_buf.data); exit2: free(esp_buf.data); exit1: // lazy file pointer cleanup _fcloseall(); printf("Finished.\n"); (void)getc(stdin); return 0; }