From 3186bfa576f757566326db230ffabc11884f7b29 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Fri, 16 Jun 2023 16:46:40 +1100 Subject: [PATCH] remove HEAP memory usage --- src/lib66/tree/tree_service_add.c | 42 +++++++++++++++++----------- src/lib66/tree/tree_service_remove.c | 34 +++++++++++----------- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/src/lib66/tree/tree_service_add.c b/src/lib66/tree/tree_service_add.c index b4f71e3b..c3a2a1e4 100644 --- a/src/lib66/tree/tree_service_add.c +++ b/src/lib66/tree/tree_service_add.c @@ -13,9 +13,7 @@ */ #include <oblibs/log.h> -#include <oblibs/sastr.h> - -#include <skalibs/stralloc.h> +#include <oblibs/stack.h> #include <66/resolve.h> #include <66/tree.h> @@ -24,43 +22,53 @@ void tree_service_add(char const *base, char const *treename, char const *servic { log_flow() ; + int r ; + size_t len = strlen(service) ; resolve_tree_t tres = RESOLVE_TREE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; - stralloc sa = STRALLOC_ZERO ; + stack_ref pstk = 0 ; + + _init_stack_(stk, SS_MAX_SERVICE * SS_MAX_SERVICE_NAME + 1 + len + 1) ; if (resolve_read_g(wres, base, treename) <= 0) log_dieusys(LOG_EXIT_SYS, "read resolve file of tree: ", treename) ; if (tres.ncontents) { - if (!sastr_clean_string(&sa, tres.sa.s + tres.contents)) - log_dieu(LOG_EXIT_SYS, "clean string") ; + if (!stack_convert_string(&stk, tres.sa.s + tres.contents, strlen(tres.sa.s + tres.contents))) + log_dieusys(LOG_EXIT_SYS, "convert string to stack") ; + + if (stack_retrieve_element(&stk, service) < 0) { - if (!sastr_add_string(&sa, service)) - log_dieu(LOG_EXIT_SYS, "clean string") ; + if (!stack_add_g(&stk, service)) + log_dieusys(LOG_EXIT_SYS, "add service: ", service, " to tree: ", treename) ; - if (!sastr_sortndrop_element(&sa)) - log_dieu(LOG_EXIT_SYS, "sort string") ; + tres.ncontents++ ; + } - tres.ncontents = sastr_nelement(&sa) ; + if (!stack_close(&stk)) + log_dieusys(LOG_EXIT_SYS, "close stack") ; } else { - if (!sastr_add_string(&sa, service)) - log_dieu(LOG_EXIT_SYS, "add string") ; + if (!stack_add_g(&stk, service)) + log_dieu(LOG_EXIT_SYS, "add string to stack") ; tres.ncontents++ ; + + if (!stack_close(&stk)) + log_dieusys(LOG_EXIT_SYS, "close stack") ; + } - if (!sastr_rebuild_in_oneline(&sa)) - log_dieu(LOG_EXIT_SYS, "rebuild stralloc list") ; + if (!stack_convert_tostring(&stk)) + log_dieu(LOG_EXIT_SYS, "convert stack to string") ; - if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, sa.s)) + if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, stk.s)) log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ; if (!resolve_write_g(wres, base, treename)) log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ; - stralloc_free(&sa) ; resolve_free(wres) ; } diff --git a/src/lib66/tree/tree_service_remove.c b/src/lib66/tree/tree_service_remove.c index 14f983e6..75271456 100644 --- a/src/lib66/tree/tree_service_remove.c +++ b/src/lib66/tree/tree_service_remove.c @@ -13,9 +13,7 @@ */ #include <oblibs/log.h> -#include <oblibs/sastr.h> - -#include <skalibs/stralloc.h> +#include <oblibs/stack.h> #include <66/resolve.h> #include <66/tree.h> @@ -26,7 +24,6 @@ void tree_service_remove(char const *base, char const *treename, char const *ser resolve_tree_t tres = RESOLVE_TREE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; - stralloc sa = STRALLOC_ZERO ; char *str = 0 ; log_trace("modify field contents of resolve tree file: ", treename) ; @@ -36,29 +33,32 @@ void tree_service_remove(char const *base, char const *treename, char const *ser if (tres.ncontents) { - if (!sastr_clean_string(&sa, tres.sa.s + tres.contents)) - log_dieu(LOG_EXIT_SYS, "clean string") ; + size_t clen = strlen(tres.sa.s + tres.contents) ; + _init_stack_(stk, clen + 1) ; + + if (!stack_convert_string(&stk, tres.sa.s + tres.contents, clen)) + log_dieusys(LOG_EXIT_SYS, "convert string to stack") ; - if (!sastr_remove_element(&sa, service)) + if (!stack_remove_element_g(&stk, service)) log_dieu(LOG_EXIT_SYS, "remove service: ", service, " from selection") ; - if (sa.len) { - if (!sastr_rebuild_in_oneline(&sa)) - log_dieu(LOG_EXIT_SYS, "rebuild stralloc list") ; - str = sa.s ; + if (stk.len) { + + if (!stack_convert_tostring(&stk)) + log_dieu(LOG_EXIT_SYS, "convert stack to string") ; + + str = stk.s ; } else str = "" ; if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, str)) - log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ; - } + log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ; - if (tres.ncontents) tres.ncontents-- ; - if (!resolve_write_g(wres, base, treename)) - log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ; + if (!resolve_write_g(wres, base, treename)) + log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ; + } - stralloc_free(&sa) ; resolve_free(wres) ; } -- GitLab