130 lines
4.0 KiB
C
130 lines
4.0 KiB
C
#include <fpk.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#ifdef _WIN32
|
|
#include <direct.h>
|
|
#define MKDIR(path) _mkdir(path)
|
|
#define RMDIR(path) _rmdir(path)
|
|
#else
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#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;
|
|
}
|