@@ -617,53 +617,43 @@ static struct digest {
617
617
REBINT len = (REBINT )VAL_LEN (arg ); // due to len -= 2 below
618
618
REBUNI n ;
619
619
REBSER * ser ;
620
+ REBYTE * bp , * dp ;
620
621
621
622
const REBCHR escape_char = D_REF (2 ) ? VAL_CHAR (D_ARG (3 )) : '%' ;
622
623
const REBCHR space_char = escape_char == '=' ? '_' : '+' ;
623
624
624
625
if (VAL_BYTE_SIZE (arg )) {
625
- REBYTE * bp = VAL_BIN_DATA (arg );
626
- REBYTE * dp = Reset_Buffer (BUF_FORM , len );
627
-
628
- for (; len > 0 ; len -- ) {
629
- if (* bp == escape_char && len > 2 && Scan_Hex2 (bp + 1 , & n , FALSE)) {
630
- * dp ++ = (REBYTE )n ;
631
- bp += 3 ;
632
- len -= 2 ;
633
- }
634
- else if (* bp == space_char && as_uri ) {
635
- * dp ++ = ' ' ;
636
- bp ++ ;
637
- }
638
- else {
639
- * dp ++ = * bp ++ ;
640
- }
641
- }
642
-
643
- * dp = 0 ;
644
- ser = Copy_String (BUF_FORM , 0 , dp - BIN_HEAD (BUF_FORM ));
626
+ bp = VAL_BIN_DATA (arg );
645
627
}
646
628
else {
647
- REBUNI * up = VAL_UNI_DATA (arg );
648
- REBUNI * dp = (REBUNI * )Reset_Buffer (BUF_MOLD , len );
629
+ // if the input is an unicode string, convert it to UTF8
630
+ ser = Encode_UTF8_String (VAL_UNI_DATA (arg ), len , TRUE, 0 );
631
+ len = BIN_LEN (ser ); // because the lengh may be changed!
632
+ bp = BIN_HEAD (ser );
633
+ }
649
634
650
- for (; len > 0 ; len -- ) {
651
- if (* up == escape_char && len > 2 && Scan_Hex2 ((REBYTE * )(up + 1 ), & n , TRUE)) {
652
- * dp ++ = (REBUNI )n ;
653
- up += 3 ;
654
- len -= 2 ;
655
- }
656
- else if (* up == space_char && as_uri ) {
657
- * dp ++ = ' ' ;
658
- up ++ ;
659
- }
660
- else {
661
- * dp ++ = * up ++ ;
662
- }
635
+ dp = Reset_Buffer (BUF_FORM , len + 1 ); // count also the terminating null byte
636
+
637
+ for (; len > 0 ; len -- ) {
638
+ if (* bp == escape_char && len > 2 && Scan_Hex2 (bp + 1 , & n , FALSE)) {
639
+ * dp ++ = (REBYTE )n ;
640
+ bp += 3 ;
641
+ len -= 2 ;
642
+ }
643
+ else if (* bp == space_char && as_uri ) {
644
+ * dp ++ = ' ' ;
645
+ bp ++ ;
646
+ }
647
+ else {
648
+ * dp ++ = * bp ++ ;
663
649
}
650
+ }
664
651
665
- * dp = 0 ;
666
- ser = Copy_String (BUF_MOLD , 0 , dp - UNI_HEAD (BUF_MOLD ));
652
+ * dp = 0 ;
653
+ if (IS_BINARY (arg )) {
654
+ ser = Copy_String (BUF_FORM , 0 , dp - BIN_HEAD (BUF_FORM ));
655
+ } else {
656
+ ser = Decode_UTF_String (VAL_BIN_DATA (TASK_BUF_FORM ), dp - BIN_HEAD (BUF_FORM ), -1 , FALSE, FALSE);
667
657
}
668
658
669
659
Set_Series (VAL_TYPE (arg ), D_RET , ser );
0 commit comments