// echoes (c) 2011 org100h.com
#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using namespace std;
const struct {
char chr;
string esc;
} escmap[] = {
'a', "\a", 'b', "\b", 'f', "\f", 'n', "\n", 'r', "\r", 't', "\t", '\'', "\'", '"', "\"",
};
const auto escmap_entries = sizeof(escmap) / sizeof(*escmap);
enum cond {
NORMAL,
ESCAPE,
};
string search_escmap(char src) {
for(auto i = 0; i < escmap_entries; i++) if(escmap[i].chr == src) return escmap[i].esc;
throw "invalid sequence found.";
}
string convert_escape(char src, cond flag) {
return islower(src) && flag == ESCAPE ? search_escmap(src) : string(1, src);
}
string decode_escape(const string & src) {
string dst;
cond flag = NORMAL;
for(auto i = 0; i < src.length(); i++) {
if(src[i] == '\\') {
if(flag == ESCAPE) dst += "\\";
flag = (flag == ESCAPE) ? NORMAL : ESCAPE;
continue;
}
else {
dst += convert_escape(src[i], flag);
flag = NORMAL;
}
}
return dst;
}
int main(int argc, char * argv[]) {
try {
vector<string> args;
copy(&argv[1], &argv[argc], back_inserter(args));
for(auto I = args.begin(); I != args.end(); ++I) {
if((*I)[0] == '$') {
if(I->length() > 1 && (*I)[1] == '$'){
cout << decode_escape(I->substr(1));
} else {
cout << I->substr(1);
}
} else {
cout << decode_escape(*I);
}
cout << endl;
}
return EXIT_SUCCESS;
} catch(const char * cause) {
cout << "error: " << cause << endl;
} catch(...) {
cout << "unknown error.";
}
return EXIT_FAILURE;
}