devextras.h
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:6k
源码类别:

DVD

开发平台:

C/C++

  1. /*
  2.  * YAFFS: Yet another FFS. A NAND-flash specific file system. 
  3.  * devextras.h
  4.  *
  5.  * Copyright (C) 2002 Aleph One Ltd.
  6.  *   for Toby Churchill Ltd and Brightstar Engineering
  7.  *
  8.  * Created by Charles Manning <charles@aleph1.co.uk>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU Lesser General Public License version 2.1 as
  12.  * published by the Free Software Foundation.
  13.  *
  14.  * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
  15.  *
  16.  * This file is just holds extra declarations used during development.
  17.  * Most of these are from kernel includes placed here so we can use them in 
  18.  * applications.
  19.  *
  20.  * $Id: devextras.h,v 1.5 2002/09/27 20:50:50 charles Exp $
  21.  *
  22.  */
  23.  
  24. #ifndef __EXTRAS_H__
  25. #define __EXTRAS_H__
  26. #define __inline__ 
  27. #if defined WIN32
  28. #define __inline__ __inline
  29. #define new newHack
  30. #endif
  31. #if !(defined __KERNEL__) || (defined WIN32)
  32. typedef unsigned char   __u8;
  33. typedef unsigned short  __u16;
  34. typedef unsigned        __u32;
  35. /*
  36.  * Simple doubly linked list implementation.
  37.  *
  38.  * Some of the internal functions ("__xxx") are useful when
  39.  * manipulating whole lists rather than single entries, as
  40.  * sometimes we already know the next/prev entries and we can
  41.  * generate better code by using them directly rather than
  42.  * using the generic single-entry routines.
  43.  */
  44.  
  45.  #define prefetch(x) 1
  46.  
  47. struct list_head {
  48. struct list_head *next, *prev;
  49. };
  50. #define LIST_HEAD_INIT(name) { &(name), &(name) }
  51. #define LIST_HEAD(name) 
  52. struct list_head name = LIST_HEAD_INIT(name)
  53. #define INIT_LIST_HEAD(ptr) do { 
  54. (ptr)->next = (ptr); (ptr)->prev = (ptr); 
  55. } while (0)
  56. /*
  57.  * Insert a new entry between two known consecutive entries.
  58.  *
  59.  * This is only for internal list manipulation where we know
  60.  * the prev/next entries already!
  61.  */
  62. static __inline__ void __list_add(struct list_head * new,
  63. struct list_head * prev,
  64. struct list_head * next)
  65. {
  66. next->prev = new;
  67. new->next = next;
  68. new->prev = prev;
  69. prev->next = new;
  70. }
  71. /**
  72.  * list_add - add a new entry
  73.  * @new: new entry to be added
  74.  * @head: list head to add it after
  75.  *
  76.  * Insert a new entry after the specified head.
  77.  * This is good for implementing stacks.
  78.  */
  79. static __inline__ void list_add(struct list_head *new, struct list_head *head)
  80. {
  81. __list_add(new, head, head->next);
  82. }
  83. /**
  84.  * list_add_tail - add a new entry
  85.  * @new: new entry to be added
  86.  * @head: list head to add it before
  87.  *
  88.  * Insert a new entry before the specified head.
  89.  * This is useful for implementing queues.
  90.  */
  91. static __inline__ void list_add_tail(struct list_head *new, struct list_head *head)
  92. {
  93. __list_add(new, head->prev, head);
  94. }
  95. /*
  96.  * Delete a list entry by making the prev/next entries
  97.  * point to each other.
  98.  *
  99.  * This is only for internal list manipulation where we know
  100.  * the prev/next entries already!
  101.  */
  102. static __inline__ void __list_del(struct list_head * prev,
  103.   struct list_head * next)
  104. {
  105. next->prev = prev;
  106. prev->next = next;
  107. }
  108. /**
  109.  * list_del - deletes entry from list.
  110.  * @entry: the element to delete from the list.
  111.  * Note: list_empty on entry does not return true after this, the entry is in an undefined state.
  112.  */
  113. static __inline__ void list_del(struct list_head *entry)
  114. {
  115. __list_del(entry->prev, entry->next);
  116. }
  117. /**
  118.  * list_del_init - deletes entry from list and reinitialize it.
  119.  * @entry: the element to delete from the list.
  120.  */
  121. static __inline__ void list_del_init(struct list_head *entry)
  122. {
  123. __list_del(entry->prev, entry->next);
  124. INIT_LIST_HEAD(entry);
  125. }
  126. /**
  127.  * list_empty - tests whether a list is empty
  128.  * @head: the list to test.
  129.  */
  130. static __inline__ int list_empty(struct list_head *head)
  131. {
  132. return head->next == head;
  133. }
  134. /**
  135.  * list_splice - join two lists
  136.  * @list: the new list to add.
  137.  * @head: the place to add it in the first list.
  138.  */
  139. static __inline__ void list_splice(struct list_head *list, struct list_head *head)
  140. {
  141. struct list_head *first = list->next;
  142. if (first != list) {
  143. struct list_head *last = list->prev;
  144. struct list_head *at = head->next;
  145. first->prev = head;
  146. head->next = first;
  147. last->next = at;
  148. at->prev = last;
  149. }
  150. }
  151. /**
  152.  * list_entry - get the struct for this entry
  153.  * @ptr: the &struct list_head pointer.
  154.  * @type: the type of the struct this is embedded in.
  155.  * @member: the name of the list_struct within the struct.
  156.  */
  157. #define list_entry(ptr, type, member) 
  158. ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
  159. /**
  160.  * list_for_each - iterate over a list
  161.  * @pos: the &struct list_head to use as a loop counter.
  162.  * @head: the head for your list.
  163.  */
  164. #define list_for_each(pos, head) 
  165. for (pos = (head)->next, prefetch(pos->next); pos != (head); 
  166.          pos = pos->next, prefetch(pos->next))
  167. /**
  168.  * list_for_each_safe - iterate over a list safe against removal of list entry
  169.  * @pos: the &struct list_head to use as a loop counter.
  170.  * @n: another &struct list_head to use as temporary storage
  171.  * @head: the head for your list.
  172.  */
  173. #define list_for_each_safe(pos, n, head) 
  174. for (pos = (head)->next, n = pos->next; pos != (head); 
  175. pos = n, n = pos->next)
  176. /*
  177.  * File types
  178.  */
  179. #define DT_UNKNOWN 0
  180. #define DT_FIFO 1
  181. #define DT_CHR 2
  182. #define DT_DIR 4
  183. #define DT_BLK 6
  184. #define DT_REG 8
  185. #define DT_LNK 10
  186. #define DT_SOCK 12
  187. #define DT_WHT 14
  188. #ifndef WIN32
  189. #include <sys/stat.h>
  190. #endif
  191. /*
  192.  * Attribute flags.  These should be or-ed together to figure out what
  193.  * has been changed!
  194.  */
  195. #define ATTR_MODE 1
  196. #define ATTR_UID 2
  197. #define ATTR_GID 4
  198. #define ATTR_SIZE 8
  199. #define ATTR_ATIME 16
  200. #define ATTR_MTIME 32
  201. #define ATTR_CTIME 64
  202. #define ATTR_ATIME_SET 128
  203. #define ATTR_MTIME_SET 256
  204. #define ATTR_FORCE 512 /* Not a change, but a change it */
  205. #define ATTR_ATTR_FLAG 1024
  206. struct iattr {
  207. unsigned int ia_valid;
  208. unsigned ia_mode;
  209. unsigned ia_uid;
  210. unsigned ia_gid;
  211. unsigned ia_size;
  212. unsigned ia_atime;
  213. unsigned ia_mtime;
  214. unsigned ia_ctime;
  215. unsigned int ia_attr_flags;
  216. };
  217. #define KERN_DEBUG
  218. #else
  219. #ifndef WIN32
  220. #include <linux/types.h>
  221. #include <linux/list.h>
  222. #include <linux/fs.h>
  223. #include <linux/stat.h>
  224. #endif
  225. #endif
  226. #if defined WIN32
  227. #undef new
  228. #endif 
  229. #endif