aboutsummaryrefslogtreecommitdiff
path: root/butl/base64.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'butl/base64.cxx')
-rw-r--r--butl/base64.cxx211
1 files changed, 0 insertions, 211 deletions
diff --git a/butl/base64.cxx b/butl/base64.cxx
deleted file mode 100644
index ee44700..0000000
--- a/butl/base64.cxx
+++ /dev/null
@@ -1,211 +0,0 @@
-// file : butl/base64.cxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#include <butl/base64>
-
-#include <cstddef> // size_t
-#include <istream>
-#include <ostream>
-#include <iterator> // {istreambuf, ostreambuf, back_insert}_iterator
-#include <stdexcept> // invalid_argument
-
-using namespace std;
-
-namespace butl
-{
- static const char codes[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
- // base64-encode the data in the iterator range [i, e). Write the encoded
- // data starting at the iterator position o.
- //
- template <typename I, typename O>
- static void
- base64_encode (I& i, const I& e, O& o)
- {
- const size_t un (65); // Non-existing index of the codes string.
- for (size_t n (0); i != e; ++n)
- {
- if (n && n % 19 == 0)
- *o++ = '\n'; // Split into lines, like the base64 utility does.
-
- char c (*i++);
- size_t i1 ((c >> 2) & 0x3F);
- size_t i2 ((c << 4) & 0x30);
-
- size_t i3 (un);
- if (i != e)
- {
- c = *i++;
- i2 |= (c >> 4) & 0xF;
- i3 = (c << 2) & 0x3C;
- }
-
- size_t i4 (un);
- if (i != e)
- {
- c = *i++;
- i3 |= (c >> 6) & 0x3;
- i4 = c & 0x3F;
- }
-
- *o++ = codes[i1];
- *o++ = codes[i2];
- *o++ = i3 == un ? '=' : codes[i3];
- *o++ = i4 == un ? '=' : codes[i4];
- }
- }
-
- static char
- index (char c)
- {
- switch (c)
- {
- case '/': return 63;
- case '+': return 62;
- default:
- {
- if (c >= 'A' && c <= 'Z')
- return c - 'A';
- else if (c >= 'a' && c <= 'z')
- return c - 'a' + 26;
- else if (c >= '0' && c <= '9')
- return c - '0' + 52;
- else
- throw invalid_argument ("invalid input");
- }
- }
- }
-
- // base64-decode the data in the iterator range [i, e). Write the decoded
- // data starting at the iterator position o. Throw invalid_argument if the
- // input data is invalid.
- //
- template <typename I, typename O>
- static void
- base64_decode (I& i, const I& e, O& o)
- {
- auto bad = []() {throw invalid_argument ("invalid input");};
-
- auto next = [&i, &e, &bad]() -> char
- {
- if (i == e)
- bad ();
- return *i++;
- };
-
- while (i != e)
- {
- char c (next ());
- if (c == '\n') // @@ Should we check for '\r' as well ?
- continue;
-
- char i1 = index (c);
- char i2 = index (next ());
- *o++ = (i1 << 2) | (i2 >> 4);
-
- c = next ();
- if (c == '=')
- {
- if (next () != '=' || i != e)
- bad ();
- }
- else
- {
- char i3 = index (c);
- *o++ = (i2 << 4) | (i3 >> 2);
-
- c = next ();
- if (c == '=')
- {
- if (i != e)
- bad ();
- }
- else
- *o++ = (i3 << 6) | index (c);
- }
- }
- }
-
- string
- base64_encode (istream& is)
- {
- if (!is.good ())
- throw invalid_argument ("bad stream");
-
- string r;
- istreambuf_iterator<char> i (is);
- back_insert_iterator<string> o (r);
-
- base64_encode (i, istreambuf_iterator<char> (), o);
- is.setstate (istream::eofbit);
- return r;
- }
-
- void
- base64_encode (ostream& os, istream& is)
- {
- if (!os.good () || !is.good ())
- throw invalid_argument ("bad stream");
-
- istreambuf_iterator<char> i (is);
- ostreambuf_iterator<char> o (os);
- base64_encode (i, istreambuf_iterator<char> (), o);
-
- if (o.failed ())
- os.setstate (istream::badbit);
-
- is.setstate (istream::eofbit);
- }
-
- string
- base64_encode (const vector<char>& v)
- {
- string r;
- back_insert_iterator<string> o (r);
- auto i (v.begin ());
- base64_encode (i, v.end (), o);
- return r;
- }
-
- void
- base64_decode (ostream& os, istream& is)
- {
- if (!os.good () || !is.good ())
- throw invalid_argument ("bad stream");
-
- istreambuf_iterator<char> i (is);
- ostreambuf_iterator<char> o (os);
- base64_decode (i, istreambuf_iterator<char> (), o);
-
- if (o.failed ())
- os.setstate (istream::badbit);
-
- is.setstate (istream::eofbit);
- }
-
- void
- base64_decode (ostream& os, const string& s)
- {
- if (!os.good ())
- throw invalid_argument ("bad stream");
-
- ostreambuf_iterator<char> o (os);
- auto i (s.cbegin ());
- base64_decode (i, s.cend (), o);
-
- if (o.failed ())
- os.setstate (istream::badbit);
- }
-
- vector<char>
- base64_decode (const string& s)
- {
- vector<char> r;
- back_insert_iterator<vector<char>> o (r);
- auto i (s.cbegin ());
- base64_decode (i, s.cend (), o);
- return r;
- }
-}