summaryrefslogtreecommitdiff
path: root/support/regression/tests/bitfields-bits2.c.in
blob: 5dcdae6a941ef8f031d2632270e58855761c7d3e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/** Operations with 1-bit sized bitfields
    preBits: 0, 8, 16
    pattern: 0, 1
*/

#pragma disable_warning 88

#include <testfwk.h>
#ifdef __sun__
#include <inttypes.h>
#else
#include <stdint.h>
#endif

#include <stdbool.h>

#define PRE_BITS ({preBits})

typedef struct
{
    #if PRE_BITS > 0
        unsigned int preBits   : PRE_BITS;
    #endif
    unsigned int bit0       : 1;
    unsigned int bit1       : 1;
    unsigned int bit2       : 1;
    unsigned int bit3       : 1;
    unsigned int bit4       : 1;
    unsigned int bit5       : 1;
    unsigned int bit6       : 1;
    unsigned int bit7       : 1;
    
    unsigned int postBits   : 8;
}struct_8bits;


#if PATTERN == 0
    #define PRE_BIT_VALUE 0
    #define POST_BIT_VALUE 0
#else
    #define PRE_BIT_VALUE ((1UL << PRE_BITS) - 1)
    #define POST_BIT_VALUE 0xFF
#endif

bool
bits_check_value_no_cast(const struct_8bits * var, const uint8_t value)
{
    if((var->bit0 > 0) != ((value & 0x01) > 0)) return false;
    if((var->bit1 > 0) != ((value & 0x02) > 0)) return false;
    if((var->bit2 > 0) != ((value & 0x04) > 0)) return false;
    if((var->bit3 > 0) != ((value & 0x08) > 0)) return false;
        
    if((var->bit4 > 0) != ((value & 0x10) > 0)) return false;
    if((var->bit5 > 0) != ((value & 0x20) > 0)) return false;
    if((var->bit6 > 0) != ((value & 0x40) > 0)) return false;
    if((var->bit7 > 0) != ((value & 0x80) > 0)) return false;
    
    return true;
}


#define CAST_TO_UINT8(x) ((uint8_t)(x))

// Lack of memory.
#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15)

bool
bits_check_value(const struct_8bits * const var, const uint8_t value)
{
    #if PRE_BITS > 0
        if(var->preBits != PRE_BIT_VALUE) return false;
    #endif

    if(var->postBits != POST_BIT_VALUE) return false;
    
    if((var->bit0 > 0) != (CAST_TO_UINT8(value & 0x01) > 0)) return false;
    if((var->bit1 > 0) != (CAST_TO_UINT8(value & 0x02) > 0)) return false;
    if((var->bit2 > 0) != (CAST_TO_UINT8(value & 0x04) > 0)) return false;
    if((var->bit3 > 0) != (CAST_TO_UINT8(value & 0x08) > 0)) return false;
        
    if((var->bit4 > 0) != (CAST_TO_UINT8(value & 0x10) > 0)) return false;
    if((var->bit5 > 0) != (CAST_TO_UINT8(value & 0x20) > 0)) return false;
    if((var->bit6 > 0) != (CAST_TO_UINT8(value & 0x40) > 0)) return false;
    if((var->bit7 > 0) != (CAST_TO_UINT8(value & 0x80) > 0)) return false;
    
    return bits_check_value_no_cast(var, value);
}

void 
bits_set_value(struct_8bits * const var, const uint8_t value)
{
    #if PRE_BITS > 0
        var->preBits = PRE_BIT_VALUE;
    #endif
    
    var->postBits = POST_BIT_VALUE;
    
    var->bit0 = CAST_TO_UINT8(value & 0x01) > 0;
    var->bit1 = CAST_TO_UINT8(value & 0x02) > 0;
    var->bit2 = CAST_TO_UINT8(value & 0x04) > 0;
    var->bit3 = CAST_TO_UINT8(value & 0x08) > 0;
        
    var->bit4 = CAST_TO_UINT8(value & 0x10) > 0;
    var->bit5 = CAST_TO_UINT8(value & 0x20) > 0;
    var->bit6 = CAST_TO_UINT8(value & 0x40) > 0;
    var->bit7 = CAST_TO_UINT8(value & 0x80) > 0;
}
#endif

#define BITS_SET_AND_CHECK(value) bits_set_value(&volatileBits, value); ASSERT(bits_check_value(&volatileBits, value))

static void
testBitfields(void)
{
// Lack of memory.
#if !defined(__SDCC_pdk14) && !defined(__SDCC_pdk15)
    volatile struct_8bits volatileBits;

    BITS_SET_AND_CHECK(0x00);
    BITS_SET_AND_CHECK(0xFF);
    
    BITS_SET_AND_CHECK(0x0F);
    BITS_SET_AND_CHECK(0xF0);
    
    BITS_SET_AND_CHECK(0x01);
    BITS_SET_AND_CHECK(0x02);
    BITS_SET_AND_CHECK(0x04);
    BITS_SET_AND_CHECK(0x08);
    
    BITS_SET_AND_CHECK(0x10);
    BITS_SET_AND_CHECK(0x20);
    BITS_SET_AND_CHECK(0x40);
    BITS_SET_AND_CHECK(0x80);
#endif
}