From cc8ecc55b703ef63ddf0eb76fbd92a722b1dfe6b Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Sun, 11 Feb 2024 18:54:38 -0500 Subject: [PATCH] Continue refactor for consistency --- bin.c | 127 +++++++++++++++++++++++++++++++++++++++ haggis.c | 48 +++++++-------- include/haggis_private.h | 6 +- test/init_file_md5.c | 2 +- test/init_file_sha1.c | 2 +- test/init_file_sha256.c | 2 +- test/load_file_md5.c | 2 +- test/load_file_sha1.c | 2 +- test/load_file_sha256.c | 2 +- test/store_file_md5.c | 4 +- test/store_file_sha1.c | 4 +- test/store_file_sha256.c | 4 +- 12 files changed, 166 insertions(+), 39 deletions(-) create mode 100644 bin.c diff --git a/bin.c b/bin.c new file mode 100644 index 0000000..951a36a --- /dev/null +++ b/bin.c @@ -0,0 +1,127 @@ +#include "haggis.h" +#include +#include +#include +#include + +typedef enum { + action_error, + command_help, + create_archive, + extract_archive, + list_files, +} haggis_action; + +struct option main_opts[] = { + {"help", no_argument, &help_flag, 'h'}, + {"version", no_argument, &version_flag, 'V'}, + {0, 0, 0, 0}, +}; +struct option create_opts[] = { + {"algorithm", required_argument, NULL, 'a'}, + {"quiet", no_argument, &quiet_flag, 'q'}, + {"zstd", no_argument, &zstd_flag, 'z'}, + {"level", required_argument, NULL, 'l'}, + {"help", no_argument, &help_flag, 'h'}, + {0, 0, 0, 0}, +}; +struct option extract_opts[] = { + {"quiet", no_argument, &quiet_flag, 'q'}, + {"zstd", no_argument, &zstd_flag, 'z'}, + {"change", required_argument, NULL, 'c'}, + {"help", no_argument, &help_flag, 'h'}, + {0, 0, 0, 0}, +}; +struct option list_opts[] = { + {"color", no_argument, &color_flag, 'c'}, + {"long", no_argument, &long_flag, 'l'}, + {"files", no_argument, &files_flag, 'f'}, + {"pager", optional_argument, NULL, 'p'}, + {"zstd", no_argument, &zstd_flag, 'z'}, + {"help", no_argument, &help_flag, 'h'}, + {0, 0, 0, 0}, +}; + +haggis_action parse_action(char *spec) { + haggis_action action; + if (memcmp(spec, "help", 4) == 0) { + action = command_help; + } else if (memcmp(spec, "create", 6) == 0 || memcmp(spec, "cr", 2) == 0) { + action = create_archive; + } else if (memcmp(spec, "extract", 7) == 0 || memcmp(spec, "ex", 2) == 0) { + action = extract_archive; + } else if (memcmp(spec, "list", 4) == 0 || memcmp(spec, "ls", 2) == 0) { + action = list_files; + } else { + action = action_error; + } + return action; +} + +haggis_algorithm parse_algorithm(char *spec) { + haggis_algorithm alg = skip; + return alg; +} + +void print_help() { + fprintf(stderr, "todo\n"); +} + +void print_version() { + fprintf(stderr, "todo\n"); +} + +void print_usage() { + fprintf(stderr, "todo\n"); +} + +int main(int argc, char **argv) { + int c, idx = 0, help_flag = 0, version_flag = 0, quiet_flag = 0, + zstd_flag = 0, long_flag = 0, files_flag = 0, color_flag = 0; + + haggis_action action = no_action; + char *archive = NULL; + char *subcommand = NULL; + if (argc < 2) { + print_usage(); + exit(1); + } + subcommand = *argv; + if (memcmp(subcommand, "create", 6) == 0) { + action = create_archive; + argv++; + } else if (memcmp(subcommand, "extract", 7) == 0) { + action = extract_archive; + argv++; + } else if (memcmp(subcommand, "list", 4) == 0) { + action == list_files; + argv++; + } else if (memcmp(subcommand, "help", 4) == 0) { + // todo + print_help(); + exit(0); + } else { + print_usage(); + exit(1); + } + archive = *argv; + + /*while (1) { + c = getopt_long(argc, argv, "hvqz", opts, &idx); + if (c == -1) + break; + switch (c) { + case 'h': + print_help(); + break; + case 'v': + print_version(); + break; + case '?': + break; + default: + break; + } + }*/ + return 0; +} diff --git a/haggis.c b/haggis.c index c16b0bb..a2311ae 100644 --- a/haggis.c +++ b/haggis.c @@ -302,7 +302,7 @@ int haggis_validate_cksum(haggis_file *file) { return 0; } -int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a) { +int haggis_file_init(haggis_file *self, char *path, haggis_algorithm a) { FILE *f; long len; @@ -318,16 +318,16 @@ int haggis_file_init(char *path, haggis_file *hf, haggis_algorithm a) { fclose(f); return 2; } - hf->len.val = (uint64_t)len; + self->len.val = (uint64_t)len; rewind(f); - hf->data = calloc(1, (size_t)len); - if (fread(hf->data, 1, (size_t)len, f) != (size_t)len) { - free(hf->data); + self->data = calloc(1, (size_t)len); + if (fread(self->data, 1, (size_t)len, f) != (size_t)len) { + free(self->data); fclose(f); return 1; } fclose(f); - haggis_init_cksum(hf, a); + haggis_init_cksum(self, a); return 0; } @@ -336,32 +336,32 @@ void haggis_file_deinit(haggis_file *f) { free(f->data); } -int haggis_store_file(FILE *stream, haggis_file *file) { - if (store_u64(stream, &file->len) != 8) +int haggis_store_file(haggis_file *self, FILE *stream) { + if (store_u64(stream, &self->len) != 8) return 1; - if (haggis_store_cksum(&file->cksum, stream) != 0) + if (haggis_store_cksum(&self->cksum, stream) != 0) return 1; - int res = fwrite(file->data, 1, (size_t)file->len.val, stream); - if (res != (size_t)file->len.val) + int res = fwrite(self->data, 1, (size_t)self->len.val, stream); + if (res != (size_t)self->len.val) return 1; return 0; } -int haggis_load_file(FILE *stream, haggis_file *f) { - if (load_u64(stream, &f->len) != 8) +int haggis_load_file(haggis_file *self, FILE *stream) { + if (load_u64(stream, &self->len) != 8) return 1; - if (haggis_load_cksum(&f->cksum, stream) != 0) + if (haggis_load_cksum(&self->cksum, stream) != 0) return 1; - f->data = calloc(1, (size_t)f->len.val); - if (f->data == NULL) + self->data = calloc(1, (size_t)self->len.val); + if (self->data == NULL) return -1; - int res = fread(f->data, 1, (size_t)f->len.val, stream); - if (res != (size_t)f->len.val) { - free(f->data); + int res = fread(self->data, 1, (size_t)self->len.val, stream); + if (res != (size_t)self->len.val) { + free(self->data); return 1; } - if (haggis_validate_cksum(f)) { - free(f->data); + if (haggis_validate_cksum(self)) { + free(self->data); return 1; } return 0; @@ -415,7 +415,7 @@ int haggis_load_filetype( switch (tag) { case normal: file->tag = 0; - return haggis_load_file(stream, &file->file); + return haggis_load_file(&file->file, stream); case hardlink: return haggis_load_filename(stream, &file->target); file->tag = 1; @@ -449,7 +449,7 @@ int haggis_store_filetype(FILE *stream, haggis_filetype *filetype) { flag = 0; if (fwrite(&flag, 1, 1, stream) != 1) return 1; - if (haggis_store_file(stream, &filetype->file) != 0) + if (haggis_store_file(&filetype->file, stream) != 0) return 1; break; case hardlink: @@ -573,7 +573,7 @@ int haggis_init_file_node( } } node->filetype.tag = normal; - res = haggis_file_init(node->name.name, &node->filetype.file, a); + res = haggis_file_init(&node->filetype.file, node->name.name, a); if (res != 0) { haggis_node_deinit(node); return 1; diff --git a/include/haggis_private.h b/include/haggis_private.h index fb9d357..98627b5 100644 --- a/include/haggis_private.h +++ b/include/haggis_private.h @@ -54,9 +54,9 @@ int validate_md5 (haggis_file *file); int validate_sha1 (haggis_file *file); int validate_sha256 (haggis_file *file); int haggis_validate_cksum (haggis_file *file); -int haggis_file_init (char *path, haggis_file *hf, haggis_algorithm a); -int haggis_store_file (FILE *stream, haggis_file *file); -int haggis_load_file (FILE *stream, haggis_file *f); +int haggis_file_init (haggis_file *self, char *path, haggis_algorithm a); +int haggis_store_file (haggis_file *self, FILE *stream); +int haggis_load_file (haggis_file *self, FILE *stream); void haggis_filename_init (char *target, haggis_filename *fname); void haggis_filename_deinit(haggis_filename *fname); int haggis_load_filename (FILE *stream, haggis_filename *n); diff --git a/test/init_file_md5.c b/test/init_file_md5.c index a11f9e6..f2dfdf1 100644 --- a/test/init_file_md5.c +++ b/test/init_file_md5.c @@ -8,7 +8,7 @@ int main() { char *f = "check_header.c"; const u8 buf[16] = { 127, 161, 170, 134, 33, 218, 100, 29, 250, 255, 15, 125, 109, 5, 216, 9 }; - assert(haggis_file_init(f, &hf, md5) == 0); + assert(haggis_file_init(&hf, f, md5) == 0); assert(hf.cksum.tag == md5); assert(memcmp(buf, hf.cksum.md5, 16) == 0); } diff --git a/test/init_file_sha1.c b/test/init_file_sha1.c index 1d4de28..95ab44a 100644 --- a/test/init_file_sha1.c +++ b/test/init_file_sha1.c @@ -9,7 +9,7 @@ int main() { const u8 buf[20] = { 175, 45, 7, 226, 140, 184, 187, 69, 59, 208, 246, 108, 187, 249, 63, 111, 56, 65, 1, 58 }; - assert(haggis_file_init(f, &hf, sha1) == 0); + assert(haggis_file_init(&hf, f, sha1) == 0); assert(hf.cksum.tag == sha1); assert(memcmp(buf, hf.cksum.sha1, 20) == 0); } diff --git a/test/init_file_sha256.c b/test/init_file_sha256.c index 2c8459a..f30f3f7 100644 --- a/test/init_file_sha256.c +++ b/test/init_file_sha256.c @@ -10,7 +10,7 @@ int main() { 250, 203, 77, 108, 230, 7, 159, 124, 6, 237, 169, 239, 70, 218, 173, 188, 153, 219, 121, 82 }; - assert(haggis_file_init(f, &hf, sha256) == 0); + assert(haggis_file_init(&hf, f, sha256) == 0); assert(hf.cksum.tag == sha256); assert(memcmp(buf, hf.cksum.sha256, 32) == 0); } diff --git a/test/load_file_md5.c b/test/load_file_md5.c index f24cff3..06f0b6b 100644 --- a/test/load_file_md5.c +++ b/test/load_file_md5.c @@ -10,7 +10,7 @@ int main() { int res; fd = fopen(f, "r"); - res = haggis_load_file(fd, &hf); + res = haggis_load_file(&hf, fd); fclose(fd); return res; } diff --git a/test/load_file_sha1.c b/test/load_file_sha1.c index 5fc69ac..590049c 100644 --- a/test/load_file_sha1.c +++ b/test/load_file_sha1.c @@ -10,7 +10,7 @@ int main() { int res; fd = fopen(f, "r"); - res = haggis_load_file(fd, &hf); + res = haggis_load_file(&hf, fd); fclose(fd); return res; } diff --git a/test/load_file_sha256.c b/test/load_file_sha256.c index 525a70c..8a9e9d0 100644 --- a/test/load_file_sha256.c +++ b/test/load_file_sha256.c @@ -10,7 +10,7 @@ int main() { int res; fd = fopen(f, "r"); - res = haggis_load_file(fd, &hf); + res = haggis_load_file(&hf, fd); fclose(fd); return res; } diff --git a/test/store_file_md5.c b/test/store_file_md5.c index c8ca693..38b1b93 100644 --- a/test/store_file_md5.c +++ b/test/store_file_md5.c @@ -8,9 +8,9 @@ int main() { char *f = "load_device.c"; FILE *fd; - assert(haggis_file_init(f, &hf, md5) == 0); + assert(haggis_file_init(&hf, f, md5) == 0); fd = fopen("output/store_file_md5", "w"); - assert(haggis_store_file(fd, &hf) == 0); + assert(haggis_store_file(&hf, fd) == 0); fflush(fd); fclose(fd); return 0; diff --git a/test/store_file_sha1.c b/test/store_file_sha1.c index a530a15..d0fd587 100644 --- a/test/store_file_sha1.c +++ b/test/store_file_sha1.c @@ -13,9 +13,9 @@ int main() { char *f = "load_device.c"; FILE *fd; - assert(haggis_file_init(f, &hf, sha1) == 0); + assert(haggis_file_init(&hf, f, sha1) == 0); fd = fopen("output/store_file_sha1", "w"); - assert(haggis_store_file(fd, &hf) == 0); + assert(haggis_store_file(&hf, fd) == 0); fflush(fd); fclose(fd); return 0; diff --git a/test/store_file_sha256.c b/test/store_file_sha256.c index 62ce805..5c455b7 100644 --- a/test/store_file_sha256.c +++ b/test/store_file_sha256.c @@ -13,9 +13,9 @@ int main() { char *f = "load_device.c"; FILE *fd; - assert(haggis_file_init(f, &hf, sha1) == 0); + assert(haggis_file_init(&hf, f, sha1) == 0); fd = fopen("output/store_file_sha256", "w"); - assert(haggis_store_file(fd, &hf) == 0); + assert(haggis_store_file(&hf, fd) == 0); fflush(fd); fclose(fd); return 0;