- switch (c[1]) {
- case '0': c[1] = '\0'; break;
- case '\'': c[1] = '\''; break;
- case '\\': c[1] = '\\'; break;
- case '"': c[1] = '"'; break;
- case 'a': c[1] = '\a'; break;
- case 'b': c[1] = '\b'; break;
- case 't': c[1] = '\t'; break;
- case 'v': c[1] = '\v'; break;
- case 'f': c[1] = '\f'; break;
- case 'r': c[1] = '\r'; break;
- case 'x': c[3] = (fromHex(c[2])<<4)+fromHex(c[3]); c+=2; break;
+ if (c[1] == 'x' && isxdigit(c[2])) {
+ //two hex
+ if (isxdigit(c[3])) {
+ c[3] = (fromHex(c[2])*16)+fromHex(c[3]);
+ c+=2;
+ //one hex
+ } else {
+ c[2] = fromHex(c[2]);
+ c++;
+ }
+ } else if (c[1] == '0' && isodigit(c[2])) {
+ if (isodigit(c[3])) {
+ //three octal
+ if (isodigit(c[4])) {
+ c[4] = fromOctal(c[2])*64
+ +fromOctal(c[3])*8
+ +fromOctal(c[4]);
+ c+=2;
+ //two octal
+ } else {
+ c[3] = fromOctal(c[2])*8
+ +fromOctal(c[3]);
+ c+=2;
+ }
+ // one octal
+ } else {
+ c[2] = fromOctal(c[2]);
+ c++;
+ }
+ } else {
+ switch (c[1]) {
+ case '0': c[1] = '\0'; break;
+ case '\'': c[1] = '\''; break;
+ case '\\': c[1] = '\\'; break;
+ case '"': c[1] = '"'; break;
+ case 'a': c[1] = '\a'; break;
+ case 'b': c[1] = '\b'; break;
+ case 't': c[1] = '\t'; break;
+ case 'v': c[1] = '\v'; break;
+ case 'f': c[1] = '\f'; break;
+ case 'r': c[1] = '\r'; break;
+ }