From 2cfdd32ea608bd6f121eb767b7c010cfd418c2a6 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 18 Dec 2024 09:47:19 +0600 Subject: [PATCH 01/11] Added new functions --- source/libublsettings.c | 40 ++++++++++++++++++++++++++++++++++------ source/libublsettings.h | 7 ++++++- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index 9963154..1d313ea 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -286,13 +286,12 @@ dictionary *yon_dictionary_rip(dictionary *dict) else if (!dict->next) { dictionary *prev = dict->prev; + free(dict); if (prev) { prev->next = NULL; return prev; } - else - return dict; } else if (!dict->prev) { @@ -301,16 +300,16 @@ dictionary *yon_dictionary_rip(dictionary *dict) { yon_dictionary_make_first(next); next->prev = NULL; + free(dict); return next; } - else - return dict; } else { dictionary *next = dict->next, *prev = dict->prev; next->prev = prev; prev->next = next; + free(dict); return next; } } @@ -470,7 +469,7 @@ char *yon_cut(char *source, int size, int startpos) config_str yon_char_wrap_to_lines(char *target, unsigned int line_count, unsigned int *final_size){ if (!yon_char_is_empty(target)&&line_count){ (*final_size)=0; - unsigned int spaces = yon_char_find_count(target," "); + unsigned int spaces = yon_char_count(target," "); float line_spaces = (float)spaces/line_count; float left = spaces%line_count; @@ -694,7 +693,6 @@ int yon_char_parsed_check_exist(char **parameters, int size, char *param){ return -1; } - int yon_char_parsed_strstr(char **parameters, int size, char *param){ if (parameters){ for (int i=0;ilength){ + config_str final = NULL; + char *current = yon_char_new(target); + for (;strlen(current)>length;){ + int last = yon_char_find_last_symbol_before_length(target,' ',length); + if (last>-1){ + char *parsed = yon_char_divide(current,last); + yon_char_parsed_add_or_create_if_exists(final,size,parsed); + free(parsed); + } + + } + return final; + } + return NULL; +} + int yon_ubl_check_root(){ if (getuid()==0) return 1; else return 0; diff --git a/source/libublsettings.h b/source/libublsettings.h index 196c8bb..b1a83d3 100644 --- a/source/libublsettings.h +++ b/source/libublsettings.h @@ -538,7 +538,12 @@ char *yon_char_parsed_to_string(config_str parsed, int size, char *divider_repla char *yon_char_parsed_to_string_for_iters(config_str parsed, int size, char *divider_replace,int iterations); -config_str yonchar_parsed_cut(config_str *parsed, int size, int pos); +config_str yon_char_parsed_cut(config_str parsed, int size, int pos); + +int yon_char_find_last_symbol_before_length(char *string, char target, int length); + +config_str yon_char_wrap_to_length(char *target, unsigned int length, int *size); + /**yon_ubl_check_root() * [EN] * From 4e8cbfe9e832383f149af6d84e2dc366d883c892 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 18 Dec 2024 10:21:33 +0600 Subject: [PATCH 02/11] comments added --- source/libublsettings.h | 81 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/source/libublsettings.h b/source/libublsettings.h index b1a83d3..a2cea25 100644 --- a/source/libublsettings.h +++ b/source/libublsettings.h @@ -530,18 +530,55 @@ int yon_char_parsed_divide_full(config_str parsed,int size,int divide_pos); int yon_char_parsed_divide_search_full(config_str parsed,int size,char *divide_pos, int delete_divider); +/**yon_char_parsed_convert_to_dictionary(config_str parsed, int size) + * [EN] + * + * [RU] + * Конвертирует массив строк [parsed] размера [size] в словарь типа dictionary* + */ dictionary *yon_char_parsed_convert_to_dictionary(config_str parsed, int size); +/**yon_char_parsed_convert_copy_to_dictionary(config_str parsed, int size) + * [EN] + * + * [RU] + * Копирует массив строк [parsed] размера [size] в словарь типа dictionary* + */ dictionary *yon_char_parsed_convert_copy_to_dictionary(config_str parsed, int size); +/**yon_char_parsed_convert_copy_to_dictionary(config_str parsed, int size) + * [EN] + * + * [RU] + * Конвертирует массив строк [parsed] размера [size] в строку, вставляя в местах соединений строку [divider_replace] + */ char *yon_char_parsed_to_string(config_str parsed, int size, char *divider_replace); +/**yon_char_parsed_to_string_for_iters(config_str parsed, int size, char *divider_replace,int iterations) + * [EN] + * + * [RU] + * Конвертирует [iterations] первых элементов массива строк [parsed] размера [size] в строку, + * вставляя в местах соединений строку [divider_replace] + */ char *yon_char_parsed_to_string_for_iters(config_str parsed, int size, char *divider_replace,int iterations); +/**yon_char_parsed_cut(config_str parsed, int size, int pos) + * [EN] + * + * [RU] + * Создаёт новый массив строк из первых [pos] элементов массива строк [parsed] размера [size] + */ config_str yon_char_parsed_cut(config_str parsed, int size, int pos); int yon_char_find_last_symbol_before_length(char *string, char target, int length); +/**yon_char_wrap_to_length(char *target, unsigned int length, int *size) + * [EN] + * + * [RU] + * Разделяет строку [target] на отрезки длиной до [length] символов каждый и возвращает массив длиной [size] + */ config_str yon_char_wrap_to_length(char *target, unsigned int length, int *size); /**yon_ubl_check_root() @@ -589,8 +626,22 @@ config_str yon_ubl_get_all_users(int *user_size); */ float yon_size_convert_automatic(int bytes, int *size); +/**yon_get_size_get_from_letter(char size) + * [EN] + * + * [RU] + * Функция для работы с конфигурацией ubconfig. + * Конвертировать символ размера (K, M, G, T) в множитель для перевода размера в байты + */ int yon_get_size_get_from_letter(char size); +/**yon_size_get_mod(int size) + * [EN] + * + * [RU] + * Функция для работы с конфигурацией ubconfig. + * Конвертировать числовое представление размера из yon_get_size_get_from_letter() в символьное + */ char *yon_size_get_mod(int size); apps *yon_apps_scan_and_parse_desktops(int *sizef); @@ -599,6 +650,12 @@ void yon_apps_sort(apps *applist, int size); apps *yon_apps_get_by_name(apps *applist, char *name, int size); +/**yon_file_path_proceed_spaces(char *path) + * [EN] + * + * [RU] + * Оборачивает все пробелы в пути для правильной обработки + */ char *yon_file_path_proceed_spaces(char *path); /**yon_file_open(char *file_path, int *size) @@ -609,6 +666,12 @@ char *yon_file_path_proceed_spaces(char *path); */ config_str yon_file_open(char *file_path, int *size); +/**yon_file_save(char *file_path, char *text) + * [EN] + * + * [RU] + * Сохранить текст [text] в файл по пути [file_path]. Если файла не существует, он создаётся + */ int yon_file_save(char *file_path, char *text); /**yon_file_create(char *path, char *name, int rules) @@ -637,10 +700,28 @@ int yon_file_create_full_path(char *path, int rules); */ config_str yon_file_list_dirs (char *path, int *size); +/** + * [EN] + * + * [RU] + * Возвращает массив строк размера [size] с именами всех файлов и папок из директории [path] + */ config_str yon_file_ls(char *path, int *size); +/**yon_file_is_directory(const char *path) + * [EN] + * + * [RU] + * Проверяет указывает ли путь [path] на директорию + */ int yon_file_is_directory(const char *path); +/**yon_dir_remove(const char *path) + * [EN] + * + * [RU] + * Проверяет указывает ли путь [path] на директорию и удаляет её + */ void yon_dir_remove(const char *path); /** yon_dir_get_contents(char *dir_path, int *size) From b1a2e300e0d0f1d4cbad5f025f5fdfa3816b7d92 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 20 Dec 2024 18:37:47 +0600 Subject: [PATCH 03/11] Added new config function --- source/libublsettings.c | 26 ++++++++++++++++++++++++++ source/libublsettings.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/source/libublsettings.c b/source/libublsettings.c index 1d313ea..874d5f6 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1969,9 +1969,11 @@ config_str yon_config_get_save_parameters_by_list(int *size, config_str paramete config_str final = NULL; char *current_str = NULL; for (int i=0;ikey,current_str)){ + found = 1; if (((yon_config_parameter*)temp)->flag1!=-2){ char *action = NULL; config_str *current=NULL; @@ -2002,6 +2004,20 @@ config_str yon_config_get_save_parameters_by_list(int *size, config_str paramete } } } + if (!found){ + if(removed){ + int position = yon_char_parsed_find_element(removed,removed_size,((yon_config_parameter*)temp)->section); + if (position>=0){ + char *string = yon_char_unite((removed)[position]," ",yon_config_parameter_to_string((yon_config_parameter*)temp,0),NULL); + free(removed[position]); + removed[position]=string; + + } + } else { + char *string = yon_char_unite("remove"," ",parameters[i],NULL); + yon_char_parsed_add_or_create_if_exists(removed,&removed_size,string); + } + } } if (updated&&removed){ final = yon_char_parsed_merge(updated,updated_size,removed,removed_size,size); @@ -2299,6 +2315,16 @@ char *yon_config_get_parameter(config_str parameters, int size, char *param) return NULL; } +int yon_config_change_key(char *target, char *key){ + if (!yon_char_is_empty(target)&&!yon_char_is_empty(key)){ + dictionary *dict = yon_dictionary_get((dictionary**)&__yon__config__strings,target); + if (!dict) return 0; + free(dict->key); + dict->key = yon_char_new(key); + } + return 0; +} + char *yon_file_path_proceed_spaces(char *path){ int size; config_str parsed = yon_char_parse(path,&size,"/"); diff --git a/source/libublsettings.h b/source/libublsettings.h index a2cea25..a0d6f9b 100644 --- a/source/libublsettings.h +++ b/source/libublsettings.h @@ -831,6 +831,8 @@ int yon_char_remove_brackets(char *string); int yon_config_load_config(YON_CONFIG_TYPE config_type, ...); +int yon_config_change_key(char *target, char *key); + /**yon_config_load_register_no_cleaning(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...) * [EN] * From 74372ba137db66af8bad91b5c69d75e51a86b114 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 23 Dec 2024 14:58:19 +0600 Subject: [PATCH 04/11] Added default config comparison: if new value equals to default config value, value removes --- source/libublsettings.c | 185 +++++++++++++++++++++------------------- source/libublsettings.h | 1 + 2 files changed, 99 insertions(+), 87 deletions(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index 874d5f6..ba680fb 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1302,24 +1302,25 @@ int yon_config_load_register_no_cleaning(YON_CONFIG_TYPE config_type,char *secti free(yon_char_divide(final_str,0)); } - dictionary *dicte = yon_dictionary_get((dictionary**)&__yon__config__strings,key); + yon_config_parameter *cur_config = (config_type!=YON_CONFIG_DEFAULT? __yon__config__strings:__yon__config__default__strings); + dictionary *dicte = yon_dictionary_get((dictionary**)&cur_config,key); if (!dicte){ - yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,yon_char_new(final_str)); + yon_config_parameter_add_or_create_if_exists_with_data(cur_config,key,yon_char_new(final_str)); } else { if (strcmp((char*)dicte->data,final_str)){ - __yon__config__strings->data=final_str; + cur_config->data=final_str; } else { continue; } } - __yon__config__strings->flag1=0; + cur_config->flag1=0; yon_config_remove_ignore(key); if (config_type==YON_CONFIG_DEFAULT){ - __yon__config__strings->flag1=-2; + cur_config->flag1=-2; yon_config_set_ignore(key); } - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - __yon__config__strings->section=dict->key; + cur_config->data_type=DICTIONARY_CHAR_TYPE; + cur_config->section=dict->key; } } free(command); @@ -1751,104 +1752,110 @@ int yon_config_clean(){ } void yon_config_register(char *key, char *config_load, void *data){ - key=yon_char_new(key); - config_load=yon_char_new(config_load); - yon_config_parameter *current = NULL; - if (data){ - if (!__yon__config__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ - { - if (__yon__config__strings){ - char *data_copy = yon_char_new(data); - yon_config_parameter* dict=NULL; - for_dictionaries(dict,__yon__config__strings){ - if (!dict->next){ - __yon__config__strings=dict; + if (!yon_char_is_empty(key)){ + key=yon_char_new(key); + config_load=yon_char_new(config_load); + yon_config_parameter *current = NULL; + if (data){ + if (!__yon__config__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ + { + if (__yon__config__strings){ + char *data_copy = yon_char_new(data); + yon_config_parameter* dict=NULL; + for_dictionaries(dict,__yon__config__strings){ + if (!dict->next){ + __yon__config__strings=dict; + } } + __yon__config__strings=yon_config_parameter_append_with_data(__yon__config__strings,key,data_copy); + + } + else { + char *data_copy = yon_char_new(data); + __yon__config__strings=yon_config_parameter_new_with_data(key,yon_char_new(data)); } - __yon__config__strings=yon_config_parameter_append_with_data(__yon__config__strings,key,data_copy); - - } - else { - char *data_copy = yon_char_new(data); - __yon__config__strings=yon_config_parameter_new_with_data(key,yon_char_new(data)); - } - } - __yon__config__strings = (yon_config_parameter*)yon_dictionary_get_last((dictionary*)__yon__config__strings); - __yon__config__strings->flag1=1; - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - __yon__config__strings->load_command=config_load; - int size=0; - config_str section = yon_char_parse(config_load,&size," "); - __yon__config__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); - yon_char_parsed_free(section,size); - } - else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ - if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ - current->data=yon_char_new(data); - current->flag1=1; - current->data_type=DICTIONARY_CHAR_TYPE; - current->load_command=config_load; - if (yon_dictionary_get(&__yon_config_ignored, current->key)){ - __yon_config_ignored = yon_dictionary_rip(__yon_config_ignored); } + __yon__config__strings = (yon_config_parameter*)yon_dictionary_get_last((dictionary*)__yon__config__strings); + __yon__config__strings->flag1=1; + __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__strings->load_command=config_load; int size=0; config_str section = yon_char_parse(config_load,&size," "); - current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + __yon__config__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); yon_char_parsed_free(section,size); } - } - } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))) { - current->data=NULL; - current->flag1=0; - current->data_type=DICTIONARY_CHAR_TYPE; - current->load_command=config_load; - int size=0; - config_str section = yon_char_parse(config_load,&size," "); - current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); - yon_char_parsed_free(section,size); - } else { - if (!__yon__config__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ - { - if (__yon__config__strings){ - yon_config_parameter* dict=NULL; - for_dictionaries(dict,__yon__config__strings){ - if (!dict->next){ - __yon__config__strings=dict; - } + else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ + yon_config_parameter *cur_default = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,current->key); + if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ + current->data=yon_char_new(data); + current->flag1=1; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; + if (yon_dictionary_get(&__yon_config_ignored, current->key)){ + __yon_config_ignored = yon_dictionary_rip(__yon_config_ignored); + } + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + if (!cur_default||(cur_default&&strcmp((char*)cur_default->data,(char*)current->data))){ + yon_config_remove_by_key(current->key); } - __yon__config__strings=yon_config_parameter_append_with_data(__yon__config__strings,key,NULL); - - } - else { - __yon__config__strings=yon_config_parameter_new_with_data(key,NULL); } } - yon_config_set_ignore(key); - __yon__config__strings = (yon_config_parameter*)yon_dictionary_get_last((dictionary*)__yon__config__strings); - __yon__config__strings->flag1=0; - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - __yon__config__strings->load_command=config_load; + } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))) { + current->data=NULL; + current->flag1=0; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; int size=0; config_str section = yon_char_parse(config_load,&size," "); - __yon__config__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); yon_char_parsed_free(section,size); - } - else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ - if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ - yon_config_set_ignore(key); - - current->data=NULL; - current->flag1=0; - current->data_type=DICTIONARY_CHAR_TYPE; - current->load_command=config_load; - if (yon_dictionary_get(&__yon_config_ignored, current->key)){ - __yon_config_ignored= yon_dictionary_rip(__yon_config_ignored); + } else { + if (!__yon__config__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ + { + if (__yon__config__strings){ + yon_config_parameter* dict=NULL; + for_dictionaries(dict,__yon__config__strings){ + if (!dict->next){ + __yon__config__strings=dict; + } + } + __yon__config__strings=yon_config_parameter_append_with_data(__yon__config__strings,key,NULL); + + } + else { + __yon__config__strings=yon_config_parameter_new_with_data(key,NULL); + } } + yon_config_set_ignore(key); + __yon__config__strings = (yon_config_parameter*)yon_dictionary_get_last((dictionary*)__yon__config__strings); + __yon__config__strings->flag1=0; + __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__strings->load_command=config_load; int size=0; config_str section = yon_char_parse(config_load,&size," "); - current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + __yon__config__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); yon_char_parsed_free(section,size); } + else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ + if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ + yon_config_set_ignore(key); + + current->data=NULL; + current->flag1=0; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; + if (yon_dictionary_get(&__yon_config_ignored, current->key)){ + __yon_config_ignored= yon_dictionary_rip(__yon_config_ignored); + } + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + } + } } } } @@ -2149,6 +2156,10 @@ char *yon_config_parameter_prepare_command(char *command, char *path, char *sect config_str parsed = yon_char_parse(command,&size," "); int source_pos=yon_char_parsed_check_exist(parsed,size,"--source"); int get_pos = yon_char_parsed_check_exist(parsed,size,"get"); + if (source_pos==-1) { + source_pos = yon_char_parsed_check_exist(parsed,size,"--target"); + get_pos = yon_char_parsed_check_exist(parsed,size,"set"); + } if (path&&!strcmp(path,"")){ if (source_pos>-1&&size>source_pos+1){ free(parsed[source_pos]); diff --git a/source/libublsettings.h b/source/libublsettings.h index a0d6f9b..feaccac 100644 --- a/source/libublsettings.h +++ b/source/libublsettings.h @@ -742,6 +742,7 @@ config_str yon_dir_get_contents(char *dir_path, int *size); #define ubconfig_dull_command "ubconfig " #define ubconfig_set_command(target) yon_char_unite("ubconfig ",!yon_char_is_empty(target)?"--target ":"",target," ",NULL) +#define ubconfig_set_command_full(target, section, data) yon_char_unite("ubconfig --target ",target," set ",section," ",data,NULL) #define ubconfig_load_command(target) yon_char_unite("ubconfig --source ",target," get ",NULL) #define ubconfig_load_command_full(target, data) yon_char_unite("ubconfig --source ",target," get ",data,NULL) From d7c9a3cabac7bd86c46c3b6f30eee8965389b8e0 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 23 Dec 2024 18:15:06 +0600 Subject: [PATCH 05/11] Saving changes --- source/libublsettings.c | 145 +++++++++++++++++++++++++++++++++++----- source/libublsettings.h | 2 + 2 files changed, 131 insertions(+), 16 deletions(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index ba680fb..7e634d2 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1417,7 +1417,8 @@ int yon_config_load_config(YON_CONFIG_TYPE config_type, ...){ int command_parsed_size=0; config_str command_parsed = yon_char_parse(command[i],&command_parsed_size," "); if (config_type==YON_CONFIG_DEFAULT&&!strstr(command_parsed[5],"[*]")){ - yon_config_register(command_parsed[5], command[i],NULL); + if (config_type==YON_CONFIG_DEFAULT) + yon_config_register_default(command_parsed[5], command[i],NULL); } yon_char_parsed_free(command_parsed,command_parsed_size); if (parsed_size>0){ @@ -1432,7 +1433,10 @@ int yon_config_load_config(YON_CONFIG_TYPE config_type, ...){ char *cur_data = config(key); int cur_ignore = yon_config_check_ignore(key); if ((cur_ignore&¤t_value)||(!cur_ignore)) - yon_config_register(key,current_command,current_value); + if (config_type==YON_CONFIG_DEFAULT) + yon_config_register_default(key,current_command,current_value); + else + yon_config_register(key,current_command,current_value); if (config_type==YON_CONFIG_DEFAULT){ yon_config_set_ignore(key); yon_config_set_status(key,-2); @@ -1466,14 +1470,14 @@ int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *par char *command=NULL; dictionary *dict; for_dictionaries(dict,sections){ - command = yon_char_unite(ubconfig_load_command_old,config_type==YON_CONFIG_GLOBAL ? " global get " : config_type==YON_CONFIG_LOCAL ? " system get " : " default get ", dict->key," ", yon_dictionary_get_data(dict,char*),NULL); + command = yon_char_unite(ubconfig_load_command_old,config_type==YON_CONFIG_GLOBAL ? " global get " : config_type==YON_CONFIG_LOCAL ? " system get " : " default get", dict->key," ", yon_dictionary_get_data(dict,char*),NULL); FILE *output = popen(command, "r"); int i = 0; char str[4096]; memset(str, 0, 4096); while (fgets(str, 4096, output)) { - if (!yon_char_is_empty(str)&& strcmp(str,"(null)\n")!=0) + if (strcmp(str, "") != 0&& strcmp(str,"(null)\n")!=0) { char *key = yon_char_divide_search(str,"=",-1); char *final_str=yon_char_divide_search(str,"\n",-1); @@ -1482,24 +1486,25 @@ int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *par free(yon_char_divide(final_str,0)); } - dictionary *dicte = yon_dictionary_get((dictionary**)&__yon__config__strings,key); + yon_config_parameter *cur_config = (config_type!=YON_CONFIG_DEFAULT? __yon__config__strings:__yon__config__default__strings); + dictionary *dicte = yon_dictionary_get((dictionary**)&cur_config,key); if (!dicte){ - yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,yon_char_new(final_str)); + yon_config_parameter_add_or_create_if_exists_with_data(cur_config,key,yon_char_new(final_str)); } else { - if (strcmp((char*)__yon__config__strings->data,final_str)){ - __yon__config__strings->data=final_str; + if (strcmp((char*)dicte->data,final_str)){ + cur_config->data=final_str; } else { continue; } } - __yon__config__strings->flag1=0; + cur_config->flag1=0; yon_config_remove_ignore(key); if (config_type==YON_CONFIG_DEFAULT){ - __yon__config__strings->flag1=-2; + cur_config->flag1=-2; yon_config_set_ignore(key); } - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - __yon__config__strings->section=dict->key; + cur_config->data_type=DICTIONARY_CHAR_TYPE; + cur_config->section=dict->key; } } free(command); @@ -1786,7 +1791,9 @@ void yon_config_register(char *key, char *config_load, void *data){ } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ yon_config_parameter *cur_default = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,current->key); - if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ + if ((cur_default&&((yon_config_parameter*)current)->flag1==1&&!strcmp((char*)cur_default->data,(char*)data))){ + yon_config_remove_by_key(current->key); + } else if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ current->data=yon_char_new(data); current->flag1=1; current->data_type=DICTIONARY_CHAR_TYPE; @@ -1798,9 +1805,6 @@ void yon_config_register(char *key, char *config_load, void *data){ config_str section = yon_char_parse(config_load,&size," "); current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); yon_char_parsed_free(section,size); - if (!cur_default||(cur_default&&strcmp((char*)cur_default->data,(char*)current->data))){ - yon_config_remove_by_key(current->key); - } } } } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))) { @@ -1860,6 +1864,115 @@ void yon_config_register(char *key, char *config_load, void *data){ } } +void yon_config_register_default(char *key, char *config_load, void *data){ + if (!yon_char_is_empty(key)){ + key=yon_char_new(key); + config_load=yon_char_new(config_load); + yon_config_parameter *current = NULL; + if (data){ + if (!__yon__config__default__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key))){ + { + if (__yon__config__default__strings){ + char *data_copy = yon_char_new(data); + yon_config_parameter* dict=NULL; + for_dictionaries(dict,__yon__config__default__strings){ + if (!dict->next){ + __yon__config__default__strings=dict; + } + } + __yon__config__default__strings=yon_config_parameter_append_with_data(__yon__config__default__strings,key,data_copy); + + } + else { + char *data_copy = yon_char_new(data); + __yon__config__strings=yon_config_parameter_new_with_data(key,yon_char_new(data)); + } + } + __yon__config__default__strings = (yon_config_parameter*)yon_dictionary_get_last((dictionary*)__yon__config__default__strings); + __yon__config__default__strings->flag1=1; + __yon__config__default__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__default__strings->load_command=config_load; + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + __yon__config__default__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + } + else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key))){ + yon_config_parameter *cur_default = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,current->key); + if ((current->data&&data!=__yon__config__default__strings->data&&strcmp(__yon__config__default__strings->data,data))||!current->data){ + current->data=yon_char_new(data); + current->flag1=1; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; + if (yon_dictionary_get(&__yon_config_ignored, current->key)){ + __yon_config_ignored = yon_dictionary_rip(__yon_config_ignored); + } + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + if ((cur_default&&strcmp((char*)cur_default->data,(char*)current->data))){ + yon_config_remove_by_key(current->key); + } + } + } + } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key))) { + current->data=NULL; + current->flag1=0; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + } else { + if (!__yon__config__default__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key))){ + { + if (__yon__config__default__strings){ + yon_config_parameter* dict=NULL; + for_dictionaries(dict,__yon__config__default__strings){ + if (!dict->next){ + __yon__config__default__strings=dict; + } + } + __yon__config__default__strings=yon_config_parameter_append_with_data(__yon__config__default__strings,key,NULL); + + } + else { + __yon__config__default__strings=yon_config_parameter_new_with_data(key,NULL); + } + } + yon_config_set_ignore(key); + __yon__config__default__strings = (yon_config_parameter*)yon_dictionary_get_last((dictionary*)__yon__config__default__strings); + __yon__config__default__strings->flag1=0; + __yon__config__default__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__default__strings->load_command=config_load; + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + __yon__config__default__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + } + else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key))){ + if ((current->data&&data!=__yon__config__default__strings->data&&strcmp(__yon__config__default__strings->data,data))||!current->data){ + yon_config_set_ignore(key); + + current->data=NULL; + current->flag1=0; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; + if (yon_dictionary_get(&__yon_config_ignored, current->key)){ + __yon_config_ignored= yon_dictionary_rip(__yon_config_ignored); + } + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); + } + } + } + } +} + config_str yon_config_load(char *command, int *str_len){ FILE *output = popen(command, "r"); char **output_strings = NULL; diff --git a/source/libublsettings.h b/source/libublsettings.h index feaccac..fd84d96 100644 --- a/source/libublsettings.h +++ b/source/libublsettings.h @@ -958,6 +958,8 @@ int yon_config_clean(); */ void yon_config_register(char *key, char* config_section, void *data); +void yon_config_register_default(char *key, char *config_load, void *data); + char *yon_config_save_simple(YON_CONFIG_TYPE target, char *path); /**int yon_config_force_save_registered(char *path, char *section) From 3c582b07865c48b02039c31ca3f025b5d8fa491d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 10:25:39 +0600 Subject: [PATCH 06/11] Fixed removing of default-equaled parameters --- source/libublsettings.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index 7e634d2..db90dbf 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1764,6 +1764,11 @@ void yon_config_register(char *key, char *config_load, void *data){ if (data){ if (!__yon__config__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ { + yon_config_parameter *cur_default = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key); + if ((cur_default&&cur_default->data&&!strcmp((char*)cur_default->data,(char*)data))){ + yon_config_remove_by_key(current->key); + return; + } if (__yon__config__strings){ char *data_copy = yon_char_new(data); yon_config_parameter* dict=NULL; @@ -1790,22 +1795,17 @@ void yon_config_register(char *key, char *config_load, void *data){ yon_char_parsed_free(section,size); } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ - yon_config_parameter *cur_default = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,current->key); - if ((cur_default&&((yon_config_parameter*)current)->flag1==1&&!strcmp((char*)cur_default->data,(char*)data))){ - yon_config_remove_by_key(current->key); - } else if ((current->data&&data!=__yon__config__strings->data&&strcmp(__yon__config__strings->data,data))||!current->data){ - current->data=yon_char_new(data); - current->flag1=1; - current->data_type=DICTIONARY_CHAR_TYPE; - current->load_command=config_load; - if (yon_dictionary_get(&__yon_config_ignored, current->key)){ - __yon_config_ignored = yon_dictionary_rip(__yon_config_ignored); - } - int size=0; - config_str section = yon_char_parse(config_load,&size," "); - current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); - yon_char_parsed_free(section,size); + current->data=yon_char_new(data); + current->flag1=1; + current->data_type=DICTIONARY_CHAR_TYPE; + current->load_command=config_load; + if (yon_dictionary_get(&__yon_config_ignored, current->key)){ + __yon_config_ignored = yon_dictionary_rip(__yon_config_ignored); } + int size=0; + config_str section = yon_char_parse(config_load,&size," "); + current->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); + yon_char_parsed_free(section,size); } } else if ((current = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))) { current->data=NULL; From 610acdaf5564e737632e42c63ce047d009e81300 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 24 Dec 2024 11:54:06 +0600 Subject: [PATCH 07/11] Fixed saving bug --- source/libublsettings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libublsettings.h b/source/libublsettings.h index fd84d96..c4d9195 100644 --- a/source/libublsettings.h +++ b/source/libublsettings.h @@ -742,7 +742,7 @@ config_str yon_dir_get_contents(char *dir_path, int *size); #define ubconfig_dull_command "ubconfig " #define ubconfig_set_command(target) yon_char_unite("ubconfig ",!yon_char_is_empty(target)?"--target ":"",target," ",NULL) -#define ubconfig_set_command_full(target, section, data) yon_char_unite("ubconfig --target ",target," set ",section," ",data,NULL) +#define ubconfig_set_command_full(target, section, data) yon_char_unite("ubconfig ",!yon_char_is_empty(target)?"--target ":"",!yon_char_is_empty(target)?target:""," set ",section," ",data,NULL) #define ubconfig_load_command(target) yon_char_unite("ubconfig --source ",target," get ",NULL) #define ubconfig_load_command_full(target, data) yon_char_unite("ubconfig --source ",target," get ",data,NULL) From 6e7fe49ed4a50bd824d22918b7626af802ec21f1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 17:44:52 +0600 Subject: [PATCH 08/11] Test fix for crash --- source/libublsettings.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index db90dbf..15ea684 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1764,11 +1764,7 @@ void yon_config_register(char *key, char *config_load, void *data){ if (data){ if (!__yon__config__strings||!(current=(yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key))){ { - yon_config_parameter *cur_default = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__default__strings,key); - if ((cur_default&&cur_default->data&&!strcmp((char*)cur_default->data,(char*)data))){ - yon_config_remove_by_key(current->key); - return; - } + if (__yon__config__strings){ char *data_copy = yon_char_new(data); yon_config_parameter* dict=NULL; From 3323cc6c33409183871cba9905aec19d35774bc8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 25 Dec 2024 18:07:53 +0600 Subject: [PATCH 09/11] Ignore fix --- source/libublsettings.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index 15ea684..1263f7f 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1436,7 +1436,7 @@ int yon_config_load_config(YON_CONFIG_TYPE config_type, ...){ if (config_type==YON_CONFIG_DEFAULT) yon_config_register_default(key,current_command,current_value); else - yon_config_register(key,current_command,current_value); + yon_config_register_default(key,current_command,current_value); if (config_type==YON_CONFIG_DEFAULT){ yon_config_set_ignore(key); yon_config_set_status(key,-2); @@ -1785,6 +1785,9 @@ void yon_config_register(char *key, char *config_load, void *data){ __yon__config__strings->flag1=1; __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; __yon__config__strings->load_command=config_load; + if (yon_dictionary_get(&__yon_config_ignored, key)){ + __yon_config_ignored = yon_dictionary_rip(__yon_config_ignored); + } int size=0; config_str section = yon_char_parse(config_load,&size," "); __yon__config__strings->section=yon_char_new(section[yon_char_parsed_check_exist(section,size,"get")+1]); From edddd38ad7fa919c22998c31a90ef1d5628496a4 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 26 Dec 2024 11:33:22 +0600 Subject: [PATCH 10/11] Fixed parameters loading --- source/libublsettings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index 1263f7f..8d4b635 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -1436,7 +1436,7 @@ int yon_config_load_config(YON_CONFIG_TYPE config_type, ...){ if (config_type==YON_CONFIG_DEFAULT) yon_config_register_default(key,current_command,current_value); else - yon_config_register_default(key,current_command,current_value); + yon_config_register(key,current_command,current_value); if (config_type==YON_CONFIG_DEFAULT){ yon_config_set_ignore(key); yon_config_set_status(key,-2); From b1bf865cc3b790fc1e307e1e40a38d00446ff2d5 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 27 Dec 2024 09:38:02 +0600 Subject: [PATCH 11/11] Added new functions --- source/libublsettings.c | 26 ++++++++++++++++++++++---- source/libublsettings.h | 5 +++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/source/libublsettings.c b/source/libublsettings.c index 8d4b635..8e0c533 100644 --- a/source/libublsettings.c +++ b/source/libublsettings.c @@ -466,6 +466,27 @@ char *yon_cut(char *source, int size, int startpos) return NULL; } +int yon_char_check_begins_with(char *haystack, char *needle){ + if (!yon_char_is_empty(haystack)&&!yon_char_is_empty(needle)&&strlen(haystack)>=strlen(needle)){ + int size = strlen(needle); + for (int i=0;i