Introduction
Introduction Statistics Contact Development Disclaimer Help
u64.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
u64.c (3267B)
---
1 #include <lib9.h>
2
3 enum {
4 INVAL= 255
5 };
6
7 static uchar t64d[256] = {
8 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
9 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
10 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL, …
11 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,INVAL,INV…
12 INVAL, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, …
13 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,INV…
14 INVAL, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, …
15 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,INV…
16 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
17 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
18 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
19 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
20 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
21 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
22 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
23 INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INVAL,INV…
24 };
25 static char t64e[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx…
26
27 int
28 dec64(uchar *out, int lim, char *in, int n)
29 {
30 ulong b24;
31 uchar *start = out;
32 uchar *e = out + lim;
33 int i, c;
34
35 b24 = 0;
36 i = 0;
37 while(n-- > 0){
38
39 c = t64d[*(uchar*)in++];
40 if(c == INVAL)
41 continue;
42 switch(i){
43 case 0:
44 b24 = c<<18;
45 break;
46 case 1:
47 b24 |= c<<12;
48 break;
49 case 2:
50 b24 |= c<<6;
51 break;
52 case 3:
53 if(out + 3 > e)
54 goto exhausted;
55
56 b24 |= c;
57 *out++ = b24>>16;
58 *out++ = b24>>8;
59 *out++ = b24;
60 i = -1;
61 break;
62 }
63 i++;
64 }
65 switch(i){
66 case 2:
67 if(out + 1 > e)
68 goto exhausted;
69 *out++ = b24>>16;
70 break;
71 case 3:
72 if(out + 2 > e)
73 goto exhausted;
74 *out++ = b24>>16;
75 *out++ = b24>>8;
76 break;
77 }
78 exhausted:
79 return out - start;
80 }
81
82 int
83 enc64(char *out, int lim, uchar *in, int n)
84 {
85 int i;
86 ulong b24;
87 char *start = out;
88 char *e = out + lim;
89
90 for(i = n/3; i > 0; i--){
91 b24 = (*in++)<<16;
92 b24 |= (*in++)<<8;
93 b24 |= *in++;
94 if(out + 4 >= e)
95 goto exhausted;
96 *out++ = t64e[(b24>>18)];
97 *out++ = t64e[(b24>>12)&0x3f];
98 *out++ = t64e[(b24>>6)&0x3f];
99 *out++ = t64e[(b24)&0x3f];
100 }
101
102 switch(n%3){
103 case 2:
104 b24 = (*in++)<<16;
105 b24 |= (*in)<<8;
106 if(out + 4 >= e)
107 goto exhausted;
108 *out++ = t64e[(b24>>18)];
109 *out++ = t64e[(b24>>12)&0x3f];
110 *out++ = t64e[(b24>>6)&0x3f];
111 *out++ = '=';
112 break;
113 case 1:
114 b24 = (*in)<<16;
115 if(out + 4 >= e)
116 goto exhausted;
117 *out++ = t64e[(b24>>18)];
118 *out++ = t64e[(b24>>12)&0x3f];
119 *out++ = '=';
120 *out++ = '=';
121 break;
122 }
123 exhausted:
124 *out = 0;
125 return out - start;
126 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.