diff options
author | Ruslan Kovalev <ruslan.a.kovalev@gmail.com> | 2022-02-10 16:46:44 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:46:44 +0300 |
commit | 59e19371de37995fcb36beb16cd6ec030af960bc (patch) | |
tree | fa68e36093ebff8b805462e9e6d331fe9d348214 /library/cpp/string_utils/relaxed_escaper | |
parent | 89db6fe2fe2c32d2a832ddfeb04e8d078e301084 (diff) | |
download | ydb-59e19371de37995fcb36beb16cd6ec030af960bc.tar.gz |
Restoring authorship annotation for Ruslan Kovalev <ruslan.a.kovalev@gmail.com>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/string_utils/relaxed_escaper')
-rw-r--r-- | library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h | 76 | ||||
-rw-r--r-- | library/cpp/string_utils/relaxed_escaper/relaxed_escaper_ut.cpp | 76 |
2 files changed, 76 insertions, 76 deletions
diff --git a/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h b/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h index d7ea7c1259..97d2a48fd0 100644 --- a/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h +++ b/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h @@ -1,14 +1,14 @@ -#pragma once - -#include <util/stream/output.h> -#include <util/string/escape.h> +#pragma once + +#include <util/stream/output.h> +#include <util/string/escape.h> #include <util/memory/tempbuf.h> #include <util/generic/strbuf.h> - -namespace NEscJ { + +namespace NEscJ { // almost copypaste from util/string/escape.h // todo: move there (note difference in IsPrintable and handling of string) - + inline char HexDigit(char value) { if (value < 10) return '0' + value; @@ -17,32 +17,32 @@ namespace NEscJ { } inline char OctDigit(char value) { - return '0' + value; + return '0' + value; } - + inline bool IsUTF8(ui8 c) { return c < 0xf5 && c != 0xC0 && c != 0xC1; } - + inline bool IsControl(ui8 c) { return c < 0x20 || c == 0x7f; } - + inline bool IsPrintable(ui8 c) { return IsUTF8(c) && !IsControl(c); } - + inline bool IsHexDigit(ui8 c) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); } - + inline bool IsOctDigit(ui8 c) { return c >= '0' && c <= '7'; } - + struct TEscapeUtil { static const size_t ESCAPE_C_BUFFER_SIZE = 6; - + template <bool asunicode> static inline size_t EscapeJ(ui8 c, ui8 next, char r[ESCAPE_C_BUFFER_SIZE], TStringBuf safe, TStringBuf unsafe) { // (1) Printable characters go as-is, except backslash and double quote. @@ -109,88 +109,88 @@ namespace NEscJ { return 4; } } - + static inline size_t EscapeJ(ui8 c, ui8 next, char r[ESCAPE_C_BUFFER_SIZE], TStringBuf safe, TStringBuf unsafe) { return EscapeJ<false>(c, next, r, safe, unsafe); - } + } }; inline size_t SuggestBuffer(size_t len) { return len * TEscapeUtil::ESCAPE_C_BUFFER_SIZE; } - + template <bool tounicode> inline size_t EscapeJ(const char* str, size_t len, char* out, TStringBuf safe = TStringBuf(), TStringBuf unsafe = TStringBuf()) { char* out0 = out; char buffer[TEscapeUtil::ESCAPE_C_BUFFER_SIZE]; - + size_t i, j; for (i = 0, j = 0; i < len; ++i) { size_t rlen = TEscapeUtil::EscapeJ<tounicode>(str[i], (i + 1 < len ? str[i + 1] : 0), buffer, safe, unsafe); - + if (rlen > 1) { strncpy(out, str + j, i - j); out += i - j; j = i + 1; - + strncpy(out, buffer, rlen); out += rlen; } } - + if (j > 0) { strncpy(out, str + j, len - j); out += len - j; } else { strncpy(out, str, len); out += len; - } - + } + return out - out0; - } - + } + template <bool quote, bool tounicode> inline void EscapeJ(TStringBuf in, IOutputStream& out, TStringBuf safe = TStringBuf(), TStringBuf unsafe = TStringBuf()) { TTempBuf b(SuggestBuffer(in.size()) + 2); - + if (quote) b.Append("\"", 1); - + b.Proceed(EscapeJ<tounicode>(in.data(), in.size(), b.Current(), safe, unsafe)); - + if (quote) b.Append("\"", 1); - + out.Write(b.Data(), b.Filled()); } - + template <bool quote, bool tounicode> inline void EscapeJ(TStringBuf in, TString& out, TStringBuf safe = TStringBuf(), TStringBuf unsafe = TStringBuf()) { TTempBuf b(SuggestBuffer(in.size()) + 2); - + if (quote) b.Append("\"", 1); - + b.Proceed(EscapeJ<tounicode>(in.data(), in.size(), b.Current(), safe, unsafe)); - + if (quote) b.Append("\"", 1); - + out.append(b.Data(), b.Filled()); } - + template <bool quote, bool tounicode> inline TString EscapeJ(TStringBuf in, TStringBuf safe = TStringBuf(), TStringBuf unsafe = TStringBuf()) { TString s; EscapeJ<quote, tounicode>(in, s, safe, unsafe); return s; } - + // If the template parameter "tounicode" is ommited, then use the default value false inline size_t EscapeJ(const char* str, size_t len, char* out, TStringBuf safe = TStringBuf(), TStringBuf unsafe = TStringBuf()) { return EscapeJ<false>(str, len, out, safe, unsafe); } - + template <bool quote> inline void EscapeJ(TStringBuf in, IOutputStream& out, TStringBuf safe = TStringBuf(), TStringBuf unsafe = TStringBuf()) { EscapeJ<quote, false>(in, out, safe, unsafe); diff --git a/library/cpp/string_utils/relaxed_escaper/relaxed_escaper_ut.cpp b/library/cpp/string_utils/relaxed_escaper/relaxed_escaper_ut.cpp index 768555ea3a..9132fbad91 100644 --- a/library/cpp/string_utils/relaxed_escaper/relaxed_escaper_ut.cpp +++ b/library/cpp/string_utils/relaxed_escaper/relaxed_escaper_ut.cpp @@ -1,57 +1,57 @@ -#include "relaxed_escaper.h" - +#include "relaxed_escaper.h" + #include <library/cpp/testing/unittest/registar.h> - + #define RESC_FIXED_STR(s) TStringBuf(s, sizeof(s) - 1) static const TStringBuf CommonTestData[] = { - // Should be valid UTF-8. - RESC_FIXED_STR("http://ya.ru/"), RESC_FIXED_STR("http://ya.ru/"), - RESC_FIXED_STR("http://ya.ru/\\x17\\n"), RESC_FIXED_STR("http://ya.ru/\x17\n"), - - RESC_FIXED_STR("http://ya.ru/\\0"), RESC_FIXED_STR("http://ya.ru/\0"), - RESC_FIXED_STR("http://ya.ru/\\0\\0"), RESC_FIXED_STR("http://ya.ru/\0\0"), + // Should be valid UTF-8. + RESC_FIXED_STR("http://ya.ru/"), RESC_FIXED_STR("http://ya.ru/"), + RESC_FIXED_STR("http://ya.ru/\\x17\\n"), RESC_FIXED_STR("http://ya.ru/\x17\n"), + + RESC_FIXED_STR("http://ya.ru/\\0"), RESC_FIXED_STR("http://ya.ru/\0"), + RESC_FIXED_STR("http://ya.ru/\\0\\0"), RESC_FIXED_STR("http://ya.ru/\0\0"), RESC_FIXED_STR("http://ya.ru/\\0\\0000"), RESC_FIXED_STR("http://ya.ru/\0\0" "0"), RESC_FIXED_STR("http://ya.ru/\\0\\0001"), RESC_FIXED_STR("http://ya.ru/\0\x00" "1"), - + RESC_FIXED_STR("\\2\\4\\00678"), RESC_FIXED_STR("\2\4\6" "78"), - RESC_FIXED_STR("\\2\\4\\689"), RESC_FIXED_STR("\2\4\689"), - - RESC_FIXED_STR("\\\"Hello\\\", Alice said."), RESC_FIXED_STR("\"Hello\", Alice said."), - RESC_FIXED_STR("Slash\\\\dash!"), RESC_FIXED_STR("Slash\\dash!"), - RESC_FIXED_STR("There\\nare\\r\\nnewlines."), RESC_FIXED_STR("There\nare\r\nnewlines."), + RESC_FIXED_STR("\\2\\4\\689"), RESC_FIXED_STR("\2\4\689"), + + RESC_FIXED_STR("\\\"Hello\\\", Alice said."), RESC_FIXED_STR("\"Hello\", Alice said."), + RESC_FIXED_STR("Slash\\\\dash!"), RESC_FIXED_STR("Slash\\dash!"), + RESC_FIXED_STR("There\\nare\\r\\nnewlines."), RESC_FIXED_STR("There\nare\r\nnewlines."), RESC_FIXED_STR("There\\tare\\ttabs."), RESC_FIXED_STR("There\tare\ttabs.")}; -#undef RESC_FIXED_STR - +#undef RESC_FIXED_STR + Y_UNIT_TEST_SUITE(TRelaxedEscaperTest) { Y_UNIT_TEST(TestEscaper) { - using namespace NEscJ; + using namespace NEscJ; for (size_t i = 0; i < Y_ARRAY_SIZE(CommonTestData); i += 2) { TString expected(CommonTestData[i].data(), CommonTestData[i].size()); TString source(CommonTestData[i + 1].data(), CommonTestData[i + 1].size()); TString actual(EscapeJ<false>(source)); TString actual2(UnescapeC(expected)); - - UNIT_ASSERT_VALUES_EQUAL(expected, actual); - UNIT_ASSERT_VALUES_EQUAL(source, actual2); - } - - UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\\x17\\n\xAB", EscapeJ<false>("http://ya.ru/\x17\n\xab")); + + UNIT_ASSERT_VALUES_EQUAL(expected, actual); + UNIT_ASSERT_VALUES_EQUAL(source, actual2); + } + + UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\\x17\\n\xAB", EscapeJ<false>("http://ya.ru/\x17\n\xab")); TString s = EscapeJ<false, true>("http://ya.ru/\x17\n\xab\xff"); - UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\\u0017\\n\xAB\\xFF", s); - UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\\x17\n\xAB", EscapeJ<false>("http://ya.ru/\x17\n\xab", "\n")); - UNIT_ASSERT_VALUES_EQUAL("http:\\x2F\\x2Fya.ru\\x2F\\x17\n\xAB'", EscapeJ<false>("http://ya.ru/\x17\n\xab'", "\n'", "/")); - UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\x17\n\xab", UnescapeC("http:\\x2F\\x2Fya.ru\\x2F\\x17\n\xAB")); - UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\x17\n\xab", UnescapeC("http://ya.ru/\\x17\\n\xAB")); - UNIT_ASSERT_VALUES_EQUAL("h", EscapeJ<false>("h")); - UNIT_ASSERT_VALUES_EQUAL("\"h\"", EscapeJ<true>("h")); - UNIT_ASSERT_VALUES_EQUAL("h", UnescapeC("h")); - UNIT_ASSERT_VALUES_EQUAL("\\xFF", EscapeJ<false>("\xFF")); - UNIT_ASSERT_VALUES_EQUAL("\"\\xFF\"", EscapeJ<true>("\xFF")); - UNIT_ASSERT_VALUES_EQUAL("\xFF", UnescapeC("\\xFF")); - + UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\\u0017\\n\xAB\\xFF", s); + UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\\x17\n\xAB", EscapeJ<false>("http://ya.ru/\x17\n\xab", "\n")); + UNIT_ASSERT_VALUES_EQUAL("http:\\x2F\\x2Fya.ru\\x2F\\x17\n\xAB'", EscapeJ<false>("http://ya.ru/\x17\n\xab'", "\n'", "/")); + UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\x17\n\xab", UnescapeC("http:\\x2F\\x2Fya.ru\\x2F\\x17\n\xAB")); + UNIT_ASSERT_VALUES_EQUAL("http://ya.ru/\x17\n\xab", UnescapeC("http://ya.ru/\\x17\\n\xAB")); + UNIT_ASSERT_VALUES_EQUAL("h", EscapeJ<false>("h")); + UNIT_ASSERT_VALUES_EQUAL("\"h\"", EscapeJ<true>("h")); + UNIT_ASSERT_VALUES_EQUAL("h", UnescapeC("h")); + UNIT_ASSERT_VALUES_EQUAL("\\xFF", EscapeJ<false>("\xFF")); + UNIT_ASSERT_VALUES_EQUAL("\"\\xFF\"", EscapeJ<true>("\xFF")); + UNIT_ASSERT_VALUES_EQUAL("\xFF", UnescapeC("\\xFF")); + UNIT_ASSERT_VALUES_EQUAL("\\377f", EscapeJ<false>("\xff" "f")); UNIT_ASSERT_VALUES_EQUAL("\xff" @@ -62,5 +62,5 @@ Y_UNIT_TEST_SUITE(TRelaxedEscaperTest) { UNIT_ASSERT_VALUES_EQUAL("\xff" "g", UnescapeC("\\xFFg")); - } -} + } +} |