Skip to content

Commit fa46cb4

Browse files
committed
FEAT: BinCode - added commands: F16LE, F16BE, F32LE, F32BE, F64LE and F64BE
1 parent 34e0e2c commit fa46cb4

File tree

2 files changed

+139
-86
lines changed

2 files changed

+139
-86
lines changed

src/core/u-bincode.c

+114-85
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,29 @@ typedef union {
163163
} while (0)
164164
#define STORE_IN_BIT(val, inBit) SET_INT32(VAL_OBJ_VALUE(val, BINCODE_READ_BITMASK), inBit);
165165

166+
#ifdef ENDIAN_LITTLE
167+
#define WRITE_BE_2(cp, bp) cp[0] = bp[1]; cp[1] = bp[0];
168+
#define WRITE_BE_3(cp, bp) cp[0] = bp[2]; cp[1] = bp[1]; cp[2] = bp[0];
169+
#define WRITE_BE_4(cp, bp) cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
170+
#define WRITE_BE_8(cp, bp) cp[0] = bp[7]; cp[1] = bp[6]; cp[2] = bp[5]; cp[3] = bp[4]; \
171+
cp[4] = bp[3]; cp[5] = bp[2]; cp[6] = bp[1]; cp[7] = bp[0];
172+
#define WRITE_LE_2(cp, bp) memcpy(cp, bp, 2);
173+
#define WRITE_LE_3(cp, bp) memcpy(cp, bp, 3);
174+
#define WRITE_LE_4(cp, bp) memcpy(cp, bp, 4);
175+
#define WRITE_LE_8(cp, bp) memcpy(cp, bp, 8);
176+
#else
177+
#define WRITE_BE_2(cp, bp) memcpy(cp, bp, 2);
178+
#define WRITE_BE_3(cp, bp) memcpy(cp, bp, 3);
179+
#define WRITE_BE_4(cp, bp) memcpy(cp, bp, 4);
180+
#define WRITE_BE_8(cp, bp) memcpy(cp, bp, 8);
181+
#define WRITE_LE_2(cp, bp) cp[0] = bp[1]; cp[1] = bp[0];
182+
#define WRITE_LE_3(cp, bp) cp[0] = bp[2]; cp[1] = bp[1]; cp[2] = bp[0];
183+
#define WRITE_LE_4(cp, bp) cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
184+
#define WRITE_LE_8(cp, bp) cp[0] = bp[7]; cp[1] = bp[6]; cp[2] = bp[5]; cp[3] = bp[4]; \
185+
cp[4] = bp[3]; cp[5] = bp[2]; cp[6] = bp[1]; cp[7] = bp[0];
186+
187+
#endif
188+
166189
//**********************************************************************
167190
//MUST be in order like the values in system/standard/bincode object bellow!!!
168191
enum BincodeContextValues {
@@ -247,6 +270,7 @@ static REBCNT EncodedU32_Size(u32 value) {
247270
u16 ushort;
248271
float16_s f16;
249272
float32_s f32;
273+
REBYTE buf[8];
250274

251275

252276
ms_datetime* msdt = NULL;
@@ -531,18 +555,27 @@ static REBCNT EncodedU32_Size(u32 value) {
531555
goto error;
532556

533557
case SYM_FLOAT:
558+
case SYM_F32:
559+
case SYM_F32LE:
560+
case SYM_F32BE:
534561
if (IS_INTEGER(next) || IS_DECIMAL(next)) {
535562
count += 4;
536563
continue;
537564
}
538565
goto error;
539566
case SYM_DOUBLE:
567+
case SYM_F64:
568+
case SYM_F64LE:
569+
case SYM_F64BE:
540570
if (IS_INTEGER(next) || IS_DECIMAL(next)) {
541571
count += 8;
542572
continue;
543573
}
544574
goto error;
545575
case SYM_FLOAT16:
576+
case SYM_F16:
577+
case SYM_F16LE:
578+
case SYM_F16BE:
546579
if (IS_INTEGER(next) || IS_DECIMAL(next)) {
547580
count += 2;
548581
continue;
@@ -674,11 +707,7 @@ static REBCNT EncodedU32_Size(u32 value) {
674707
n = 2;
675708
i = VAL_INT32(next);
676709
bp = (REBYTE*)&i;
677-
#ifdef ENDIAN_LITTLE
678-
cp[0] = bp[1]; cp[1] = bp[0];
679-
#else
680-
memcpy(cp, bp, 2);
681-
#endif
710+
WRITE_BE_2(cp, bp);
682711
break;
683712
case SYM_UI24:
684713
case SYM_UI24BE:
@@ -687,75 +716,45 @@ static REBCNT EncodedU32_Size(u32 value) {
687716
n = 3;
688717
i = VAL_INT32(next);
689718
bp = (REBYTE*)&i;
690-
#ifdef ENDIAN_LITTLE
691-
cp[0] = bp[2]; cp[1] = bp[1]; cp[2] = bp[0];
692-
#else
693-
memcpy(cp, bp, 3);
694-
#endif
719+
WRITE_BE_3(cp, bp);
695720
break;
696721
case SYM_UI32:
697722
case SYM_UI32BE:
698723
ASSERT_U32_RANGE(next);
699724
write_ui32:
700725
n = 4;
701726
bp = (REBYTE*)&VAL_INT64(next);
702-
#ifdef ENDIAN_LITTLE
703-
cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
704-
#else
705-
memcpy(cp, bp, 4);
706-
#endif
727+
WRITE_BE_4(cp, bp);
707728
break;
708729
case SYM_UI64:
709730
case SYM_UI64BE:
710731
write_ui64:
711732
n = 8;
712733
bp = (REBYTE*)&VAL_INT64(next);
713-
#ifdef ENDIAN_LITTLE
714-
cp[0] = bp[7]; cp[1] = bp[6]; cp[2] = bp[5]; cp[3] = bp[4];
715-
cp[4] = bp[3]; cp[5] = bp[2]; cp[6] = bp[1]; cp[7] = bp[0];
716-
#else
717-
memcpy(cp, bp, 8);
718-
#endif
734+
WRITE_BE_8(cp, bp);
719735
break;
720736
case SYM_UI16LE:
721737
ASSERT_UI_RANGE(next, 0xFFFF);
722738
n = 2;
723739
bp = (REBYTE*)&VAL_INT64(next);
724-
#ifdef ENDIAN_BIG
725-
cp[0] = bp[1]; cp[1] = bp[0];
726-
#else
727-
memcpy(cp, bp, 2);
728-
#endif
740+
WRITE_LE_2(cp, bp);
729741
break;
730742
case SYM_UI24LE:
731743
ASSERT_UI_RANGE(next, 0xFFFFFF);
732744
n = 3;
733745
bp = (REBYTE*)&VAL_INT64(next);
734-
#ifdef ENDIAN_BIG
735-
cp[0] = bp[2]; cp[1] = bp[1]; cp[2] = bp[0];
736-
#else
737-
memcpy(cp, bp, 3);
738-
#endif
746+
WRITE_LE_3(cp, bp);
739747
break;
740748
case SYM_UI32LE:
741749
ASSERT_U32_RANGE(next);
742750
n = 4;
743751
bp = (REBYTE*)&VAL_INT64(next);
744-
#ifdef ENDIAN_BIG
745-
cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
746-
#else
747-
memcpy(cp, bp, 4);
748-
#endif
752+
WRITE_LE_4(cp, bp);
749753
break;
750754
case SYM_UI64LE:
751755
n = 8;
752756
bp = (REBYTE*)&VAL_INT64(next);
753-
#ifdef ENDIAN_LITTLE
754-
memcpy(cp, bp, 8);
755-
#else
756-
cp[0] = bp[7]; cp[1] = bp[6]; cp[2] = bp[5]; cp[3] = bp[4];
757-
cp[4] = bp[3]; cp[5] = bp[2]; cp[6] = bp[1]; cp[7] = bp[0];
758-
#endif
757+
WRITE_LE_8(cp, bp);
759758
break;
760759

761760
case SYM_SI8:
@@ -786,23 +785,15 @@ static REBCNT EncodedU32_Size(u32 value) {
786785
case SYM_UI16BEBYTES:
787786
n = VAL_LEN(next);
788787
bp = (REBYTE*)&n;
789-
#ifdef ENDIAN_LITTLE
790-
cp[0] = bp[1]; cp[1] = bp[0];
791-
#else
792-
memcpy(cp, bp, 2);
793-
#endif
788+
WRITE_BE_2(cp, bp);
794789
cp+=2;
795790
memcpy(cp, VAL_BIN_AT(next), n);
796791
VAL_INDEX(buffer_write)+=2; //for the length byte;
797792
break;
798793
case SYM_UI16LEBYTES:
799794
n = VAL_LEN(next);
800795
bp = (REBYTE*)&n;
801-
#ifdef ENDIAN_LITTLE
802-
memcpy(cp, bp, 2);
803-
#else
804-
cp[0] = bp[1]; cp[1] = bp[0];
805-
#endif
796+
WRITE_LE_2(cp, bp);
806797
cp+=2;
807798
memcpy(cp, VAL_BIN_AT(next), n);
808799
VAL_INDEX(buffer_write)+=2; //for the length byte;
@@ -812,23 +803,15 @@ static REBCNT EncodedU32_Size(u32 value) {
812803
case SYM_UI24BEBYTES:
813804
n = VAL_LEN(next);
814805
bp = (REBYTE*)&n;
815-
#ifdef ENDIAN_LITTLE
816-
cp[0] = bp[2]; cp[1] = bp[1]; cp[2] = bp[0];
817-
#else
818-
memcpy(cp, bp, 3);
819-
#endif
806+
WRITE_BE_3(cp, bp);
820807
cp += 3;
821808
memcpy(cp, VAL_BIN_AT(next), n);
822809
VAL_INDEX(buffer_write) += 3; //for the length byte;
823810
break;
824811
case SYM_UI24LEBYTES:
825812
n = VAL_LEN(next);
826813
bp = (REBYTE*)&n;
827-
#ifdef ENDIAN_LITTLE
828-
memcpy(cp, bp, 3);
829-
#else
830-
cp[0] = bp[2]; cp[1] = bp[1]; cp[2] = bp[0];
831-
#endif
814+
WRITE_LE_3(cp, bp);
832815
cp += 3;
833816
memcpy(cp, VAL_BIN_AT(next), n);
834817
VAL_INDEX(buffer_write) += 3; //for the length byte;
@@ -837,39 +820,52 @@ static REBCNT EncodedU32_Size(u32 value) {
837820
case SYM_UI32BEBYTES:
838821
n = VAL_LEN(next);
839822
bp = (REBYTE*)&n;
840-
#ifdef ENDIAN_LITTLE
841-
cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
842-
#else
843-
memcpy(cp, bp, 4);
844-
#endif
823+
WRITE_BE_4(cp, bp);
845824
cp += 4;
846825
memcpy(cp, VAL_BIN_AT(next), n);
847826
VAL_INDEX(buffer_write) += 4; //for the length byte;
848827
break;
849828
case SYM_UI32LEBYTES:
850829
n = VAL_LEN(next);
851830
bp = (REBYTE*)&n;
852-
#ifdef ENDIAN_LITTLE
853-
memcpy(cp, bp, 4);
854-
#else
855-
cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
856-
#endif
831+
WRITE_LE_4(cp, bp);
857832
cp += 4;
858833
memcpy(cp, VAL_BIN_AT(next), n);
859834
VAL_INDEX(buffer_write) += 4; //for the length byte;
860835
break;
861836

862837
case SYM_FLOAT:
838+
case SYM_F32:
839+
case SYM_F32LE:
840+
f32.v = (float)(IS_INTEGER(next) ? VAL_INT64(next) : VAL_DECIMAL(next));
841+
bp = (REBYTE *)&f32;
842+
WRITE_LE_4(cp, bp);
843+
n = 4;
844+
break;
845+
case SYM_F32BE:
863846
f32.v = (float)(IS_INTEGER(next) ? VAL_INT64(next) : VAL_DECIMAL(next));
864-
memcpy(cp, (REBYTE*)&f32, 4);
847+
bp = (REBYTE *)&f32;
848+
WRITE_BE_4(cp, bp);
865849
n = 4;
866850
break;
867851
case SYM_DOUBLE:
852+
case SYM_F64:
853+
case SYM_F64LE:
868854
dbl = (REBDEC)(IS_INTEGER(next) ? VAL_INT64(next) : VAL_DECIMAL(next));
869-
memcpy(cp, (REBYTE*)&dbl, 8);
870855
n = 8;
856+
bp = (REBYTE *)&dbl;
857+
WRITE_LE_8(cp, bp);
858+
break;
859+
case SYM_F64BE:
860+
dbl = (REBDEC)(IS_INTEGER(next) ? VAL_INT64(next) : VAL_DECIMAL(next));
861+
n = 8;
862+
bp = (REBYTE *)&dbl;
863+
WRITE_BE_8(cp, bp);
871864
break;
872865
case SYM_FLOAT16:
866+
case SYM_F16:
867+
case SYM_F16BE:
868+
case SYM_F16LE:
873869
d32 = (REBDEC)(IS_INTEGER(next) ? VAL_INT64(next) : VAL_DECIMAL(next));
874870
if (isnan(d32)) { // 1.#NaN
875871
ushort = 0x7e00;
@@ -889,7 +885,13 @@ static REBCNT EncodedU32_Size(u32 value) {
889885

890886
ushort = (u16)t1;
891887
}
892-
memcpy(cp, (REBYTE*)&ushort, 2);
888+
bp = (REBYTE *)&ushort;
889+
if (cmd == SYM_F16BE) {
890+
WRITE_BE_2(cp, bp);
891+
}
892+
else {
893+
WRITE_LE_2(cp, bp);
894+
}
893895
n = 2;
894896
break;
895897

@@ -920,22 +922,14 @@ static REBCNT EncodedU32_Size(u32 value) {
920922
n = 4;
921923
i = (i32)time(NULL);
922924
bp = (REBYTE*)&i;
923-
#ifdef ENDIAN_LITTLE
924-
cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
925-
#else
926-
memcpy(cp, bp, 4);
927-
#endif
925+
WRITE_BE_4(cp, bp);
928926
break;
929927
case SYM_UNIXTIME_NOW_LE:
930928
value--; // no args
931929
n = 4;
932930
i = (i32)time(NULL);
933931
bp = (REBYTE*)&i;
934-
#ifdef ENDIAN_LITTLE
935-
memcpy(cp, bp, 4);
936-
#else
937-
cp[0] = bp[3]; cp[1] = bp[2]; cp[2] = bp[1]; cp[3] = bp[0];
938-
#endif
932+
WRITE_LE_4(cp, bp);
939933
break;
940934

941935
case SYM_MSDOS_DATE:
@@ -1516,22 +1510,57 @@ static REBCNT EncodedU32_Size(u32 value) {
15161510
Set_Tuple(temp, BIN_DATA(bin) + VAL_INDEX(buffer_read), n);
15171511
break;
15181512
case SYM_FLOAT16:
1513+
case SYM_F16:
1514+
case SYM_F16LE:
15191515
n = 2;
15201516
ASSERT_READ_SIZE(value, cp, ep, n);
15211517
f16.bytes.low = cp[0];
15221518
f16.bytes.high = cp[1];
15231519
SET_DECIMAL(temp, float16to32(f16) );
15241520
break;
1521+
case SYM_F16BE:
1522+
n = 2;
1523+
ASSERT_READ_SIZE(value, cp, ep, n);
1524+
f16.bytes.low = cp[1];
1525+
f16.bytes.high = cp[0];
1526+
SET_DECIMAL(temp, float16to32(f16));
1527+
break;
15251528
case SYM_FLOAT:
1529+
case SYM_F32:
1530+
case SYM_F32LE:
15261531
n = 4;
15271532
ASSERT_READ_SIZE(value, cp, ep, n);
15281533
SET_DECIMAL(temp, ((float*)cp)[0]);
15291534
break;
1535+
case SYM_F32BE:
1536+
n = 4;
1537+
ASSERT_READ_SIZE(value, cp, ep, n);
1538+
buf[0] = cp[3];
1539+
buf[1] = cp[2];
1540+
buf[2] = cp[1];
1541+
buf[3] = cp[0];
1542+
SET_DECIMAL(temp, ((float*)buf)[0]);
1543+
break;
15301544
case SYM_DOUBLE:
1545+
case SYM_F64:
1546+
case SYM_F64LE:
15311547
n = 8;
15321548
ASSERT_READ_SIZE(value, cp, ep, n);
15331549
SET_DECIMAL(temp, ((double*)cp)[0]);
15341550
break;
1551+
case SYM_F64BE:
1552+
n = 8;
1553+
ASSERT_READ_SIZE(value, cp, ep, n);
1554+
buf[0] = cp[7];
1555+
buf[1] = cp[6];
1556+
buf[2] = cp[5];
1557+
buf[3] = cp[4];
1558+
buf[4] = cp[3];
1559+
buf[5] = cp[2];
1560+
buf[6] = cp[1];
1561+
buf[7] = cp[0];
1562+
SET_DECIMAL(temp, ((double *)buf)[0]);
1563+
break;
15351564
case SYM_FIXED8:
15361565
n = 2;
15371566
ASSERT_READ_SIZE(value, cp, ep, n);

0 commit comments

Comments
 (0)