xref: /inferno-os/appl/lib/encoding/base32.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Encoding;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "encoding.m";
4*37da2899SCharles.Forsyth
5*37da2899SCharles.Forsythb32: con "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythenc(a: array of byte): string
8*37da2899SCharles.Forsyth{
9*37da2899SCharles.Forsyth	if(len a == 0)
10*37da2899SCharles.Forsyth		return "========";
11*37da2899SCharles.Forsyth	out := "";
12*37da2899SCharles.Forsyth	nbit := len a * 8;
13*37da2899SCharles.Forsyth	for(bit := 0; bit < nbit; bit += 5){
14*37da2899SCharles.Forsyth		b := bit >> 3;
15*37da2899SCharles.Forsyth		r := bit & 7;
16*37da2899SCharles.Forsyth		v := int a[b] << r;
17*37da2899SCharles.Forsyth		if(r > 3){
18*37da2899SCharles.Forsyth			if(b+1 < len a)
19*37da2899SCharles.Forsyth				v |= int (a[b+1] >> (8-r));
20*37da2899SCharles.Forsyth		}
21*37da2899SCharles.Forsyth		out[len out] = b32[(v>>3) & 16r1F];
22*37da2899SCharles.Forsyth	}
23*37da2899SCharles.Forsyth	while(len out & 7)
24*37da2899SCharles.Forsyth		out[len out] = '=';	# RFC3548 says pad: we pad.
25*37da2899SCharles.Forsyth	return out;
26*37da2899SCharles.Forsyth}
27*37da2899SCharles.Forsyth
28*37da2899SCharles.ForsythNaughty: con 255;
29*37da2899SCharles.Forsyth
30*37da2899SCharles.Forsytht32d := array[256] of {
31*37da2899SCharles.Forsyth	'a' => byte 0, 'b' => byte 1, 'c' => byte 2, 'd' => byte 3, 'e' => byte 4, 'f' => byte 5, 'g' => byte 6, 'h' => byte 7,
32*37da2899SCharles.Forsyth	'i' => byte 8, 'j' => byte 9, 'k' => byte 10, 'l' => byte 11, 'm' => byte 12, 'n' => byte 13, 'o' => byte 14, 'p' => byte 15,
33*37da2899SCharles.Forsyth	'q' => byte 16, 'r' => byte 17, 's' => byte 18, 't' => byte 19, 'u' => byte 20, 'v' => byte 21, 'w' => byte 22, 'x' => byte 23,
34*37da2899SCharles.Forsyth	'y' => byte 24, 'z' => byte 25,
35*37da2899SCharles.Forsyth	'A' => byte 0, 'B' => byte 1, 'C' => byte 2, 'D' => byte 3, 'E' => byte 4, 'F' => byte 5, 'G' => byte 6, 'H' => byte 7,
36*37da2899SCharles.Forsyth	'I' => byte 8, 'J' => byte 9, 'K' => byte 10, 'L' => byte 11, 'M' => byte 12, 'N' => byte 13, 'O' => byte 14, 'P' => byte 15,
37*37da2899SCharles.Forsyth	'Q' => byte 16, 'R' => byte 17, 'S' => byte 18, 'T' => byte 19, 'U' => byte 20, 'V' => byte 21, 'W' => byte 22, 'X' => byte 23,
38*37da2899SCharles.Forsyth	'Y' => byte 24, 'Z' => byte 25,
39*37da2899SCharles.Forsyth	'2' => byte 26, '3' => byte 27, '4' => byte 28, '5' => byte 29, '6' => byte 30, '7' => byte 31,
40*37da2899SCharles.Forsyth	* => byte Naughty
41*37da2899SCharles.Forsyth};
42*37da2899SCharles.Forsyth
43*37da2899SCharles.Forsythdec(s: string): array of byte
44*37da2899SCharles.Forsyth{
45*37da2899SCharles.Forsyth	a := array[(8*len s + 4)/5] of byte;
46*37da2899SCharles.Forsyth	o := 0;
47*37da2899SCharles.Forsyth	v := 0;
48*37da2899SCharles.Forsyth	j := 0;
49*37da2899SCharles.Forsyth	for(i := 0; i < len s; i++){
50*37da2899SCharles.Forsyth		if((c := s[i]) > 16rFF || (c = int t32d[c]) == Naughty)
51*37da2899SCharles.Forsyth			continue;
52*37da2899SCharles.Forsyth		v <<= 5;
53*37da2899SCharles.Forsyth		v |= c;
54*37da2899SCharles.Forsyth		if((j += 5) >= 8){
55*37da2899SCharles.Forsyth			a[o++] = byte (v>>(j-8));
56*37da2899SCharles.Forsyth			j -= 8;
57*37da2899SCharles.Forsyth		}
58*37da2899SCharles.Forsyth	}
59*37da2899SCharles.Forsyth	return a[0:o];
60*37da2899SCharles.Forsyth}
61