- Add DDK alignment macros and move/rename the ones in the NDK for user-mode only...
[reactos.git] / reactos / include / reactos / helper.h
index 465f96d..c7d933e 100644 (file)
-#ifndef _HELPER_H\r
-#define _HELPER_H\r
\r
-#define ROUNDUP(a,b)   ((((a)+(b)-1)/(b))*(b))\r
-#define ROUNDDOWN(a,b) (((a)/(b))*(b))\r
-#define ROUND_UP ROUNDUP\r
-#define ROUND_DOWN ROUNDDOWN\r
-#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~(PAGE_SIZE-1)))\r
-#define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGE_SIZE) ? ((((ULONG)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG)x) )\r
-#define ABS_VALUE(V) (((V) < 0) ? -(V) : (V))\r
-#define RtlRosMin(X,Y) (((X) < (Y))? (X) : (Y))\r
-#define RtlRosMin3(X,Y,Z) (((X) < (Y)) ? RtlRosMin(X,Z) : RtlRosMin(Y,Z))\r
-#define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)\r
-#define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)\r
-#define EXPORTED __declspec(dllexport)\r
-#define IMPORTED __declspec(dllimport)\r
-#define LIST_FOR_EACH(entry, head) \\r
-   for(entry = (head)->Flink; entry != (head); entry = entry->Flink)\r
-#define LIST_FOR_EACH_SAFE(tmp_entry, head, ptr, type, field) \\r
-   for ((tmp_entry)=(head)->Flink; (tmp_entry)!=(head) && \\r
-        ((ptr) = CONTAINING_RECORD(tmp_entry,type,field)) && \\r
-        ((tmp_entry) = (tmp_entry)->Flink); )\r
-#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a                 +  \\r
-                        ((PIMAGE_DOS_HEADER)a)->e_lfanew    +  \\r
-                        sizeof (IMAGE_NT_SIGNATURE)                 +  \\r
-                        sizeof (IMAGE_FILE_HEADER)))\r
-#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))\r
-#define RVA(m, b) ((PVOID)((ULONG_PTR)(b) + (ULONG_PTR)(m)))\r
-#define NTSTAT_SEVERITY_SHIFT 30\r
-#define NTSTAT_SEVERITY_MASK  0x00000003\r
-#define NTSTAT_FACILITY_SHIFT 16\r
-#define NTSTAT_FACILITY_MASK  0x00000FFF\r
-#define NTSTAT_CUSTOMER_MASK  0x20000000\r
-#define NT_SEVERITY(StatCode) (((StatCode) >> NTSTAT_SEVERITY_SHIFT) & NTSTAT_SEVERITY_MASK)\r
-#define NT_FACILITY(StatCode) (((StatCode) >> NTSTAT_FACILITY_SHIFT) & NTSTAT_FACILITY_MASK)\r
-#define NT_CUSTOMER(StatCode) ((StatCode) & NTSTAT_CUSTOMER_MASK)\r
-#define RELATIVE_TIME(wait) (-(wait))\r
-#define NANOS_TO_100NS(nanos) (((LONGLONG)(nanos)) / 100)\r
-#define MICROS_TO_100NS(micros) (((LONGLONG)(micros)) * NANOS_TO_100NS(1000))\r
-#define MILLIS_TO_100NS(milli) (((LONGLONG)(milli)) * MICROS_TO_100NS(1000))\r
-#define SECONDS_TO_100NS(seconds) (((LONGLONG)(seconds)) * MILLIS_TO_100NS(1000))\r
-#define MINUTES_TO_100NS(minutes) (((LONGLONG)(minutes)) * SECONDS_TO_100NS(60))\r
-#define HOURS_TO_100NS(hours) (((LONGLONG)(hours)) * MINUTES_TO_100NS(60))\r
-#define UNICODIZE1(x) L##x\r
-#define UNICODIZE(x) UNICODIZE1(x)\r
-#define InsertAscendingListFIFO(ListHead, Type, ListEntryField, NewEntry, SortField)\\r
-{\\r
-  PLIST_ENTRY current;\\r
-\\r
-  current = (ListHead)->Flink;\\r
-  while (current != (ListHead))\\r
-  {\\r
-    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >\\r
-        (NewEntry)->SortField)\\r
-    {\\r
-      break;\\r
-    }\\r
-    current = current->Flink;\\r
-  }\\r
-\\r
-  InsertTailList(current, &((NewEntry)->ListEntryField));\\r
-}\r
-\r
-#define InsertDescendingListFIFO(ListHead, Type, ListEntryField, NewEntry, SortField)\\r
-{\\r
-  PLIST_ENTRY current;\\r
-\\r
-  current = (ListHead)->Flink;\\r
-  while (current != (ListHead))\\r
-  {\\r
-    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField <\\r
-        (NewEntry)->SortField)\\r
-    {\\r
-      break;\\r
-    }\\r
-    current = current->Flink;\\r
-  }\\r
-\\r
-  InsertTailList(current, &((NewEntry)->ListEntryField));\\r
-}\r
-\r
-#define InsertAscendingList(ListHead, Type, ListEntryField, NewEntry, SortField)\\r
-{\\r
-  PLIST_ENTRY current;\\r
-\\r
-  current = (ListHead)->Flink;\\r
-  while (current != (ListHead))\\r
-  {\\r
-    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >=\\r
-        (NewEntry)->SortField)\\r
-    {\\r
-      break;\\r
-    }\\r
-    current = current->Flink;\\r
-  }\\r
-\\r
-  InsertTailList(current, &((NewEntry)->ListEntryField));\\r
-}\r
-\r
-#define InsertDescendingList(ListHead, Type, ListEntryField, NewEntry, SortField)\\r
-{\\r
-  PLIST_ENTRY current;\\r
-\\r
-  current = (ListHead)->Flink;\\r
-  while (current != (ListHead))\\r
-  {\\r
-    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField <=\\r
-        (NewEntry)->SortField)\\r
-    {\\r
-      break;\\r
-    }\\r
-    current = current->Flink;\\r
-  }\\r
-\\r
-  InsertTailList(current, &((NewEntry)->ListEntryField));\\r
-}\r
-\r
-#endif\r
+#ifndef _HELPER_H
+#define _HELPER_H
+
+#ifndef ROUND_UP
+#define ROUND_UP(n, align) \
+    ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
+#endif
+
+#ifndef ROUND_DOWN
+#define ROUND_DOWN(n, align) \
+    (((ULONG)n) & ~((align) - 1l))
+#endif
+
+#ifndef ROUNDUP
+#define ROUNDUP ROUND_UP
+#endif
+
+#ifndef ROUNDDOWN
+#define ROUNDDOWN ROUND_DOWN
+#endif
+
+#ifndef PAGE_ROUND_DOWN
+#define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~(PAGE_SIZE-1)))
+#endif
+
+#ifndef PAGE_ROUND_UP
+#define PAGE_ROUND_UP(x) ( (((ULONG)x)%PAGE_SIZE) ? ((((ULONG)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG)x) )
+#endif
+
+#define ABS_VALUE(V) (((V) < 0) ? -(V) : (V))
+
+#define RtlRosMin3(X,Y,Z) (((X) < (Y)) ? RtlRosMin(X,Z) : RtlRosMin(Y,Z))
+
+#ifndef KEBUGCHECK
+#define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
+#define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
+#endif
+
+/* iterate through the list using a list entry. 
+ * elem is set to NULL if the list is run thru without breaking out or if list is empty.
+ */
+#define LIST_FOR_EACH(elem, list, type, field) \
+    for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \
+         &(elem)->field != (list) || (elem = NULL); \
+         (elem) = CONTAINING_RECORD((elem)->field.Flink, type, field))
+         
+/* iterate through the list using a list entry, with safety against removal 
+ * elem is set to NULL if the list is run thru without breaking out or if list is empty.
+ */
+#define LIST_FOR_EACH_SAFE(cursor, cursor2, list, type, field) \
+    for ((cursor) = CONTAINING_RECORD((list)->Flink, type, field), \
+         (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field); \
+         &(cursor)->field != (list) || (cursor = NULL); \
+         (cursor) = (cursor2), \
+         (cursor2) = CONTAINING_RECORD((cursor)->field.Flink, type, field))
+         
+#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a                 +  \
+                        ((PIMAGE_DOS_HEADER)a)->e_lfanew    +  \
+                        sizeof (IMAGE_NT_SIGNATURE)                 +  \
+                        sizeof (IMAGE_FILE_HEADER)))
+#ifndef TAG
+#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
+#endif
+#define RVA(m, b) ((PVOID)((ULONG_PTR)(b) + (ULONG_PTR)(m)))
+#define NTSTAT_SEVERITY_SHIFT 30
+#define NTSTAT_SEVERITY_MASK  0x00000003
+#define NTSTAT_FACILITY_SHIFT 16
+#define NTSTAT_FACILITY_MASK  0x00000FFF
+#define NTSTAT_CUSTOMER_MASK  0x20000000
+#define NT_SEVERITY(StatCode) (((StatCode) >> NTSTAT_SEVERITY_SHIFT) & NTSTAT_SEVERITY_MASK)
+#define NT_FACILITY(StatCode) (((StatCode) >> NTSTAT_FACILITY_SHIFT) & NTSTAT_FACILITY_MASK)
+#define NT_CUSTOMER(StatCode) ((StatCode) & NTSTAT_CUSTOMER_MASK)
+#define RELATIVE_TIME(wait) (-(wait))
+#define NANOS_TO_100NS(nanos) (((LONGLONG)(nanos)) / 100)
+#define MICROS_TO_100NS(micros) (((LONGLONG)(micros)) * NANOS_TO_100NS(1000))
+#define MILLIS_TO_100NS(milli) (((LONGLONG)(milli)) * MICROS_TO_100NS(1000))
+#define SECONDS_TO_100NS(seconds) (((LONGLONG)(seconds)) * MILLIS_TO_100NS(1000))
+#define MINUTES_TO_100NS(minutes) (((LONGLONG)(minutes)) * SECONDS_TO_100NS(60))
+#define HOURS_TO_100NS(hours) (((LONGLONG)(hours)) * MINUTES_TO_100NS(60))
+#define UNICODIZE1(x) L##x
+#define UNICODIZE(x) UNICODIZE1(x)
+#define InsertAscendingListFIFO(ListHead, NewEntry, Type, ListEntryField, SortField)\
+{\
+  PLIST_ENTRY current;\
+\
+  current = (ListHead)->Flink;\
+  while (current != (ListHead))\
+  {\
+    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >\
+        (NewEntry)->SortField)\
+    {\
+      break;\
+    }\
+    current = current->Flink;\
+  }\
+\
+  InsertTailList(current, &((NewEntry)->ListEntryField));\
+}
+
+#define InsertDescendingListFIFO(ListHead, NewEntry, Type, ListEntryField, SortField)\
+{\
+  PLIST_ENTRY current;\
+\
+  current = (ListHead)->Flink;\
+  while (current != (ListHead))\
+  {\
+    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField <\
+        (NewEntry)->SortField)\
+    {\
+      break;\
+    }\
+    current = current->Flink;\
+  }\
+\
+  InsertTailList(current, &((NewEntry)->ListEntryField));\
+}
+
+#define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField, SortField)\
+{\
+  PLIST_ENTRY current;\
+\
+  current = (ListHead)->Flink;\
+  while (current != (ListHead))\
+  {\
+    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >=\
+        (NewEntry)->SortField)\
+    {\
+      break;\
+    }\
+    current = current->Flink;\
+  }\
+\
+  InsertTailList(current, &((NewEntry)->ListEntryField));\
+}
+
+#define InsertDescendingList(ListHead, NewEntry, Type, ListEntryField, SortField)\
+{\
+  PLIST_ENTRY current;\
+\
+  current = (ListHead)->Flink;\
+  while (current != (ListHead))\
+  {\
+    if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField <=\
+        (NewEntry)->SortField)\
+    {\
+      break;\
+    }\
+    current = current->Flink;\
+  }\
+\
+  InsertTailList(current, &((NewEntry)->ListEntryField));\
+}
+
+#endif