You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
402 lines
10 KiB
402 lines
10 KiB
#include "libublsettings.h"
|
|
|
|
|
|
|
|
dictionary *yon_dictionary_new()
|
|
{
|
|
dictionary *dict = malloc(sizeof(dictionary));
|
|
dict->data = NULL;
|
|
dict->key = NULL;
|
|
dict->next = NULL;
|
|
dict->prev = NULL;
|
|
dict->first = dict;
|
|
dict->data_type = DICTIONARY_OTHER_TYPE;
|
|
return dict;
|
|
}
|
|
|
|
dictionary *yon_dictinoary_copy(dictionary *dict){
|
|
dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data);
|
|
dct->data_type= dict->data_type;
|
|
return dct;
|
|
}
|
|
|
|
dictionary *yon_dictionary_copy_deep(dictionary *dict){
|
|
dictionary *dct = NULL;
|
|
dictionary *newone=NULL;
|
|
for_dictionaries(dct,dict){
|
|
yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data);
|
|
newone->data_type=dct->data_type;
|
|
}
|
|
return newone->first;
|
|
}
|
|
|
|
int yon_dictionary_set_data(dictionary *dict, void *data){
|
|
if (!dict) return 0;
|
|
dict->data=data;
|
|
return 1;
|
|
}
|
|
|
|
int yon_dictionary_set_key(dictionary *dict, char *key){
|
|
if (!dict||yon_char_is_empty(key)) return 0;
|
|
dict->key=key;
|
|
return 1;
|
|
}
|
|
|
|
int yon_dictionary_set(dictionary *dict, char *key, void *data){
|
|
if (!dict||yon_char_is_empty(key)) return 0;
|
|
dict->key=key;
|
|
dict->data=data;
|
|
return 1;
|
|
}
|
|
|
|
int yon_dictionary_empty(dictionary *dict){
|
|
dict->data=NULL;
|
|
dict->data_type=DICTIONARY_OTHER_TYPE;
|
|
return 1;
|
|
}
|
|
|
|
void yon_dictionary_switch_to_last(dictionary **dict)
|
|
{
|
|
dictionary *dct=NULL, *dact=*dict;
|
|
for_dictionaries(dct,dact);
|
|
}
|
|
|
|
dictionary *yon_dictionary_append(dictionary *targetdict)
|
|
{
|
|
targetdict = yon_dictionary_get_last(targetdict);
|
|
targetdict->next = yon_dictionary_new();
|
|
targetdict->next->prev = targetdict;
|
|
targetdict->next->first = targetdict->first;
|
|
targetdict->next->data_type = DICTIONARY_OTHER_TYPE;
|
|
return targetdict->next;
|
|
}
|
|
|
|
dictionary *yon_dictionary_get_last(dictionary *dict)
|
|
{
|
|
if (dict->next){
|
|
dictionary *dct = NULL;
|
|
for_dictionaries(dct,dict)
|
|
if (!dct->next)
|
|
return dct;
|
|
} else return dict;
|
|
}
|
|
|
|
dictionary *yon_dictionary_swap(dictionary *dict, int aim)
|
|
{
|
|
if (aim < 0)
|
|
{
|
|
if (dict->prev)
|
|
{
|
|
if (dict->prev->prev)
|
|
{
|
|
dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev;
|
|
if (next)
|
|
{
|
|
preprev->next = dict;
|
|
dict->prev = preprev;
|
|
dict->next = prev;
|
|
prev->prev = dict;
|
|
prev->next = next;
|
|
next->prev = prev;
|
|
}
|
|
else
|
|
{
|
|
preprev->next = dict;
|
|
dict->prev = preprev;
|
|
dict->next = prev;
|
|
prev->prev = dict;
|
|
prev->next = NULL;
|
|
}
|
|
return prev;
|
|
}
|
|
else
|
|
{
|
|
dictionary *next = dict->next, *prev = dict->prev;
|
|
if (next)
|
|
{
|
|
yon_dictionary_make_first(dict);
|
|
dict->prev = NULL;
|
|
dict->next = prev;
|
|
prev->prev = dict;
|
|
prev->next = next;
|
|
next->prev = prev;
|
|
}
|
|
else
|
|
{
|
|
dict->prev = NULL;
|
|
dict->next = prev;
|
|
prev->prev = dict;
|
|
prev->next = NULL;
|
|
}
|
|
return prev;
|
|
}
|
|
}
|
|
}
|
|
else if (aim > 0)
|
|
{
|
|
if (dict->next)
|
|
{
|
|
if (dict->next->next)
|
|
{
|
|
dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next;
|
|
if (prev)
|
|
{
|
|
prev->next = next;
|
|
next->prev = prev;
|
|
next->next = dict;
|
|
dict->prev = next;
|
|
dict->next = afnext;
|
|
afnext->prev = dict;
|
|
}
|
|
else
|
|
{
|
|
yon_dictionary_make_first(next);
|
|
next->prev = NULL;
|
|
next->next = dict;
|
|
dict->prev = next;
|
|
dict->next = afnext;
|
|
afnext->prev = dict;
|
|
}
|
|
return next;
|
|
}
|
|
else
|
|
{
|
|
dictionary *next = dict->next, *prev = dict->prev;
|
|
if (prev)
|
|
{
|
|
prev->next = next;
|
|
next->prev = prev;
|
|
next->next = dict;
|
|
dict->prev = next;
|
|
dict->next = NULL;
|
|
}
|
|
else
|
|
{
|
|
next->prev = NULL;
|
|
next->next = dict;
|
|
dict->prev = next;
|
|
dict->next = NULL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void yon_dictionary_make_first(dictionary *dict)
|
|
{
|
|
for (dictionary *dct = dict->first; dct != NULL; dct = dct->next)
|
|
{
|
|
dct->first = dict;
|
|
}
|
|
}
|
|
|
|
void yon_dictionary_make_nth(dictionary *dict, int nth)
|
|
{
|
|
dictionary *dct = dict->first;
|
|
for (int i = 0; i < nth; i++)
|
|
{
|
|
if (dct == NULL)
|
|
return;
|
|
else
|
|
dct = dct->next;
|
|
}
|
|
yon_dictionary_rip(dict);
|
|
dictionary *prev = dct->prev;
|
|
prev->next = dict;
|
|
dict->prev = prev;
|
|
dict->next = dct;
|
|
dct->prev = dict;
|
|
}
|
|
|
|
dictionary *yon_dictionary_new_with_data(char *key, void *data)
|
|
{
|
|
dictionary *dct = yon_dictionary_new();
|
|
dct->key = yon_char_new(key);
|
|
dct->data = data;
|
|
dct->data_type = DICTIONARY_OTHER_TYPE;
|
|
return dct;
|
|
}
|
|
|
|
void *yon_dictionary_free(dictionary *dictionary_to_free){
|
|
if (dictionary_to_free){
|
|
free(dictionary_to_free->data);
|
|
free(dictionary_to_free->key);
|
|
free(dictionary_to_free);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){
|
|
if (dictionary_to_free){
|
|
dictionary *dict=NULL;
|
|
for_dictionaries(dict,dictionary_to_free){
|
|
if(data_manipulation)
|
|
data_manipulation(dict->data);
|
|
if(dict->prev)
|
|
free(dict->prev);
|
|
}
|
|
free(dict);
|
|
}
|
|
}
|
|
|
|
dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data)
|
|
{
|
|
dictionary *dct = yon_dictionary_append(dict);
|
|
dct->key = yon_char_new(key);
|
|
dct->data = data;
|
|
dct->data_type = DICTIONARY_OTHER_TYPE;
|
|
return dct;
|
|
}
|
|
|
|
int yon_dictionary_connect(dictionary *old, dictionary *toconnect)
|
|
{
|
|
if (!old||!toconnect) return 0;
|
|
dictionary *dict = yon_dictionary_get_last(old);
|
|
dict->next = toconnect;
|
|
toconnect->prev = dict;
|
|
toconnect->first = dict->first;
|
|
return 1;
|
|
}
|
|
|
|
int yon_dictionary_merge(dictionary *dict1,dictionary *dict2){
|
|
if (!dict1||!dict2) return 0;
|
|
dictionary *dct = NULL;
|
|
for_dictionaries(dct,dict2){
|
|
if (!yon_dictionary_get(&dict1,dct->key))
|
|
yon_dictionary_connect(dict1,dct);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
dictionary *yon_dictionary_get(dictionary **dict, char *key)
|
|
{
|
|
dictionary *dct = *dict;
|
|
if (dct){
|
|
for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next){
|
|
if (pointer->key&&strcmp(pointer->key, key) == 0){
|
|
*dict = pointer;
|
|
return pointer;
|
|
}
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
dictionary *yon_dictionary_rip(dictionary *dict)
|
|
{
|
|
if (!dict->next&&!dict->prev) {
|
|
free(dict);
|
|
return NULL;
|
|
}
|
|
else if (!dict->next)
|
|
{
|
|
dictionary *prev = dict->prev;
|
|
free(dict);
|
|
if (prev)
|
|
{
|
|
prev->next = NULL;
|
|
return prev;
|
|
}
|
|
}
|
|
else if (!dict->prev)
|
|
{
|
|
dictionary *next = dict->next;
|
|
if (next)
|
|
{
|
|
yon_dictionary_make_first(next);
|
|
next->prev = NULL;
|
|
free(dict);
|
|
return next;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dictionary *next = dict->next, *prev = dict->prev;
|
|
next->prev = prev;
|
|
prev->next = next;
|
|
free(dict);
|
|
return next;
|
|
}
|
|
}
|
|
|
|
dictionary *yon_dictionary_get_nth(dictionary *dict, int place)
|
|
{
|
|
if (dict){
|
|
dict = dict->first;
|
|
int i = 0;
|
|
for (i = 0; i < place; i++)
|
|
if (dict->next)
|
|
dict = dict->next;
|
|
else
|
|
break;
|
|
if (i == place)
|
|
return dict;
|
|
else
|
|
return NULL;
|
|
} else return NULL;
|
|
}
|
|
|
|
|
|
dictionary *yon_dictionary_sort(dictionary *dict){
|
|
dictionary *first = dict->first;
|
|
dictionary *prev = first;
|
|
dictionary *current = first->next;
|
|
while (current){
|
|
if (current!=prev&&strcmp(current->key,prev->key)<0){
|
|
if (current->next)
|
|
current->next->prev=prev;
|
|
prev->next=current->next;
|
|
current->next=prev;
|
|
current->prev=prev->prev;
|
|
if (prev->prev)
|
|
prev->prev->next=current;
|
|
prev->prev=current;
|
|
if (prev==prev->first){
|
|
yon_dictionary_make_first(current);
|
|
}
|
|
dictionary *temp = prev;
|
|
prev = current;
|
|
current=temp;
|
|
}
|
|
prev=prev->next;
|
|
current = current->next;
|
|
}
|
|
return first;
|
|
}
|
|
|
|
int _yon_dictionary_check_loops(dictionary *_REG_DICT,dictionary *link){
|
|
if (_REG_DICT){
|
|
dictionary *dict;
|
|
for_dictionaries(dict,_REG_DICT){
|
|
if (dict->data==link){
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
dictionary *yon_dictionary_check_loops(dictionary *target){
|
|
dictionary *found = NULL;
|
|
dictionary *dict;
|
|
for_dictionaries(dict,target){
|
|
if (_yon_dictionary_check_loops(found,dict)){
|
|
return dict;
|
|
} else {
|
|
yon_dictionary_add_or_create_if_exists_with_data(found,NULL,dict);
|
|
}
|
|
}
|
|
yon_dictionary_free_all(found,NULL);
|
|
|
|
found = NULL;
|
|
dict=yon_dictionary_get_last(target);
|
|
for(;dict;dict=dict->prev){
|
|
if (_yon_dictionary_check_loops(found,dict)){
|
|
return dict;
|
|
} else {
|
|
yon_dictionary_add_or_create_if_exists_with_data(found,NULL,dict);
|
|
}
|
|
}
|
|
yon_dictionary_free_all(found,NULL);
|
|
return NULL;
|
|
} |