10
10
11
11
module base32
12
12
13
- pub const (
14
- std_padding = `=` // Standard padding character
15
- no_padding = u8 (- 1 ) // No padding
16
- std_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' .bytes ()
17
- hex_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUV' .bytes ()
13
+ pub const (
14
+ std_padding = `=` // Standard padding character
15
+ no_padding = u8 (- 1 ) // No padding
16
+ std_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' .bytes ()
17
+ hex_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUV' .bytes ()
18
18
)
19
19
20
20
struct Encoding {
21
21
padding_char u8
22
- alphabet []u8
22
+ alphabet []u8
23
23
mut :
24
- decode_map [256 ]u8
24
+ decode_map [256 ]u8
25
25
}
26
26
27
27
pub fn decode_string_to_string (src string ) ? string {
@@ -34,7 +34,7 @@ pub fn decode_to_string(src []u8) ?string {
34
34
}
35
35
36
36
pub fn decode (src []u8 ) ? []u8 {
37
- mut e := new_encoding (std_alphabet)
37
+ mut e := new_encoding (base 32 . std_alphabet)
38
38
return e.decode (src)
39
39
}
40
40
@@ -47,8 +47,8 @@ pub fn encode_to_string(src []u8) string {
47
47
}
48
48
49
49
pub fn encode (src []u8 ) []u8 {
50
- e := new_encoding (std_alphabet)
51
- return e.encode (src)
50
+ e := new_encoding (base 32 . std_alphabet)
51
+ return e.encode (src)
52
52
}
53
53
54
54
pub fn (enc &Encoding) encode_to_string (src []u8 ) string {
@@ -60,15 +60,15 @@ pub fn (enc &Encoding) encode_string_to_string(src string) string {
60
60
}
61
61
62
62
pub fn new_std_encoding () Encoding {
63
- return new_encoding_with_padding (std_alphabet, std_padding)
63
+ return new_encoding_with_padding (base 32 . std_alphabet, base 32 . std_padding)
64
64
}
65
65
66
66
pub fn new_std_encoding_with_padding (padding u8 ) Encoding {
67
- return new_encoding_with_padding (std_alphabet, padding)
67
+ return new_encoding_with_padding (base 32 . std_alphabet, padding)
68
68
}
69
69
70
70
pub fn new_encoding (alphabet []u8 ) Encoding {
71
- return new_encoding_with_padding (alphabet, std_padding)
71
+ return new_encoding_with_padding (alphabet, base 32 . std_padding)
72
72
}
73
73
74
74
pub fn new_encoding_with_padding (alphabet []u8 , padding_char u8 ) Encoding {
@@ -83,7 +83,7 @@ pub fn new_encoding_with_padding(alphabet []u8, padding_char u8) Encoding {
83
83
}
84
84
85
85
mut decode_map := [256 ]u8 {}
86
- for i in 0 .. alphabet.len {
86
+ for i in 0 .. alphabet.len {
87
87
decode_map[alphabet[i]] = u8 (i)
88
88
}
89
89
@@ -95,8 +95,8 @@ pub fn new_encoding_with_padding(alphabet []u8, padding_char u8) Encoding {
95
95
}
96
96
97
97
fn (enc &Encoding) encode (src []u8 ) []u8 {
98
- mut buf := []u8 {len: enc.encoded_len (src.len)}
99
- mut dst := unsafe { buf }
98
+ mut buf := []u8 {len: enc.encoded_len (src.len)}
99
+ mut dst := unsafe { buf }
100
100
enc.encode_ (src, mut dst)
101
101
return buf
102
102
}
@@ -140,23 +140,23 @@ fn (enc &Encoding) encode_(src_ []u8, mut dst []u8) {
140
140
// Encode 5-bit blocks using the base32 alphabet
141
141
if dst.len > = 8 {
142
142
// Common case, unrolled for extra performance
143
- dst[0 ] = enc.alphabet[b[0 ]& 31 ]
144
- dst[1 ] = enc.alphabet[b[1 ]& 31 ]
145
- dst[2 ] = enc.alphabet[b[2 ]& 31 ]
146
- dst[3 ] = enc.alphabet[b[3 ]& 31 ]
147
- dst[4 ] = enc.alphabet[b[4 ]& 31 ]
148
- dst[5 ] = enc.alphabet[b[5 ]& 31 ]
149
- dst[6 ] = enc.alphabet[b[6 ]& 31 ]
150
- dst[7 ] = enc.alphabet[b[7 ]& 31 ]
143
+ dst[0 ] = enc.alphabet[b[0 ] & 31 ]
144
+ dst[1 ] = enc.alphabet[b[1 ] & 31 ]
145
+ dst[2 ] = enc.alphabet[b[2 ] & 31 ]
146
+ dst[3 ] = enc.alphabet[b[3 ] & 31 ]
147
+ dst[4 ] = enc.alphabet[b[4 ] & 31 ]
148
+ dst[5 ] = enc.alphabet[b[5 ] & 31 ]
149
+ dst[6 ] = enc.alphabet[b[6 ] & 31 ]
150
+ dst[7 ] = enc.alphabet[b[7 ] & 31 ]
151
151
} else {
152
152
for i := 0 ; i < dst.len; i++ {
153
- dst[i] = enc.alphabet[b[i]& 31 ]
153
+ dst[i] = enc.alphabet[b[i] & 31 ]
154
154
}
155
155
}
156
156
157
157
// Pad the final quantum
158
158
if src.len < 5 {
159
- if enc.padding_char == no_padding {
159
+ if enc.padding_char == base 32 . no_padding {
160
160
break
161
161
}
162
162
@@ -180,14 +180,14 @@ fn (enc &Encoding) encode_(src_ []u8, mut dst []u8) {
180
180
}
181
181
}
182
182
183
- fn (enc &Encoding) encoded_len (n int ) int {
184
- if enc.padding_char == no_padding {
185
- return (n* 8 + 4 ) / 5
183
+ fn (enc &Encoding) encoded_len (n int ) int {
184
+ if enc.padding_char == base 32 . no_padding {
185
+ return (n * 8 + 4 ) / 5
186
186
}
187
187
return (n + 4 ) / 5 * 8
188
188
}
189
189
190
- pub fn (enc &Encoding) decode_string (src string ) ? []u8 {
190
+ pub fn (enc &Encoding) decode_string (src string ) ? []u8 {
191
191
return enc.decode (src.bytes ())
192
192
// mut buf := strip_newlines(src.bytes())
193
193
// mut dst := unsafe { buf }
@@ -196,20 +196,18 @@ pub fn (enc &Encoding) decode_string(src string) ?[]u8 {
196
196
// return buf[..n]
197
197
}
198
198
199
- pub fn (enc &Encoding) decode_string_to_string (src string ) ? string {
199
+ pub fn (enc &Encoding) decode_string_to_string (src string ) ? string {
200
200
decoded := enc.decode_string (src)?
201
201
return decoded.bytestr ()
202
202
}
203
203
204
- pub fn (enc &Encoding) decode (src []u8 ) ? []u8 {
204
+ pub fn (enc &Encoding) decode (src []u8 ) ? []u8 {
205
205
mut buf := []u8 {len: src.len}
206
- // mut dst := unsafe { buf }
206
+ // mut dst := unsafe { buf }
207
207
// l := strip_newlines(mut dst, src)
208
208
// n, _ := enc.decode_(src[..l], mut dst) or {
209
209
// src := strip_newlines(src_)
210
- n , _ := enc.decode_ (src, mut buf) or {
211
- return err
212
- }
210
+ n , _ := enc.decode_ (src, mut buf) or { return err }
213
211
return buf[..n]
214
212
}
215
213
@@ -233,9 +231,8 @@ fn (enc &Encoding) decode_(src_ []u8, mut dst []u8) ?(int, bool) {
233
231
mut dlen := 8
234
232
235
233
for j := 0 ; j < 8 ; {
236
-
237
234
if src.len == 0 {
238
- if enc.padding_char != no_padding {
235
+ if enc.padding_char != base 32 . no_padding {
239
236
// We have reached the end and are missing padding
240
237
// return n, false, corrupt_input_error(olen - src.len - j)
241
238
return error (corrupt_input_error_msg (olen - src.len - j))
@@ -248,12 +245,12 @@ fn (enc &Encoding) decode_(src_ []u8, mut dst []u8) ?(int, bool) {
248
245
src = src[1 ..]
249
246
if in0 == enc.padding_char && j > = 2 && src.len < 8 {
250
247
// We`ve reached the end and there`s padding
251
- if src.len+ j < 8 - 1 {
248
+ if src.len + j < 8 - 1 {
252
249
// not enough padding
253
250
// return n, false, corrupt_input_error(olen)
254
251
return error (corrupt_input_error_msg (olen))
255
252
}
256
- for k := 0 ; k < 8 - 1 - j; k++ {
253
+ for k := 0 ; k < 8 - 1 - j; k++ {
257
254
if src.len > k && src[k] != enc.padding_char {
258
255
// incorrect padding
259
256
// return n, false, corrupt_input_error(olen - src.len + k - 1)
@@ -272,7 +269,7 @@ fn (enc &Encoding) decode_(src_ []u8, mut dst []u8) ?(int, bool) {
272
269
}
273
270
break
274
271
}
275
-
272
+
276
273
dbuf[j] = enc.decode_map[in0 ]
277
274
if dbuf[j] == 0xFF {
278
275
// return n, false, corrupt_input_error(olen - src.len - 1)
@@ -284,23 +281,23 @@ fn (enc &Encoding) decode_(src_ []u8, mut dst []u8) ?(int, bool) {
284
281
// Pack 8x 5-bit source blocks into 5 u8 destination
285
282
// quantum
286
283
if dlen == 8 {
287
- dst[dsti+ 4 ] = dbuf[6 ]<< 5 | dbuf[7 ]
284
+ dst[dsti + 4 ] = dbuf[6 ] << 5 | dbuf[7 ]
288
285
n++
289
286
}
290
287
if dlen > = 7 {
291
- dst[dsti+ 3 ] = dbuf[4 ]<< 7 | dbuf[5 ]<< 2 | dbuf[6 ]>> 3
288
+ dst[dsti + 3 ] = dbuf[4 ] << 7 | dbuf[5 ] << 2 | dbuf[6 ] >> 3
292
289
n++
293
290
}
294
291
if dlen > = 5 {
295
- dst[dsti+ 2 ] = dbuf[3 ]<< 4 | dbuf[4 ]>> 1
292
+ dst[dsti + 2 ] = dbuf[3 ] << 4 | dbuf[4 ] >> 1
296
293
n++
297
294
}
298
295
if dlen > = 4 {
299
- dst[dsti+ 1 ] = dbuf[1 ]<< 6 | dbuf[2 ]<< 1 | dbuf[3 ]>> 4
296
+ dst[dsti + 1 ] = dbuf[1 ] << 6 | dbuf[2 ] << 1 | dbuf[3 ] >> 4
300
297
n++
301
298
}
302
299
if dlen > = 2 {
303
- dst[dsti+ 0 ] = dbuf[0 ]<< 3 | dbuf[1 ]>> 2
300
+ dst[dsti + 0 ] = dbuf[0 ] << 3 | dbuf[1 ] >> 2
304
301
n++
305
302
}
306
303
dsti + = 5
@@ -332,7 +329,6 @@ fn strip_newlines(src []u8) []u8 {
332
329
return dst
333
330
}
334
331
335
-
336
332
fn corrupt_input_error_msg (e int ) string {
337
333
// return error('illegal base32 data at input byte ' + strconv.FormatInt(int64(e), 10)
338
334
return 'illegal base32 data at input byte $e '
0 commit comments