| 2461 | } |
| 2462 | |
| 2463 | bool collapseEscape(char *buf) |
| 2464 | { |
| 2465 | S32 len = dStrlen(buf) + 1; |
| 2466 | for(S32 i = 0; i < len;) |
| 2467 | { |
| 2468 | if(buf[i] == '\\') |
| 2469 | { |
| 2470 | if(buf[i+1] == 'x') |
| 2471 | { |
| 2472 | S32 dig1 = getHexDigit(buf[i+2]); |
| 2473 | if(dig1 == -1) |
| 2474 | return false; |
| 2475 | |
| 2476 | S32 dig2 = getHexDigit(buf[i+3]); |
| 2477 | if(dig2 == -1) |
| 2478 | return false; |
| 2479 | buf[i] = dig1 * 16 + dig2; |
| 2480 | dMemmove(buf + i + 1, buf + i + 4, len - i - 3); |
| 2481 | len -= 3; |
| 2482 | i++; |
| 2483 | } |
| 2484 | else if(buf[i+1] == 'c') |
| 2485 | { |
| 2486 | /* Remap around: \b = 0x8, \t = 0x9, \n = 0xa, \r = 0xd */ |
| 2487 | static U8 collapseRemap[10] = { 0x1, |
| 2488 | 0x2, |
| 2489 | 0x3, |
| 2490 | 0x4, |
| 2491 | 0x5, |
| 2492 | 0x6, |
| 2493 | 0x7, |
| 2494 | 0xb, |
| 2495 | 0xc, |
| 2496 | 0xe }; |
| 2497 | |
| 2498 | if(buf[i+2] == 'r') |
| 2499 | buf[i] = 15; |
| 2500 | else if(buf[i+2] == 'p') |
| 2501 | buf[i] = 16; |
| 2502 | else if(buf[i+2] == 'o') |
| 2503 | buf[i] = 17; |
| 2504 | else |
| 2505 | { |
| 2506 | int dig1 = buf[i+2] - '0'; |
| 2507 | if(dig1 < 0 || dig1 > 9) |
| 2508 | return false; |
| 2509 | buf[i] = collapseRemap[dig1]; |
| 2510 | } |
| 2511 | // Make sure we don't put 0x1 at the beginning of the string. |
| 2512 | if ((buf[i] == 0x1) && (i == 0)) |
| 2513 | { |
| 2514 | buf[i] = 0x2; |
| 2515 | buf[i+1] = 0x1; |
| 2516 | dMemmove(buf + i + 2, buf + i + 3, len - i - 1); |
| 2517 | len -= 1; |
| 2518 | } |
| 2519 | else |
| 2520 | { |
no test coverage detected