ibase64.c - ics2txt - convert icalendar .ics file to plain text Err bitreich.org 70 hgit clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt URL:git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt bitreich.org 70 1Log /scm/ics2txt/log.gph bitreich.org 70 1Files /scm/ics2txt/files.gph bitreich.org 70 1Refs /scm/ics2txt/refs.gph bitreich.org 70 1Tags /scm/ics2txt/tag bitreich.org 70 1README /scm/ics2txt/file/README.md.gph bitreich.org 70 i--- Err bitreich.org 70 ibase64.c (3039B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include "base64.h" Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 Err bitreich.org 70 i 7 static char encode_map[64] = Err bitreich.org 70 i 8 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; Err bitreich.org 70 i 9 Err bitreich.org 70 i 10 void Err bitreich.org 70 i 11 base64_encode(char const *s, size_t slen, char *d, size_t *dlen) Err bitreich.org 70 i 12 { Err bitreich.org 70 i 13 char const *sbeg = s, *send = s + slen, *dbeg = d; Err bitreich.org 70 i 14 unsigned char x; Err bitreich.org 70 i 15 Err bitreich.org 70 i 16 while (s < send) { Err bitreich.org 70 i 17 switch ((s - sbeg) % 3) { Err bitreich.org 70 i 18 case 0: /* AAAAAABB bbbbcccc ccdddddd */ Err bitreich.org 70 i 19 assert((size_t)(d - dbeg) + 1 < *dlen); Err bitreich.org 70 i 20 *d++ = encode_map[*s >> 2]; Err bitreich.org 70 i 21 x = *s << 4 & 0x3f; Err bitreich.org 70 i 22 break; Err bitreich.org 70 i 23 case 1: /* aaaaaabb BBBBCCCC ccdddddd */ Err bitreich.org 70 i 24 assert((size_t)(d - dbeg) + 1 < *dlen); Err bitreich.org 70 i 25 *d++ = encode_map[x | (*s >> 4)]; Err bitreich.org 70 i 26 x = (*s << 2) & 0x3f; Err bitreich.org 70 i 27 break; Err bitreich.org 70 i 28 case 2: /* aaaaaabb bbbbcccc CCDDDDDD */ Err bitreich.org 70 i 29 assert((size_t)(d - dbeg) + 2 < *dlen); Err bitreich.org 70 i 30 *d++ = encode_map[x | (*s >> 6)]; Err bitreich.org 70 i 31 *d++ = encode_map[*s & 0x3f]; Err bitreich.org 70 i 32 break; Err bitreich.org 70 i 33 } Err bitreich.org 70 i 34 s++; Err bitreich.org 70 i 35 } Err bitreich.org 70 i 36 Err bitreich.org 70 i 37 /* flush extra content in 'x' */ Err bitreich.org 70 i 38 assert((size_t)(d - dbeg) + 1 < *dlen); Err bitreich.org 70 i 39 if ((s - sbeg) % 3 != 2) Err bitreich.org 70 i 40 *d++ = encode_map[x]; Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 /* pad the end with '=' */ Err bitreich.org 70 i 43 while ((d - dbeg) % 4 != 0) { Err bitreich.org 70 i 44 assert((size_t)(d - dbeg) + 1 < *dlen); Err bitreich.org 70 i 45 *d++ = '='; Err bitreich.org 70 i 46 } Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 *dlen = d - dbeg; Err bitreich.org 70 i 49 } Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 static int8_t decode_map[256] = { Err bitreich.org 70 i 52 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 53 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 54 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, Err bitreich.org 70 i 55 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, Err bitreich.org 70 i 56 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, Err bitreich.org 70 i 57 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, Err bitreich.org 70 i 58 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, Err bitreich.org 70 i 59 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, Err bitreich.org 70 i 60 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 61 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 62 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 64 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 65 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 66 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 67 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Err bitreich.org 70 i 68 }; Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 int Err bitreich.org 70 i 71 base64_decode(char const *s, size_t *slen, char *d, size_t *dlen) Err bitreich.org 70 i 72 { Err bitreich.org 70 i 73 char const *sbeg = s, *send = sbeg + *slen, *dbeg = d; Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 for (; s + 3 < send; s += 4) { Err bitreich.org 70 i 76 int8_t x0 = decode_map[(unsigned)s[0]]; Err bitreich.org 70 i 77 int8_t x1 = decode_map[(unsigned)s[1]]; Err bitreich.org 70 i 78 int8_t x2 = decode_map[(unsigned)s[2]]; Err bitreich.org 70 i 79 int8_t x3 = decode_map[(unsigned)s[3]]; Err bitreich.org 70 i 80 uint32_t x = (x0 << 18) | (x1 << 12) | (x2 << 6) | (x3 << 0); Err bitreich.org 70 i 81 Err bitreich.org 70 i 82 assert((size_t)(d - dbeg) + 3 < *dlen); Err bitreich.org 70 i 83 *d++ = x >> 16; Err bitreich.org 70 i 84 *d++ = x >> 8 & 0xff; Err bitreich.org 70 i 85 *d++ = x & 0xff; Err bitreich.org 70 i 86 Err bitreich.org 70 i 87 /* only "xxxx" or "xxx=" or "xx==" allowed */ Err bitreich.org 70 i 88 if (s[0] == '=' || s[1] == '=' || (s[2] == '=' && s[3] != '=')) Err bitreich.org 70 i 89 return -2; Err bitreich.org 70 i 90 if (s[2] == '=') Err bitreich.org 70 i 91 d--; Err bitreich.org 70 i 92 if (s[3] == '=') { Err bitreich.org 70 i 93 d--; Err bitreich.org 70 i 94 break; Err bitreich.org 70 i 95 } Err bitreich.org 70 i 96 Err bitreich.org 70 i 97 if (x0 < 0 || x1 < 0 || x2 < 0 || x3 < 0) Err bitreich.org 70 i 98 return -1; Err bitreich.org 70 i 99 } Err bitreich.org 70 i 100 Err bitreich.org 70 i 101 *slen = s - sbeg; Err bitreich.org 70 i 102 *dlen = d - dbeg; Err bitreich.org 70 i 103 return 0; Err bitreich.org 70 i 104 } Err bitreich.org 70 .