annotate C++/modules/Base64/base64.cpp @ 485:898d8b29a4f1

Switch to lowercase filenames
author David Demelier <markand@malikania.fr>
date Thu, 12 Nov 2015 21:53:36 +0100
parents C++/modules/Base64/Base64.cpp@65b567c8de54
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Base64.cpp -- base64 encoding and decoding
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
403
d5ec1174b707 Massive cleanup
David Demelier <markand@malikania.fr>
parents: 393
diff changeset
4 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr>
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
19 #include <cassert>
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <iterator>
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <sstream>
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
22 #include <unordered_map>
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
485
898d8b29a4f1 Switch to lowercase filenames
David Demelier <markand@malikania.fr>
parents: 477
diff changeset
24 #include "base64.h"
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
393
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
26 namespace base64 {
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
27
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
28 namespace {
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
29
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
30 const std::string table{"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
31
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
32 const std::unordered_map<unsigned char, unsigned int> rtable{
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
33 { 'A', 0 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
34 { 'B', 1 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
35 { 'C', 2 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
36 { 'D', 3 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
37 { 'E', 4 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
38 { 'F', 5 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
39 { 'G', 6 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
40 { 'H', 7 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
41 { 'I', 8 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
42 { 'J', 9 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
43 { 'K', 10 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
44 { 'L', 11 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
45 { 'M', 12 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
46 { 'N', 13 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
47 { 'O', 14 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
48 { 'P', 15 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
49 { 'Q', 16 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
50 { 'R', 17 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
51 { 'S', 18 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
52 { 'T', 19 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
53 { 'U', 20 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
54 { 'V', 21 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
55 { 'W', 22 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
56 { 'X', 23 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
57 { 'Y', 24 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
58 { 'Z', 25 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
59 { 'a', 26 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
60 { 'b', 27 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
61 { 'c', 28 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
62 { 'd', 29 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
63 { 'e', 30 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
64 { 'f', 31 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
65 { 'g', 32 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
66 { 'h', 33 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
67 { 'i', 34 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
68 { 'j', 35 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
69 { 'k', 36 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
70 { 'l', 37 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
71 { 'm', 38 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
72 { 'n', 39 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
73 { 'o', 40 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
74 { 'p', 41 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
75 { 'q', 42 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
76 { 'r', 43 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
77 { 's', 44 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
78 { 't', 45 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
79 { 'u', 46 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
80 { 'v', 47 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
81 { 'w', 48 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
82 { 'x', 49 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
83 { 'y', 50 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
84 { 'z', 51 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
85 { '0', 52 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
86 { '1', 53 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
87 { '2', 54 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
88 { '3', 55 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
89 { '4', 56 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
90 { '5', 57 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
91 { '6', 58 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
92 { '7', 59 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
93 { '8', 60 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
94 { '9', 61 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
95 { '+', 62 },
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
96 { '/', 63 }
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
97 };
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
98
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
99 } // !namespace
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
100
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
101 unsigned char lookup(unsigned int value) noexcept
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 {
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
103 assert(value < 64);
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 return table[value];
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 }
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
108 unsigned int rlookup(unsigned char ch)
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 {
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
110 assert(rtable.count(ch) != 0 && ch != '=');
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
112 return rtable.at(ch);
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
113 }
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
477
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
115 bool isValid(unsigned char ch) noexcept
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
116 {
65b567c8de54 Base64:
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
117 return ch == '=' || rtable.count(ch);
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 }
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
393
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
120 std::string encode(const std::string &input)
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 {
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 std::string result;
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 std::istringstream iss(input, std::istringstream::in);
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 encode(std::istreambuf_iterator<char>(iss), std::istreambuf_iterator<char>(), std::back_inserter(result));
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 return result;
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 }
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
393
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
130 std::string decode(const std::string &input)
238
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 {
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 std::string result;
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 std::istringstream iss(input, std::istringstream::in);
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 decode(std::istreambuf_iterator<char>(iss), std::istreambuf_iterator<char>(), std::back_inserter(result));
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
b97d75a78e22 Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 return result;
393
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
138 }
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
139
875b5ce19fda Base64: remove class, use namespace
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
140 } // !base64