init(lib): add Tanabata FM lib

This commit is contained in:
Masahiko AMANO 2022-12-22 00:22:55 +03:00
parent f075769648
commit b6c4837ffe
2 changed files with 148 additions and 0 deletions

52
include/tanabata.h Normal file
View File

@ -0,0 +1,52 @@
// Tanabata file manager lib
// By Masahiko AMANO aka H1K0
#ifndef TANABATA_H
#define TANABATA_H
#ifdef __cplusplus
#include <cstdint>
#include <cstdio>
extern "C" {
#else
#include <stdint.h>
#include <stdio.h>
#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

96
src/tanabata/database.c Normal file
View File

@ -0,0 +1,96 @@
#include <malloc.h>
#include <string.h>
#include <sys/stat.h>
#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;
}