Fixed issue where the LRC of a card was the reverse of the start
[magread] / llist.c
1 #include "llist.h"
2
3
4 LListH *llist_init() {
5         LListH *list;
6
7         list = ( LListH * ) malloc( sizeof( LListH ) );
8         if( list == NULL )
9                 return NULL;
10         
11         list->first = NULL;
12         list->last = NULL;
13         list->len = 0;
14
15         return list;
16 }
17
18
19 void llist_append( LListH *list, int idx, short amp ) {
20         LList *node;
21
22         node = ( LList * ) malloc( sizeof( LList ) );
23         if( node == NULL )
24                 return;
25         
26         node->idx = idx;
27         node->amp = amp;
28         node->next = NULL;
29
30         if( list->first == NULL )
31                 list->first = node;
32         if( list->last != NULL )
33                 list->last->next = node;
34         
35         list->last = node;
36
37         list->len++;
38 }
39
40 void llist_remove_idx( LListH *list, int idx ) {
41         LList *trav,*prev;
42
43         for( trav = list->first, prev = NULL; trav != NULL; trav = trav->next ) {
44                 if( trav->idx == idx )
45                         break;
46                 prev = trav;
47         }
48
49         if( trav != NULL ) {//if found
50                 if( prev != NULL ) {
51                         prev->next = trav->next;
52                 } else {
53                         list->first = trav->next;
54                 }
55                 if( trav == list->last )
56                         list->last = prev;
57
58                 free( trav );
59                 list->len--;
60         }
61 }
62
63 LListH *llist_free( LListH *list ) {
64         if( list == NULL )
65                 return NULL;
66
67         llist_reinit( list );
68
69         free( list );
70
71         return NULL;
72 }
73
74 void llist_reinit( LListH *list ) {
75         LList *trav,*prev;
76
77         for( trav = list->first, prev = NULL; trav != NULL; ) {
78                 prev = trav;
79                 trav = trav->next;
80                 if( prev ) {
81                         free( prev );
82                         prev = NULL;
83                 }
84         }
85
86         if( prev )
87                 free( prev );
88         
89         list->first = NULL;
90         list->last = NULL;
91         list->len = 0;
92 }