@@ -208,7 +208,7 @@ static REBCNT EncodedU32_Size(u32 value) {
208
208
// /write "Write data into output buffer"
209
209
// data [binary! block!] "Data dialect"
210
210
// /read "Read data from the input buffer"
211
- // code [word! block!] "Input encoding"
211
+ // code [word! block! integer! ] "Input encoding"
212
212
// /into "Put READ results in out block, instead of creating a new block"
213
213
// out [block!] "Target block for results, when /into is used"
214
214
// /with "Additional input argument"
@@ -420,8 +420,10 @@ static REBCNT EncodedU32_Size(u32 value) {
420
420
Do_Path (& next , NULL );
421
421
next = DS_POP ; // volatile stack reference
422
422
}
423
- if (IS_STRING (next )) {
424
- Set_Binary (next , Encode_UTF8_Value (next , VAL_LEN (next ), 0 ));
423
+ if (IS_STRING (next ) || IS_FILE (next ) || IS_URL (next )) {
424
+ DS_PUSH_NONE ;
425
+ Set_Binary (DS_TOP , Encode_UTF8_Value (next , VAL_LEN (next ), 0 ));
426
+ next = DS_POP ;
425
427
}
426
428
427
429
switch (VAL_WORD_CANON (data )) {
@@ -492,20 +494,25 @@ static REBCNT EncodedU32_Size(u32 value) {
492
494
break ;
493
495
case SYM_UI16BYTES :
494
496
case SYM_UI16LEBYTES :
497
+ case SYM_UI16BEBYTES :
495
498
if (IS_BINARY (next )) {
496
499
ASSERT_UIBYTES_RANGE (next , 0xFFFF );
497
500
count += (2 + VAL_LEN (next ));
498
501
continue ;
499
502
}
500
503
goto error ;
501
504
case SYM_UI24BYTES :
505
+ case SYM_UI24LEBYTES :
506
+ case SYM_UI24BEBYTES :
502
507
if (IS_BINARY (next )) {
503
508
ASSERT_UIBYTES_RANGE (next , 0xFFFFFF );
504
509
count += (3 + VAL_LEN (next ));
505
510
continue ;
506
511
}
507
512
goto error ;
508
513
case SYM_UI32BYTES :
514
+ case SYM_UI32LEBYTES :
515
+ case SYM_UI32BEBYTES :
509
516
if (IS_BINARY (next )) {
510
517
ASSERT_UIBYTES_RANGE (next , 0xFFFFFFFF );
511
518
count += (4 + VAL_LEN (next ));
@@ -643,8 +650,10 @@ static REBCNT EncodedU32_Size(u32 value) {
643
650
Do_Path (& next , NULL );
644
651
next = DS_POP ; // volatile stack reference
645
652
}
646
- if (IS_STRING (next )) {
647
- Set_Binary (next , Encode_UTF8_Value (next , VAL_LEN (next ), 0 ));
653
+ if (IS_STRING (next ) || IS_FILE (next ) || IS_URL (next )) {
654
+ DS_PUSH_NONE ;
655
+ Set_Binary (DS_TOP , Encode_UTF8_Value (next , VAL_LEN (next ), 0 ));
656
+ next = DS_POP ;
648
657
}
649
658
650
659
switch (VAL_WORD_CANON (data )) {
@@ -771,6 +780,7 @@ static REBCNT EncodedU32_Size(u32 value) {
771
780
VAL_INDEX (buffer_write )++ ; //for the length byte;
772
781
break ;
773
782
case SYM_UI16BYTES :
783
+ case SYM_UI16BEBYTES :
774
784
n = VAL_LEN (next );
775
785
bp = (REBYTE * )& n ;
776
786
#ifdef ENDIAN_LITTLE
@@ -796,24 +806,50 @@ static REBCNT EncodedU32_Size(u32 value) {
796
806
break ;
797
807
798
808
case SYM_UI24BYTES :
809
+ case SYM_UI24BEBYTES :
799
810
n = VAL_LEN (next );
800
811
bp = (REBYTE * )& n ;
801
812
#ifdef ENDIAN_LITTLE
802
813
cp [0 ] = bp [2 ]; cp [1 ] = bp [1 ]; cp [2 ] = bp [0 ];
803
814
#else
804
815
memcpy (cp , bp , 3 );
816
+ #endif
817
+ cp += 3 ;
818
+ memcpy (cp , VAL_BIN_AT (next ), n );
819
+ VAL_INDEX (buffer_write ) += 3 ; //for the length byte;
820
+ break ;
821
+ case SYM_UI24LEBYTES :
822
+ n = VAL_LEN (next );
823
+ bp = (REBYTE * )& n ;
824
+ #ifdef ENDIAN_LITTLE
825
+ memcpy (cp , bp , 3 );
826
+ #else
827
+ cp [0 ] = bp [2 ]; cp [1 ] = bp [1 ]; cp [2 ] = bp [0 ];
805
828
#endif
806
829
cp += 3 ;
807
830
memcpy (cp , VAL_BIN_AT (next ), n );
808
831
VAL_INDEX (buffer_write ) += 3 ; //for the length byte;
809
832
break ;
810
833
case SYM_UI32BYTES :
834
+ case SYM_UI32BEBYTES :
811
835
n = VAL_LEN (next );
812
836
bp = (REBYTE * )& n ;
813
837
#ifdef ENDIAN_LITTLE
814
838
cp [0 ] = bp [3 ]; cp [1 ] = bp [2 ]; cp [2 ] = bp [1 ]; cp [3 ] = bp [0 ];
815
839
#else
816
840
memcpy (cp , bp , 4 );
841
+ #endif
842
+ cp += 4 ;
843
+ memcpy (cp , VAL_BIN_AT (next ), n );
844
+ VAL_INDEX (buffer_write ) += 4 ; //for the length byte;
845
+ break ;
846
+ case SYM_UI32LEBYTES :
847
+ n = VAL_LEN (next );
848
+ bp = (REBYTE * )& n ;
849
+ #ifdef ENDIAN_LITTLE
850
+ memcpy (cp , bp , 4 );
851
+ #else
852
+ cp [0 ] = bp [3 ]; cp [1 ] = bp [2 ]; cp [2 ] = bp [1 ]; cp [3 ] = bp [0 ];
817
853
#endif
818
854
cp += 4 ;
819
855
memcpy (cp , VAL_BIN_AT (next ), n );
@@ -978,6 +1014,17 @@ static REBCNT EncodedU32_Size(u32 value) {
978
1014
979
1015
inBit = IS_OBJECT (val_ctx ) ? VAL_INT32 (VAL_OBJ_VALUE (val_ctx , BINCODE_READ_BITMASK )): 0 ;
980
1016
1017
+ if (IS_INTEGER (val_read )) {
1018
+ n = VAL_INT64 (val_read );
1019
+ ASSERT_READ_SIZE (val_read , cp , ep , n );
1020
+ if (ref_into ) {
1021
+ Trap0 (RE_FEATURE_NA );
1022
+ }
1023
+ Set_Binary (D_RET , Copy_Series_Part (bin , VAL_INDEX (buffer_read ), n ));
1024
+ VAL_TAIL (D_RET ) = n ;
1025
+ VAL_INDEX (buffer_read ) += n ;
1026
+ return R_RET ;
1027
+ }
981
1028
as_block = IS_BLOCK (val_read );
982
1029
983
1030
if (as_block ) {
@@ -1237,7 +1284,7 @@ static REBCNT EncodedU32_Size(u32 value) {
1237
1284
if (nbits > 0 ) {
1238
1285
if (inBit == 0 ) inBit = 0x80 ;
1239
1286
// http://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend
1240
- u64 m = 1U << (nbits - 1 ); // sign bit mask
1287
+ u64 m = ( u64 ) 1 << (nbits - 1 ); // sign bit mask
1241
1288
nbits = 1 << nbits ;
1242
1289
//if (nbits > 0) {
1243
1290
//printf("SB nbits: %i\n", nbits);
@@ -1326,7 +1373,7 @@ static REBCNT EncodedU32_Size(u32 value) {
1326
1373
VAL_SERIES (temp ) = bin_new ;
1327
1374
VAL_INDEX (temp ) = 0 ;
1328
1375
if (cmd == SYM_STRING_BYTES ) {
1329
- VAL_TAIL (temp ) = strnlen (VAL_BIN (temp ), n );
1376
+ VAL_TAIL (temp ) = strnlen (cs_cast ( VAL_BIN (temp ) ), n );
1330
1377
}
1331
1378
}
1332
1379
break ;
0 commit comments