#include <locale>
#include <iostream>
class rot13codecvt : public std::codecvt<char, char, std::mbstate_t>
{
protected:
virtual ~rot13codecvt() { }
virtual result do_out(std::mbstate_t& /* state */,
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const
{ return rot13(from, from_end, from_next, to, to_limit, to_next); }
virtual result do_in(std::mbstate_t& /* state */,
const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const
{ return rot13(from, from_end, from_next, to, to_limit, to_next); }
virtual result do_unshift(std::mbstate_t& state,
char* to,
char* to_limit,
char*& to_next) const;
virtual int do_encoding() const throw() { return 1; }
virtual bool do_always_noconv() const throw() { return false; }
virtual int do_length(const std::mbstate_t&,
const char* from,
const char* end,
size_t max) const;
virtual int do_max_length() const throw() { return 1; }
private:
result rot13(const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const;
}; // class rot13codecvt
static const unsigned char table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,78,79,80,81,82,83,84,85,86,87,88,89,90,65,66,67,68,69,70,71,72,73,74,75,76,77,91,92,93,94,95,96,110,111,112,113,114,115,116,117,118,119,120,121,122,97,98,99,100,101,102,103,104,105,106,107,108,109,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
std::codecvt_base::result rot13codecvt::rot13(const char* from,
const char* from_end,
const char*& from_next,
char* to,
char* to_limit,
char*& to_next) const
{
from_next = from;
to_next = to;
while((to_next != to_limit) && (from_next != from_end) )
*to_next++ = table[static_cast<unsigned char>(*from_next++)];
return (from_next == from_end) ? std::codecvt_base::ok : std::codecvt_base::partial;
} // rot13
std::codecvt_base::result rot13codecvt::do_unshift(std::mbstate_t& /* state */,
char* to,
char* /* to_limit */,
char*& to_next) const
{
to_next = to;
return std::codecvt_base::ok;
} // do_unshift
int rot13codecvt::do_length(const std::mbstate_t&,
const char* from,
const char* end,
size_t max) const
{
return std::max<int>(end - from, max);
} // do_length
int main ()
{
std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));
std::cout << "The quick brown fox ran over the lazy dog" << std::endl;
}
I2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3Mgcm90MTNjb2RlY3Z0IDogcHVibGljIHN0ZDo6Y29kZWN2dDxjaGFyLCBjaGFyLCBzdGQ6Om1ic3RhdGVfdD4Kewpwcm90ZWN0ZWQ6CiAgdmlydHVhbCB+cm90MTNjb2RlY3Z0KCkgeyB9CgogIHZpcnR1YWwgcmVzdWx0IGRvX291dChzdGQ6Om1ic3RhdGVfdCYgLyogc3RhdGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZyb21fZW5kLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgZnJvbV9uZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiB0bywKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogdG9fbGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiB0b19uZXh0KSBjb25zdCAKICAgICAgeyByZXR1cm4gcm90MTMoZnJvbSwgZnJvbV9lbmQsIGZyb21fbmV4dCwgdG8sIHRvX2xpbWl0LCB0b19uZXh0KTsgfQoKICB2aXJ0dWFsIHJlc3VsdCBkb19pbihzdGQ6Om1ic3RhdGVfdCYgLyogc3RhdGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnJvbSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmcm9tX2VuZCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgZnJvbV9uZXh0LAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHRvLAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHRvX2xpbWl0LAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiB0b19uZXh0KSBjb25zdAogICAgICB7IHJldHVybiByb3QxMyhmcm9tLCBmcm9tX2VuZCwgZnJvbV9uZXh0LCB0bywgdG9fbGltaXQsIHRvX25leHQpOyB9CgogIHZpcnR1YWwgcmVzdWx0IGRvX3Vuc2hpZnQoc3RkOjptYnN0YXRlX3QmIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHRvLAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHRvX2xpbWl0LAogICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiB0b19uZXh0KSBjb25zdDsKCiAgdmlydHVhbCBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIDE7IH0KCiAgdmlydHVhbCBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIGZhbHNlOyB9CgogIHZpcnR1YWwgaW50IGRvX2xlbmd0aChjb25zdCBzdGQ6Om1ic3RhdGVfdCYsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heCkgY29uc3Q7CgogIHZpcnR1YWwgaW50IGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIDE7IH0KCnByaXZhdGU6CiAgcmVzdWx0IHJvdDEzKGNvbnN0IGNoYXIqIGZyb20sCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZyb21fZW5kLAogICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgZnJvbV9uZXh0LAogICAgICAgICAgICAgICBjaGFyKiB0bywKICAgICAgICAgICAgICAgY2hhciogdG9fbGltaXQsCiAgICAgICAgICAgICAgIGNoYXIqJiB0b19uZXh0KSBjb25zdDsKfTsgLy8gY2xhc3Mgcm90MTNjb2RlY3Z0CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZVtdPXswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDkxLDkyLDkzLDk0LDk1LDk2LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1fTsKCnN0ZDo6Y29kZWN2dF9iYXNlOjpyZXN1bHQgcm90MTNjb2RlY3Z0Ojpyb3QxMyhjb25zdCBjaGFyKiBmcm9tLAogICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmcm9tX2VuZCwKICAgICAgICAgICAgICAgY29uc3QgY2hhciomIGZyb21fbmV4dCwKICAgICAgICAgICAgICAgY2hhciogdG8sCiAgICAgICAgICAgICAgIGNoYXIqIHRvX2xpbWl0LAogICAgICAgICAgICAgICBjaGFyKiYgdG9fbmV4dCkgY29uc3QKewogIGZyb21fbmV4dCA9IGZyb207CiAgdG9fbmV4dCA9IHRvOwoKICB3aGlsZSgodG9fbmV4dCAhPSB0b19saW1pdCkgJiYgKGZyb21fbmV4dCAhPSBmcm9tX2VuZCkgKQogICAgKnRvX25leHQrKyA9IHRhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpmcm9tX25leHQrKyldOwoKICByZXR1cm4gKGZyb21fbmV4dCA9PSBmcm9tX2VuZCkgPyBzdGQ6OmNvZGVjdnRfYmFzZTo6b2sgOiBzdGQ6OmNvZGVjdnRfYmFzZTo6cGFydGlhbDsgCn0gLy8gcm90MTMKCnN0ZDo6Y29kZWN2dF9iYXNlOjpyZXN1bHQgcm90MTNjb2RlY3Z0Ojpkb191bnNoaWZ0KHN0ZDo6bWJzdGF0ZV90JiAvKiBzdGF0ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogLyogdG9fbGltaXQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiYgdG9fbmV4dCkgY29uc3QKewogIHRvX25leHQgPSB0bzsKICByZXR1cm4gc3RkOjpjb2RlY3Z0X2Jhc2U6Om9rOwp9IC8vIGRvX3Vuc2hpZnQKCmludCByb3QxM2NvZGVjdnQ6OmRvX2xlbmd0aChjb25zdCBzdGQ6Om1ic3RhdGVfdCYsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heCkgY29uc3QKewogIHJldHVybiBzdGQ6Om1heDxpbnQ+KGVuZCAtIGZyb20sIG1heCk7Cn0gLy8gZG9fbGVuZ3RoCgoKaW50IG1haW4gKCkKewogIHN0ZDo6Y291dC5pbWJ1ZShzdGQ6OmxvY2FsZShzdGQ6OmxvY2FsZSgiQyIpLCBuZXcgcm90MTNjb2RlY3Z0KCkpKTsKICBzdGQ6OmNvdXQgPDwgIlRoZSBxdWljayBicm93biBmb3ggcmFuIG92ZXIgdGhlIGxhenkgZG9nIiA8PCBzdGQ6OmVuZGw7Cn0K