+/* special character function */
+
+char *specialchar (char *s) {
+ int i = 0, j = 0;
+ while (s[i] != 0) {
+ if (s[i] != '\\') {
+ s[j++] = s[i++];
+ continue;
+ }
+
+ int l = 0;
+ switch (s[i + 1]) {
+ case 'a': l = 0x07; i += 2; break;
+ case 'b': l = 0x08; i += 2; break;
+ case 'e': l = 0x1b; i += 2; break;
+ case 'f': l = 0x0c; i += 2; break;
+ case 'n': l = 0x0a; i += 2; break;
+ case 'r': l = 0x0d; i += 2; break;
+ case 't': l = 0x09; i += 2; break;
+ case 'v': l = 0x0b; i += 2; break;
+ case '\\': l = '\\'; i += 2; break;
+ case '\'': l = '\''; i += 2; break;
+ case '"': l = '"'; i += 2; break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ if ((s[i + 2] >= '0') && (s[i + 2] <= '9') &&
+ (s[i + 3] >= '0') && (s[i + 3] <= '9')) {
+ l = (s[i + 1] - '0') * 8 * 8 + (s[i + 2] - '0') * 8 + s[i + 3] - '0';
+ i += 4;
+ }
+ break;
+ case 'x':
+ if ((((s[i + 2] >= '0') && (s[i + 2] <= '9')) ||
+ ((s[i + 2] >= 'A') && (s[i + 2] <= 'F')) ||
+ ((s[i + 2] >= 'a') && (s[i + 2] <= 'f'))) &&
+ (((s[i + 3] >= '0') && (s[i + 3] <= '9')) ||
+ ((s[i + 3] >= 'A') && (s[i + 3] <= 'F')) ||
+ ((s[i + 3] >= 'a') && (s[i + 3] <= 'f')))) {
+ l = s[i + 2] - '0';
+ if (s[i + 2] >= 'a') {
+ l += '0' + 10 - 'a';
+ } else if (s[i + 2] >= 'A') {
+ l += '0' + 10 - 'A';
+ }
+ l = l * 16 + s[i + 3] - '0';
+ if (s[i + 3] >= 'a') {
+ l += '0' + 10 - 'a';
+ } else if (s[i + 3] >= 'A') {
+ l += '0' + 10 - 'A';
+ }
+ i += 4;
+ }
+ break;
+ default:
+ }
+ VERBOSE (DEBUG, printf("l: 0x%02x '%c'\n", l, l));
+ s[j++] = (l != 0) ? l : s[i++];
+ }
+ s[j] = '\0';
+
+ return s;
+}
+