/usr/include/geomview/dbllist.h is in libgeomview-dev 1.9.4-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | /*
* Copyright (C) 2007 Claus-Justus Heine
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to the
Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
Simple doubly linked list implementation. Somewhat inspired from the
stuff used in the Linux kernel.
*/
#ifndef _GV_LIST_H_
#define _GV_LIST_H_
typedef struct dbllistnode
{
struct dbllistnode *next;
struct dbllistnode *prev;
} DblListNode;
/* DblListNode Head = DBLLISTINIT(Head); */
#define DBLLISTINIT(name, head) { &name.head, &name.head }
#define DBLLIST(name) DblListNode name = { &name, &name }
/* list is empty if the list head is the only member */
static inline void DblListInit(DblListNode *head)
{
head->next = head;
head->prev = head;
}
static inline bool DblListEmpty(DblListNode *head)
{
return head->next == head;
}
/* add in front, right after head */
static inline void DblListAdd(DblListNode *head, DblListNode *node)
{
node->next = head->next;
head->next->prev = node;
head->next = node;
node->prev = head;
}
/* add at the tail, right before head */
static inline void DblListAddTail(DblListNode *head, DblListNode *node)
{
node->prev = head->prev;
head->prev->next = node;
head->prev = node;
node->next = head;
}
/* One nice feature of doubly linked lists is that one does not need a
* pointer to the head to do a deletion.
*/
static inline void DblListDelete(DblListNode *node)
{
node->next->prev = node->prev;
node->prev->next = node->next;
DblListInit(node);
}
/* Copy an entire DblList, i.e. reparent it, give it a new head.
*/
static inline void DblListMove(DblListNode *fromhead, DblListNode *tohead)
{
fromhead->next->prev = tohead;
fromhead->prev->next = tohead;
tohead->next = fromhead->next;
tohead->prev = fromhead->prev;
}
/* Given a list-node "node" construct a pointer to the containing
* structure of type "ctype" which has a member with name "nodename"
* (of type DblListNode).
*/
#define DblListContainer(node, ctype, nodename) \
((ctype *)((char *)(node) - (char *)&((ctype *)0)->nodename))
/* Iterate over the list; head is the list-head, ctype the type of the
* containing structure, nodemember the name of the list-head inside
* ctype, pos is the loop variable and must be of type ctype, next is
* a temporary helper variable to protect against deletion of list
* members.
*/
#define DblListIterate(head, ctype, nodename, pos, nextp) \
for (pos = DblListContainer((head)->next, ctype, nodename), \
nextp = DblListContainer(pos->nodename.next, ctype, nodename); \
pos->nodename.next != (head)->next; \
pos = nextp, \
nextp = DblListContainer(pos->nodename.next, ctype, nodename))
#define DblListIterateNoDelete(head, ctype, nodename, pos) \
for (pos = DblListContainer((head)->next, ctype, nodename); \
pos->nodename.next != (head)->next; \
pos = DblListContainer(pos->nodename.next, ctype, nodename))
#endif
/*
* Local Variables: ***
* mode: c ***
* c-basic-offset: 2 ***
* End: ***
*/
|