#include #include #include #include #include #include #include "nickel/linkedlist.h" // helper function to format bytes out. char* get_bytes_f(long bytes, char* str) { if(str != NULL) { if (bytes > 0) { if (bytes < 1024) { sprintf(str, "%ld bytes", bytes); } if ((bytes >= 1024) & (bytes < 1024*1024)) { sprintf(str, "%.3f Kbytes", ((double)bytes/(double)1024.00)); } if (bytes >= 1024*1024) { sprintf(str, "%.3f Mbytes",(double)bytes/(double)(1024*1024)); } } } else { return NULL; } return str; } typedef struct test_data { uint8_t data1; uint16_t data2; uint32_t data3; uint64_t data4; ni_list_node link; } test_data; int main (void) { time_t time_now; srand(time(&time_now)); ni_list data_instances; ni_list__init(&data_instances); printf("list is allocated at %p\n", (void*)&data_instances); size_t test_size = 10; for(size_t i = 0; i < test_size; i++) { test_data* t = malloc(sizeof(test_data)); printf("n = %ld allocated data at %p...test_data.link at %p...\n", i, (void*)t, (void*)&t->link); t->data1 = (uint8_t)(rand() % UINT8_MAX); t->data2 = (uint16_t)(rand() % UINT16_MAX); t->data3 = (uint32_t)(rand() % UINT32_MAX); t->data4 = (((uint64_t)(rand() % UINT32_MAX)) << 32 | (rand() %UINT32_MAX)); // ensure our link points at nothing. t->link.next = NULL; t->link.prev = NULL; ni_list__push_back(&data_instances, &(t->link)); printf("write: n = %ld: %d %d %d %ld \n\tnext: %p\n\tprev: %p\n", i, t->data1, t->data2, t->data3, t->data4, (void*)t->link.next, (void*)t->link.prev); } printf("Inserted %ld count entries into test list...\n", data_instances.count); { // scope for access to iter and list size_t i = 0; NI_LIST__FOREACH(&data_instances) { test_data* t = NI_LIST_CONTAINER_OF(it, test_data, link); printf("read: %ld: %d %d %d %ld \n\tnext: %p\n\tprev: %p\n", i, t->data1, t->data2, t->data3, t->data4, (void*)it->next, (void*)it->prev); i++; } } // drain from back of list and remove then free entries while (!ni_list__is_empty(&data_instances)) { ni_list_node* tail = ni_list__get_back(&data_instances); ni_list__remove(&data_instances, tail); test_data* t = NI_LIST_CONTAINER_OF(tail, test_data, link); free(t); } /* all done! */ }