From 67ae939b1f23c7c9f0d1a4daeeb0ce99efe28df7 Mon Sep 17 00:00:00 2001 From: ax-6 Date: Fri, 9 Aug 2024 01:10:58 +0800 Subject: [PATCH] Added linked list library and fixed the incorrect use of "and or" in the time library. --- aqvm/base/CMakeLists.txt | 2 + aqvm/base/linked_list/CMakeLists.txt | 11 ++ aqvm/base/linked_list/linked_list.c | 178 +++++++++++++++++++++++++++ aqvm/base/linked_list/linked_list.h | 45 +++++++ aqvm/base/logging/logging.c | 4 +- aqvm/base/pair.h | 13 ++ aqvm/base/time/time.c | 4 +- 7 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 aqvm/base/linked_list/CMakeLists.txt create mode 100644 aqvm/base/linked_list/linked_list.c create mode 100644 aqvm/base/linked_list/linked_list.h create mode 100644 aqvm/base/pair.h diff --git a/aqvm/base/CMakeLists.txt b/aqvm/base/CMakeLists.txt index 37634d5..38fc593 100644 --- a/aqvm/base/CMakeLists.txt +++ b/aqvm/base/CMakeLists.txt @@ -14,6 +14,7 @@ add_subdirectory(process) add_subdirectory(threading) add_subdirectory(hash) add_subdirectory(io) +add_subdirectory(linked_list) add_subdirectory(logging) add_library(AqvmBase STATIC ${SOURCES}) @@ -24,4 +25,5 @@ target_link_libraries(AqvmBase PRIVATE AqvmBaseProcess) target_link_libraries(AqvmBase PRIVATE AqvmBaseThreading) target_link_libraries(AqvmBase PRIVATE AqvmBaseHash) target_link_libraries(AqvmBase PRIVATE AqvmBaseIo) +target_link_libraries(AqvmBase PRIVATE AqvmBaseLinkedList) target_link_libraries(AqvmBase PRIVATE AqvmBaseLogging) \ No newline at end of file diff --git a/aqvm/base/linked_list/CMakeLists.txt b/aqvm/base/linked_list/CMakeLists.txt new file mode 100644 index 0000000..4892b5b --- /dev/null +++ b/aqvm/base/linked_list/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copyright 2024 AQ author, All Rights Reserved. +# This program is licensed under the AQ License. You can find the AQ license in +# the root directory. + +cmake_minimum_required(VERSION 3.10) + +include_directories(${PROJECT_SOURCE_DIR}) + +set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/linked_list.c) + +add_library(AqvmBaseLinkedList STATIC ${SOURCES}) \ No newline at end of file diff --git a/aqvm/base/linked_list/linked_list.c b/aqvm/base/linked_list/linked_list.c new file mode 100644 index 0000000..82b213f --- /dev/null +++ b/aqvm/base/linked_list/linked_list.c @@ -0,0 +1,178 @@ +// Copyright 2024 AQ author, All Rights Reserved. +// This program is licensed under the AQ License. You can find the AQ license in +// the root directory. + +#include "aqvm/base/linked_list/linked_list.h" + +#include +#include + +int AqvmBaseLinkedList_AddNode(struct AqvmBaseLinkedList_LinkedList* list, + void* data) { + if (list == NULL) { + // TODO + return -1; + } + + struct AqvmBaseLinkedList_Node* new_node = + (struct AqvmBaseLinkedList_Node*)malloc( + sizeof(struct AqvmBaseLinkedList_Node)); + if (new_node == NULL) { + // TODO + return -2; + } + new_node->data = data; + new_node->prev = list->tail; + new_node->next = NULL; + if (list->tail != NULL) list->tail->next = new_node; + list->tail = new_node; + ++list->capacity; + return 0; +} + +struct AqvmBaseLinkedList_LinkedList* AqvmBaseLinkedList_CreateLinkedList() { + struct AqvmBaseLinkedList_LinkedList* result = + (struct AqvmBaseLinkedList_LinkedList*)malloc( + sizeof(struct AqvmBaseLinkedList_LinkedList)); + if (result == NULL) { + // TODO + return NULL; + } + result->head = NULL; + result->tail = NULL; + result->capacity = 0; + return result; +} + +int AqvmBaseLinkedList_CloseLinkedList( + struct AqvmBaseLinkedList_LinkedList* list) { + if (list == NULL) { + // TODO + return -1; + } + + while (list->capacity > 0) { + if (AqvmBaseLinkedList_DeleteNode(list, 0)) { + // TODO + return -2; + } + } + free(list); + return 0; +} + +int AqvmBaseLinkedList_DeleteNode(struct AqvmBaseLinkedList_LinkedList* list, + size_t index) { + if (list == NULL || index >= list->capacity) { + // TODO + return -1; + } + + struct AqvmBaseLinkedList_Node* delete_node = list->head; + for (size_t i = 0; i != index; ++i) delete_node = delete_node->next; + if (delete_node == NULL) { + // TODO + return -2; + } + if (list->head == delete_node) list->head = delete_node->next; + if (list->tail == delete_node) list->tail = delete_node->prev; + if (delete_node->prev != NULL) delete_node->prev->next = delete_node->next; + if (delete_node->next != NULL) delete_node->next->prev = delete_node->prev; + free(delete_node); + --list->capacity; + return 0; +} + +void* AqvmBaseLinkedList_GetData(struct AqvmBaseLinkedList_LinkedList* list, + size_t index) { + if (list == NULL || index >= list->capacity) { + // TODO + return NULL; + } + + struct AqvmBaseLinkedList_Node* get_node = list->head; + for (size_t i = 0; i != index; ++i) get_node = get_node->next; + if (get_node == NULL) { + // TODO + return NULL; + } + return get_node->data; +} + +int AqvmBaseLinkedList_InsertNode(struct AqvmBaseLinkedList_LinkedList* list, + size_t index, void* data) { + if (list == NULL || index >= list->capacity) { + // TODO + return -1; + } + + struct AqvmBaseLinkedList_Node* prev_node = list->head; + for (size_t i = 0; i != index; ++i) prev_node = prev_node->next; + if (prev_node == NULL) { + // TODO + return -2; + } + + struct AqvmBaseLinkedList_Node* insert_node = + (struct AqvmBaseLinkedList_Node*)malloc( + sizeof(struct AqvmBaseLinkedList_Node)); + if (insert_node == NULL) { + // TODO + return -3; + } + insert_node->data = data; + insert_node->prev = prev_node; + insert_node->next = prev_node->next; + prev_node->next = insert_node; + if (list->tail == prev_node) { + list->tail = insert_node; + } else { + insert_node->next->prev = insert_node; + } + ++list->capacity; + return 0; +} + +int AqvmBaseLinkedList_PrependNode(struct AqvmBaseLinkedList_LinkedList* list, + void* data) { + if (list == NULL) { + // TODO + return -1; + } + + struct AqvmBaseLinkedList_Node* new_node = + (struct AqvmBaseLinkedList_Node*)malloc( + sizeof(struct AqvmBaseLinkedList_Node)); + if (new_node == NULL) { + // TODO + return -2; + } + new_node->data = data; + new_node->prev = NULL; + new_node->next = list->head; + list->head = new_node; + if (new_node->next == NULL) { + list->tail = new_node; + } else { + new_node->next->prev = new_node; + } + ++list->capacity; + return 0; +} + +int AqvmBaseLinkedList_SetData(struct AqvmBaseLinkedList_LinkedList* list, + size_t index, void* data) { + if (list == NULL || index >= list->capacity) { + // TODO + return -1; + } + + struct AqvmBaseLinkedList_Node* set_node = list->head; + for (size_t i = 0; i != index; ++i) set_node = set_node->next; + if (set_node == NULL) { + // TODO + return -2; + } + set_node->data = data; + return 0; +} \ No newline at end of file diff --git a/aqvm/base/linked_list/linked_list.h b/aqvm/base/linked_list/linked_list.h new file mode 100644 index 0000000..8e1bd9b --- /dev/null +++ b/aqvm/base/linked_list/linked_list.h @@ -0,0 +1,45 @@ +// Copyright 2024 AQ author, All Rights Reserved. +// This program is licensed under the AQ License. You can find the AQ license in +// the root directory. + +#ifndef AQ_AQVM_BASE_LINKED_LIST_LINKED_LIST_H_ +#define AQ_AQVM_BASE_LINKED_LIST_LINKED_LIST_H_ + +#include + +struct AqvmBaseLinkedList_LinkedList { + struct AqvmBaseLinkedList_Node* head; + struct AqvmBaseLinkedList_Node* tail; + size_t capacity; +}; + +struct AqvmBaseLinkedList_Node { + struct AqvmBaseLinkedList_Node* prev; + struct AqvmBaseLinkedList_Node* next; + void* data; +}; + +int AqvmBaseLinkedList_AddNode(struct AqvmBaseLinkedList_LinkedList* list, + void* data); + +struct AqvmBaseLinkedList_LinkedList* AqvmBaseLinkedList_CreateLinkedList(); + +int AqvmBaseLinkedList_CloseLinkedList( + struct AqvmBaseLinkedList_LinkedList* list); + +int AqvmBaseLinkedList_DeleteNode(struct AqvmBaseLinkedList_LinkedList* list, + size_t index); + +void* AqvmBaseLinkedList_GetData(struct AqvmBaseLinkedList_LinkedList* list, + size_t index); + +int AqvmBaseLinkedList_InsertNode(struct AqvmBaseLinkedList_LinkedList* list, + size_t index, void* data); + +int AqvmBaseLinkedList_PrependNode(struct AqvmBaseLinkedList_LinkedList* list, + void* data); + +int AqvmBaseLinkedList_SetData(struct AqvmBaseLinkedList_LinkedList* list, + size_t index, void* data); + +#endif \ No newline at end of file diff --git a/aqvm/base/logging/logging.c b/aqvm/base/logging/logging.c index 5cb6d9d..abe1cb3 100644 --- a/aqvm/base/logging/logging.c +++ b/aqvm/base/logging/logging.c @@ -20,7 +20,7 @@ void AqvmBaseLogging_OutputLog(const char* type, const char* code, char time_str[31]; if (AqvmBaseTime_GetCurrentTimeString(time_str) != 0) { // TODO - return; + // return; } va_list other_info; @@ -84,7 +84,7 @@ int AqvmBaseLogging_OutputLogToFile(const char* time, const char* type, system_info, other_info); if (result != 0) { // TODO - return -2; + // return -2; } AqvmBaseFile_fclose(log_ptr); diff --git a/aqvm/base/pair.h b/aqvm/base/pair.h new file mode 100644 index 0000000..303c850 --- /dev/null +++ b/aqvm/base/pair.h @@ -0,0 +1,13 @@ +// Copyright 2024 AQ author, All Rights Reserved. +// This program is licensed under the AQ License. You can find the AQ license in +// the root directory. + +#ifndef AQ_AQVM_BASE_PAIR_PAIR_H_ +#define AQ_AQVM_BASE_PAIR_PAIR_H_ + +struct AqvmBaseHashTable_Pair { + void* key; + void* value; +}; + +#endif \ No newline at end of file diff --git a/aqvm/base/time/time.c b/aqvm/base/time/time.c index 6b2e4e5..c00c027 100644 --- a/aqvm/base/time/time.c +++ b/aqvm/base/time/time.c @@ -198,7 +198,7 @@ int AqvmBaseTime_GetCurrentTimeString(char* result) { if (AqvmBaseTime_GetTimezoneOffsetString(¤t_time, timezone_offset_string) != 0) { // TODO - return -4; + // return -4; } if (current_time.year < 0) { if (AqvmBaseIo_snprintf( @@ -232,7 +232,7 @@ int AqvmBaseTime_GetTimezoneOffsetString( if (time_info->offset_sign == 0 && AqvmBaseIo_snprintf(result, 2, "Z") < 0) { // TODO return -2; - } else if (time_info->offset_sign > 0 || + } else if (time_info->offset_sign > 0 && AqvmBaseIo_snprintf(result, 7, "+%02d:%02d", time_info->offset_hour, time_info->offset_minute) < 0) {