aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h
diff options
context:
space:
mode:
authorRuslan Kovalev <ruslan.a.kovalev@gmail.com>2022-02-10 16:46:45 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:46:45 +0300
commit9123176b341b6f2658cff5132482b8237c1416c8 (patch)
tree49e222ea1c5804306084bb3ae065bb702625360f /library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h
parent59e19371de37995fcb36beb16cd6ec030af960bc (diff)
downloadydb-9123176b341b6f2658cff5132482b8237c1416c8.tar.gz
Restoring authorship annotation for Ruslan Kovalev <ruslan.a.kovalev@gmail.com>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h')
-rw-r--r--library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h76
1 files changed, 38 insertions, 38 deletions
diff --git a/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h b/library/cpp/string_utils/relaxed_escaper/relaxed_escaper.h
index 97d2a48fd0..d7ea7c1259 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);