From cc795bae19bdca9827049ea7d4b8e37f63c9d74a Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Fri, 20 Jan 2023 17:18:23 +0300 Subject: [PATCH] fix(lib): some bug fixes, optimization improves and code cleanup --- include/tanabata.h | 10 ++--- tanabata/lib/database.c | 91 ++++++++++++++++++++--------------------- tanabata/lib/kazari.c | 45 +++++++++----------- tanabata/lib/sasa.c | 20 +-------- tanabata/lib/tanzaku.c | 19 +-------- 5 files changed, 72 insertions(+), 113 deletions(-) diff --git a/include/tanabata.h b/include/tanabata.h index f4c5c16..f8fca1f 100644 --- a/include/tanabata.h +++ b/include/tanabata.h @@ -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 ==================== // diff --git a/tanabata/lib/database.c b/tanabata/lib/database.c index 4ccea6a..2548033 100644 --- a/tanabata/lib/database.c +++ b/tanabata/lib/database.c @@ -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) { - strcpy(file_path, path); - if (sasahyou_dump(&tanabata->sasahyou, strcat(file_path, "/sasahyou")) != 0) { - 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; + size_t pathlen = strlen(path); + char *file_path = malloc(pathlen + 10); + strcpy(file_path, path); + 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; } 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; } diff --git a/tanabata/lib/kazari.c b/tanabata/lib/kazari.c index e508b72..7619903 100644 --- a/tanabata/lib/kazari.c +++ b/tanabata/lib/kazari.c @@ -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; + return 1; } - 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; diff --git a/tanabata/lib/sasa.c b/tanabata/lib/sasa.c index 494e41d..750e2a6 100644 --- a/tanabata/lib/sasa.c +++ b/tanabata/lib/sasa.c @@ -1,27 +1,11 @@ -#include -#include - #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; } diff --git a/tanabata/lib/tanzaku.c b/tanabata/lib/tanzaku.c index 2ad43a5..e829d20 100644 --- a/tanabata/lib/tanzaku.c +++ b/tanabata/lib/tanzaku.c @@ -1,26 +1,11 @@ -#include - #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; }