Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1 | pmbaty | 1 | /** |
| 2 | * PhysicsFS; a portable, flexible file i/o abstraction. |
||
| 3 | * |
||
| 4 | * Documentation is in physfs.h. It's verbose, honest. :) |
||
| 5 | * |
||
| 6 | * Please see the file LICENSE.txt in the source's root directory. |
||
| 7 | * |
||
| 8 | * This file written by Ryan C. Gordon. |
||
| 9 | */ |
||
| 10 | |||
| 11 | #define __PHYSICSFS_INTERNAL__ |
||
| 12 | #include "physfs_internal.h" |
||
| 13 | |||
| 14 | #ifndef PHYSFS_Swap16 |
||
| 15 | static inline PHYSFS_uint16 PHYSFS_Swap16(PHYSFS_uint16 D) |
||
| 16 | { |
||
| 17 | return ((D<<8)|(D>>8)); |
||
| 18 | } |
||
| 19 | #endif |
||
| 20 | #ifndef PHYSFS_Swap32 |
||
| 21 | static inline PHYSFS_uint32 PHYSFS_Swap32(PHYSFS_uint32 D) |
||
| 22 | { |
||
| 23 | return ((D<<24)|((D<<8)&0x00FF0000)|((D>>8)&0x0000FF00)|(D>>24)); |
||
| 24 | } |
||
| 25 | #endif |
||
| 26 | #ifndef PHYSFS_NO_64BIT_SUPPORT |
||
| 27 | #ifndef PHYSFS_Swap64 |
||
| 28 | static inline PHYSFS_uint64 PHYSFS_Swap64(PHYSFS_uint64 val) { |
||
| 29 | PHYSFS_uint32 hi, lo; |
||
| 30 | |||
| 31 | /* Separate into high and low 32-bit values and swap them */ |
||
| 32 | lo = (PHYSFS_uint32)(val&0xFFFFFFFF); |
||
| 33 | val >>= 32; |
||
| 34 | hi = (PHYSFS_uint32)(val&0xFFFFFFFF); |
||
| 35 | val = PHYSFS_Swap32(lo); |
||
| 36 | val <<= 32; |
||
| 37 | val |= PHYSFS_Swap32(hi); |
||
| 38 | return val; |
||
| 39 | } |
||
| 40 | #endif |
||
| 41 | #else |
||
| 42 | #ifndef PHYSFS_Swap64 |
||
| 43 | /* This is mainly to keep compilers from complaining in PHYSFS code. |
||
| 44 | If there is no real 64-bit datatype, then compilers will complain about |
||
| 45 | the fake 64-bit datatype that PHYSFS provides when it compiles user code. |
||
| 46 | */ |
||
| 47 | #define PHYSFS_Swap64(X) (X) |
||
| 48 | #endif |
||
| 49 | #endif /* PHYSFS_NO_64BIT_SUPPORT */ |
||
| 50 | |||
| 51 | |||
| 52 | /* Byteswap item from the specified endianness to the native endianness */ |
||
| 53 | #if PHYSFS_BYTEORDER == PHYSFS_LIL_ENDIAN |
||
| 54 | PHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 x) { return x; } |
||
| 55 | PHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 x) { return x; } |
||
| 56 | PHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 x) { return x; } |
||
| 57 | PHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 x) { return x; } |
||
| 58 | PHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 x) { return x; } |
||
| 59 | PHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 x) { return x; } |
||
| 60 | |||
| 61 | PHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 x) { return PHYSFS_Swap16(x); } |
||
| 62 | PHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 x) { return PHYSFS_Swap16(x); } |
||
| 63 | PHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 x) { return PHYSFS_Swap32(x); } |
||
| 64 | PHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 x) { return PHYSFS_Swap32(x); } |
||
| 65 | PHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 x) { return PHYSFS_Swap64(x); } |
||
| 66 | PHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 x) { return PHYSFS_Swap64(x); } |
||
| 67 | #else |
||
| 68 | PHYSFS_uint16 PHYSFS_swapULE16(PHYSFS_uint16 x) { return PHYSFS_Swap16(x); } |
||
| 69 | PHYSFS_sint16 PHYSFS_swapSLE16(PHYSFS_sint16 x) { return PHYSFS_Swap16(x); } |
||
| 70 | PHYSFS_uint32 PHYSFS_swapULE32(PHYSFS_uint32 x) { return PHYSFS_Swap32(x); } |
||
| 71 | PHYSFS_sint32 PHYSFS_swapSLE32(PHYSFS_sint32 x) { return PHYSFS_Swap32(x); } |
||
| 72 | PHYSFS_uint64 PHYSFS_swapULE64(PHYSFS_uint64 x) { return PHYSFS_Swap64(x); } |
||
| 73 | PHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 x) { return PHYSFS_Swap64(x); } |
||
| 74 | |||
| 75 | PHYSFS_uint16 PHYSFS_swapUBE16(PHYSFS_uint16 x) { return x; } |
||
| 76 | PHYSFS_sint16 PHYSFS_swapSBE16(PHYSFS_sint16 x) { return x; } |
||
| 77 | PHYSFS_uint32 PHYSFS_swapUBE32(PHYSFS_uint32 x) { return x; } |
||
| 78 | PHYSFS_sint32 PHYSFS_swapSBE32(PHYSFS_sint32 x) { return x; } |
||
| 79 | PHYSFS_uint64 PHYSFS_swapUBE64(PHYSFS_uint64 x) { return x; } |
||
| 80 | PHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 x) { return x; } |
||
| 81 | #endif |
||
| 82 | |||
| 83 | static inline int readAll(PHYSFS_File *file, void *val, const size_t len) |
||
| 84 | { |
||
| 85 | return (PHYSFS_readBytes(file, val, len) == len); |
||
| 86 | } /* readAll */ |
||
| 87 | |||
| 88 | #define PHYSFS_BYTEORDER_READ(datatype, swaptype) \ |
||
| 89 | int PHYSFS_read##swaptype(PHYSFS_File *file, PHYSFS_##datatype *val) { \ |
||
| 90 | PHYSFS_##datatype in; \ |
||
| 91 | BAIL_IF(val == NULL, PHYSFS_ERR_INVALID_ARGUMENT, 0); \ |
||
| 92 | BAIL_IF_ERRPASS(!readAll(file, &in, sizeof (in)), 0); \ |
||
| 93 | *val = PHYSFS_swap##swaptype(in); \ |
||
| 94 | return 1; \ |
||
| 95 | } |
||
| 96 | |||
| 97 | PHYSFS_BYTEORDER_READ(sint16, SLE16) |
||
| 98 | PHYSFS_BYTEORDER_READ(uint16, ULE16) |
||
| 99 | PHYSFS_BYTEORDER_READ(sint16, SBE16) |
||
| 100 | PHYSFS_BYTEORDER_READ(uint16, UBE16) |
||
| 101 | PHYSFS_BYTEORDER_READ(sint32, SLE32) |
||
| 102 | PHYSFS_BYTEORDER_READ(uint32, ULE32) |
||
| 103 | PHYSFS_BYTEORDER_READ(sint32, SBE32) |
||
| 104 | PHYSFS_BYTEORDER_READ(uint32, UBE32) |
||
| 105 | PHYSFS_BYTEORDER_READ(sint64, SLE64) |
||
| 106 | PHYSFS_BYTEORDER_READ(uint64, ULE64) |
||
| 107 | PHYSFS_BYTEORDER_READ(sint64, SBE64) |
||
| 108 | PHYSFS_BYTEORDER_READ(uint64, UBE64) |
||
| 109 | |||
| 110 | |||
| 111 | static inline int writeAll(PHYSFS_File *f, const void *val, const size_t len) |
||
| 112 | { |
||
| 113 | return (PHYSFS_writeBytes(f, val, len) == len); |
||
| 114 | } /* writeAll */ |
||
| 115 | |||
| 116 | #define PHYSFS_BYTEORDER_WRITE(datatype, swaptype) \ |
||
| 117 | int PHYSFS_write##swaptype(PHYSFS_File *file, PHYSFS_##datatype val) { \ |
||
| 118 | const PHYSFS_##datatype out = PHYSFS_swap##swaptype(val); \ |
||
| 119 | BAIL_IF_ERRPASS(!writeAll(file, &out, sizeof (out)), 0); \ |
||
| 120 | return 1; \ |
||
| 121 | } |
||
| 122 | |||
| 123 | PHYSFS_BYTEORDER_WRITE(sint16, SLE16) |
||
| 124 | PHYSFS_BYTEORDER_WRITE(uint16, ULE16) |
||
| 125 | PHYSFS_BYTEORDER_WRITE(sint16, SBE16) |
||
| 126 | PHYSFS_BYTEORDER_WRITE(uint16, UBE16) |
||
| 127 | PHYSFS_BYTEORDER_WRITE(sint32, SLE32) |
||
| 128 | PHYSFS_BYTEORDER_WRITE(uint32, ULE32) |
||
| 129 | PHYSFS_BYTEORDER_WRITE(sint32, SBE32) |
||
| 130 | PHYSFS_BYTEORDER_WRITE(uint32, UBE32) |
||
| 131 | PHYSFS_BYTEORDER_WRITE(sint64, SLE64) |
||
| 132 | PHYSFS_BYTEORDER_WRITE(uint64, ULE64) |
||
| 133 | PHYSFS_BYTEORDER_WRITE(sint64, SBE64) |
||
| 134 | PHYSFS_BYTEORDER_WRITE(uint64, UBE64) |
||
| 135 | |||
| 136 | /* end of physfs_byteorder.c ... */ |
||
| 137 |