summaryrefslogtreecommitdiffstats
path: root/list.c
diff options
context:
space:
mode:
authorFreeArtMan <dos21h@gmail.com>2014-12-09 10:31:37 +0900
committerFreeArtMan <dos21h@gmail.com>2014-12-09 10:31:37 +0900
commita57c6bed8f6ab7d0f4355190c0cff7cd913da6a0 (patch)
treec8b85b9de364cb63678d05625bdff6a2cf12ecda /list.c
parentdc4bbe5366d6c733f9f77b7c9fee0cbba3e0d92b (diff)
downloadmicrobbs-a57c6bed8f6ab7d0f4355190c0cff7cd913da6a0.tar.gz
microbbs-a57c6bed8f6ab7d0f4355190c0cff7cd913da6a0.zip
New planned functionality. Menuconfig support. Simple captcha.
Diffstat (limited to 'list.c')
-rw-r--r--list.c180
1 files changed, 179 insertions, 1 deletions
diff --git a/list.c b/list.c
index 83655cd..7e7f732 100644
--- a/list.c
+++ b/list.c
@@ -39,8 +39,9 @@ int llist_index( struct List *list, void *ptr )
}
-void llist_reverse( struct List **list )
+void llist_reverse( struct List *list )
{
+ ERROR("\n");
//abort(0);
}
@@ -108,6 +109,67 @@ void llist_push( struct List *list, void *ptr )
}
+void* llist_removen( struct List *l, struct ListNode *ln )
+{
+ ListNode *ret=NULL;
+ ListNode *iter = l->first;
+ ListNode *prev_iter = NULL;
+
+ if ( iter == NULL )
+ goto result_ready;
+
+ while ( iter->next != NULL )
+ {
+ if ( iter == ln )
+ {
+ break;
+ }
+ prev_iter = iter;
+ iter = iter->next;
+ }
+ ret = iter;
+ iter = NULL; //dont use iter anymore pls
+
+ if ( ret != NULL )
+ {
+ //if first element of list
+ //the prev=NULL
+ if ( prev_iter == NULL )
+ {
+ //if only one element in da list?
+
+ if ( l->first == l->last )
+ {
+ l->first = NULL;
+ l->last = NULL;
+ } else
+ //if more then one element
+ {
+ l->first = l->first->next;
+ }
+ ret->next = NULL;
+ goto result_ready;
+ }
+
+ //if last element of the list
+ if ( ret == l->last )
+ {
+ prev_iter->next = NULL;
+ l->last = prev_iter;
+ goto result_ready;
+ }
+
+ //if in da middle
+ prev_iter->next = ((ListNode *)ret)->next;
+ ((ListNode *)ret)->next = NULL;
+
+
+ }
+
+result_ready:
+ return ret;
+}
+
void llist_free( struct List *list )
{
@@ -137,6 +199,122 @@ void llist_free( struct List *list )
void llist_freen( struct ListNode *node )
{
+ ERROR("\n");
+}
+
+
+
+void llist_sortn( struct List *list, clb_llist_cmp clb_cmp)
+{
+ int print_list( List *ln )
+ {
+ if ( ln == NULL ) return;
+ char *ptr=NULL;
+ ListNode *l = ln->first;
+
+ while ( l != NULL )
+ {
+ ptr = l->val;
+ printf("%s", ptr);
+ if ( l->next != NULL )
+ {
+ printf("(->%s) ",(char*)l->next->val );
+ }
+ //printf("\n");
+ l = l->next;
+ }
+ printf("\n");
+
+ return 1;
+ }
+
+ int print_node( ListNode *n )
+ {
+ if ( n == NULL ) return;
+ while ( n != NULL )
+ {
+ printf("%s ", (char*)n->val);
+ n = n->next;
+ }
+ printf("\n");
+ }
+
+
+ //creat new empty list and add all elements sorted
+ struct ListNode *sorted=NULL, *last=NULL, *get=NULL;
+
+ get = llist_removen( list, list->first );
+ sorted = get;
+ get = llist_removen( list, list->first );
+
+ while ( get != NULL )
+ {
+ //add to empty in sorted like place
+ struct ListNode *iter = sorted;
+ struct ListNode *prev_iter = malloc( sizeof(struct ListNode));
+ memset( prev_iter, 0, sizeof(struct ListNode));
+ prev_iter->next = iter;
+ while ( iter != NULL )
+ {
+ //there could be that no empty element in da list
+ if ( get == NULL ) break;
+ if ( clb_cmp( iter->val, get->val ) >= 0 )
+ {
+ //add to sorted list end if everything is ok
+ if ( iter->next == NULL )
+ {
+ iter->next = get;
+ break;
+ }
+ } else
+ {
+ prev_iter->next = get;
+ prev_iter = get;
+ get->next = iter;
+ if ( iter == sorted )
+ {
+ sorted = prev_iter;
+ }
+ iter = prev_iter;
+
+ break;
+ }
+ prev_iter = iter;
+ iter = iter->next;
+ }
+ get = llist_removen( list, list->first );
+ }
+ list->first = sorted;
+}
+
+int llist_save( struct List *l, clb_llist_save clb_save )
+{
+ int ret=0, frc=0;
+ if ( l == NULL ) return ret;
+ if ( clb_save == NULL ) return ret;
+
+ /*
+ struct ListNode *iter = llist_first( l );
+
+ while ( iter != NULL )
+ {
+ clb_save( );
+ iter = iter->next;
+ }
+ */
+ frc = clb_save( "/tmp/binlist.txt", l );
+ if ( frc != 0)
+ ret = -1;
+ return ret;
}
+struct List* llist_load( clb_llist_load clb_load, const char *fname )
+{
+ int ret = 0;
+ struct List *loaded = NULL;
+
+ ret = clb_load( (char *)fname, (void **)loaded );
+
+ return loaded;
+}