@@ -3716,148 +3716,6 @@ f_balloon_split(typval_T *argvars, typval_T *rettv UNUSED)
37163716# endif
37173717#endif
37183718
3719- // Base64 character set
3720- static const char_u base64_table [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ;
3721-
3722- // Base64 decoding table (initialized in init_base64_dec_table() below)
3723- static char_u base64_dec_table [256 ];
3724-
3725- /*
3726- * Initialize the base64 decoding table
3727- */
3728- static void
3729- init_base64_dec_table (void )
3730- {
3731- static int base64_dec_tbl_initialized = FALSE;
3732-
3733- if (base64_dec_tbl_initialized )
3734- return ;
3735-
3736- // Unsupported characters are set to 0xFF
3737- vim_memset (base64_dec_table , 0xFF , sizeof (base64_dec_table ));
3738-
3739- // Initialize the index for the base64 alphabets
3740- for (size_t i = 0 ; i < sizeof (base64_table ) - 1 ; i ++ )
3741- base64_dec_table [(char_u )base64_table [i ]] = (char_u )i ;
3742-
3743- // base64 padding character
3744- base64_dec_table ['=' ] = 0 ;
3745-
3746- base64_dec_tbl_initialized = TRUE;
3747- }
3748-
3749- /*
3750- * Encode the bytes in "blob" using base-64 encoding.
3751- */
3752- static char_u *
3753- base64_encode (blob_T * blob )
3754- {
3755- size_t input_len = blob -> bv_ga .ga_len ;
3756- size_t encoded_len = ((input_len + 2 ) / 3 ) * 4 ;
3757- char_u * data = blob -> bv_ga .ga_data ;
3758-
3759- char_u * encoded = alloc (encoded_len + 1 );
3760- if (encoded == NULL )
3761- return NULL ;
3762-
3763- size_t i , j ;
3764- for (i = 0 , j = 0 ; i < input_len ;)
3765- {
3766- int_u octet_a = i < input_len ? data [i ++ ] : 0 ;
3767- int_u octet_b = i < input_len ? data [i ++ ] : 0 ;
3768- int_u octet_c = i < input_len ? data [i ++ ] : 0 ;
3769-
3770- int_u triple = (octet_a << 16 ) | (octet_b << 8 ) | octet_c ;
3771-
3772- encoded [j ++ ] = base64_table [(triple >> 18 ) & 0x3F ];
3773- encoded [j ++ ] = base64_table [(triple >> 12 ) & 0x3F ];
3774- encoded [j ++ ] = (!octet_b && i >= input_len ) ? '='
3775- : base64_table [(triple >> 6 ) & 0x3F ];
3776- encoded [j ++ ] = (!octet_c && i >= input_len ) ? '='
3777- : base64_table [triple & 0x3F ];
3778- }
3779- encoded [j ] = NUL ;
3780-
3781- return encoded ;
3782- }
3783-
3784- /*
3785- * Decode the string "data" using base-64 encoding.
3786- */
3787- static void
3788- base64_decode (const char_u * data , blob_T * blob )
3789- {
3790- size_t input_len = STRLEN (data );
3791-
3792- if (input_len == 0 )
3793- return ;
3794-
3795- if (input_len % 4 != 0 )
3796- {
3797- // Invalid input length
3798- semsg (_ (e_invalid_argument_str ), data );
3799- return ;
3800- }
3801-
3802- init_base64_dec_table ();
3803-
3804- size_t decoded_len = (input_len / 4 ) * 3 ;
3805- if (data [input_len - 1 ] == '=' )
3806- decoded_len -- ;
3807- if (data [input_len - 2 ] == '=' )
3808- decoded_len -- ;
3809-
3810- size_t i , j ;
3811- for (i = 0 , j = 0 ; i < input_len ;)
3812- {
3813- int_u sextet_a = base64_dec_table [(char_u )data [i ++ ]];
3814- int_u sextet_b = base64_dec_table [(char_u )data [i ++ ]];
3815- int_u sextet_c = base64_dec_table [(char_u )data [i ++ ]];
3816- int_u sextet_d = base64_dec_table [(char_u )data [i ++ ]];
3817-
3818- if (sextet_a == 0xFF || sextet_b == 0xFF || sextet_c == 0xFF
3819- || sextet_d == 0xFF )
3820- {
3821- // Invalid character
3822- semsg (_ (e_invalid_argument_str ), data );
3823- ga_clear (& blob -> bv_ga );
3824- return ;
3825- }
3826-
3827- int_u triple = (sextet_a << 18 ) | (sextet_b << 12 )
3828- | (sextet_c << 6 ) | sextet_d ;
3829-
3830- if (j < decoded_len )
3831- {
3832- ga_append (& blob -> bv_ga , (triple >> 16 ) & 0xFF );
3833- j ++ ;
3834- }
3835- if (j < decoded_len )
3836- {
3837- ga_append (& blob -> bv_ga , (triple >> 8 ) & 0xFF );
3838- j ++ ;
3839- }
3840- if (j < decoded_len )
3841- {
3842- ga_append (& blob -> bv_ga , triple & 0xFF );
3843- j ++ ;
3844- }
3845-
3846- if (j == decoded_len )
3847- {
3848- // Check for invalid padding bytes (based on the
3849- // "Base64 Malleability in Practice" ACM paper).
3850- if ((data [input_len - 2 ] == '=' && ((sextet_b & 0xF ) != 0 ))
3851- || ((data [input_len - 1 ] == '=' ) && ((sextet_c & 0x3 ) != 0 )))
3852- {
3853- semsg (_ (e_invalid_argument_str ), data );
3854- ga_clear (& blob -> bv_ga );
3855- return ;
3856- }
3857- }
3858- }
3859- }
3860-
38613719/*
38623720 * "base64_decode(string)" function
38633721 */
@@ -3872,7 +3730,7 @@ f_base64_decode(typval_T *argvars, typval_T *rettv)
38723730
38733731 char_u * str = tv_get_string_chk (& argvars [0 ]);
38743732 if (str != NULL )
3875- base64_decode (str , rettv -> vval .v_blob );
3733+ base64_decode (str , STRLEN ( str ), & rettv -> vval .v_blob -> bv_ga );
38763734}
38773735
38783736/*
@@ -3889,7 +3747,8 @@ f_base64_encode(typval_T *argvars, typval_T *rettv)
38893747
38903748 blob_T * blob = argvars -> vval .v_blob ;
38913749 if (blob != NULL )
3892- rettv -> vval .v_string = base64_encode (blob );
3750+ rettv -> vval .v_string =
3751+ base64_encode (blob -> bv_ga .ga_data , blob -> bv_ga .ga_len );
38933752}
38943753
38953754/*
0 commit comments