[CMAKE]
[reactos.git] / include / reactos / libs / fullfat / ff_memory.h
index 1d4507c..5064c27 100644 (file)
 #include "ff_config.h"
 #include "ff_types.h"
 
+#ifdef __REACTOS__
+// defined in fullfat.c
+void *FF_Malloc(FF_T_UINT32 allocSize);
+void FF_Free(void *pBuffer);
+#endif
 
+/*
+       HT changed type of aOffset to u32
+*/
 //---------- PROTOTYPES
 
-FF_T_UINT8             FF_getChar      (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset);
-FF_T_UINT16            FF_getShort     (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset);
-FF_T_UINT32            FF_getLong      (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset);
+#if    defined(FF_LITTLE_ENDIAN)
+
+typedef struct {
+       FF_T_UINT8      u8_0;
+       FF_T_UINT8      u8_1;
+} FF_T_SHORT;
+
+typedef struct {
+       FF_T_UINT8      u8_0;
+       FF_T_UINT8      u8_1;
+       FF_T_UINT8      u8_2;
+       FF_T_UINT8      u8_3;
+} FF_T_LONG;
+
+#elif defined(FF_BIG_ENDIAN)
+
+typedef struct {
+       FF_T_UINT8      u8_1;
+       FF_T_UINT8      u8_0;
+} FF_T_SHORT;
+
+typedef struct {
+       FF_T_UINT8      u8_3;
+       FF_T_UINT8      u8_2;
+       FF_T_UINT8      u8_1;
+       FF_T_UINT8      u8_0;
+} FF_T_LONG;
+
+#else
+
+#error Little or Big Endian? - Please set an endianess in ff_config.h
+
+#endif
+
+//! 16-bit union.
+typedef union {
+   FF_T_UINT16 u16;
+   FF_T_SHORT  bytes;
+} FF_T_UN16;
+
+//! 32-bit union.
+typedef union {
+  FF_T_UINT32  u32;
+  FF_T_LONG            bytes;
+} FF_T_UN32;
 
-void                   FF_putChar      (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT8 Value);
-void                   FF_putShort     (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT16 Value);
-void                   FF_putLong      (FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT32 Value);
+/*     HT inlined these functions:
+ */
 
-void                   *FF_Malloc(FF_T_UINT32 allocSize);
-void                   FF_Free(void *pBuffer);
+#ifdef FF_INLINE_MEMORY_ACCESS
+
+FF_INLINE FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset)
+{
+       return (FF_T_UINT8) (pBuffer[aOffset]);
+}
+
+FF_INLINE FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset)
+{
+       FF_T_UN16 u16;
+       pBuffer += aOffset;
+       u16.bytes.u8_1 = pBuffer[1];
+       u16.bytes.u8_0 = pBuffer[0];
+       return u16.u16;
+}
+
+FF_INLINE FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) {
+       FF_T_UN32 u32;
+       pBuffer += aOffset;
+       u32.bytes.u8_3 = pBuffer[3];
+       u32.bytes.u8_2 = pBuffer[2];
+       u32.bytes.u8_1 = pBuffer[1];
+       u32.bytes.u8_0 = pBuffer[0];
+       return u32.u32;
+}
+
+FF_INLINE void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value) {
+       pBuffer[aOffset] = Value;
+}
+
+FF_INLINE void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value) {
+       FF_T_UN16 u16;
+       u16.u16 = Value;
+       pBuffer += aOffset;
+       pBuffer[0] = u16.bytes.u8_0;
+       pBuffer[1] = u16.bytes.u8_1;
+}
+
+FF_INLINE void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value) {
+       FF_T_UN32 u32;
+       u32.u32 = Value;
+       pBuffer += aOffset;
+       pBuffer[0] = u32.bytes.u8_0;
+       pBuffer[1] = u32.bytes.u8_1;
+       pBuffer[2] = u32.bytes.u8_2;
+       pBuffer[3] = u32.bytes.u8_3;
+}
+
+#else
+
+FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset);
+FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset);
+FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset);
+void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value);
+void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value);
+void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value);
+
+
+#endif
 
 #endif