From b6c4837ffed3db86755947403bb9486b1b3f0b5f Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Thu, 22 Dec 2022 00:22:55 +0300 Subject: [PATCH] init(lib): add Tanabata FM lib --- include/tanabata.h | 52 ++++++++++++++++++++++ src/tanabata/database.c | 96 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 include/tanabata.h create mode 100644 src/tanabata/database.c diff --git a/include/tanabata.h b/include/tanabata.h new file mode 100644 index 0000000..3b18d60 --- /dev/null +++ b/include/tanabata.h @@ -0,0 +1,52 @@ +// Tanabata file manager lib +// By Masahiko AMANO aka H1K0 + +#ifndef TANABATA_H +#define TANABATA_H + +#ifdef __cplusplus +#include +#include +extern "C" { +#else +#include +#include +#endif + +#include "core.h" + +// Tanabata (七夕) - the struct with all databases +typedef struct tanabata { + Sasahyou sasahyou; // Sasahyou struct + Sappyou sappyou; // Sappyou struct + Shoppyou shoppyou; // Shoppyou struct +} Tanabata; + +// ==================== DATABASE SECTION ==================== // + +// Initialize empty tanabata +int tanabata_init(Tanabata *tanabata); + +// Free tanabata +int tanabata_free(Tanabata *tanabata); + +// Weed tanabata +int tanabata_weed(Tanabata *tanabata); + +// Load tanabata +int tanabata_load(Tanabata *tanabata); + +// Save tanabata +int tanabata_save(Tanabata *tanabata); + +// Open tanabata +int tanabata_open(Tanabata *tanabata, const char *path); + +// Dump tanabata +int tanabata_dump(Tanabata *tanabata, const char *path); + +#ifdef __cplusplus +} +#endif + +#endif //TANABATA_H diff --git a/src/tanabata/database.c b/src/tanabata/database.c new file mode 100644 index 0000000..b9ae317 --- /dev/null +++ b/src/tanabata/database.c @@ -0,0 +1,96 @@ +#include +#include +#include + +#include "../../include/tanabata.h" + +int tanabata_init(Tanabata *tanabata) { + int status = 0; + status |= sasahyou_init(&tanabata->sasahyou); + status |= sappyou_init(&tanabata->sappyou); + status |= shoppyou_init(&tanabata->shoppyou); + + return status; +} + +int tanabata_free(Tanabata *tanabata) { + int status = 0; + status |= sasahyou_free(&tanabata->sasahyou); + status |= sappyou_free(&tanabata->sappyou); + status |= shoppyou_free(&tanabata->shoppyou); + + return status; +} + +int tanabata_weed(Tanabata *tanabata) { + int status = 0; + status |= sasahyou_weed(&tanabata->sasahyou); + status |= sappyou_weed(&tanabata->sappyou); + status |= shoppyou_weed(&tanabata->shoppyou); + + return status; +} + +int tanabata_load(Tanabata *tanabata) { + int status = 0; + status |= sasahyou_load(&tanabata->sasahyou); + status |= sappyou_load(&tanabata->sappyou); + status |= shoppyou_load(&tanabata->shoppyou); + + return status; +} + +int tanabata_save(Tanabata *tanabata) { + int status = 0; + status |= sasahyou_save(&tanabata->sasahyou); + status |= sappyou_save(&tanabata->sappyou); + status |= shoppyou_save(&tanabata->shoppyou); + + return status; +} + +int tanabata_open(Tanabata *tanabata, const char *path) { + if (path[-1] == '/') { + fprintf(stderr, "Failed to open tanabata: output path must not end with '/'\n"); + return 1; + } + struct stat st; + if (stat(path, &st) != 0 || !S_ISDIR(st.st_mode)) { + fprintf(stderr, "Failed to open tanabata: directory '%s' does not exist\n", path); + return 1; + } + int status = 0; + char *file_path = malloc(strlen(path) + 10); + strcpy(file_path, path); + status |= sasahyou_open(&tanabata->sasahyou, strcat(file_path, "/sasahyou")); + strcpy(file_path, path); + status |= sappyou_open(&tanabata->sappyou, strcat(file_path, "/sappyou")); + strcpy(file_path, path); + status |= shoppyou_open(&tanabata->shoppyou, strcat(file_path, "/shoppyou")); + free(file_path); + + return status; +} + +int tanabata_dump(Tanabata *tanabata, const char *path) { + if (path[-1] == '/') { + fprintf(stderr, "Failed to dump tanabata: output path must not end with '/'\n"); + return 1; + } + struct stat st; + if (stat(path, &st) != 0 || !S_ISDIR(st.st_mode)) { + fprintf(stderr, "Failed to dump tanabata: directory '%s' does not exist\n", path); + return 1; + } + int status = 0; + char *file_path = malloc(strlen(path) + 10); + strcpy(file_path, path); + status |= sasahyou_dump(&tanabata->sasahyou, strcat(file_path, "/sasahyou")); + strcpy(file_path, path); + status |= sappyou_dump(&tanabata->sappyou, strcat(file_path, "/sappyou")); + strcpy(file_path, path); + status |= shoppyou_dump(&tanabata->shoppyou, strcat(file_path, "/shoppyou")); + free(file_path); + + return status; +}