Choco OS  V.0.16.9.0
Join to the chocolate world
oc_list.c
Go to the documentation of this file.
1 
27 #include <oc_list.h>
28 #include <oc_math.h>
29 #include <string.h>
30 #include <oc_null.h>
31 #include <oc_stdlib.h>
32 #include <oc_errors.h>
33 
39 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________
40 
41 static void PushToEmpty( oC_List_t List , oC_List_ElementHandle_t Handle );
42 
43 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________
44 
45 
51 #define _________________________________________INTERFACE_SECTION__________________________________________________________________________
52 
53 //==========================================================================================================================================
54 //==========================================================================================================================================
55 oC_List_t List_New( Allocator_t Allocator , AllocationFlags_t Flags )
56 {
57  oC_List_t list = NULL;
58 
59  list = kmalloc(sizeof(struct List_t) , Allocator , Flags );
60 
61  if(list)
62  {
63  list->ObjectControl = oC_CountObjectControl(list,oC_ObjectId_List);
64  list->Count = 0;
65  list->First = NULL;
66  list->Last = NULL;
67  }
68 
69  return list;
70 }
71 
72 
73 //==========================================================================================================================================
74 //==========================================================================================================================================
75 bool List_IsCorrect( oC_List_t List )
76 {
77  return isram(List) && oC_CheckObjectControl(List,oC_ObjectId_List,List->ObjectControl);
78 }
79 
80 //==========================================================================================================================================
81 //==========================================================================================================================================
82 bool List_Delete( oC_List_t * List , AllocationFlags_t Flags )
83 {
84  bool deleted = false;
85 
86  if(List_IsCorrect(*List))
87  {
88  if(List_Clear(*List))
89  {
90  (*List)->ObjectControl = 0;
91 
92  if(kfree(*List,Flags))
93  {
94  *List = NULL;
95  deleted = true;
96  }
97  else
98  {
99  oC_SaveError("List-delete: cannot release memory" , oC_ErrorCode_ReleaseError);
100  }
101  }
102  else
103  {
104  oC_SaveError("List-delete: cannot clear the list" , oC_ErrorCode_ReleaseError);
105  }
106  }
107 
108 
109  return deleted;
110 }
111 
112 //==========================================================================================================================================
113 //==========================================================================================================================================
114 bool List_DeleteElement( oC_List_ElementHandle_t Element )
115 {
116  bool success = false;
117 
118  if(isram(Element))
119  {
120  success = kfree(Element->Object,AllocationFlags_CanWaitForever) && kfree(Element,AllocationFlags_CanWaitForever);
121  }
122 
123  return success;
124 }
125 
126 //==========================================================================================================================================
127 //==========================================================================================================================================
128 oC_List_ElementHandle_t List_NewElement( const void * Object , oC_UInt_t Size , Allocator_t Allocator )
129 {
130  oC_List_ElementHandle_t handle = NULL;
131 
132  if(isaddresscorrect(Object))
133  {
134  handle = kmalloc(sizeof(struct List_ElementHandle_t),Allocator,AllocationFlags_CanWaitForever);
135 
136  if(handle)
137  {
138  handle->Object = kmalloc(Size, Allocator , AllocationFlags_CanWaitForever);
139  memcpy(handle->Object,Object,Size);
140  handle->Size = Size;
141  handle->Next = NULL;
142  handle->Previous = NULL;
143  }
144  }
145 
146  return handle;
147 }
148 
149 //==========================================================================================================================================
150 //==========================================================================================================================================
151 bool List_Contains( oC_List_t List , void * Object , oC_UInt_t Size )
152 {
153  return List_CountObjects(List,Object,Size) > 0;
154 }
155 
156 //==========================================================================================================================================
157 //==========================================================================================================================================
158 uint32_t List_Count( oC_List_t List )
159 {
160  uint32_t count = 0;
161 
162  if(List_IsCorrect(List))
163  {
164  count = List->Count;
165  }
166 
167  return count;
168 }
169 
170 //==========================================================================================================================================
171 //==========================================================================================================================================
172 bool List_Clear( oC_List_t List )
173 {
174  bool success = false;
175 
176  if(List_IsCorrect(List))
177  {
178  success = true;
179  oC_List_ElementHandle_t element = List->Last;
180  oC_List_ElementHandle_t previous = element->Previous;
181 
182  while(List_DeleteElement(element))
183  {
184  element = previous;
185  previous = previous->Previous;
186  List->Count--;
187  }
188  }
189 
190  return success;
191 }
192 
193 //==========================================================================================================================================
194 //==========================================================================================================================================
195 uint32_t List_CountObjects( oC_List_t List , void * Object , oC_UInt_t Size )
196 {
197  uint32_t count = 0;
198 
199  if(List_IsCorrect(List) && (Size > 0) && (isaddresscorrect(Object)))
200  {
201  for(oC_List_ElementHandle_t element = List->First ; element != NULL ; element = element->Next )
202  {
203  if((Size == element->Size) && (memcmp(Object,element->Object,element->Size) == 0))
204  {
205  count++;
206  }
207  }
208  }
209 
210  return count;
211 }
212 
213 //==========================================================================================================================================
214 //==========================================================================================================================================
215 int List_IndexOf( oC_List_t List , void * Object , oC_UInt_t Size )
216 {
217  int index = -1;
218 
219  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
220  {
221  int currentIndex = 0;
222  for(oC_List_ElementHandle_t element = List->First ; element != NULL ; element = element->Next )
223  {
224  if((Size == element->Size) && (memcmp(Object,element->Object,element->Size) == 0))
225  {
226  index = currentIndex;
227  break;
228  }
229  currentIndex++;
230  }
231  }
232 
233  return index;
234 }
235 
236 //==========================================================================================================================================
237 //==========================================================================================================================================
238 int List_IndexOfElement( oC_List_t List , oC_List_ElementHandle_t ElementHandle )
239 {
240  int index = -1;
241 
242  if(List_IsCorrect(List))
243  {
244  int currentIndex = 0;
245  for(oC_List_ElementHandle_t element = List->First ; element != NULL ; element = element->Next )
246  {
247  if(ElementHandle == element)
248  {
249  index = currentIndex;
250  break;
251  }
252  currentIndex++;
253  }
254  }
255 
256  return index;
257 }
258 
259 //==========================================================================================================================================
260 //==========================================================================================================================================
261 oC_List_ElementHandle_t List_ElementHandleOf( oC_List_t List , void * Object , oC_UInt_t Size )
262 {
263  oC_List_ElementHandle_t handle = NULL;
264 
265  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
266  {
267  for(oC_List_ElementHandle_t element = List->First ; element != NULL ; element = element->Next )
268  {
269  if((Size == element->Size) && (memcmp(Object,element->Object,element->Size) == 0))
270  {
271  handle = element;
272  break;
273  }
274  }
275  }
276 
277  return handle;
278 }
279 
280 //==========================================================================================================================================
281 //==========================================================================================================================================
282 oC_List_ElementHandle_t List_ElementOfIndex( oC_List_t List , int Index )
283 {
284  oC_List_ElementHandle_t handle = NULL;
285 
286  if(List_IsCorrect(List) && (Index >= 0))
287  {
288  int currentIndex = 0;
289  for(oC_List_ElementHandle_t element = List->First ; element != NULL ; element = element->Next , currentIndex++ )
290  {
291  if(currentIndex == Index)
292  {
293  handle = element;
294  break;
295  }
296  }
297  }
298 
299  return handle;
300 }
301 
302 //==========================================================================================================================================
303 //==========================================================================================================================================
304 bool List_PushBack( oC_List_t List , const void * Object , oC_UInt_t Size , Allocator_t Allocator)
305 {
306  bool pushed = false;
307 
308  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
309  {
310  oC_List_ElementHandle_t element = List_NewElement(Object,Size,Allocator);
311 
312  if(element)
313  {
314  if(List->Last && List->First)
315  {
316  element->Previous = List->Last;
317  element->Next = NULL;
318  List->Last->Next = element;
319  List->Last = element;
320  }
321  else
322  {
323  PushToEmpty(List,element);
324  }
325 
326  pushed = true;
327  List->Count++;
328  }
329  else
330  {
331  oC_SaveError("List - push back element error" , oC_ErrorCode_AllocationError);
332  }
333  }
334 
335  return pushed;
336 }
337 
338 //==========================================================================================================================================
339 //==========================================================================================================================================
340 bool List_PushFront( oC_List_t List , const void * Object , oC_UInt_t Size , Allocator_t Allocator)
341 {
342  bool pushed = false;
343 
344  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
345  {
346  oC_List_ElementHandle_t element = List_NewElement(Object,Size,Allocator);
347 
348  if(element)
349  {
350  if(List->Last && List->First)
351  {
352  element->Next = List->First;
353  element->Previous = NULL;
354  List->First->Previous = element;
355  List->First = element;
356  }
357  else
358  {
359  PushToEmpty(List,element);
360  }
361 
362  pushed = true;
363  List->Count++;
364  }
365  else
366  {
367  oC_SaveError("List - push front element error" , oC_ErrorCode_AllocationError);
368  }
369  }
370 
371  return pushed;
372 }
373 
374 //==========================================================================================================================================
375 //==========================================================================================================================================
376 bool List_InsertAfter( oC_List_t List , void * Object , oC_UInt_t Size , oC_List_ElementHandle_t ElementHandle , Allocator_t Allocator)
377 {
378  bool inserted = false;
379 
380  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
381  {
382  if(List->First == NULL && List->Last == NULL)
383  {
384  inserted = List_PushFront(List,Object,Size,Allocator);
385  }
386  else if(isram(ElementHandle)==false)
387  {
388  oC_SaveError("List-insert-after: ElementHandle is not in ram " , oC_ErrorCode_WrongAddress);
389  }
390  else if(List->Last == ElementHandle)
391  {
392  inserted = List_PushBack(List,Object,Size,Allocator);
393  }
394  else
395  {
396  oC_List_ElementHandle_t element = List_NewElement(Object,Size,Allocator);
397 
398  if(element)
399  {
400  element->Next = ElementHandle->Next;
401  element->Previous = ElementHandle;
402 
403  ElementHandle->Next->Previous = element;
404  ElementHandle->Next = element;
405 
406  inserted = true;
407  List->Count++;
408  }
409  else
410  {
411  oC_SaveError("List - insert after element error" , oC_ErrorCode_AllocationError);
412  }
413  }
414  }
415 
416  return inserted;
417 }
418 
419 //==========================================================================================================================================
420 //==========================================================================================================================================
421 bool List_InsertBefore( oC_List_t List , void * Object , oC_UInt_t Size , oC_List_ElementHandle_t ElementHandle , Allocator_t Allocator)
422 {
423  bool inserted = false;
424 
425  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
426  {
427  if( (List->First == ElementHandle) || (List->First == NULL && List->Last == NULL))
428  {
429  inserted = List_PushFront(List,Object,Size,Allocator);
430  }
431  else if(isram(ElementHandle)==false)
432  {
433  oC_SaveError("List-insert-after: ElementHandle is not in ram " , oC_ErrorCode_WrongAddress);
434  }
435  else
436  {
437  oC_List_ElementHandle_t element = List_NewElement(Object,Size,Allocator);
438 
439  if(element)
440  {
441  element->Next = ElementHandle;
442  element->Previous = ElementHandle->Previous;
443 
444  ElementHandle->Previous->Next = element;
445  ElementHandle->Previous = element;
446 
447  inserted = true;
448  List->Count++;
449  }
450  else
451  {
452  oC_SaveError("List - insert before element error" , oC_ErrorCode_AllocationError);
453  }
454  }
455  }
456 
457  return inserted;
458 }
459 
460 //==========================================================================================================================================
461 //==========================================================================================================================================
462 bool List_Replace( oC_List_t List , void * Object , oC_UInt_t Size , oC_List_ElementHandle_t ElementHandle , Allocator_t Allocator , AllocationFlags_t Flags )
463 {
464  bool replaced = false;
465 
466  if(List_IsCorrect(List) && (Size > 0) && isram(ElementHandle) && isaddresscorrect(Object))
467  {
468  if( List->First == NULL && List->Last == NULL )
469  {
470  replaced = false;
471  }
472  else
473  {
474  if(!kfree(ElementHandle->Object,Flags))
475  {
476  oC_SaveError("List replace" , oC_ErrorCode_ReleaseError);
477  }
478 
479  ElementHandle->Object = kmalloc(Size,Allocator,Flags);
480 
481  if(ElementHandle->Object)
482  {
483  memcpy(ElementHandle->Object,Object,Size);
484  ElementHandle->Size = Size;
485  replaced = true;
486  }
487 
488  }
489  }
490 
491  return replaced;
492 }
493 
494 //==========================================================================================================================================
495 //==========================================================================================================================================
496 bool List_Remove( oC_List_t List , oC_List_ElementHandle_t ElementHandle )
497 {
498  bool removed = false;
499 
500  if(List_IsCorrect(List) && isram(ElementHandle) && (List->Count > 0))
501  {
502  if(ElementHandle == List->First)
503  {
504  removed = List_PopFront(List);
505  }
506  else if (ElementHandle == List->Last)
507  {
508  removed = List_PopBack(List);
509  }
510  else
511  {
512  oC_List_ElementHandle_t previous = ElementHandle->Previous;
513  oC_List_ElementHandle_t next = ElementHandle->Next;
514 
515  previous->Next = next;
516  next->Previous = previous;
517 
518  removed = List_DeleteElement(ElementHandle);
519  }
520  }
521 
522  return removed;
523 }
524 
525 //==========================================================================================================================================
526 //==========================================================================================================================================
527 uint32_t List_RemoveAll( oC_List_t List , void * Object , oC_UInt_t Size )
528 {
529  uint32_t removedCount = 0;
530 
531  if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
532  {
533  oC_List_ElementHandle_t handle = List->First;
534  oC_List_ElementHandle_t next = handle->Next;
535  while(handle != NULL)
536  {
537  if(Size == handle->Size && (memcmp(Object,handle->Object,Size) == 0))
538  {
539  if(List_Remove(List,handle))
540  {
541  removedCount++;
542  }
543  }
544  handle = next;
545  next = next->Next;
546  }
547  }
548 
549  return removedCount;
550 }
551 
552 //==========================================================================================================================================
553 //==========================================================================================================================================
554 void * List_At( oC_List_t List , oC_List_ElementHandle_t ElementHandle , void * outObject , oC_UInt_t Size )
555 {
556  void * Object = NULL;
557 
558  if(List_IsCorrect(List) && isram(ElementHandle) && isram(outObject))
559  {
560  if(Size == ElementHandle->Size)
561  {
562  Object = outObject;
563  memcpy(outObject,ElementHandle->Object,Size);
564  }
565  }
566 
567  return Object;
568 }
569 
570 //==========================================================================================================================================
571 //==========================================================================================================================================
572 void * List_AtWithDefault( oC_List_t List , void * DefaultObject , oC_UInt_t DefaultSize , oC_List_ElementHandle_t ElementHandle , void * outObject , oC_UInt_t Size )
573 {
574  void * AtObject = DefaultObject;
575 
576  if(isram(outObject) && isaddresscorrect(DefaultObject))
577  {
578  if(Size == DefaultSize)
579  {
580  memcpy(outObject,DefaultObject,Size);
581  }
582 
583  if(List_IsCorrect(List) && isram(ElementHandle))
584  {
585  if(Size == ElementHandle->Size)
586  {
587  AtObject = outObject;
588  memcpy(outObject,ElementHandle->Object,Size);
589  }
590  }
591  }
592 
593  return AtObject;
594 }
595 
596 //==========================================================================================================================================
597 //==========================================================================================================================================
598 bool List_Move( oC_List_t List , oC_List_ElementHandle_t From , oC_List_ElementHandle_t To , Allocator_t Allocator )
599 {
600  bool moved = false;
601 
602 // if(List_IsCorrect(List) && isram(From) && isram(To))
603 // {
604 // oC_UInt_t size = From->Size;
605 // void * object = List_TakeAt(List,From);
606 //
607 // moved = List_InsertAfter(List,object,size,To,Allocator);
608 // }
609 
610  return moved;
611 }
612 
613 //==========================================================================================================================================
614 //==========================================================================================================================================
615 bool List_PopBack( oC_List_t List )
616 {
617  bool poped = false;
618 
619  if(List_IsCorrect(List) && (List->Last != NULL))
620  {
621  oC_List_ElementHandle_t handle = List->Last;
622 
623  List->Last = handle->Previous;
624 
625  if(List->Last == NULL)
626  {
627  List->First = NULL;
628  }
629  else
630  {
631  List->Last->Next = NULL;
632  }
633 
634  poped = List_DeleteElement(handle);
635  }
636 
637  return poped;
638 }
639 
640 //==========================================================================================================================================
641 //==========================================================================================================================================
642 bool List_PopFront( oC_List_t List )
643 {
644  bool poped = false;
645 
646  if(List_IsCorrect(List) && (List->Last != NULL))
647  {
648  oC_List_ElementHandle_t handle = List->First;
649 
650  List->First = handle->Next;
651 
652  if(List->First == NULL)
653  {
654  List->Last = NULL;
655  }
656  else
657  {
658  List->First->Previous = NULL;
659  }
660 
661  poped = List_DeleteElement(handle);
662  }
663 
664  return poped;
665 }
666 
667 //==========================================================================================================================================
668 //==========================================================================================================================================
669 bool List_Swap( oC_List_t List , oC_List_ElementHandle_t I , oC_List_ElementHandle_t J )
670 {
671  bool swaped = false;
672 
673  if(List_IsCorrect(List) && isram(I) && isram(J))
674  {
675  void * object = I->Object;
676  oC_UInt_t size = I->Size;
677 
678  I->Object = J->Object;
679  I->Size = J->Size;
680 
681  J->Object = object;
682  J->Size = size;
683 
684  swaped = true;
685  }
686 
687  return swaped;
688 }
689 
690 //==========================================================================================================================================
691 //==========================================================================================================================================
692 bool List_TakeAt( oC_List_t List , oC_List_ElementHandle_t ElementHandle , void * outObject , oC_UInt_t Size )
693 {
694  bool result = false;
695 
696  if(List_IsCorrect(List) && isram(ElementHandle) && ElementHandle->Size == Size && isram(outObject))
697  {
698  if(ElementHandle == List->First)
699  {
700  result = List_TakeFirst(List,outObject,Size);
701  }
702  else if (ElementHandle == List->Last)
703  {
704  result = List_TakeLast(List,outObject,Size);
705  }
706  else
707  {
708  result = true;
709 
710  memcpy(outObject,ElementHandle->Object,Size);
711 
712  oC_List_ElementHandle_t previous = ElementHandle->Previous;
713  oC_List_ElementHandle_t next = ElementHandle->Next;
714 
715  if(previous)
716  {
717  previous->Next = next;
718  }
719 
720  if(next)
721  {
722  next->Previous = previous;
723  }
724 
725  if(!List_DeleteElement(ElementHandle))
726  {
727  oC_SaveError("List , takeAt, delete element" , oC_ErrorCode_ReleaseError);
728  }
729  }
730  }
731 
732  return result;
733 }
734 
735 //==========================================================================================================================================
736 //==========================================================================================================================================
737 bool List_TakeFirst( oC_List_t List , void * outObject , oC_UInt_t Size )
738 {
739  bool result = false;
740 
741  if(List_IsCorrect(List) && List->First != NULL && List->First->Size == Size && isram(outObject))
742  {
743  oC_List_ElementHandle_t first = List->First;
744 
745  result = true;
746 
747  memcpy(outObject,List->First->Object,Size);
748 
749  List->First = List->First->Next;
750 
751  if(List->Last == first)
752  {
753  List->Last = List->First;
754  }
755 
756  if(List->First != NULL)
757  {
758  List->First->Previous = NULL;
759  }
760 
761  if(!List_DeleteElement(first))
762  {
763  oC_SaveError("List , take first, delete element" , oC_ErrorCode_ReleaseError);
764  }
765  }
766 
767  return result;
768 }
769 
770 //==========================================================================================================================================
771 //==========================================================================================================================================
772 bool List_TakeLast( oC_List_t List , void * outObject , oC_UInt_t Size )
773 {
774  bool result = false;
775 
776  if(List_IsCorrect(List) && List->Last != NULL && isram(outObject))
777  {
778  oC_List_ElementHandle_t last = List->Last;
779 
780  result = true;
781 
782  memcpy(outObject,List->Last->Object,Size);
783 
784  List->Last = List->Last->Previous;
785 
786  if(List->First == last)
787  {
788  List->First = List->Last;
789  }
790 
791  if(List->Last != NULL)
792  {
793  List->Last->Next = NULL;
794  }
795 
796  if(!List_DeleteElement(last))
797  {
798  oC_SaveError("List , take last, delete element" , oC_ErrorCode_ReleaseError);
799  }
800  }
801 
802  return result;
803 }
804 
805 //==========================================================================================================================================
806 //==========================================================================================================================================
807 bool List_Verify( oC_List_t List )
808 {
809  bool correct = false;
810 
811  if(List_IsCorrect(List))
812  {
813  uint32_t count = 0;
814 
815  for(oC_List_ElementHandle_t element = List->First ; isram(element) && element != NULL ; element = element->Next )
816  {
817  count++;
818  }
819 
820  correct = count == List->Count;
821  }
822 
823  return correct;
824 }
825 
826 //==========================================================================================================================================
827 //==========================================================================================================================================
828 bool List_Repair( oC_List_t List , void * SavedListAddress , uint32_t MaximumNumberOfObjects )
829 {
830  bool repaired = false;
831 
832  /* Check list pointer first and try to restore it if possible */
833  if(List_IsCorrect(List) == false)
834  {
835  if(isram(SavedListAddress) && List != SavedListAddress)
836  {
837  List = SavedListAddress;
838  }
839  if(List_IsCorrect(List) == false && isram(List) && SavedListAddress == List)
840  {
841  List->ObjectControl = oC_CountObjectControl(SavedListAddress,oC_ObjectId_List);
842  }
843  }
844 
845  /* Now, if we repaired list address, we can try to restore elements inside */
846  if(List_IsCorrect(List))
847  {
848  uint32_t countFromHead = 0;
849  uint32_t countFromTail = 0;
850  oC_List_ElementHandle_t lastElementFromHead = NULL;
851  oC_List_ElementHandle_t firstElementFromTail= NULL;
852  bool repairFromHead = false;
853  bool repairFromTail = false;
854 
855  for(oC_List_ElementHandle_t element = List->First ; isram(element) && element != NULL ; element = element->Next )
856  {
857  lastElementFromHead = element;
858  countFromHead++;
859  }
860 
861  for(oC_List_ElementHandle_t element = List->Last; isram(element) && element != NULL ; element = element->Previous )
862  {
863  firstElementFromTail = element;
864  countFromTail++;
865  }
866 
867  if(List->Count < MaximumNumberOfObjects)
868  {
869  if( countFromHead == List->Count && isram(lastElementFromHead))
870  {
871  repairFromHead = true;
872  }
873  else if( countFromTail == List->Count && isram(lastElementFromHead))
874  {
875  repairFromTail = true;
876  }
877  else
878  {
879  if(countFromHead < MaximumNumberOfObjects)
880  {
881  repairFromHead = true;
882  }
883  if(countFromTail < MaximumNumberOfObjects)
884  {
885  repairFromTail = true;
886  }
887  }
888  }
889  else
890  {
891  repairFromHead = true;
892  repairFromTail = true;
893  }
894 
895  if(repairFromHead)
896  {
897  oC_List_ElementHandle_t previous = NULL;
898 
899  countFromHead = 0;
900 
901  List->Last = lastElementFromHead;
902 
903  for(oC_List_ElementHandle_t element = List->First; isram(element) && element != NULL ; element = element->Next )
904  {
905  element->Previous = previous;
906  previous = element;
907  countFromHead++;
908  }
909  }
910 
911  if(repairFromTail)
912  {
914 
915  countFromTail = 0;
916 
917  List->First = firstElementFromTail;
918 
919  for(oC_List_ElementHandle_t element = List->Last; isram(element) && element != NULL ; element = element->Previous )
920  {
921  element->Next = next;
922  next = element;
923  countFromTail++;
924  }
925  }
926 
927  if(repairFromHead)
928  {
929  oC_List_ElementHandle_t previous = NULL;
930 
931  countFromHead = 0;
932 
933  List->Last = lastElementFromHead;
934 
935  for(oC_List_ElementHandle_t element = List->First; isram(element) && element != NULL ; element = element->Next )
936  {
937  element->Previous = previous;
938  previous = element;
939  countFromHead++;
940  }
941  }
942 
943  if(countFromHead == countFromTail && countFromHead < MaximumNumberOfObjects)
944  {
945  List->Count = countFromHead;
946  repaired = true;
947  }
948  }
949 
950  return repaired;
951 }
952 
953 #undef _________________________________________INTERFACE_SECTION__________________________________________________________________________
954 
960 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
961 
962 //==========================================================================================================================================
963 //==========================================================================================================================================
964 static void PushToEmpty( oC_List_t List , oC_List_ElementHandle_t Handle )
965 {
966  List->Last = Handle;
967  List->First= Handle;
968 }
969 
970 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
971 
Definition: oc_list.h:63
Basic math operations.
identifier for allocations
Definition: oc_stdlib.h:159
The file with list library.
static oC_ObjectControl_t oC_CountObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId)
counts object control for object
Definition: oc_object.h:168
static bool oC_CheckObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId, oC_ObjectControl_t ObjectControl)
checks if object control is correct
Definition: oc_object.h:203
Definition of the null pointer.
static const oC_Allocator_t Allocator
Definition: oc_eth.c:152
#define NULL
pointer to a zero
Definition: oc_null.h:37