#include #include #include #include #ifdef _WIN32 #include #define MKDIR(path) _mkdir(path) #define RMDIR(path) _rmdir(path) #else #include #include #define MKDIR(path) mkdir(path, 0755) #define RMDIR(path) rmdir(path) #endif #define CHECK(cond, msg) \ do { \ if (!(cond)) { \ fprintf(stderr, "FAIL: %s\n", msg); \ return EXIT_FAILURE; \ } \ } while (0) static const char *PAK_PATH = "roundtrip.fpk"; static void write_file(const char *path, const char *data) { FILE *fp = fopen(path, "wb"); fwrite(data, 1, strlen(data), fp); fclose(fp); } int main(void) { struct fpk_writer *w; struct fpk *r; fpk_entry_t *entry; void *data; size_t out_size; static const char hello[] = "hello, fpk"; static const char world[] = "world"; w = fpk_writer_open(PAK_PATH); CHECK(w != NULL, "fpk_writer_open failed"); CHECK(fpk_writer_add(w, "a/hello.txt", hello, sizeof(hello)) == 0, "fpk_writer_add(hello) failed"); CHECK(fpk_writer_add(w, "b/world.txt", world, sizeof(world)) == 0, "fpk_writer_add(world) failed"); CHECK(fpk_writer_add(w, "c/empty.bin", NULL, 0) == 0, "fpk_writer_add(empty) failed"); CHECK(fpk_writer_finalize(w) == 0, "fpk_writer_finalize failed"); fpk_writer_close(w); r = fpk_open(PAK_PATH); CHECK(r != NULL, "fpk_open failed"); CHECK(fpk_entry_count(r) == 3, "unexpected entry_count"); entry = fpk_find(r, "a/hello.txt"); CHECK(entry != NULL, "fpk_find(hello) failed"); CHECK(entry->data_size == sizeof(hello), "hello size mismatch"); data = fpk_read(r, entry, &out_size); CHECK(data != NULL, "fpk_read(hello) failed"); CHECK(out_size == sizeof(hello), "hello read size mismatch"); CHECK(memcmp(data, hello, sizeof(hello)) == 0, "hello content mismatch"); free(data); entry = fpk_find(r, "b/world.txt"); CHECK(entry != NULL, "fpk_find(world) failed"); data = fpk_read(r, entry, &out_size); CHECK(data != NULL, "fpk_read(world) failed"); CHECK(out_size == sizeof(world), "world read size mismatch"); CHECK(memcmp(data, world, sizeof(world)) == 0, "world content mismatch"); free(data); entry = fpk_find(r, "c/empty.bin"); CHECK(entry != NULL, "fpk_find(empty) failed"); CHECK(entry->data_size == 0, "empty size mismatch"); CHECK(fpk_find(r, "does/not/exist") == NULL, "fpk_find(missing) should return NULL"); fpk_close(r); remove(PAK_PATH); CHECK(MKDIR("adddir_src") == 0, "mkdir(adddir_src) failed"); CHECK(MKDIR("adddir_src/nested") == 0, "mkdir(adddir_src/nested) failed"); write_file("adddir_src/root.txt", "root"); write_file("adddir_src/nested/leaf.txt", "leaf"); w = fpk_writer_open("adddir.fpk"); CHECK(w != NULL, "fpk_writer_open(adddir) failed"); CHECK(fpk_writer_add_dir(w, "adddir_src", NULL, NULL) == 0, "fpk_writer_add_dir failed"); CHECK(fpk_writer_finalize(w) == 0, "fpk_writer_finalize(adddir) failed"); fpk_writer_close(w); r = fpk_open("adddir.fpk"); CHECK(r != NULL, "fpk_open(adddir) failed"); CHECK(fpk_entry_count(r) == 2, "adddir entry_count mismatch"); entry = fpk_find(r, "root.txt"); CHECK(entry != NULL, "fpk_find(root.txt) failed"); data = fpk_read(r, entry, &out_size); CHECK(data != NULL, "fpk_read(root.txt) failed"); CHECK(out_size == 4 && memcmp(data, "root", 4) == 0, "root.txt content mismatch"); free(data); entry = fpk_find(r, "nested/leaf.txt"); CHECK(entry != NULL, "fpk_find(nested/leaf.txt) failed"); data = fpk_read(r, entry, &out_size); CHECK(data != NULL, "fpk_read(nested/leaf.txt) failed"); CHECK(out_size == 4 && memcmp(data, "leaf", 4) == 0, "nested/leaf.txt content mismatch"); free(data); fpk_close(r); remove("adddir.fpk"); remove("adddir_src/root.txt"); remove("adddir_src/nested/leaf.txt"); RMDIR("adddir_src/nested"); RMDIR("adddir_src"); printf("PASS\n"); return EXIT_SUCCESS; }