#include <iostream>
#include <sstream>
#include <vector>
#include <string>
const static char _delims[] = { '\\', '"' };
const static std::vector<char> delims(_delims, _delims + 2);
class EscapeStr {
const static unsigned short MAX_CHAR = 256;
std::string &_elem;
bool _delim[MAX_CHAR];
const char* _escape;
int _escLen;
public:
EscapeStr(std::string &elem,
const std::vector<char> &delim = std::vector<char>(1, '"'),
const std::string &escape = "\\") :
_elem(elem),
_escape(escape.c_str()),
_escLen(escape.size())
{
for (int i = 0; i < MAX_CHAR; i++) {
_delim[i] = false;
}
for (std::size_t i = 0; i < delim.size(); i++) {
_delim[delim[i]] = true;
}
}
void print(std::ostream& os) const {
for (std::size_t i = 0; i < _elem.length(); i++) {
char c = _elem[i];
if (_delim[c]) {
for (int j = 0; j < _escLen; j++) {
os << _escape[j];
}
}
os << _elem[i];
}
}
};
std::ostream& operator <<(std::ostream& os, const EscapeStr& t)
{
t.print(os);
return os;
}
int main()
{
std::ostream os(NULL);
std::string s = "Hi there \"This should be escaped\"";
EscapeStr es(s);
os << es;
std::stringstream oss;
oss << os.rdbuf();
std::cout << oss.str();
std::cout << "Do you see this?";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KCmNvbnN0IHN0YXRpYyBjaGFyIF9kZWxpbXNbXSA9IHsgJ1xcJywgJyInIH07CmNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxjaGFyPiBkZWxpbXMoX2RlbGltcywgX2RlbGltcyArIDIpOwoKY2xhc3MgRXNjYXBlU3RyIHsKCWNvbnN0IHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBNQVhfQ0hBUiA9IDI1NjsKCglzdGQ6OnN0cmluZyAmX2VsZW07Cglib29sIF9kZWxpbVtNQVhfQ0hBUl07Cgljb25zdCBjaGFyKiBfZXNjYXBlOwoJaW50IF9lc2NMZW47CnB1YmxpYzoKCUVzY2FwZVN0cihzdGQ6OnN0cmluZyAmZWxlbSwKCQljb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiAmZGVsaW0gPSBzdGQ6OnZlY3RvcjxjaGFyPigxLCAnIicpLAoJCWNvbnN0IHN0ZDo6c3RyaW5nICZlc2NhcGUgPSAiXFwiKSA6CgkJX2VsZW0oZWxlbSksCgkJX2VzY2FwZShlc2NhcGUuY19zdHIoKSksCgkJX2VzY0xlbihlc2NhcGUuc2l6ZSgpKQoJewoJCWZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NIQVI7IGkrKykgewoJCQlfZGVsaW1baV0gPSBmYWxzZTsKCQl9CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGRlbGltLnNpemUoKTsgaSsrKSB7CgkJCV9kZWxpbVtkZWxpbVtpXV0gPSB0cnVlOwoJCX0KCX0KCXZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3QgewoJCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBfZWxlbS5sZW5ndGgoKTsgaSsrKSB7CgkJCWNoYXIgYyA9IF9lbGVtW2ldOwoJCQlpZiAoX2RlbGltW2NdKSB7CgkJCQlmb3IgKGludCBqID0gMDsgaiA8IF9lc2NMZW47IGorKykgewoJCQkJCW9zIDw8IF9lc2NhcGVbal07CgkJCQl9CgkJCX0KCQkJb3MgPDwgX2VsZW1baV07CgkJfQoJfQp9OwoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBFc2NhcGVTdHImIHQpCnsKCXQucHJpbnQob3MpOwoJcmV0dXJuIG9zOwp9CgoKaW50IG1haW4oKQp7CglzdGQ6Om9zdHJlYW0gb3MoTlVMTCk7CglzdGQ6OnN0cmluZyBzID0gIkhpIHRoZXJlIFwiVGhpcyBzaG91bGQgYmUgZXNjYXBlZFwiIjsKCUVzY2FwZVN0ciBlcyhzKTsKCW9zIDw8IGVzOwoJc3RkOjpzdHJpbmdzdHJlYW0gb3NzOwoJb3NzIDw8IG9zLnJkYnVmKCk7CglzdGQ6OmNvdXQgPDwgb3NzLnN0cigpOwoJc3RkOjpjb3V0IDw8ICJEbyB5b3Ugc2VlIHRoaXM/IjsKfQ==