25
25
*/
26
26
27
27
#include <stdio.h>
28
+ #include <inttypes.h>
28
29
29
30
#include "py/binary.h"
30
31
#include "py/objarray.h"
@@ -66,13 +67,37 @@ STATIC void read(msgpack_stream_t *s, void *buf, mp_uint_t size) {
66
67
}
67
68
}
68
69
70
+ /*
69
71
STATIC uint32_t read_bytes(msgpack_stream_t *s, mp_uint_t n_bytes) {
70
72
uint32_t res = 0;
71
73
read(s, &res, n_bytes);
72
74
return res;
73
75
}
76
+ */
77
+ STATIC uint8_t read1 (msgpack_stream_t * s ) {
78
+ uint8_t res = 0 ;
79
+ read (s , & res , 1 );
80
+ return res ;
81
+ }
82
+
83
+ STATIC uint16_t read2 (msgpack_stream_t * s ) {
84
+ uint16_t res = 0 ;
85
+ read (s , & res , 2 );
86
+ int n = 1 ;
87
+ if (* (char * )& n == 1 ) res = __builtin_bswap16 (res );
88
+ return res ;
89
+ }
90
+
91
+ STATIC uint32_t read4 (msgpack_stream_t * s ) {
92
+ uint32_t res = 0 ;
93
+ read (s , & res , 4 );
94
+ int n = 1 ;
95
+ if (* (char * )& n == 1 ) res = __builtin_bswap32 (res );
96
+ return res ;
97
+ }
74
98
75
- size_t read_size (msgpack_stream_t * s , uint8_t len_index ) {
99
+ /*
100
+ STATIC size_t read_size(msgpack_stream_t *s, uint8_t len_index) {
76
101
size_t n_bytes = 4;
77
102
switch (len_index) {
78
103
case 0: n_bytes = 1; break;
@@ -83,6 +108,17 @@ size_t read_size(msgpack_stream_t *s, uint8_t len_index) {
83
108
read(s, &res, n_bytes);
84
109
return res;
85
110
}
111
+ */
112
+
113
+ STATIC size_t read_size (msgpack_stream_t * s , uint8_t len_index ) {
114
+ size_t res ;
115
+ switch (len_index ) {
116
+ case 0 : res = (size_t )read1 (s ); break ;
117
+ case 1 : res = (size_t )read2 (s ); break ;
118
+ case 2 : res = (size_t )read4 (s ); break ;
119
+ }
120
+ return res ;
121
+ }
86
122
87
123
////////////////////////////////////////////////////////////////
88
124
// writers
@@ -97,20 +133,33 @@ STATIC void write(msgpack_stream_t *s, const void *buf, mp_uint_t size) {
97
133
}
98
134
}
99
135
100
- STATIC void write_bytes (msgpack_stream_t * s , mp_uint_t n_bytes , uint32_t obj ) {
101
- write (s , & obj , n_bytes );
136
+ STATIC void write1 (msgpack_stream_t * s , uint8_t obj ) {
137
+ write (s , & obj , 1 );
138
+ }
139
+
140
+ STATIC void write2 (msgpack_stream_t * s , uint16_t obj ) {
141
+ int n = 1 ;
142
+ if (* (char * )& n == 1 ) obj = __builtin_bswap16 (obj );
143
+ write (s , & obj , 2 );
144
+ }
145
+
146
+ STATIC void write4 (msgpack_stream_t * s , uint32_t obj ) {
147
+ int n = 1 ;
148
+ if (* (char * )& n == 1 ) obj = __builtin_bswap32 (obj );
149
+ write (s , & obj , 4 );
102
150
}
103
151
104
- void write_size (msgpack_stream_t * s , uint8_t code , size_t size ) {
152
+ // compute and write msgpack size code (array structures)
153
+ STATIC void write_size (msgpack_stream_t * s , uint8_t code , size_t size ) {
105
154
if ((uint8_t )size == size ) {
106
- write_bytes ( s , 1 , code );
107
- write_bytes ( s , 1 , size );
155
+ write1 ( s , code );
156
+ write1 ( s , size );
108
157
} else if ((uint16_t )size == size ) {
109
- write_bytes ( s , 1 , code + 1 );
110
- write_bytes ( s , 2 , size );
158
+ write1 ( s , code + 1 );
159
+ write2 ( s , size );
111
160
} else {
112
- write_bytes ( s , 1 , code + 2 );
113
- write_bytes ( s , 4 , size );
161
+ write1 ( s , code + 2 );
162
+ write4 ( s , size );
114
163
}
115
164
}
116
165
@@ -136,61 +185,61 @@ STATIC mp_map_elem_t *dict_iter_next(mp_obj_dict_t *dict, size_t *cur) {
136
185
137
186
STATIC void pack_int (msgpack_stream_t * s , int32_t x ) {
138
187
if (x > -32 && x < 128 ) {
139
- write_bytes ( s , 1 , x );
188
+ write1 ( s , x );
140
189
} else if ((int8_t )x == x ) {
141
- write_bytes ( s , 1 , 0xd0 );
142
- write_bytes ( s , 1 , x );
190
+ write1 ( s , 0xd0 );
191
+ write1 ( s , x );
143
192
} else if ((int16_t )x == x ) {
144
- write_bytes ( s , 1 , 0xd1 );
145
- write_bytes ( s , 2 , x );
193
+ write1 ( s , 0xd1 );
194
+ write2 ( s , x );
146
195
} else {
147
- write_bytes ( s , 1 , 0xd2 );
148
- write_bytes ( s , 4 , x );
196
+ write1 ( s , 0xd2 );
197
+ write4 ( s , x );
149
198
}
150
199
}
151
200
152
201
void pack_bin (msgpack_stream_t * s , const uint8_t * data , size_t len ) {
153
202
write_size (s , 0xc4 , len );
154
203
for (size_t i = 0 ; i < len ; i ++ ) {
155
- write_bytes ( s , 1 , data [i ]);
204
+ write1 ( s , data [i ]);
156
205
}
157
206
}
158
207
159
208
void pack_str (msgpack_stream_t * s , const char * str , size_t len ) {
160
209
// size_t len = strlen(str);
161
210
if (len < 32 ) {
162
- write_bytes ( s , 1 , 0b10100000 | (uint8_t )len );
211
+ write1 ( s , 0b10100000 | (uint8_t )len );
163
212
} else {
164
213
write_size (s , 0xd9 , len );
165
214
}
166
215
for (size_t l = 0 ; l < len ; l ++ ) {
167
- write_bytes ( s , 1 , str [l ]);
216
+ write1 ( s , str [l ]);
168
217
}
169
218
}
170
219
171
220
void pack_array (msgpack_stream_t * s , size_t len ) {
172
221
// only writes the header, manually write the objects after calling pack_array!
173
222
if (len < 16 ) {
174
- write_bytes ( s , 1 , 0b10010000 | (uint8_t )len );
223
+ write1 ( s , 0b10010000 | (uint8_t )len );
175
224
} else if (len < 0x10000 ) {
176
- write_bytes ( s , 1 , 0xdc );
177
- write_bytes ( s , 2 , len );
225
+ write1 ( s , 0xdc );
226
+ write2 ( s , len );
178
227
} else {
179
- write_bytes ( s , 1 , 0xdd );
180
- write_bytes ( s , 4 , len );
228
+ write1 ( s , 0xdd );
229
+ write4 ( s , len );
181
230
}
182
231
}
183
232
184
233
void pack_dict (msgpack_stream_t * s , size_t len ) {
185
234
// only writes the header, manually write the objects after calling pack_array!
186
235
if (len < 16 ) {
187
- write_bytes ( s , 1 , 0b10000000 | (uint8_t )len );
236
+ write1 ( s , 0b10000000 | (uint8_t )len );
188
237
} else if (len < 0x10000 ) {
189
- write_bytes ( s , 1 , 0xde );
190
- write_bytes ( s , 2 , len );
238
+ write1 ( s , 0xde );
239
+ write2 ( s , len );
191
240
} else {
192
- write_bytes ( s , 1 , 0xdf );
193
- write_bytes ( s , 4 , len );
241
+ write1 ( s , 0xdf );
242
+ write4 ( s , len );
194
243
}
195
244
}
196
245
@@ -234,15 +283,17 @@ void pack(mp_obj_t obj, msgpack_stream_t *s) {
234
283
pack (next -> value , s );
235
284
}
236
285
} else if (mp_obj_is_float (obj )) {
237
- mp_float_t f = mp_obj_float_get (obj );
238
- write_bytes (s , 1 , 0xca );
239
- write (s , & f , 4 );
286
+ union Float { mp_float_t f ; uint32_t u ; };
287
+ union Float data ;
288
+ data .f = mp_obj_float_get (obj );
289
+ write1 (s , 0xca );
290
+ write4 (s , data .u );
240
291
} else if (obj == mp_const_none ) {
241
- write_bytes ( s , 1 , 0xc0 );
292
+ write1 ( s , 0xc0 );
242
293
} else if (obj == mp_const_false ) {
243
- write_bytes ( s , 1 , 0xc2 );
294
+ write1 ( s , 0xc2 );
244
295
} else if (obj == mp_const_true ) {
245
- write_bytes ( s , 1 , 0xc3 );
296
+ write1 ( s , 0xc3 );
246
297
} else {
247
298
mp_raise_ValueError (translate ("no packer" ));
248
299
}
@@ -252,7 +303,7 @@ void pack(mp_obj_t obj, msgpack_stream_t *s) {
252
303
// unpacker
253
304
254
305
mp_obj_t unpack (msgpack_stream_t * s ) {
255
- uint8_t code = read_bytes ( s , 1 );
306
+ uint8_t code = read1 ( s );
256
307
if (((code & 0b10000000 ) == 0 ) || ((code & 0b11100000 ) == 0b11100000 )) {
257
308
// int
258
309
return MP_OBJ_NEW_SMALL_INT ((int8_t )code );
@@ -298,17 +349,24 @@ mp_obj_t unpack(msgpack_stream_t *s) {
298
349
read (s , p , size );
299
350
return mp_obj_new_str_from_vstr (& mp_type_bytes , & vstr );
300
351
}
352
+ case 0xcc :
353
+ return MP_OBJ_NEW_SMALL_INT (read1 (s ));
354
+ case 0xcd :
355
+ return MP_OBJ_NEW_SMALL_INT (read2 (s ));
356
+ case 0xce :
357
+ return MP_OBJ_NEW_SMALL_INT (read4 (s ));
301
358
case 0xca : {
302
- float f ;
303
- read (s , & f , 4 );
304
- return mp_obj_new_float (f );
359
+ union Float { mp_float_t f ; uint32_t u ; };
360
+ union Float data ;
361
+ data .u = read4 (s );
362
+ return mp_obj_new_float (data .f );
305
363
}
306
364
case 0xd0 :
307
- return MP_OBJ_NEW_SMALL_INT ((int8_t )read_bytes ( s , 1 ));
365
+ return MP_OBJ_NEW_SMALL_INT ((int8_t )read1 ( s ));
308
366
case 0xd1 :
309
- return MP_OBJ_NEW_SMALL_INT ((int16_t )read_bytes ( s , 2 ));
367
+ return MP_OBJ_NEW_SMALL_INT ((int16_t )read2 ( s ));
310
368
case 0xd2 :
311
- return MP_OBJ_NEW_SMALL_INT ((int32_t )read_bytes ( s , 4 ));
369
+ return MP_OBJ_NEW_SMALL_INT ((int32_t )read4 ( s ));
312
370
case 0xd9 :
313
371
case 0xda :
314
372
case 0xdb : {
@@ -345,9 +403,6 @@ mp_obj_t unpack(msgpack_stream_t *s) {
345
403
case 0xc8 : // ext 16
346
404
case 0xc9 : // ext 32
347
405
case 0xcb : // float 64
348
- case 0xcc : // uint 8
349
- case 0xcd : // uint 16
350
- case 0xce : // uint 32
351
406
case 0xcf : // uint 64
352
407
case 0xd3 : // int 64
353
408
case 0xd4 : // fixenxt 1
0 commit comments