Created
May 11, 2018 16:27
-
-
Save sktt/21d5f70c50e364a9b4ef48cce09df60e to your computer and use it in GitHub Desktop.
1337 lists... kernel style
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| /* 1337 linked list, kernel style */ | |
| #define MEMBER_OFFSET(type, member) \ | |
| (unsigned long)(&(((type *)0)->member)) | |
| #define LIST_ENTRY(ptr, type, member) \ | |
| ((type *)(((char *)(ptr)) - MEMBER_OFFSET(type, member))) | |
| #define LIST_INIT(list) \ | |
| (list).next = &(list);\ | |
| (list).prev = &(list); | |
| #define LIST_APPEND(list, entry)\ | |
| (entry)->prev = (list).prev;\ | |
| (entry)->next = &(list);\ | |
| (list).prev->next = entry;\ | |
| (list).prev = entry;\ | |
| #define LIST_REMOVE(entry)\ | |
| (entry)->prev->next = (entry)->next;\ | |
| (entry)->next->prev = (entry)->prev; | |
| struct list_head { | |
| struct list_head *next; | |
| struct list_head *prev; | |
| }; | |
| struct boll { | |
| int hest; | |
| char *poni; | |
| struct list_head list; | |
| }; | |
| int main(void) | |
| { | |
| struct boll kalle = { | |
| .hest = 1337, | |
| .poni = "test" | |
| }; | |
| struct boll anka = { | |
| .hest = 1412, | |
| .poni = "banki" | |
| }; | |
| struct boll danne = { | |
| .hest = 0xbaba, | |
| .poni = "kiki" | |
| }; | |
| struct boll dack = { | |
| .hest = 0xcafe, | |
| .poni = "bobo" | |
| }; | |
| LIST_INIT(kalle.list); | |
| LIST_APPEND(kalle.list, &anka.list); | |
| LIST_APPEND(kalle.list, &danne.list); | |
| LIST_APPEND(kalle.list, &dack.list); | |
| struct boll *entry = &kalle; | |
| do { | |
| printf("%s\n", entry->poni); | |
| entry = LIST_ENTRY(entry->list.next, struct boll, list); | |
| } while (entry != &kalle); | |
| LIST_REMOVE(kalle.list.next); | |
| printf("deleted banki!\n"); | |
| entry = &kalle; | |
| do { | |
| printf("%s\n", entry->poni); | |
| entry = LIST_ENTRY(entry->list.next, struct boll, list); | |
| } while (entry != &kalle); | |
| return 0; | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment