@@ -218,6 +218,13 @@ static REBCNT EncodedU32_Size(u32 value) {
218
218
return count ;
219
219
}
220
220
221
+ static REBCNT EncodedVINT_Size (REBU64 value ) {
222
+ REBCNT count = 1 ;
223
+ REBU64 temp = value ;
224
+ while (temp >= (1ULL << (7 * count ))) count ++ ;
225
+ return count ;
226
+ }
227
+
221
228
/***********************************************************************
222
229
**
223
230
*/ REBNATIVE (binary )
@@ -565,6 +572,13 @@ static REBCNT EncodedU32_Size(u32 value) {
565
572
}
566
573
goto error ;
567
574
575
+ case SYM_VINT :
576
+ if (IS_INTEGER (next )) {
577
+ count += EncodedVINT_Size (VAL_UNT64 (next ));
578
+ continue ;
579
+ }
580
+ goto error ;
581
+
568
582
case SYM_FLOAT :
569
583
case SYM_F32 :
570
584
case SYM_F32LE :
@@ -936,6 +950,16 @@ static REBCNT EncodedU32_Size(u32 value) {
936
950
}
937
951
break ;
938
952
953
+ case SYM_VINT :
954
+ u = VAL_UNT64 (next );
955
+ n = EncodedVINT_Size (u );
956
+ for (i = n - 1 ; i > 0 ; i -- ) {
957
+ cp [i ] = (char )(u & 0xFF );
958
+ u >>= 8 ;
959
+ }
960
+ cp [0 ] = (char )(u | (0x80 >> (n - 1 )));
961
+ break ;
962
+
939
963
case SYM_UNIXTIME_NOW :
940
964
value -- ; // no args
941
965
n = 4 ;
@@ -1651,6 +1675,29 @@ static REBCNT EncodedU32_Size(u32 value) {
1651
1675
VAL_INDEX (buffer_write ) = MAX (0 , (REBI64 )VAL_INDEX (buffer_write ) - VAL_INDEX (buffer_read ));
1652
1676
VAL_INDEX (buffer_read ) = 0 ;
1653
1677
continue ;
1678
+
1679
+ case SYM_VINT : {
1680
+ // A variable-length format for positive integers
1681
+ ASSERT_READ_SIZE (value , cp , ep , 1 );
1682
+ int mask = 0x80 ;
1683
+ n = 1 ;
1684
+ // Determine the length of the VINT
1685
+ while (mask ) {
1686
+ if (cp [0 ] & mask ) break ;
1687
+ mask >>= 1 ;
1688
+ n ++ ;
1689
+ }
1690
+ // Extract the VINT value
1691
+ ASSERT_READ_SIZE (value , cp , ep , n );
1692
+ u = (u64 )(cp [0 ] & (0xFF >> n ));
1693
+ for (int i = 1 ; i < n ; i ++ ) {
1694
+ u = (u << 8 ) | cp [i ];
1695
+ }
1696
+ VAL_SET (temp , REB_INTEGER );
1697
+ VAL_UNT64 (temp ) = u ;
1698
+ break ;
1699
+ }
1700
+
1654
1701
default :
1655
1702
Trap1 (RE_INVALID_SPEC , value );
1656
1703
}
0 commit comments