u32.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
u32.c (2399B) | |
--- | |
1 #include <lib9.h> | |
2 | |
3 int | |
4 dec32(uchar *dest, int ndest, char *src, int nsrc) | |
5 { | |
6 char *s, *tab; | |
7 uchar *start; | |
8 int i, u[8]; | |
9 | |
10 if(ndest+1 < (5*nsrc+7)/8) | |
11 return -1; | |
12 start = dest; | |
13 tab = "23456789abcdefghijkmnpqrstuvwxyz"; | |
14 while(nsrc>=8){ | |
15 for(i=0; i<8; i++){ | |
16 s = strchr(tab,(int)src[i]); | |
17 u[i] = s ? s-tab : 0; | |
18 } | |
19 *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2)); | |
20 *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>… | |
21 *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1)); | |
22 *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>… | |
23 *dest++ = ((0x7 & u[6])<<5) | u[7]; | |
24 src += 8; | |
25 nsrc -= 8; | |
26 } | |
27 if(nsrc > 0){ | |
28 if(nsrc == 1 || nsrc == 3 || nsrc == 6) | |
29 return -1; | |
30 for(i=0; i<nsrc; i++){ | |
31 s = strchr(tab,(int)src[i]); | |
32 u[i] = s ? s-tab : 0; | |
33 } | |
34 *dest++ = (u[0]<<3) | (0x7 & (u[1]>>2)); | |
35 if(nsrc == 2) | |
36 goto out; | |
37 *dest++ = ((0x3 & u[1])<<6) | (u[2]<<1) | (0x1 & (u[3]>>… | |
38 if(nsrc == 4) | |
39 goto out; | |
40 *dest++ = ((0xf & u[3])<<4) | (0xf & (u[4]>>1)); | |
41 if(nsrc == 5) | |
42 goto out; | |
43 *dest++ = ((0x1 & u[4])<<7) | (u[5]<<2) | (0x3 & (u[6]>>… | |
44 } | |
45 out: | |
46 return dest-start; | |
47 } | |
48 | |
49 int | |
50 enc32(char *dest, int ndest, uchar *src, int nsrc) | |
51 { | |
52 char *tab, *start; | |
53 int j; | |
54 | |
55 if(ndest <= (8*nsrc+4)/5 ) | |
56 return -1; | |
57 start = dest; | |
58 tab = "23456789abcdefghijkmnpqrstuvwxyz"; | |
59 while(nsrc>=5){ | |
60 j = (0x1f & (src[0]>>3)); | |
61 *dest++ = tab[j]; | |
62 j = (0x1c & (src[0]<<2)) | (0x03 & (src[1]>>6)); | |
63 *dest++ = tab[j]; | |
64 j = (0x1f & (src[1]>>1)); | |
65 *dest++ = tab[j]; | |
66 j = (0x10 & (src[1]<<4)) | (0x0f & (src[2]>>4)); | |
67 *dest++ = tab[j]; | |
68 j = (0x1e & (src[2]<<1)) | (0x01 & (src[3]>>7)); | |
69 *dest++ = tab[j]; | |
70 j = (0x1f & (src[3]>>2)); | |
71 *dest++ = tab[j]; | |
72 j = (0x18 & (src[3]<<3)) | (0x07 & (src[4]>>5)); | |
73 *dest++ = tab[j]; | |
74 j = (0x1f & (src[4])); | |
75 *dest++ = tab[j]; | |
76 src += 5; | |
77 nsrc -= 5; | |
78 } | |
79 if(nsrc){ | |
80 j = (0x1f & (src[0]>>3)); | |
81 *dest++ = tab[j]; | |
82 j = (0x1c & (src[0]<<2)); | |
83 if(nsrc == 1) | |
84 goto out; | |
85 j |= (0x03 & (src[1]>>6)); | |
86 *dest++ = tab[j]; | |
87 j = (0x1f & (src[1]>>1)); | |
88 if(nsrc == 2) | |
89 goto out; | |
90 *dest++ = tab[j]; | |
91 j = (0x10 & (src[1]<<4)); | |
92 if(nsrc == 3) | |
93 goto out; | |
94 j |= (0x0f & (src[2]>>4)); | |
95 *dest++ = tab[j]; | |
96 j = (0x1e & (src[2]<<1)); | |
97 if(nsrc == 4) | |
98 goto out; | |
99 j |= (0x01 & (src[3]>>7)); | |
100 *dest++ = tab[j]; | |
101 j = (0x1f & (src[3]>>2)); | |
102 *dest++ = tab[j]; | |
103 j = (0x18 & (src[3]<<3)); | |
104 out: | |
105 *dest++ = tab[j]; | |
106 } | |
107 *dest = 0; | |
108 return dest-start; | |
109 } |