Mercurial > cgi-bin > hgwebdir.cgi > VMS > C_Libraries > ListOfArrays
annotate ListOfArrays.c @ 12:abf2117d7535
make lists clearable
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Fri, 31 Aug 2012 18:27:26 +0200 |
| parents | 5df9392eca1a |
| children |
| rev | line source |
|---|---|
| nengel@0 | 1 |
| nengel@0 | 2 #include "ListOfArrays.h" |
| seanhalle@10 | 3 #include "VMS_impl/Services_Offered_by_VMS/Memory_Handling/vmalloc.h" |
| nengel@0 | 4 |
| nengel@0 | 5 ListOfArrays* makeListOfArrays(size_t entry_size, int num_entries_per_block){ |
| seanhalle@8 | 6 ListOfArrays* newLoA = (ListOfArrays*) VMS_int__malloc(sizeof(ListOfArrays)); |
| nengel@2 | 7 newLoA->dim1info = makePrivDynArrayOfSize(&(newLoA->dim1),8); |
| nengel@3 | 8 |
| nengel@0 | 9 newLoA->entry_size = entry_size; |
| nengel@0 | 10 newLoA->num_entries_per_fragment = num_entries_per_block; |
| nengel@0 | 11 newLoA->next_free_index = 0; |
| nengel@0 | 12 |
| nengel@0 | 13 return newLoA; |
| nengel@0 | 14 } |
| nengel@0 | 15 |
| nengel@0 | 16 void forAllInListOfArraysDo(ListOfArrays* list, ListOfArraysFnPtr fnPtr){ |
| nengel@2 | 17 int n; |
| nengel@1 | 18 uintptr_t p; |
| nengel@12 | 19 int num_full = list->next_free_index / list->num_entries_per_fragment; //!\\ != list->dim1info->numInArray-1 |
| nengel@5 | 20 for(n=0;n<num_full; n++){ |
| nengel@2 | 21 for(p = (uintptr_t) (list->dim1)[n]; p < (uintptr_t) (list->dim1)[n] + list->num_entries_per_fragment * list->entry_size; p += list->entry_size){ |
| nengel@1 | 22 (*fnPtr)((void*)p); |
| nengel@0 | 23 } |
| nengel@0 | 24 } |
| nengel@0 | 25 int offset_in_last = list->next_free_index % list->num_entries_per_fragment; |
| nengel@12 | 26 if (n < list->dim1info->numInArray){ |
| nengel@2 | 27 for(p = (uintptr_t)(list->dim1)[n]; p < (uintptr_t)(list->dim1)[n] + offset_in_last * list->entry_size; p += list->entry_size){ |
| nengel@2 | 28 (*fnPtr)((void*)p); |
| nengel@2 | 29 } |
| nengel@2 | 30 } |
| nengel@2 | 31 } |
| nengel@1 | 32 |
| nengel@12 | 33 void clearListOfArrays(ListOfArrays* list){ |
| nengel@12 | 34 list->next_free_index = 0; |
| nengel@12 | 35 } |
| nengel@12 | 36 |
| nengel@3 | 37 void freeListOfArrays(ListOfArrays* list){ |
| seanhalle@8 | 38 freeDynArrayDeep(list->dim1info,&VMS_int__free); |
| seanhalle@8 | 39 VMS_int__free((void*)list); |
| nengel@3 | 40 } |
| nengel@3 | 41 |
| nengel@2 | 42 /* |
| nengel@2 | 43 void addToListOfArraysDependency(Dependency value, ListOfArrays* list){ |
| nengel@2 | 44 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; |
| nengel@2 | 45 if(offset_in_fragment == 0){ |
| seanhalle@8 | 46 void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); |
| nengel@2 | 47 addToDynArray(newBlock,list->dim1info); |
| nengel@2 | 48 } |
| nengel@2 | 49 Dependency* typedFragment = (Dependency*) ((list->dim1)[list->dim1info->numInArray -1]); |
| nengel@2 | 50 typedFragment[offset_in_fragment] = value; |
| nengel@2 | 51 list->next_free_index++; |
| nengel@2 | 52 } |
| nengel@2 | 53 |
| nengel@2 | 54 void addToListOfArraysUnit(Unit value, ListOfArrays* list){ |
| nengel@2 | 55 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment; |
| nengel@2 | 56 if(offset_in_fragment == 0){ |
| seanhalle@8 | 57 void* newBlock = VMS_int__malloc(list->entry_size * list->num_entries_per_fragment); |
| nengel@2 | 58 addToDynArray(newBlock,list->dim1info); |
| nengel@2 | 59 } |
| nengel@2 | 60 Unit* typedFragment = (Unit*) ((list->dim1)[list->dim1info->numInArray -1]); |
| nengel@2 | 61 typedFragment[offset_in_fragment] = value; |
| nengel@2 | 62 list->next_free_index++; |
| nengel@2 | 63 } |
| seanhalle@7 | 64 */ |
| seanhalle@7 | 65 |
