Mercurial > code
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 |
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 | 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 | 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 | 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 | 28 namespace { |
29 | |
30 const std::string table{"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"}; | |
31 | |
32 const std::unordered_map<unsigned char, unsigned int> rtable{ | |
33 { 'A', 0 }, | |
34 { 'B', 1 }, | |
35 { 'C', 2 }, | |
36 { 'D', 3 }, | |
37 { 'E', 4 }, | |
38 { 'F', 5 }, | |
39 { 'G', 6 }, | |
40 { 'H', 7 }, | |
41 { 'I', 8 }, | |
42 { 'J', 9 }, | |
43 { 'K', 10 }, | |
44 { 'L', 11 }, | |
45 { 'M', 12 }, | |
46 { 'N', 13 }, | |
47 { 'O', 14 }, | |
48 { 'P', 15 }, | |
49 { 'Q', 16 }, | |
50 { 'R', 17 }, | |
51 { 'S', 18 }, | |
52 { 'T', 19 }, | |
53 { 'U', 20 }, | |
54 { 'V', 21 }, | |
55 { 'W', 22 }, | |
56 { 'X', 23 }, | |
57 { 'Y', 24 }, | |
58 { 'Z', 25 }, | |
59 { 'a', 26 }, | |
60 { 'b', 27 }, | |
61 { 'c', 28 }, | |
62 { 'd', 29 }, | |
63 { 'e', 30 }, | |
64 { 'f', 31 }, | |
65 { 'g', 32 }, | |
66 { 'h', 33 }, | |
67 { 'i', 34 }, | |
68 { 'j', 35 }, | |
69 { 'k', 36 }, | |
70 { 'l', 37 }, | |
71 { 'm', 38 }, | |
72 { 'n', 39 }, | |
73 { 'o', 40 }, | |
74 { 'p', 41 }, | |
75 { 'q', 42 }, | |
76 { 'r', 43 }, | |
77 { 's', 44 }, | |
78 { 't', 45 }, | |
79 { 'u', 46 }, | |
80 { 'v', 47 }, | |
81 { 'w', 48 }, | |
82 { 'x', 49 }, | |
83 { 'y', 50 }, | |
84 { 'z', 51 }, | |
85 { '0', 52 }, | |
86 { '1', 53 }, | |
87 { '2', 54 }, | |
88 { '3', 55 }, | |
89 { '4', 56 }, | |
90 { '5', 57 }, | |
91 { '6', 58 }, | |
92 { '7', 59 }, | |
93 { '8', 60 }, | |
94 { '9', 61 }, | |
95 { '+', 62 }, | |
96 { '/', 63 } | |
97 }; | |
98 | |
99 } // !namespace | |
100 | |
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 | 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 | 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 | 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 | 112 return rtable.at(ch); |
113 } | |
238
b97d75a78e22
Add Base64, base64 encoding and decoding
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 |
477 | 115 bool isValid(unsigned char ch) noexcept |
116 { | |
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 |