fix(lib): some bug fixes, optimization improves and code cleanup

This commit is contained in:
Masahiko AMANO 2023-01-20 17:18:23 +03:00
parent 8768d55b48
commit cc795bae19
5 changed files with 72 additions and 113 deletions

View File

@ -1,4 +1,4 @@
// Tanabata file manager lib
// Tanabata lib
// By Masahiko AMANO aka H1K0
#pragma once
@ -43,13 +43,13 @@ int tanabata_dump(Tanabata *tanabata, const char *path);
int tanabata_sasa_add(Tanabata *tanabata, const char *path);
// Remove sasa by ID
int tanabata_sasa_rem_by_id(Tanabata *tanabata, uint64_t sasa_id);
int tanabata_sasa_rem(Tanabata *tanabata, uint64_t sasa_id);
// Update sasa file path
int tanabata_sasa_upd(Tanabata *tanabata, uint64_t sasa_id, const char *path);
// Get sasa by ID
Sasa tanabata_sasa_get_by_id(Tanabata *tanabata, uint64_t sasa_id);
Sasa tanabata_sasa_get(Tanabata *tanabata, uint64_t sasa_id);
// ==================== TANZAKU SECTION ==================== //
@ -57,13 +57,13 @@ Sasa tanabata_sasa_get_by_id(Tanabata *tanabata, uint64_t sasa_id);
int tanabata_tanzaku_add(Tanabata *tanabata, const char *name, const char *description);
// Remove tanzaku by ID
int tanabata_tanzaku_rem_by_id(Tanabata *tanabata, uint64_t tanzaku_id);
int tanabata_tanzaku_rem(Tanabata *tanabata, uint64_t tanzaku_id);
// Update tanzaku name and description
int tanabata_tanzaku_upd(Tanabata *tanabata, uint64_t tanzaku_id, const char *name, const char *description);
// Get tanzaku by ID
Tanzaku tanabata_tanzaku_get_by_id(Tanabata *tanabata, uint64_t tanzaku_id);
Tanzaku tanabata_tanzaku_get(Tanabata *tanabata, uint64_t tanzaku_id);
// ==================== KAZARI SECTION ==================== //

View File

@ -33,20 +33,22 @@ int tanabata_free(Tanabata *tanabata) {
shoppyou_free(&tanabata->shoppyou) != 0) {
return 1;
}
tanabata->sasahyou_mod = 0;
tanabata->sappyou_mod = 0;
tanabata->shoppyou_mod = 0;
return 0;
}
int tanabata_weed(Tanabata *tanabata) {
uint64_t hole_cnt = 0;
uint64_t new_id;
uint64_t hole_cnt = 0, new_id;
Kazari *current_kazari;
Sasa *current_sasa = tanabata->sasahyou.database;
for (uint64_t i = 0; i < tanabata->sasahyou.size; i++) {
for (uint64_t i = 0; i < tanabata->sasahyou.size; i++, current_sasa++) {
if (current_sasa->id != HOLE_ID) {
if (hole_cnt > 0) {
new_id = current_sasa->id - hole_cnt;
for (current_kazari = tanabata->shoppyou.database + tanabata->shoppyou.size - 1;
current_kazari >= tanabata->shoppyou.database; current_kazari++) {
current_kazari >= tanabata->shoppyou.database; current_kazari--) {
if (current_kazari->sasa_id == current_sasa->id) {
current_kazari->sasa_id = new_id;
}
@ -58,23 +60,24 @@ int tanabata_weed(Tanabata *tanabata) {
kazari_rem_by_sasa(&tanabata->shoppyou, current_sasa->id);
hole_cnt++;
}
current_sasa++;
}
if (hole_cnt > 0) {
tanabata->sasahyou.size -= hole_cnt;
tanabata->sasahyou.hole_cnt = 0;
free(tanabata->sasahyou.holes);
tanabata->sasahyou.database = realloc(tanabata->sasahyou.database, tanabata->sasahyou.size * sizeof(Sasa));
tanabata->sasahyou.holes = NULL;
tanabata->sasahyou.database = reallocarray(tanabata->sasahyou.database, tanabata->sasahyou.size,
sizeof(Sasa));
tanabata->sasahyou.modified_ts = time(NULL);
}
hole_cnt = 0;
Tanzaku *current_tanzaku = tanabata->sappyou.database;
for (uint64_t i = 0; i < tanabata->sappyou.size; i++) {
for (uint64_t i = 0; i < tanabata->sappyou.size; i++, current_tanzaku++) {
if (current_tanzaku->id != HOLE_ID) {
if (hole_cnt > 0) {
new_id = current_tanzaku->id - hole_cnt;
for (current_kazari = tanabata->shoppyou.database + tanabata->shoppyou.size - 1;
current_kazari >= tanabata->shoppyou.database; current_kazari++) {
current_kazari >= tanabata->shoppyou.database; current_kazari--) {
if (current_kazari->tanzaku_id == current_tanzaku->id) {
current_kazari->tanzaku_id = new_id;
}
@ -85,18 +88,19 @@ int tanabata_weed(Tanabata *tanabata) {
hole_cnt++;
}
}
current_tanzaku++;
}
if (hole_cnt > 0) {
tanabata->sappyou.size -= tanabata->sappyou.hole_cnt;
tanabata->sappyou.hole_cnt = 0;
free(tanabata->sappyou.holes);
tanabata->sappyou.database = realloc(tanabata->sappyou.database, tanabata->sappyou.size * sizeof(Tanzaku));
tanabata->sappyou.holes = NULL;
tanabata->sappyou.database = reallocarray(tanabata->sappyou.database, tanabata->sappyou.size,
sizeof(Tanzaku));
tanabata->sappyou.modified_ts = time(NULL);
}
hole_cnt = 0;
current_kazari = tanabata->shoppyou.database;
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++) {
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++, current_kazari++) {
if (current_kazari->sasa_id != HOLE_ID && current_kazari->tanzaku_id != HOLE_ID &&
current_kazari->sasa_id < tanabata->sasahyou.size &&
current_kazari->tanzaku_id < tanabata->sappyou.size) {
@ -106,22 +110,23 @@ int tanabata_weed(Tanabata *tanabata) {
} else {
hole_cnt++;
}
current_kazari++;
}
if (hole_cnt > 0) {
tanabata->shoppyou.size -= tanabata->shoppyou.hole_cnt;
tanabata->shoppyou.hole_cnt = 0;
free(tanabata->shoppyou.holes);
tanabata->shoppyou.database = realloc(tanabata->shoppyou.database, tanabata->shoppyou.size * sizeof(Kazari));
tanabata->shoppyou.holes = NULL;
tanabata->shoppyou.database = reallocarray(tanabata->shoppyou.database, tanabata->shoppyou.size,
sizeof(Kazari));
tanabata->shoppyou.modified_ts = time(NULL);
}
return 0;
}
int tanabata_load(Tanabata *tanabata) {
if (sasahyou_load(&tanabata->sasahyou) != 0 ||
sappyou_load(&tanabata->sappyou) != 0 ||
shoppyou_load(&tanabata->shoppyou) != 0) {
if (tanabata->sasahyou_mod != tanabata->sasahyou.modified_ts && sasahyou_load(&tanabata->sasahyou) != 0 ||
tanabata->sappyou_mod != tanabata->sappyou.modified_ts && sappyou_load(&tanabata->sappyou) != 0 ||
tanabata->shoppyou_mod != tanabata->shoppyou.modified_ts && shoppyou_load(&tanabata->shoppyou) != 0) {
return 1;
}
tanabata->sasahyou_mod = tanabata->sasahyou.modified_ts;
@ -150,17 +155,16 @@ int tanabata_open(Tanabata *tanabata, const char *path) {
if (stat(path, &st) != 0 || !S_ISDIR(st.st_mode)) {
return 1;
}
char *file_path = malloc(strlen(path) + 10);
size_t pathlen = strlen(path);
char *file_path = malloc(pathlen + 10);
strcpy(file_path, path);
if (sasahyou_open(&tanabata->sasahyou, strcat(file_path, "/sasahyou")) != 0) {
return 1;
}
strcpy(file_path, path);
if (sappyou_open(&tanabata->sappyou, strcat(file_path, "/sappyou")) != 0) {
return 1;
}
strcpy(file_path, path);
if (shoppyou_open(&tanabata->shoppyou, strcat(file_path, "/shoppyou")) != 0) {
if (tanabata->sasahyou_mod != tanabata->sasahyou.modified_ts &&
sasahyou_open(&tanabata->sasahyou, strcpy(file_path + pathlen, "/sasahyou")) != 0 ||
tanabata->sappyou_mod != tanabata->sappyou.modified_ts &&
sappyou_open(&tanabata->sappyou, strcpy(file_path + pathlen, "/sappyou")) != 0 ||
tanabata->shoppyou_mod != tanabata->shoppyou.modified_ts &&
shoppyou_open(&tanabata->shoppyou, strcpy(file_path + pathlen, "/shoppyou")) != 0) {
free(file_path);
return 1;
}
free(file_path);
@ -178,28 +182,21 @@ int tanabata_dump(Tanabata *tanabata, const char *path) {
if (stat(path, &st) != 0 || !S_ISDIR(st.st_mode)) {
return 1;
}
char *file_path = malloc(strlen(path) + 10);
if (tanabata->sasahyou_mod != tanabata->sasahyou.modified_ts) {
size_t pathlen = strlen(path);
char *file_path = malloc(pathlen + 10);
strcpy(file_path, path);
if (sasahyou_dump(&tanabata->sasahyou, strcat(file_path, "/sasahyou")) != 0) {
if (tanabata->sasahyou_mod != tanabata->sasahyou.modified_ts &&
sasahyou_dump(&tanabata->sasahyou, strcpy(file_path + pathlen, "/sasahyou")) != 0 ||
tanabata->sappyou_mod != tanabata->sappyou.modified_ts &&
sappyou_dump(&tanabata->sappyou, strcpy(file_path + pathlen, "/sappyou")) != 0 ||
tanabata->shoppyou_mod != tanabata->shoppyou.modified_ts &&
shoppyou_dump(&tanabata->shoppyou, strcpy(file_path + pathlen, "/shoppyou")) != 0) {
free(file_path);
return 1;
}
tanabata->sasahyou_mod = tanabata->sasahyou.modified_ts;
}
if (tanabata->sappyou_mod != tanabata->sappyou.modified_ts) {
strcpy(file_path, path);
if (sappyou_dump(&tanabata->sappyou, strcat(file_path, "/sappyou")) != 0) {
return 1;
}
tanabata->sappyou_mod = tanabata->sappyou.modified_ts;
}
if (tanabata->shoppyou_mod != tanabata->shoppyou.modified_ts) {
strcpy(file_path, path);
if (shoppyou_dump(&tanabata->shoppyou, strcat(file_path, "/shoppyou")) != 0) {
return 1;
}
tanabata->shoppyou_mod = tanabata->shoppyou.modified_ts;
}
free(file_path);
tanabata->sasahyou_mod = tanabata->sasahyou.modified_ts;
tanabata->sappyou_mod = tanabata->sappyou.modified_ts;
tanabata->shoppyou_mod = tanabata->shoppyou.modified_ts;
return 0;
}

View File

@ -8,26 +8,17 @@ int tanabata_kazari_add(Tanabata *tanabata, uint64_t sasa_id, uint64_t tanzaku_i
tanabata->shoppyou.size == -1 && tanabata->shoppyou.hole_cnt == 0) {
return 1;
}
Kazari *current_kazari = tanabata->shoppyou.database;
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++) {
Kazari *current_kazari = tanabata->shoppyou.database + tanabata->shoppyou.size - 1;
for (; current_kazari >= tanabata->shoppyou.database; current_kazari--) {
if (current_kazari->sasa_id == sasa_id && current_kazari->tanzaku_id == tanzaku_id) {
return 0;
}
current_kazari++;
}
if (kazari_add(&tanabata->shoppyou, sasa_id, tanzaku_id) == 0) {
tanabata->shoppyou_mod = 1;
return 0;
}
return 1;
}
}
return kazari_add(&tanabata->shoppyou, sasa_id, tanzaku_id);
}
int tanabata_kazari_rem(Tanabata *tanabata, uint64_t sasa_id, uint64_t tanzaku_id) {
if (kazari_rem(&tanabata->shoppyou, sasa_id, tanzaku_id) == 0) {
tanabata->shoppyou_mod = 1;
return 0;
}
return 1;
return kazari_rem(&tanabata->shoppyou, sasa_id, tanzaku_id);
}
Tanzaku *tanabata_tanzaku_get_by_sasa(Tanabata *tanabata, uint64_t sasa_id) {
@ -36,17 +27,18 @@ Tanzaku *tanabata_tanzaku_get_by_sasa(Tanabata *tanabata, uint64_t sasa_id) {
}
Tanzaku *tanzaku_list = NULL;
uint64_t tanzaku_count = 0;
Tanzaku temp;
Kazari *current_kazari = tanabata->shoppyou.database;
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++) {
if (current_kazari->sasa_id == sasa_id && current_kazari->tanzaku_id != HOLE_ID) {
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++, current_kazari++) {
if (current_kazari->sasa_id == sasa_id &&
(temp = tanabata_tanzaku_get(tanabata, current_kazari->tanzaku_id)).id != HOLE_ID) {
tanzaku_count++;
tanzaku_list = realloc(tanzaku_list, tanzaku_count * sizeof(Tanzaku));
tanzaku_list[tanzaku_count - 1] = tanabata_tanzaku_get_by_id(tanabata, current_kazari->tanzaku_id);
tanzaku_list = reallocarray(tanzaku_list, tanzaku_count, sizeof(Tanzaku));
tanzaku_list[tanzaku_count - 1] = temp;
}
current_kazari++;
}
if (tanzaku_list != NULL) {
tanzaku_list = realloc(tanzaku_list, (tanzaku_count + 1) * sizeof(Tanzaku));
tanzaku_list = reallocarray(tanzaku_list, (tanzaku_count + 1), sizeof(Tanzaku));
tanzaku_list[tanzaku_count] = HOLE_TANZAKU;
}
return tanzaku_list;
@ -58,17 +50,18 @@ Sasa *tanabata_sasa_get_by_tanzaku(Tanabata *tanabata, uint64_t tanzaku_id) {
}
Sasa *sasa_list = NULL;
uint64_t sasa_count = 0;
Sasa temp;
Kazari *current_kazari = tanabata->shoppyou.database;
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++) {
if (current_kazari->tanzaku_id == tanzaku_id && current_kazari->sasa_id != HOLE_ID) {
for (uint64_t i = 0; i < tanabata->shoppyou.size; i++, current_kazari++) {
if (current_kazari->tanzaku_id == tanzaku_id &&
(temp = tanabata_sasa_get(tanabata, current_kazari->sasa_id)).id != HOLE_ID) {
sasa_count++;
sasa_list = realloc(sasa_list, sasa_count * sizeof(Sasa));
sasa_list[sasa_count - 1] = tanabata_sasa_get_by_id(tanabata, current_kazari->sasa_id);
sasa_list = reallocarray(sasa_list, sasa_count, sizeof(Sasa));
sasa_list[sasa_count - 1] = temp;
}
current_kazari++;
}
if (sasa_list != NULL) {
sasa_list = realloc(sasa_list, (sasa_count + 1) * sizeof(Sasa));
sasa_list = reallocarray(sasa_list, (sasa_count + 1), sizeof(Sasa));
sasa_list[sasa_count] = HOLE_SASA;
}
return sasa_list;

View File

@ -1,27 +1,11 @@
#include <stdlib.h>
#include <string.h>
#include "../core/core_func.h"
#include "../../include/tanabata.h"
int tanabata_sasa_add(Tanabata *tanabata, const char *path) {
if (path == NULL || tanabata->sasahyou.size == -1 && tanabata->sasahyou.hole_cnt == 0) {
return 1;
}
Sasa *current_sasa = tanabata->sasahyou.database;
for (uint64_t i = 0; i < tanabata->sasahyou.size; i++) {
if (current_sasa->id != HOLE_ID && strcmp(current_sasa->path, path) == 0) {
return 1;
}
current_sasa++;
}
return sasa_add(&tanabata->sasahyou, path);
}
int tanabata_sasa_rem_by_id(Tanabata *tanabata, uint64_t sasa_id) {
if (sasa_id == HOLE_ID || sasa_id >= tanabata->sasahyou.size) {
return 1;
}
int tanabata_sasa_rem(Tanabata *tanabata, uint64_t sasa_id) {
if (sasa_rem(&tanabata->sasahyou, sasa_id) == 0 &&
kazari_rem_by_sasa(&tanabata->shoppyou, sasa_id) == 0) {
return 0;
@ -33,7 +17,7 @@ int tanabata_sasa_upd(Tanabata *tanabata, uint64_t sasa_id, const char *path) {
return sasa_upd(&tanabata->sasahyou, sasa_id, path);
}
Sasa tanabata_sasa_get_by_id(Tanabata *tanabata, uint64_t sasa_id) {
Sasa tanabata_sasa_get(Tanabata *tanabata, uint64_t sasa_id) {
if (sasa_id == HOLE_ID || sasa_id >= tanabata->sasahyou.size) {
return HOLE_SASA;
}

View File

@ -1,26 +1,11 @@
#include <string.h>
#include "../core/core_func.h"
#include "../../include/tanabata.h"
int tanabata_tanzaku_add(Tanabata *tanabata, const char *name, const char *description) {
if (name == NULL || description == NULL || tanabata->sappyou.size == -1 && tanabata->sappyou.hole_cnt == 0) {
return 1;
}
Tanzaku *current_tanzaku = tanabata->sappyou.database;
for (uint64_t i = 0; i < tanabata->sappyou.size; i++) {
if (current_tanzaku->id != HOLE_ID && strcmp(current_tanzaku->name, name) == 0) {
return 1;
}
current_tanzaku++;
}
return tanzaku_add(&tanabata->sappyou, name, description);
}
int tanabata_tanzaku_rem_by_id(Tanabata *tanabata, uint64_t tanzaku_id) {
if (tanzaku_id == HOLE_ID || tanzaku_id >= tanabata->sappyou.size || tanzaku_id == 0) {
return 1;
}
int tanabata_tanzaku_rem(Tanabata *tanabata, uint64_t tanzaku_id) {
if (tanzaku_rem(&tanabata->sappyou, tanzaku_id) == 0 &&
kazari_rem_by_tanzaku(&tanabata->shoppyou, tanzaku_id) == 0) {
return 0;
@ -32,7 +17,7 @@ int tanabata_tanzaku_upd(Tanabata *tanabata, uint64_t tanzaku_id, const char *na
return tanzaku_upd(&tanabata->sappyou, tanzaku_id, name, description);
}
Tanzaku tanabata_tanzaku_get_by_id(Tanabata *tanabata, uint64_t tanzaku_id) {
Tanzaku tanabata_tanzaku_get(Tanabata *tanabata, uint64_t tanzaku_id) {
if (tanzaku_id == HOLE_ID || tanzaku_id >= tanabata->sappyou.size) {
return HOLE_TANZAKU;
}