From e97feb1e3d99fc3b483fb1e71d9ecd2368f2bfb6 Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Mon, 24 Jul 2023 18:56:04 -0400 Subject: [PATCH] Finish `haggis_load_node` function; Add *node related function prototypes to haggis.h; --- include/haggis.h | 5 +++++ src/haggis.c | 34 +++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/include/haggis.h b/include/haggis.h index 87cf72b..2e25153 100644 --- a/include/haggis.h +++ b/include/haggis.h @@ -118,4 +118,9 @@ struct haggis_node { struct haggis_filetype *filetype; }; +struct haggis_node* haggis_create_node(char *file); +int haggis_extract_node(FILE *stram, struct haggis_node *node); +int haggis_load_node(FILE *stream, struct haggis_node *node); +int haggis_store_node(FILE *stream, struct haggis_node *node); + #endif // !HAGGIS_H diff --git a/src/haggis.c b/src/haggis.c index 11f9877..31e6974 100644 --- a/src/haggis.c +++ b/src/haggis.c @@ -30,6 +30,7 @@ * other than his own. */ +#include #if defined(__FreeBSD__) || defined(__DragonFly__) #include #include @@ -357,7 +358,7 @@ int haggis_load_filetype( file->tag = 2; case directory: file->tag = 3; - break; + break; case character: file->tag = 4; return haggis_load_device(stream, file->f_type); @@ -366,7 +367,7 @@ int haggis_load_filetype( return haggis_load_device(stream, file->f_type); case fifo: file->tag = 6; - break; + break; case eof: file->tag = 7; break; @@ -374,7 +375,19 @@ int haggis_load_filetype( return 0; } -int haggis_store_node(FILE *stream, struct haggis_node *node) { +enum haggis_typeflag haggis_filetype_from_mode(union u16 mode) { + u8 mask = 07 << 5; + int filetype = (int)((mode.bytes[0] & mask) >> 5); + return filetype; +} + +struct haggis_node* haggis_create_node(char *file) { + struct haggis_node *node = malloc(sizeof(struct haggis_node)); + // todo + return node; +} + +int haggis_extract_node(FILE *stram, struct haggis_node *node) { // todo return 0; } @@ -382,8 +395,9 @@ int haggis_store_node(FILE *stream, struct haggis_node *node) { int haggis_load_node(FILE *stream, struct haggis_node *node) { int res; union u16 mode; - enum haggis_typeflag flag; + enum haggis_typeflag tag; + mode.val = 0; res = haggis_load_filename(stream, node->name); if (res) return res; @@ -399,6 +413,16 @@ int haggis_load_node(FILE *stream, struct haggis_node *node) { res = load_u16(stream, mode); if (res != 2) return 2; - //todo + tag = haggis_filetype_from_mode(mode); + node->mode.bytes[0] = mode.bytes[0] & 037; + node->mode.bytes[1] = mode.bytes[1]; + res = haggis_load_filetype(stream, tag, node->filetype); + if (res) + return res; + return 0; +} + +int haggis_store_node(FILE *stream, struct haggis_node *node) { + // todo return 0; }