00001
00002
00003
00004
00005
00006
00007 #include "list.h"
00008
00009 static ListStatus listStatus;
00010 const unsigned int MarkAlive = 0xBEEF;
00011 const unsigned int MarkDead = 0xDEADBEEF;
00012
00013 ListStatus getListStatus()
00014 {
00015 return listStatus;
00016 }
00017
00018 bool isValidPos(List l, Position p)
00019 {
00020 bool toret = isValidList( l ) && ( p != NULL || l->first == NULL );
00021
00022 if ( toret
00023 && p != NULL ) {
00024 toret = toret && ( p->signature == MarkAlive );
00025 }
00026
00027 return toret;
00028 }
00029
00030
00031 static inline
00032 void setListNextPos(List l, Position pos, Position npos)
00033 {
00034 if ( isValidPos( l, pos )
00035 && isValidPos( l, npos ) )
00036 {
00037 listStatus = ListOk;
00038 pos->next = npos;
00039
00040 if ( pos == getListLastPos( l ) ) {
00041 l->last = npos;
00042 }
00043 } else listStatus = ListInvalidPos;
00044
00045 return;
00046 }
00047
00048 static inline
00049 void setListPreviousPos(List l, Position pos, Position npos)
00050 {
00051 if ( isValidPos( l, pos )
00052 && isValidPos( l, npos ) )
00053 {
00054 listStatus = ListOk;
00055 pos->prev = npos;
00056
00057 if ( pos == getListFirstPos( l ) ) {
00058 l->first = npos;
00059 }
00060 } else listStatus = ListInvalidPos;
00061
00062 return;
00063 }
00064
00065 List createList()
00066 {
00067 listStatus = ListOk;
00068 List toret = (List) malloc( sizeof( struct _List ) );
00069
00070 if ( toret != NULL ) {
00071 toret->first = toret->last = NULL;
00072 toret->signature = MarkAlive;
00073 }
00074
00075 return toret;
00076 }
00077
00078 void destroyList(List l)
00079 {
00080 listStatus = ListOk;
00081 deleteListRange( l, getListFirstPos( l ), getListLastPos( l ) );
00082 l->first = l->last = NULL;
00083 l->signature = MarkDead;
00084 free( l );
00085 }
00086
00087 Position deleteListElement(List l, Position p)
00088 {
00089 listStatus = ListOk;
00090 Position * previous;
00091 Position toret = NULL;
00092
00093 if ( isValidPos( l, p ) ) {
00094
00095 if ( p != getListFirstPos( l ) )
00096 previous = &( getListPreviousPos( l, p )->next );
00097 else previous = &( l->first );
00098
00099
00100 Position next = getListNextPos( l, p );
00101 *previous = next;
00102
00103
00104 if ( next != NULL ) {
00105 next->prev = p->prev;
00106 }
00107
00108
00109 toret = getListPreviousPos( l, p );
00110 if ( toret == NULL ) {
00111 toret = getListNextPos( l, p );
00112 }
00113
00114
00115 p->signature = MarkDead;
00116 free( p );
00117 } else listStatus = ListInvalidPos;
00118
00119 return toret;
00120 }
00121
00122 void deleteListRange(List l, Position beg, Position end)
00123 {
00124 listStatus = ListOk;
00125
00126
00127 while( beg != NULL
00128 && beg != end )
00129 {
00130 beg = deleteListElement( l, beg );
00131
00132 if ( getListStatus() != ListOk ) {
00133 beg = NULL;
00134
00135 if ( getListStatus() == ListInvalidPos ) {
00136 listStatus = ListInvalidRange;
00137 }
00138
00139 break;
00140 }
00141 }
00142
00143
00144 if ( beg != NULL ) {
00145 deleteListElement( l, beg );
00146 }
00147 }
00148
00149 Position getListNextPos(List l, Position pos)
00150 {
00151 listStatus = ListOk;
00152 Position toret = NULL;
00153
00154 if ( pos != NULL
00155 && isValidPos( l, pos ) )
00156 {
00157 toret = pos->next;
00158 }
00159
00160 return toret;
00161 }
00162
00163 inline
00164 Position getListPreviousPos(List l, Position pos)
00165 {
00166 Position toret = NULL;
00167 listStatus = ListOk;
00168
00169 if ( pos != NULL
00170 && isValidPos( l, pos ) )
00171 {
00172 toret = pos->prev;
00173 }
00174
00175 return toret;
00176 }
00177
00178 Position insertListElement(List l, Position p, void * data)
00179 {
00180 listStatus = ListOk;
00181 Position * previous;
00182 Position toret = (Position) malloc( sizeof( Node ) );
00183
00184 if ( toret != NULL ) {
00185 if ( isValidPos( l, p ) ) {
00186
00187 if ( p != getListFirstPos( l ) )
00188 previous = &( getListPreviousPos( l, p )->next );
00189 else previous = &( l->first );
00190
00191 toret->content = data;
00192 toret->signature = MarkAlive;
00193
00194
00195 if ( getListFirstPos( l ) == NULL ) {
00196 toret->prev = NULL;
00197 }
00198 toret->next = p;
00199
00200
00201 if ( p == NULL ) {
00202 l->last = toret;
00203 }
00204
00205
00206 *previous = toret;
00207 if ( p != NULL ) {
00208 p->prev = toret;
00209 }
00210 } else listStatus = ListInvalidPos;
00211 } else listStatus = ListNoMemory;
00212
00213 return toret;
00214 }
00215
00216 void * getListPosContent(List l, Position p)
00217 {
00218 void * toret = NULL;
00219 listStatus = ListInvalidPos;
00220
00221 if ( isValidPos( l, p ) ) {
00222 toret = p->content;
00223 listStatus = ListOk;
00224 }
00225
00226 return toret;
00227 }
00228
00229 void setListPosContent(List l, Position p, void * data)
00230 {
00231 listStatus = ListInvalidPos;
00232
00233 if ( isValidPos( l, p ) ) {
00234 p->content = data;
00235 listStatus = ListOk;
00236 }
00237 }
00238
00239 void advanceListPos(List l, Position &pos, int delta)
00240 {
00241 listStatus = ListOk;
00242 bool atras = ( delta < 0 );
00243 delta = abs( delta );
00244
00245 if ( isValidPos( l, pos ) ) {
00246 for(; delta > 0; --delta) {
00247 if ( atras )
00248 pos = getListPreviousPos( l, pos );
00249 else pos = getListNextPos( l, pos );
00250 }
00251 }
00252
00253 return;
00254 }