| 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 } |