8 const utf8_from_base64 : (encoded : byte[:] -> std.result(byte[:], void))
11 const b64_value = { b : byte
12 if ('A' : byte) <= b && b <= ('Z' : byte)
13 -> `std.Some (b - ('A' : byte))
14 elif ('a' : byte) <= b && b <= ('z' : byte)
15 -> `std.Some (b - ('a' : byte) + 26)
16 elif ('0' : byte) <= b && b <= ('9' : byte)
17 -> `std.Some (b - ('0' : byte) + 52)
18 elif b == ('+' : byte)
20 elif b == ('/' : byte)
22 elif b == ('=' : byte)
29 const utf8_from_base64 = { encoded : byte[:]
30 var decoded : std.strbuf# = std.mksb()
31 var since_nl : int = 0
32 var buf : byte[3] = [0, 0, 0]
33 var four_pos : int = 0
34 var num_equals : int = 0
37 if b == ('\n' : byte) || b == ('\r' : byte)
53 if n != 0 && num_equals != 0
60 buf[0] |= (n & 0b00111111) << 2
62 buf[0] |= (n & 0b00110000) >> 4
63 buf[1] |= (n & 0b00001111) << 4
65 buf[1] |= (n & 0b00111100) >> 2
66 buf[2] |= (n & 0b00000011) << 6
68 buf[2] |= (n & 0b00111111)
69 std.sbputs(decoded, buf[0:3 - num_equals])
73 four_pos = (four_pos + 1) % 4
81 if !util.non_ctrl_utf8(std.sbpeek(decoded))
85 -> `std.Ok std.sbfin(decoded)