Subversion Repositories Games.Carmageddon

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 pmbaty 1
#include "bswap.h"
2
#include "harness/trace.h"
3
 
4
#define SWAP(A, B) do { (A) ^= (B); (B) ^= (A); (A) ^= (B); } while (0)
5
 
6
 
7
// IDA: br_uint_32 __cdecl BrSwap32(br_uint_32 l)
8
br_uint_32 BrSwap32(br_uint_32 l) {
9
    union { // size: 0x4
10
        unsigned long l; // @0x0
11
        unsigned char c[4]; // @0x0
12
    } u;
13
    LOG_TRACE10("(%d)", l);
14
 
15
    u.l = l;
16
    SWAP(u.c[0], u.c[3]);
17
    SWAP(u.c[1], u.c[2]);
18
    return u.l;
19
}
20
 
21
// IDA: br_uint_16 __cdecl BrSwap16(br_uint_16 s)
22
br_uint_16 BrSwap16(br_uint_16 s) {
23
    union { // size: 0x2
24
        unsigned short s; // @0x0
25
        unsigned char c[2]; // @0x0
26
    } u;
27
    LOG_TRACE("(%d)", s);
28
 
29
    u.s = s;
30
    SWAP(u.c[0], u.c[1]);
31
    return u.s;
32
}
33
 
34
// IDA: br_float __cdecl BrSwapFloat(br_float f)
35
br_float BrSwapFloat(br_float f) {
36
    union { // size: 0x4
37
        br_float f; // @0x0
38
        unsigned char c[4]; // @0x0
39
    } u;
40
    LOG_TRACE("(%f)", f);
41
 
42
    u.f = f;
43
    SWAP(u.c[0], u.c[3]);
44
    SWAP(u.c[1], u.c[2]);
45
    return u.f;
46
}
47
 
48
 
49
// IDA: void* __cdecl BrSwapBlock(void *block, int count, int size)
50
void* BrSwapBlock(void* block, int count, int size) {
51
    br_uint_8* cp;
52
    int i;
53
    int k;
54
    LOG_TRACE9("(%p, %d, %d)", block, count, size);
55
 
56
    cp = (br_uint_8*)block;
57
    switch (size) {
58
    case 1:
59
        break;
60
    case 2:
61
        for (i = 0; i < count; i++) {
62
            SWAP(cp[0], cp[1]);
63
            cp += 2;
64
        }
65
        break;
66
    case 4:
67
        for (i = 0; i < count; i++) {
68
            SWAP(cp[0], cp[3]);
69
            SWAP(cp[1], cp[2]);
70
            cp += 4;
71
        }
72
        break;
73
 
74
    default:
75
        for (i = 0; i < count; i++) {
76
            for (k = 0; k < size / 2; k++) {
77
                SWAP(cp[k], cp[size - k - 1]);
78
            }
79
            cp += size;
80
        }
81
        break;
82
    }
83
    return block;
84
}