Skip to content

Instantly share code, notes, and snippets.

@sktt
Created May 11, 2018 16:27
Show Gist options
  • Select an option

  • Save sktt/21d5f70c50e364a9b4ef48cce09df60e to your computer and use it in GitHub Desktop.

Select an option

Save sktt/21d5f70c50e364a9b4ef48cce09df60e to your computer and use it in GitHub Desktop.
1337 lists... kernel style
#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