X-Git-Url: http://nitlanguage.org diff --git a/lib/base64.nit b/lib/base64.nit index 8a718eb..7b78d78 100644 --- a/lib/base64.nit +++ b/lib/base64.nit @@ -28,7 +28,7 @@ redef class String do var inv_base64_chars = new HashMap[Char,Int] for k in [0..base64_chars.length[ do - inv_base64_chars[ base64_chars[k] ] = k + inv_base64_chars[ base64_chars.chars[k] ] = k end return inv_base64_chars end @@ -36,6 +36,10 @@ redef class String # Encodes the receiver string to base64. # By default, uses "=" for padding. fun encode_base64 : String do return encode_base64_custom_padding( '=' ) + + # Encodes the receiver string to base64 using a custom padding character. + # + # If using the default padding character `=`, see `encode_base64`. fun encode_base64_custom_padding( padding : Char ) : String do var base64_chars = once base64_chars @@ -52,32 +56,36 @@ redef class String for s in [0..steps[ do var e = 0 for ss in [0..3[ do - e += self[s*3+ss].ascii.lshift((2-ss)*8) + e += self.chars[s*3+ss].ascii.lshift((2-ss)*8) end for ss in [0..4[ do - result[s*4+3-ss] = base64_chars[ e.rshift(ss*6).bin_and( mask_6bit ) ] + result[s*4+3-ss] = base64_chars.chars[ e.rshift(ss*6).bin_and( mask_6bit ) ] end end if chars_in_last_step == 1 then - var e = self[length-1].ascii.lshift(16) + var e = self.chars[length-1].ascii.lshift(16) for ss in [0..2[ do - result[steps*4+1-ss] = base64_chars[ e.rshift((ss+2)*6).bin_and( mask_6bit ) ] + result[steps*4+1-ss] = base64_chars.chars[ e.rshift((ss+2)*6).bin_and( mask_6bit ) ] end else if chars_in_last_step == 2 then - var e = self[length-2].ascii.lshift(16) + - self[length-1].ascii.lshift(8) + var e = self.chars[length-2].ascii.lshift(16) + + self.chars[length-1].ascii.lshift(8) for ss in [0..3[ do - result[steps*4+2-ss] = base64_chars[ e.rshift((ss+1)*6).bin_and( mask_6bit ) ] + result[steps*4+2-ss] = base64_chars.chars[ e.rshift((ss+1)*6).bin_and( mask_6bit ) ] end end - return new String.from_cstring( result ) + return result.to_s end # Decodes the receiver string from base64. # By default, uses "=" for padding. fun decode_base64 : String do return decode_base64_custom_padding( '=' ) + + # Decodes the receiver string to base64 using a custom padding character. + # + # If using the default padding character `=`, see `decode_base64`. fun decode_base64_custom_padding( padding : Char ) : String do var inverted_base64_chars = once inverted_base64_chars @@ -87,12 +95,12 @@ redef class String var steps = length / 4 var result_length = steps*3 - var padding_begin = padding.search_index_in( self, 0 ) + var padding_begin = self.search(padding) var padding_count : Int - if padding_begin == -1 then + if padding_begin == null then padding_count = 0 else - padding_count = length - padding_begin + padding_count = length - padding_begin.from steps -= 1 result_length -= padding_count end @@ -104,7 +112,7 @@ redef class String for s in [0..steps[ do var e = 0 for ss in [0..4[ do - e += inverted_base64_chars[self[s*4+ss]].lshift((3-ss)*6) + e += inverted_base64_chars[self.chars[s*4+ss]].lshift((3-ss)*6) end for ss in [0..3[ do @@ -116,7 +124,7 @@ redef class String if padding_count == 1 then var e = 0 for ss in [0..3[ do - e += inverted_base64_chars[self[s*4+ss]].lshift((3-ss)*6) + e += inverted_base64_chars[self.chars[s*4+ss]].lshift((3-ss)*6) end for ss in [0..2[ do @@ -125,12 +133,12 @@ redef class String else if padding_count == 2 then var e = 0 for ss in [0..2[ do - e += inverted_base64_chars[self[s*4+ss]].lshift((3-ss)*6) + e += inverted_base64_chars[self.chars[s*4+ss]].lshift((3-ss)*6) end result[s*3] = e.rshift(2*8).bin_and( mask_8bit ).ascii end - return new String.from_cstring( result ) + return result.to_s end end