init(lib): add Tanabata FM lib
This commit is contained in:
parent
f075769648
commit
b6c4837ffe
52
include/tanabata.h
Normal file
52
include/tanabata.h
Normal 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
96
src/tanabata/database.c
Normal 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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user