aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/uri/encodefsm.rl6
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/uri/encodefsm.rl6
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/uri/encodefsm.rl6')
-rw-r--r--library/cpp/uri/encodefsm.rl651
1 files changed, 51 insertions, 0 deletions
diff --git a/library/cpp/uri/encodefsm.rl6 b/library/cpp/uri/encodefsm.rl6
new file mode 100644
index 0000000000..6a323aa85a
--- /dev/null
+++ b/library/cpp/uri/encodefsm.rl6
@@ -0,0 +1,51 @@
+#include <library/cpp/uri/encode.h>
+
+#ifdef __clang__
+ #pragma clang diagnostic ignored "-Wunused-variable"
+#endif
+
+namespace NUri {
+namespace NEncode {
+
+%%{
+ machine TEncoder;
+
+ hex = (
+ digit >{ HexDigit(fc); } |
+ [A-F] >{ HexUpper(fc); } |
+ [a-f] >{ HexLower(fc); }
+ );
+
+ escaped = ( "%" hex hex )
+ > { HexReset(); }
+ % { DoHex(); };
+
+ bad_escaped = ( "%" hex )
+ % {
+ DoSym(*(fpc - 2));
+ DoSym(*(fpc - 1));
+ };
+
+ sym = (any - bad_escaped - escaped) %{ DoSym(*(fpc - 1)); };
+
+ main := ( escaped | bad_escaped | sym )**;
+
+ write data;
+}%%
+
+ui64 TEncoder::ReEncode(const TStringBuf &url)
+{
+ const char *p = url.data();
+ const char *pe = p + url.length();
+ const char *eof = pe;
+ int cs;
+ OutFlags = 0;
+
+ %% write init;
+ %% write exec;
+
+ return OutFlags;
+}
+
+}
+}