text: /* drm_linux_list.h -- linux list functions for the BSDs.
   * Created: Mon Apr 7 14:30:16 1999 by anholt@FreeBSD.org
   */
  /*-
   * Copyright 2003 Eric Anholt
   * All Rights Reserved.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
   * to deal in the Software without restriction, including without limitation
   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   * and/or sell copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice (including the next
   * paragraph) shall be included in all copies or substantial portions of the
   * Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
   * OTHER DEALINGS IN THE SOFTWARE.
   *
   * Authors:
   *    Eric Anholt <anholt@FreeBSD.org>
   *
   */
  
  #include <sys/cdefs.h>
  __FBSDID("$FreeBSD: src/sys/dev/drm/drm_linux_list.h,v 1.4 2005/11/28 23:13:52 anholt Exp $");
  
  struct list_head {
  	struct list_head *next, *prev;
  };
  
  /* Cheat, assume the list_head is at the start of the struct */
  #define list_entry(entry, type, member)	(type *)(entry)
  
  static __inline__ void
  INIT_LIST_HEAD(struct list_head *head) {
  	(head)->next = head;
  	(head)->prev = head;
  }
  
  static __inline__ int
  list_empty(struct list_head *head) {
  	return (head)->next == head;
  }
  
  static __inline__ void
  list_add_tail(struct list_head *entry, struct list_head *head) {
  	(entry)->prev = (head)->prev;
  	(entry)->next = head;
  	(head)->prev->next = entry;
  	(head)->prev = entry;
  }
  
  static __inline__ void
  list_del(struct list_head *entry) {
  	(entry)->next->prev = (entry)->prev;
  	(entry)->prev->next = (entry)->next;
  }
  
  #define list_for_each(entry, head)				\
      for (entry = (head)->next; entry != head; entry = (entry)->next)
  
  #define list_for_each_safe(entry, temp, head)			\
      for (entry = (head)->next, temp = (entry)->next;		\
  	temp != head; 						\
  	entry = temp, temp = temp->next)
  
  