Skip to content

Commit 9fd983c

Browse files
committed
Add big endian support
1 parent 96fdc35 commit 9fd983c

File tree

4 files changed

+126
-2
lines changed

4 files changed

+126
-2
lines changed

src/formats/internal/memreader.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,22 @@ uint8_t memread_ubyte(memreader *reader) {
6262

6363
uint16_t memread_uword(memreader *reader) {
6464
uint16_t r;
65+
#ifdef BIG_ENDIAN_BUILD
66+
r = __builtin_bswap16(*((uint16_t *)(reader->buf + reader->pos)));
67+
#else
6568
memcpy(&r, reader->buf + reader->pos, sizeof(r));
69+
#endif
6670
reader->pos += sizeof(r);
6771
return r;
6872
}
6973

7074
uint32_t memread_udword(memreader *reader) {
7175
uint32_t r;
76+
#ifdef BIG_ENDIAN_BUILD
77+
r = __builtin_bswap32(*((uint32_t *)(reader->buf + reader->pos)));
78+
#else
7279
memcpy(&r, reader->buf + reader->pos, sizeof(r));
80+
#endif
7381
reader->pos += sizeof(r);
7482
return r;
7583
}
@@ -83,22 +91,37 @@ int8_t memread_byte(memreader *reader) {
8391

8492
int16_t memread_word(memreader *reader) {
8593
int16_t r;
94+
#ifdef BIG_ENDIAN_BUILD
95+
r = __builtin_bswap16(*((uint16_t *)(reader->buf + reader->pos)));
96+
#else
8697
memcpy(&r, reader->buf + reader->pos, sizeof(r));
98+
#endif
8799
reader->pos += sizeof(r);
88100
return r;
89101
}
90102

91103
int32_t memread_dword(memreader *reader) {
92104
int32_t r;
105+
#ifdef BIG_ENDIAN_BUILD
106+
r = __builtin_bswap32(*((int32_t *)(reader->buf + reader->pos)));
107+
#else
93108
memcpy(&r, reader->buf + reader->pos, sizeof(r));
109+
#endif
94110
reader->pos += sizeof(r);
95111
return r;
96112
}
97113

98114
float memread_float(memreader *reader) {
99115
float r;
116+
#ifdef BIG_ENDIAN_BUILD
117+
uint32_t fl;
118+
memcpy(&fl, reader->buf + reader->pos, sizeof(fl));
119+
fl = __builtin_bswap32(fl);
120+
reader->pos += sizeof(fl);
121+
#else
100122
memcpy(&r, reader->buf + reader->pos, sizeof(r));
101123
reader->pos += sizeof(r);
124+
#endif
102125
return r;
103126
}
104127

src/formats/internal/memwriter.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include "formats/internal/memwriter.h"
88
#include "formats/internal/writer.h"
99
#include "utils/allocator.h"
10-
1110
#define GROW 64
1211

1312
#define CHECK_SIZE \
@@ -57,27 +56,58 @@ void memwrite_ubyte(memwriter *writer, uint8_t value) {
5756
}
5857

5958
void memwrite_uword(memwriter *writer, uint16_t value) {
59+
#ifdef BIG_ENDIAN_BUILD
60+
uint16_t t = value;
61+
t = __builtin_bswap16(t);
62+
memwrite_buf(writer, (char *)&t, 2);
63+
#else
6064
memwrite_buf(writer, (char *)&value, 2);
65+
#endif
6166
}
6267

6368
void memwrite_udword(memwriter *writer, uint32_t value) {
69+
#ifdef BIG_ENDIAN_BUILD
70+
uint32_t t = value;
71+
t = __builtin_bswap32(t);
72+
memwrite_buf(writer, (char *)&t, 4);
73+
#else
6474
memwrite_buf(writer, (char *)&value, 4);
75+
#endif
6576
}
6677

6778
void memwrite_byte(memwriter *writer, int8_t value) {
6879
memwrite_buf(writer, (char *)&value, 1);
6980
}
7081

7182
void memwrite_word(memwriter *writer, int16_t value) {
83+
#ifdef BIG_ENDIAN_BUILD
84+
int16_t t = value;
85+
t = __builtin_bswap16(t);
86+
memwrite_buf(writer, (char *)&t, 2);
87+
#else
7288
memwrite_buf(writer, (char *)&value, 2);
89+
#endif
7390
}
7491

7592
void memwrite_dword(memwriter *writer, int32_t value) {
93+
#ifdef BIG_ENDIAN_BUILD
94+
int32_t t = value;
95+
t = __builtin_bswap32(t);
96+
memwrite_buf(writer, (char *)&t, 4);
97+
#else
7698
memwrite_buf(writer, (char *)&value, 4);
99+
#endif
77100
}
78101

79102
void memwrite_float(memwriter *writer, float value) {
103+
#ifdef BIG_ENDIAN_BUILD
104+
uint32_t t;
105+
memcpy(&t, &value, 4);
106+
t = __builtin_bswap32(t);
107+
memwrite_buf(writer, (char *)&t, 4);
108+
#else
80109
memwrite_buf(writer, (char *)&value, sizeof(float));
110+
#endif
81111
}
82112

83113
void memwrite_fill(memwriter *writer, char content, int len) {

src/formats/internal/reader.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,18 @@ uint8_t sd_read_ubyte(sd_reader *reader) {
110110
uint16_t sd_read_uword(sd_reader *reader) {
111111
uint16_t d = 0;
112112
sd_read_buf(reader, (char *)&d, 2);
113+
#ifdef BIG_ENDIAN_BUILD
114+
d = __builtin_bswap16(d);
115+
#endif
113116
return d;
114117
}
115118

116119
uint32_t sd_read_udword(sd_reader *reader) {
117120
uint32_t d = 0;
118121
sd_read_buf(reader, (char *)&d, 4);
122+
#ifdef BIG_ENDIAN_BUILD
123+
d = __builtin_bswap32(d);
124+
#endif
119125
return d;
120126
}
121127

@@ -128,18 +134,31 @@ int8_t sd_read_byte(sd_reader *reader) {
128134
int16_t sd_read_word(sd_reader *reader) {
129135
int16_t d = 0;
130136
sd_read_buf(reader, (char *)&d, 2);
137+
#ifdef BIG_ENDIAN_BUILD
138+
d = __builtin_bswap16(d);
139+
#endif
131140
return d;
132141
}
133142

134143
int32_t sd_read_dword(sd_reader *reader) {
135144
int32_t d = 0;
136145
sd_read_buf(reader, (char *)&d, 4);
146+
#ifdef BIG_ENDIAN_BUILD
147+
d = __builtin_bswap32(d);
148+
#endif
137149
return d;
138150
}
139151

140152
float sd_read_float(sd_reader *reader) {
141153
float f = 0;
154+
#ifdef BIG_ENDIAN_BUILD
155+
uint32_t r = 0;
156+
sd_read_buf(reader, (char *)&r, 4);
157+
r = __builtin_bswap32(r);
158+
memcpy(&f, &r, sizeof(f));
159+
#else
142160
sd_read_buf(reader, (char *)&f, 4);
161+
#endif
143162
return f;
144163
}
145164

@@ -152,12 +171,18 @@ uint8_t sd_peek_ubyte(sd_reader *reader) {
152171
uint16_t sd_peek_uword(sd_reader *reader) {
153172
uint16_t d = 0;
154173
sd_peek_buf(reader, (char *)&d, 2);
174+
#ifdef BIG_ENDIAN_BUILD
175+
d = __builtin_bswap16(d);
176+
#endif
155177
return d;
156178
}
157179

158180
uint32_t sd_peek_udword(sd_reader *reader) {
159181
uint32_t d = 0;
160182
sd_peek_buf(reader, (char *)&d, 4);
183+
#ifdef BIG_ENDIAN_BUILD
184+
d = __builtin_bswap32(d);
185+
#endif
161186
return d;
162187
}
163188

@@ -170,18 +195,27 @@ int8_t sd_peek_byte(sd_reader *reader) {
170195
int16_t sd_peek_word(sd_reader *reader) {
171196
int16_t d = 0;
172197
sd_peek_buf(reader, (char *)&d, 2);
198+
#ifdef BIG_ENDIAN_BUILD
199+
d = __builtin_bswap16(d);
200+
#endif
173201
return d;
174202
}
175203

176204
int32_t sd_peek_dword(sd_reader *reader) {
177205
int32_t d = 0;
178206
sd_peek_buf(reader, (char *)&d, 4);
207+
#ifdef BIG_ENDIAN_BUILD
208+
d = __builtin_bswap32(d);
209+
#endif
179210
return d;
180211
}
181212

182213
float sd_peek_float(sd_reader *reader) {
183214
float f = 0;
184215
sd_peek_buf(reader, (char *)&f, 4);
216+
#ifdef BIG_ENDIAN_BUILD
217+
f = __builtin_bswap16(f);
218+
#endif
185219
return f;
186220
}
187221

@@ -213,6 +247,16 @@ int sd_read_line(const sd_reader *reader, char *buffer, int maxlen) {
213247
if(fgets(buffer, maxlen, reader->handle) == NULL) {
214248
return 1;
215249
}
250+
#ifdef BIG_ENDIAN_BUILD
251+
int len = maxlen;
252+
for(int i = 0; i < len / 4; i += 1) {
253+
((int *)buffer)[i] = __builtin_bswap32(((int *)buffer)[i]);
254+
}
255+
256+
if((len & 3) == 2) {
257+
((uint16_t *)buffer)[(len / 2) - 1] = __builtin_bswap16(((uint16_t *)buffer)[(len / 2) - 1]);
258+
}
259+
#endif
216260
return 0;
217261
}
218262

@@ -231,6 +275,15 @@ void sd_read_str(sd_reader *r, str *dst) {
231275
if(len > 0) {
232276
char *buf = omf_calloc(1, len + 1);
233277
sd_read_buf(r, buf, len);
278+
#ifdef BIG_ENDIAN_BUILD
279+
for(int i = 0; i < len / 4; i += 1) {
280+
((int *)buf)[i] = __builtin_bswap32(((int *)buf)[i]);
281+
}
282+
283+
if((len & 3) == 2) {
284+
((uint16_t *)buf)[(len / 2) - 1] = __builtin_bswap16(((uint16_t *)buf)[(len / 2) - 1]);
285+
}
286+
#endif
234287
str_from_c(dst, buf);
235288
omf_free(buf);
236289
} else {

src/formats/internal/writer.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ struct sd_writer {
1515

1616
sd_writer *sd_writer_open(const char *file) {
1717
sd_writer *writer = omf_calloc(1, sizeof(sd_writer));
18-
1918
writer->handle = fopen(file, "wb");
2019
writer->sd_errno = 0;
2120
if(!writer->handle) {
@@ -76,10 +75,16 @@ void sd_write_ubyte(sd_writer *writer, uint8_t data) {
7675
}
7776

7877
void sd_write_uword(sd_writer *writer, uint16_t data) {
78+
#ifdef BIG_ENDIAN_BUILD
79+
data = __builtin_bswap16(data);
80+
#endif
7981
sd_write_buf(writer, (char *)&data, 2);
8082
}
8183

8284
void sd_write_udword(sd_writer *writer, uint32_t data) {
85+
#ifdef BIG_ENDIAN_BUILD
86+
data = __builtin_bswap32(data);
87+
#endif
8388
sd_write_buf(writer, (char *)&data, 4);
8489
}
8590

@@ -88,15 +93,28 @@ void sd_write_byte(sd_writer *writer, int8_t data) {
8893
}
8994

9095
void sd_write_word(sd_writer *writer, int16_t data) {
96+
#ifdef BIG_ENDIAN_BUILD
97+
data = __builtin_bswap16(data);
98+
#endif
9199
sd_write_buf(writer, (char *)&data, 2);
92100
}
93101

94102
void sd_write_dword(sd_writer *writer, int32_t data) {
103+
#ifdef BIG_ENDIAN_BUILD
104+
data = __builtin_bswap32(data);
105+
#endif
95106
sd_write_buf(writer, (char *)&data, 4);
96107
}
97108

98109
void sd_write_float(sd_writer *writer, float data) {
110+
#ifdef BIG_ENDIAN_BUILD
111+
uint32_t fl;
112+
memcpy(&fl, &data, sizeof(fl));
113+
fl = __builtin_bswap32(fl);
114+
sd_write_buf(writer, (char *)&fl, sizeof(fl));
115+
#else
99116
sd_write_buf(writer, (char *)&data, sizeof(float));
117+
#endif
100118
}
101119

102120
void sd_write_fill(sd_writer *writer, char content, size_t len) {

0 commit comments

Comments
 (0)