slow_blink 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/ext/slow_blink/ext_schema_parser/extconf.rb +1 -0
  3. data/ext/slow_blink/ext_schema_parser/lexer.c +6 -8
  4. data/ext/slow_blink/ext_schema_parser/lexer.h +1 -1
  5. data/ext/slow_blink/ext_schema_parser/parser.c +3 -1
  6. data/ext/slow_blink/message/ext_compact_encoder/ext_compact_encoder.c +46 -24
  7. data/ext/slow_blink/message/ext_compact_encoder/extconf.rb +9 -2
  8. data/lib/slow_blink/enum.rb +4 -1
  9. data/lib/slow_blink/field.rb +1 -1
  10. data/lib/slow_blink/generate_c/model.rb +119 -12
  11. data/lib/slow_blink/message/binary.rb +9 -1
  12. data/lib/slow_blink/message/boolean.rb +12 -3
  13. data/lib/slow_blink/message/date.rb +9 -1
  14. data/lib/slow_blink/message/decimal.rb +9 -1
  15. data/lib/slow_blink/message/dynamic_group.rb +132 -0
  16. data/lib/slow_blink/message/enum.rb +6 -2
  17. data/lib/slow_blink/message/field.rb +67 -43
  18. data/lib/slow_blink/message/fixed.rb +5 -1
  19. data/lib/slow_blink/message/floating_point.rb +9 -1
  20. data/lib/slow_blink/message/group.rb +54 -197
  21. data/lib/slow_blink/message/integer.rb +16 -8
  22. data/lib/slow_blink/message/model.rb +20 -18
  23. data/lib/slow_blink/message/static_group.rb +63 -0
  24. data/lib/slow_blink/message/string.rb +9 -1
  25. data/lib/slow_blink/message/test_data.rb +126 -0
  26. data/lib/slow_blink/message/time.rb +10 -2
  27. data/lib/slow_blink/message/time_of_day.rb +18 -2
  28. data/lib/slow_blink/schema.rb +2 -2
  29. data/lib/slow_blink/type.rb +3 -3
  30. data/lib/slow_blink/version.rb +1 -1
  31. data/test/tc_inputs.rb +34 -25
  32. data/test/tc_model_enum.rb +47 -0
  33. data/test/tc_model_inputs.rb +47 -0
  34. metadata +9 -7
  35. data/ext/slow_blink/message/ext_compact_encoder/blink_compact.c +0 -642
  36. data/ext/slow_blink/message/ext_compact_encoder/blink_compact.h +0 -411
  37. data/ext/slow_blink/message/ext_compact_encoder/blink_debug.h +0 -46
  38. data/ext/slow_blink/message/ext_compact_encoder/blink_stream.c +0 -314
  39. data/ext/slow_blink/message/ext_compact_encoder/blink_stream.h +0 -185
@@ -1,642 +0,0 @@
1
- /* Copyright (c) 2016 Cameron Harper
2
- *
3
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- * this software and associated documentation files (the "Software"), to deal in
5
- * the Software without restriction, including without limitation the rights to
6
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
- * the Software, and to permit persons to whom the Software is furnished to do so,
8
- * subject to the following conditions:
9
- *
10
- * The above copyright notice and this permission notice shall be included in all
11
- * copies or substantial portions of the Software.
12
- *
13
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
- *
20
- *
21
- * */
22
-
23
- /* includes ***********************************************************/
24
-
25
- #include "blink_compact.h"
26
- #include "blink_debug.h"
27
- #include "blink_stream.h"
28
-
29
- #include <string.h>
30
-
31
- /* static function prototypes *****************************************/
32
-
33
- static bool encodeVLC(uint64_t in, bool isSigned, blink_stream_t out);
34
- static bool decodeVLC(blink_stream_t in, bool isSigned, uint64_t *out, bool *isNull);
35
-
36
- /* functions **********************************************************/
37
-
38
- bool BLINK_Compact_encodeNull(blink_stream_t out)
39
- {
40
- uint8_t in = 0xc0U;
41
- return BLINK_Stream_write(out, &in, sizeof(in));
42
- }
43
-
44
- bool BLINK_Compact_encodePresent(blink_stream_t out)
45
- {
46
- uint8_t in = 0x01U;
47
- return BLINK_Stream_write(out, &in, sizeof(in));
48
- }
49
-
50
- bool BLINK_Compact_decodeBool(blink_stream_t in, bool *out, bool *isNull)
51
- {
52
- BLINK_ASSERT(out != NULL)
53
-
54
- uint64_t number;
55
- bool retval = false;
56
-
57
- if(decodeVLC(in, false, &number, isNull)){
58
-
59
- if(*isNull){
60
-
61
- retval = true;
62
- }
63
- else{
64
-
65
- if(number <= (uint64_t)UINT8_MAX){
66
-
67
- if((number == 0x00U) || (number == 0x01U)){
68
-
69
- *out = (number == 0x00U) ? false : true;
70
- retval = true;
71
- }
72
- else{
73
-
74
- BLINK_ERROR("W11: boolean must be 0x00 or 0x01")
75
- }
76
- }
77
- else{
78
-
79
- BLINK_ERROR("W3: out of range")
80
- }
81
- }
82
- }
83
-
84
- return retval;
85
- }
86
-
87
- bool BLINK_Compact_decodeU8(blink_stream_t in, uint8_t *out, bool *isNull)
88
- {
89
- BLINK_ASSERT(out != NULL)
90
-
91
- uint64_t number;
92
- bool retval = false;
93
-
94
- if(decodeVLC(in, false, &number, isNull)){
95
-
96
- if(*isNull){
97
-
98
- retval = true;
99
- }
100
- else{
101
-
102
- if(number <= (uint64_t)UINT8_MAX){
103
-
104
- *out = (uint8_t)number;
105
- retval = true;
106
- }
107
- else{
108
-
109
- BLINK_ERROR("W3: out of range")
110
- }
111
- }
112
- }
113
-
114
- return retval;
115
- }
116
-
117
- bool BLINK_Compact_decodeU16(blink_stream_t in, uint16_t *out, bool *isNull)
118
- {
119
- BLINK_ASSERT(out != NULL)
120
-
121
- uint64_t number;
122
- bool retval = false;
123
-
124
- if(decodeVLC(in, false, &number, isNull)){
125
-
126
- if(*isNull){
127
-
128
- retval = true;
129
- }
130
- else{
131
-
132
- if(number <= (uint64_t)UINT16_MAX){
133
-
134
- *out = (uint16_t)number;
135
- retval = true;
136
- }
137
- else{
138
-
139
- BLINK_ERROR("W3: out of range")
140
- }
141
- }
142
- }
143
-
144
- return retval;
145
- }
146
-
147
- bool BLINK_Compact_decodeU32(blink_stream_t in, uint32_t *out, bool *isNull)
148
- {
149
- BLINK_ASSERT(out != NULL)
150
-
151
- uint64_t number;
152
- bool retval = false;
153
-
154
- if(decodeVLC(in, false, &number, isNull)){
155
-
156
- if(*isNull){
157
-
158
- retval = true;
159
- }
160
- else{
161
-
162
- if(number <= UINT32_MAX){
163
-
164
- *out = (uint32_t)number;
165
- retval = true;
166
- }
167
- else{
168
-
169
- BLINK_ERROR("W3: out of range")
170
- }
171
- }
172
- }
173
-
174
- return retval;
175
- }
176
-
177
- bool BLINK_Compact_decodeU64(blink_stream_t in, uint64_t *out, bool *isNull)
178
- {
179
- return decodeVLC(in, false, out, isNull);
180
- }
181
-
182
- bool BLINK_Compact_decodeI8(blink_stream_t in, int8_t *out, bool *isNull)
183
- {
184
- BLINK_ASSERT(out != NULL)
185
-
186
- int64_t number;
187
- bool retval = false;
188
-
189
- if(decodeVLC(in, true, (uint64_t *)&number, isNull)){
190
-
191
- if(*isNull){
192
-
193
- retval = true;
194
- }
195
- else{
196
-
197
- if((number <= INT8_MAX) && (number >= INT8_MIN)){
198
-
199
- *out = (int8_t)number;
200
- retval = true;
201
- }
202
- else{
203
-
204
- BLINK_ERROR("W3: out of range")
205
- }
206
- }
207
- }
208
-
209
- return retval;
210
- }
211
-
212
- bool BLINK_Compact_decodeI16(blink_stream_t in, int16_t *out, bool *isNull)
213
- {
214
- BLINK_ASSERT(out != NULL)
215
-
216
- int64_t number;
217
- bool retval = false;
218
-
219
- if(decodeVLC(in, true, (uint64_t *)&number, isNull)){
220
-
221
- if(*isNull){
222
-
223
- retval = true;
224
- }
225
- else{
226
-
227
- if((number <= INT16_MAX) && (number >= INT16_MIN)){
228
-
229
- *out = (int16_t)number;
230
- retval = true;
231
- }
232
- else{
233
-
234
- BLINK_ERROR("W3: out of range")
235
- }
236
- }
237
- }
238
-
239
- return retval;
240
- }
241
-
242
- bool BLINK_Compact_decodeI32(blink_stream_t in, int32_t *out, bool *isNull)
243
- {
244
- BLINK_ASSERT(out != NULL)
245
-
246
- int64_t number;
247
- bool retval = false;
248
-
249
- if(decodeVLC(in, true, (uint64_t *)&number, isNull)){
250
-
251
- if(*isNull){
252
-
253
- retval = true;
254
- }
255
- else{
256
-
257
- if((number <= INT32_MAX) && (number >= INT32_MIN)){
258
-
259
- *out = (int32_t)number;
260
- retval = true;
261
- }
262
- else{
263
-
264
- BLINK_ERROR("W3: out of range")
265
- }
266
- }
267
- }
268
-
269
- return retval;
270
- }
271
-
272
- bool BLINK_Compact_decodeI64(blink_stream_t in, int64_t *out, bool *isNull)
273
- {
274
- BLINK_ASSERT(out != NULL)
275
-
276
- return decodeVLC(in, true, (uint64_t *)out, isNull);
277
- }
278
-
279
- bool BLINK_Compact_decodeDecimal(blink_stream_t in, int64_t *mantissa, int8_t *exponent, bool *isNull)
280
- {
281
- BLINK_ASSERT(mantissa != NULL)
282
- BLINK_ASSERT(exponent != NULL)
283
-
284
- bool retval = false;
285
-
286
- if(BLINK_Compact_decodeI8(in, exponent, isNull)){
287
-
288
- if(*isNull){
289
-
290
- retval = true;
291
- }
292
- else{
293
-
294
- if(BLINK_Compact_decodeI64(in, mantissa, isNull)){
295
-
296
- if(*isNull){
297
-
298
- BLINK_ERROR("mantissa cannot be NULL")
299
- }
300
- else{
301
-
302
- retval = true;
303
- }
304
- }
305
- }
306
- }
307
-
308
- return retval;
309
- }
310
-
311
- bool BLINK_Compact_decodeF64(blink_stream_t in, double *out, bool *isNull)
312
- {
313
- BLINK_ASSERT(out != NULL)
314
-
315
- bool retval = false;
316
- uint64_t result;
317
-
318
- if(BLINK_Compact_decodeU64(in, &result, isNull)){
319
-
320
- retval = true;
321
-
322
- if(*isNull == false){
323
-
324
- *out = (double)result;
325
- }
326
- }
327
-
328
- return retval;
329
- }
330
-
331
- bool BLINK_Compact_decodePresent(blink_stream_t in, bool *out)
332
- {
333
- BLINK_ASSERT(out != NULL)
334
-
335
- bool isNull;
336
- uint64_t value;
337
- bool retval = false;
338
-
339
- if(decodeVLC(in, false, &value, &isNull)){
340
-
341
- if(isNull || (value == 0x01U)){
342
-
343
- *out = (isNull) ? false : true;
344
- retval = true;
345
- }
346
- else{
347
-
348
- BLINK_ERROR("W9: presence flag must be 0xc0 or 0x01")
349
- }
350
- }
351
-
352
- return retval;
353
- }
354
-
355
- bool BLINK_Compact_encodeBool(bool in, blink_stream_t out)
356
- {
357
- return encodeVLC((in ? 0x01U : 0x00U), false, out);
358
- }
359
-
360
- bool BLINK_Compact_encodeU8(uint8_t in, blink_stream_t out)
361
- {
362
- return encodeVLC((uint64_t)in, false, out);
363
- }
364
-
365
- bool BLINK_Compact_encodeU16(uint16_t in, blink_stream_t out)
366
- {
367
- return encodeVLC((uint64_t)in, false, out);
368
- }
369
-
370
- bool BLINK_Compact_encodeU32(uint32_t in, blink_stream_t out)
371
- {
372
- return encodeVLC((uint64_t)in, false, out);
373
- }
374
-
375
- bool BLINK_Compact_encodeU64(uint64_t in, blink_stream_t out)
376
- {
377
- return encodeVLC(in, false, out);
378
- }
379
-
380
- bool BLINK_Compact_encodeI8(int8_t in, blink_stream_t out)
381
- {
382
- return encodeVLC((uint64_t)in, true, out);
383
- }
384
-
385
- bool BLINK_Compact_encodeI16(int16_t in, blink_stream_t out)
386
- {
387
- return encodeVLC((uint64_t)in, true, out);
388
- }
389
-
390
- bool BLINK_Compact_encodeI32(int32_t in, blink_stream_t out)
391
- {
392
- return encodeVLC((uint64_t)in, true, out);
393
- }
394
-
395
- bool BLINK_Compact_encodeI64(int64_t in, blink_stream_t out)
396
- {
397
- return encodeVLC((uint64_t)in, true, out);
398
- }
399
-
400
- bool BLINK_Compact_encodeF64(double in, blink_stream_t out)
401
- {
402
- uint64_t *value = (uint64_t *)&in; /*lint !e740 !e9087 double cast to uint64_t */
403
-
404
- return encodeVLC(*value, false, out);
405
- }
406
-
407
- bool BLINK_Compact_encodeDecimal(int64_t mantissa, int8_t exponent, blink_stream_t out)
408
- {
409
- bool retval = false;
410
-
411
- if(encodeVLC((uint64_t)exponent, true, out)){
412
-
413
- if(encodeVLC(mantissa, true, out)){
414
-
415
- retval = true;
416
- }
417
- }
418
-
419
- return retval;
420
- }
421
-
422
- uint8_t BLINK_Compact_sizeofUnsigned(uint64_t value)
423
- {
424
- uint8_t retval;
425
-
426
- if(value <= 0x7fUL){
427
- retval = 1U;
428
- }
429
- else if(value <= 0x3fffUL){
430
- retval = 2U;
431
- }
432
- else if(value <= 0xffffUL){
433
- retval = 3U;
434
- }
435
- else if(value <= 0xffffffUL){
436
- retval = 4U;
437
- }
438
- else if(value <= 0xffffffffUL){
439
- retval = 5U;
440
- }
441
- else if(value <= 0xffffffffffUL){
442
- retval = 6U;
443
- }
444
- else if(value <= 0xffffffffffffUL){
445
- retval = 7U;
446
- }
447
- else if(value <= 0xffffffffffffffUL){
448
- retval = 8U;
449
- }
450
- else{
451
- retval = 9U;
452
- }
453
-
454
- return retval;
455
- }
456
-
457
- uint8_t BLINK_Compact_sizeofSigned(int64_t value)
458
- {
459
- uint8_t retval;
460
-
461
- if(value < 0){
462
-
463
- if(value >= -64){
464
- retval = 1U;
465
- }
466
- else if(value >= -8192){
467
- retval = 2U;
468
- }
469
- else if(value >= -32768){
470
- retval = 3U;
471
- }
472
- else if(value >= -8388608){
473
- retval = 4U;
474
- }
475
- else if(value >= -2147483648){
476
- retval = 5U;
477
- }
478
- else if(value >= -549755813888){
479
- retval = 6U;
480
- }
481
- else if(value >= -140737488355328){
482
- retval = 7U;
483
- }
484
- else if(value >= -36028797018963968){
485
- retval = 8U;
486
- }
487
- else{
488
- retval = 9U;
489
- }
490
- }
491
- else{
492
-
493
- if(value <= 0x3fL){
494
- retval = 1U;
495
- }
496
- else if(value <= 0x1fffL){
497
- retval = 2U;
498
- }
499
- else if(value <= 0x7fffL){
500
- retval = 3U;
501
- }
502
- else if(value <= 0x7fffffL){
503
- retval = 4U;
504
- }
505
- else if(value <= 0x7fffffffL){
506
- retval = 5U;
507
- }
508
- else if(value <= 0x7fffffffffL){
509
- retval = 6U;
510
- }
511
- else if(value <= 0x7fffffffffffL){
512
- retval = 7U;
513
- }
514
- else if(value <= 0x7fffffffffffffL){
515
- retval = 8U;
516
- }
517
- else{
518
- retval = 9U;
519
- }
520
- }
521
-
522
- return retval;
523
- }
524
-
525
- /* static functions ***************************************************/
526
-
527
- static bool encodeVLC(uint64_t in, bool isSigned, blink_stream_t out)
528
- {
529
- uint8_t buffer[9U];
530
- uint8_t bytes = (isSigned) ? BLINK_Compact_sizeofSigned((int64_t)in) : BLINK_Compact_sizeofUnsigned(in);
531
- uint8_t i;
532
-
533
- if(bytes == 1U){
534
-
535
- *buffer = (uint8_t)(in & 0x7fU);
536
- }
537
- else if(bytes == 2U){
538
-
539
- buffer[0] = 0x80U | (uint8_t)(in & 0x3fU);
540
- buffer[1] = (uint8_t)(in >> 6);
541
- }
542
- else{
543
-
544
- buffer[0] = 0xC0U | (bytes-1U);
545
- for(i=1; i < bytes; i++){
546
-
547
- buffer[i] = (uint8_t)(in >> ((i-1U)*8U));
548
- }
549
- }
550
-
551
- return BLINK_Stream_write(out, buffer, bytes);
552
- }
553
-
554
- static bool decodeVLC(blink_stream_t in, bool isSigned, uint64_t *out, bool *isNull)
555
- {
556
- BLINK_ASSERT(out != NULL)
557
- BLINK_ASSERT(isNull != NULL)
558
-
559
- uint8_t buffer[9U];
560
- bool retval = false;
561
- uint8_t bytes;
562
- uint8_t i;
563
-
564
- *isNull = false;
565
-
566
- if(BLINK_Stream_read(in, buffer, 1U)){
567
-
568
- if(buffer[0] < 0xc0U){
569
-
570
- if(buffer[0] < 0x80U){
571
-
572
- if(isSigned && ((buffer[0] & 0x40U) == 0x40U)){
573
-
574
- *out = 0xffffffffffffffc0U;
575
- }
576
- else{
577
-
578
- *out = 0x0U;
579
- }
580
- *out |= (uint64_t)(buffer[0] & 0x7fU);
581
- retval = true;
582
- }
583
- else{
584
-
585
- if(BLINK_Stream_read(in, &buffer[1], 1U)){
586
-
587
- if(isSigned && ((buffer[1] & 0x80U) == 0x80U)){
588
-
589
- *out = 0xffffffffffffff00U;
590
- }
591
- else{
592
-
593
- *out = 0x0U;
594
- }
595
- *out |= (uint64_t)buffer[1];
596
- *out <<= 6U;
597
- *out |= (uint64_t)(buffer[0] & 0x3fU);
598
- retval = true;
599
- }
600
- }
601
- }
602
- else if(buffer[0] == 0xc0U){
603
-
604
- *isNull = true;
605
- retval = true;
606
- }
607
- else{
608
-
609
- bytes = buffer[0] & 0x3fU;
610
-
611
- if(bytes <= 8U){
612
-
613
- if(BLINK_Stream_read(in, &buffer[1], bytes)){
614
-
615
- if(isSigned && ((buffer[bytes] & 0x80U) == 0x80U)){
616
-
617
- *out = 0xffffffffffff00U | buffer[bytes];
618
- }
619
- else{
620
-
621
- *out = buffer[bytes];
622
- }
623
-
624
- for(i=bytes-1U; i != 0U; i--){
625
-
626
- *out <<= 8;
627
- *out |= buffer[i];
628
- }
629
-
630
- retval = true;
631
- }
632
- }
633
- else{
634
-
635
- /* VLC too large */
636
- BLINK_ERROR("cannot handle a VLC field larger than 8 bytes")
637
- }
638
- }
639
- }
640
-
641
- return retval;
642
- }