| 562 | } |
| 563 | |
| 564 | void Escape(const TStringBuf str) { |
| 565 | const unsigned char* i = reinterpret_cast<const unsigned char*>(str.data()); |
| 566 | const unsigned char* end = i + str.size(); |
| 567 | while (i < end) { |
| 568 | wchar32 rune; |
| 569 | size_t runeLen; |
| 570 | const RECODE_RESULT result = SafeReadUTF8Char(rune, runeLen, i, end); |
| 571 | if (result == RECODE_OK) { // string is expected not to have unallowed characters now |
| 572 | switch (rune) { |
| 573 | case '\'': |
| 574 | Out.Write("'"); |
| 575 | break; |
| 576 | case '\"': |
| 577 | Out.Write("""); |
| 578 | break; |
| 579 | case '<': |
| 580 | Out.Write("<"); |
| 581 | break; |
| 582 | case '>': |
| 583 | Out.Write(">"); |
| 584 | break; |
| 585 | case '&': |
| 586 | Out.Write("&"); |
| 587 | break; |
| 588 | default: |
| 589 | Out.Write(i, runeLen); |
| 590 | break; |
| 591 | } |
| 592 | i += runeLen; |
| 593 | } |
| 594 | } |
| 595 | } |
| 596 | |
| 597 | private: |
| 598 | TFileOutput Out; |