@@ -163,6 +163,29 @@ typedef union {
163
163
} while (0)
164
164
#define STORE_IN_BIT (val , inBit ) SET_INT32(VAL_OBJ_VALUE(val, BINCODE_READ_BITMASK), inBit);
165
165
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
+
166
189
//**********************************************************************
167
190
//MUST be in order like the values in system/standard/bincode object bellow!!!
168
191
enum BincodeContextValues {
@@ -247,6 +270,7 @@ static REBCNT EncodedU32_Size(u32 value) {
247
270
u16 ushort ;
248
271
float16_s f16 ;
249
272
float32_s f32 ;
273
+ REBYTE buf [8 ];
250
274
251
275
252
276
ms_datetime * msdt = NULL ;
@@ -531,18 +555,27 @@ static REBCNT EncodedU32_Size(u32 value) {
531
555
goto error ;
532
556
533
557
case SYM_FLOAT :
558
+ case SYM_F32 :
559
+ case SYM_F32LE :
560
+ case SYM_F32BE :
534
561
if (IS_INTEGER (next ) || IS_DECIMAL (next )) {
535
562
count += 4 ;
536
563
continue ;
537
564
}
538
565
goto error ;
539
566
case SYM_DOUBLE :
567
+ case SYM_F64 :
568
+ case SYM_F64LE :
569
+ case SYM_F64BE :
540
570
if (IS_INTEGER (next ) || IS_DECIMAL (next )) {
541
571
count += 8 ;
542
572
continue ;
543
573
}
544
574
goto error ;
545
575
case SYM_FLOAT16 :
576
+ case SYM_F16 :
577
+ case SYM_F16LE :
578
+ case SYM_F16BE :
546
579
if (IS_INTEGER (next ) || IS_DECIMAL (next )) {
547
580
count += 2 ;
548
581
continue ;
@@ -674,11 +707,7 @@ static REBCNT EncodedU32_Size(u32 value) {
674
707
n = 2 ;
675
708
i = VAL_INT32 (next );
676
709
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 );
682
711
break ;
683
712
case SYM_UI24 :
684
713
case SYM_UI24BE :
@@ -687,75 +716,45 @@ static REBCNT EncodedU32_Size(u32 value) {
687
716
n = 3 ;
688
717
i = VAL_INT32 (next );
689
718
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 );
695
720
break ;
696
721
case SYM_UI32 :
697
722
case SYM_UI32BE :
698
723
ASSERT_U32_RANGE (next );
699
724
write_ui32 :
700
725
n = 4 ;
701
726
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 );
707
728
break ;
708
729
case SYM_UI64 :
709
730
case SYM_UI64BE :
710
731
write_ui64 :
711
732
n = 8 ;
712
733
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 );
719
735
break ;
720
736
case SYM_UI16LE :
721
737
ASSERT_UI_RANGE (next , 0xFFFF );
722
738
n = 2 ;
723
739
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 );
729
741
break ;
730
742
case SYM_UI24LE :
731
743
ASSERT_UI_RANGE (next , 0xFFFFFF );
732
744
n = 3 ;
733
745
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 );
739
747
break ;
740
748
case SYM_UI32LE :
741
749
ASSERT_U32_RANGE (next );
742
750
n = 4 ;
743
751
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 );
749
753
break ;
750
754
case SYM_UI64LE :
751
755
n = 8 ;
752
756
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 );
759
758
break ;
760
759
761
760
case SYM_SI8 :
@@ -786,23 +785,15 @@ static REBCNT EncodedU32_Size(u32 value) {
786
785
case SYM_UI16BEBYTES :
787
786
n = VAL_LEN (next );
788
787
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 );
794
789
cp += 2 ;
795
790
memcpy (cp , VAL_BIN_AT (next ), n );
796
791
VAL_INDEX (buffer_write )+= 2 ; //for the length byte;
797
792
break ;
798
793
case SYM_UI16LEBYTES :
799
794
n = VAL_LEN (next );
800
795
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 );
806
797
cp += 2 ;
807
798
memcpy (cp , VAL_BIN_AT (next ), n );
808
799
VAL_INDEX (buffer_write )+= 2 ; //for the length byte;
@@ -812,23 +803,15 @@ static REBCNT EncodedU32_Size(u32 value) {
812
803
case SYM_UI24BEBYTES :
813
804
n = VAL_LEN (next );
814
805
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 );
820
807
cp += 3 ;
821
808
memcpy (cp , VAL_BIN_AT (next ), n );
822
809
VAL_INDEX (buffer_write ) += 3 ; //for the length byte;
823
810
break ;
824
811
case SYM_UI24LEBYTES :
825
812
n = VAL_LEN (next );
826
813
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 );
832
815
cp += 3 ;
833
816
memcpy (cp , VAL_BIN_AT (next ), n );
834
817
VAL_INDEX (buffer_write ) += 3 ; //for the length byte;
@@ -837,39 +820,52 @@ static REBCNT EncodedU32_Size(u32 value) {
837
820
case SYM_UI32BEBYTES :
838
821
n = VAL_LEN (next );
839
822
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 );
845
824
cp += 4 ;
846
825
memcpy (cp , VAL_BIN_AT (next ), n );
847
826
VAL_INDEX (buffer_write ) += 4 ; //for the length byte;
848
827
break ;
849
828
case SYM_UI32LEBYTES :
850
829
n = VAL_LEN (next );
851
830
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 );
857
832
cp += 4 ;
858
833
memcpy (cp , VAL_BIN_AT (next ), n );
859
834
VAL_INDEX (buffer_write ) += 4 ; //for the length byte;
860
835
break ;
861
836
862
837
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 :
863
846
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 );
865
849
n = 4 ;
866
850
break ;
867
851
case SYM_DOUBLE :
852
+ case SYM_F64 :
853
+ case SYM_F64LE :
868
854
dbl = (REBDEC )(IS_INTEGER (next ) ? VAL_INT64 (next ) : VAL_DECIMAL (next ));
869
- memcpy (cp , (REBYTE * )& dbl , 8 );
870
855
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 );
871
864
break ;
872
865
case SYM_FLOAT16 :
866
+ case SYM_F16 :
867
+ case SYM_F16BE :
868
+ case SYM_F16LE :
873
869
d32 = (REBDEC )(IS_INTEGER (next ) ? VAL_INT64 (next ) : VAL_DECIMAL (next ));
874
870
if (isnan (d32 )) { // 1.#NaN
875
871
ushort = 0x7e00 ;
@@ -889,7 +885,13 @@ static REBCNT EncodedU32_Size(u32 value) {
889
885
890
886
ushort = (u16 )t1 ;
891
887
}
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
+ }
893
895
n = 2 ;
894
896
break ;
895
897
@@ -920,22 +922,14 @@ static REBCNT EncodedU32_Size(u32 value) {
920
922
n = 4 ;
921
923
i = (i32 )time (NULL );
922
924
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 );
928
926
break ;
929
927
case SYM_UNIXTIME_NOW_LE :
930
928
value -- ; // no args
931
929
n = 4 ;
932
930
i = (i32 )time (NULL );
933
931
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 );
939
933
break ;
940
934
941
935
case SYM_MSDOS_DATE :
@@ -1516,22 +1510,57 @@ static REBCNT EncodedU32_Size(u32 value) {
1516
1510
Set_Tuple (temp , BIN_DATA (bin ) + VAL_INDEX (buffer_read ), n );
1517
1511
break ;
1518
1512
case SYM_FLOAT16 :
1513
+ case SYM_F16 :
1514
+ case SYM_F16LE :
1519
1515
n = 2 ;
1520
1516
ASSERT_READ_SIZE (value , cp , ep , n );
1521
1517
f16 .bytes .low = cp [0 ];
1522
1518
f16 .bytes .high = cp [1 ];
1523
1519
SET_DECIMAL (temp , float16to32 (f16 ) );
1524
1520
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 ;
1525
1528
case SYM_FLOAT :
1529
+ case SYM_F32 :
1530
+ case SYM_F32LE :
1526
1531
n = 4 ;
1527
1532
ASSERT_READ_SIZE (value , cp , ep , n );
1528
1533
SET_DECIMAL (temp , ((float * )cp )[0 ]);
1529
1534
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 ;
1530
1544
case SYM_DOUBLE :
1545
+ case SYM_F64 :
1546
+ case SYM_F64LE :
1531
1547
n = 8 ;
1532
1548
ASSERT_READ_SIZE (value , cp , ep , n );
1533
1549
SET_DECIMAL (temp , ((double * )cp )[0 ]);
1534
1550
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 ;
1535
1564
case SYM_FIXED8 :
1536
1565
n = 2 ;
1537
1566
ASSERT_READ_SIZE (value , cp , ep , n );
0 commit comments