aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/uri/parse.h
diff options
context:
space:
mode:
authoralbert <albert@yandex-team.ru>2022-02-10 16:48:15 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:48:15 +0300
commita817f5de12611ec73085eba17f8ec7740a46bdb7 (patch)
treeb222e5ac2e2e98872661c51ccceee5da0d291e13 /library/cpp/uri/parse.h
parent9f25ef3232c288ca664ceee6c376cf64e4349a2e (diff)
downloadydb-a817f5de12611ec73085eba17f8ec7740a46bdb7.tar.gz
Restoring authorship annotation for <albert@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/uri/parse.h')
-rw-r--r--library/cpp/uri/parse.h136
1 files changed, 68 insertions, 68 deletions
diff --git a/library/cpp/uri/parse.h b/library/cpp/uri/parse.h
index 0d2ce86ddf4..ca2358e5728 100644
--- a/library/cpp/uri/parse.h
+++ b/library/cpp/uri/parse.h
@@ -1,20 +1,20 @@
-#pragma once
+#pragma once
-// #define DO_PRN
+// #define DO_PRN
-#include <cstddef>
+#include <cstddef>
-#include "common.h"
+#include "common.h"
#include <library/cpp/charset/doccodes.h>
-#include <util/generic/strbuf.h>
-#include <util/stream/output.h>
-#include <util/string/cast.h>
-#include <util/system/yassert.h>
+#include <util/generic/strbuf.h>
+#include <util/stream/output.h>
+#include <util/string/cast.h>
+#include <util/system/yassert.h>
-namespace NUri {
+namespace NUri {
class TParser;
-
+
namespace NParse {
class TRange {
public:
@@ -23,7 +23,7 @@ namespace NUri {
ui64 FlagsAllPlaintext;
ui32 Encode;
ui32 Decode;
-
+
public:
TRange(const char* beg = nullptr)
: Beg(beg)
@@ -33,51 +33,51 @@ namespace NUri {
, Decode(0)
{
}
-
+
void Reset(const char* beg = nullptr) {
*this = TRange(beg);
}
-
+
void AddRange(const TRange& range, ui64 mask);
-
+
void AddFlag(const char* ptr, ui64 mask, ui64 flag) {
if (0 != flag)
AddFlagImpl(ptr, mask, flag, flag);
}
-
+
void AddFlagExcept(const char* ptr, ui64 mask, ui64 flag, ui64 exclflag) {
if (0 != flag)
AddFlagImpl(ptr, mask, flag & ~exclflag, flag);
}
-
+
void AddFlagUnless(const char* ptr, ui64 mask, ui64 flag, ui64 exclmask) {
if (0 != flag)
AddFlagImpl(ptr, mask, flag, flag, exclmask);
}
-
+
void AddFlag(const char* ptr, ui64 mask, ui64 flag, ui64 exclflag, ui64 exclmask) {
if (0 != flag)
AddFlagImpl(ptr, mask, flag & ~exclflag, flag, exclmask);
}
-
+
private:
void AddFlagImpl(const char* ptr, ui64 mask, ui64 plainflag, ui64 encflag) {
AddFlagAllPlaintextImpl(ptr, plainflag);
AddFlagEncodeMaskedImpl(encflag & mask);
}
-
+
void AddFlagImpl(const char* ptr, ui64 mask, ui64 plainflag, ui64 encflag, ui64 exclmask) {
AddFlagAllPlaintextImpl(ptr, plainflag);
if (0 == (mask & exclmask))
AddFlagEncodeMaskedImpl(encflag & mask);
}
-
+
void AddFlagAllPlaintextImpl(const char* ptr, ui64 flag) {
if (nullptr == Beg)
Beg = ptr;
FlagsAllPlaintext |= flag;
}
-
+
void AddFlagEncodeMaskedImpl(ui64 flag) {
if (0 == flag)
return;
@@ -88,36 +88,36 @@ namespace NUri {
++Decode;
}
};
-
- }
-
+
+ }
+
class TSection
: protected NParse::TRange {
private:
friend class TParser;
-
+
private:
const char* End;
-
+
TSection(const char* beg = nullptr)
: NParse::TRange(beg)
, End(nullptr)
{
}
-
+
void Reset() {
Enter(nullptr);
}
-
+
void Reset(const char* pc) {
Y_ASSERT(!Beg || !pc || Beg < pc);
Reset();
}
-
+
void Enter(const char* pc) {
*this = TSection(pc);
}
-
+
bool Leave(const char* pc) {
Y_ASSERT(Beg);
End = pc;
@@ -133,40 +133,40 @@ namespace NUri {
bool IsSet() const {
return End;
}
-
+
TStringBuf Get() const {
return TStringBuf(Beg, End);
}
-
+
size_t Len() const {
return End - Beg;
}
-
+
size_t DecodedLen() const {
return Len() - 2 * Decode;
}
-
+
size_t EncodedLen() const {
return 2 * Encode + DecodedLen();
}
-
+
ui32 GetEncode() const {
return Encode;
}
-
+
ui32 GetDecode() const {
return Decode;
}
-
+
ui64 GetFlagsEncode() const {
return FlagsEncodeMasked;
}
-
+
ui64 GetFlagsAllPlaintext() const {
return FlagsAllPlaintext;
}
};
-
+
class TParser {
public:
TSection Sections[TField::FieldUrlMAX];
@@ -175,7 +175,7 @@ namespace NUri {
const TStringBuf UriStr;
TState::EParsed State;
ECharset Enc;
-
+
public:
TParser(const TParseFlags& flags, const TStringBuf& uri, ECharset enc = CODES_UTF8)
: Scheme(TScheme::SchemeEmpty)
@@ -218,97 +218,97 @@ namespace NUri {
ui64 GetFieldFlags(TField::EField fld) const {
return GetFieldFlags(fld, Flags);
}
-
+
protected:
static const TParseFlags FieldFlags[TField::FieldUrlMAX];
TSection::TRange CurRange;
unsigned HexValue;
const char* PctBegin;
-
-#ifdef DO_PRN
+
+#ifdef DO_PRN
IOutputStream& PrintAddr(const char* ptr) const {
return Cdbg << "[" << IntToString<16>(ui64(ptr)) << "] ";
}
-
+
IOutputStream& PrintHead(const char* ptr, const char* func) const {
return PrintAddr(ptr) << func << " ";
}
-
+
IOutputStream& PrintHead(const char* ptr, const char* func, const TField::EField& fld) const {
return PrintHead(ptr, func) << fld;
}
-
+
IOutputStream& PrintTail(const TStringBuf& val) const {
return Cdbg << " [" << val << "]" << Endl;
}
IOutputStream& PrintTail(const char* beg, const char* end) const {
return PrintTail(TStringBuf(beg, end));
}
-#endif
-
+#endif
+
void ResetSection(TField::EField fld, const char* pc = nullptr) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(pc, __FUNCTION__, fld);
PrintTail(pc);
-#endif
+#endif
Sections[fld].Reset(pc);
}
void storeSection(const TStringBuf& val, TField::EField fld) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(val.data(), __FUNCTION__, fld);
PrintTail(val);
-#endif
+#endif
Sections[fld].Set(val);
}
-
+
void startSection(const char* pc, TField::EField fld) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(pc, __FUNCTION__, fld);
PrintTail(pc);
-#endif
+#endif
copyRequirements(pc);
Sections[fld].Enter(pc);
}
void finishSection(const char* pc, TField::EField fld) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(pc, __FUNCTION__, fld);
PrintTail(pc);
-#endif
+#endif
if (Sections[fld].Leave(pc))
copyRequirements(pc);
}
void setRequirement(const char* ptr, ui64 flags) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(ptr, __FUNCTION__) << IntToString<16>(flags)
<< " & mask=" << IntToString<16>(Flags.Allow | Flags.Extra);
PrintTail(ptr);
-#endif
+#endif
CurRange.AddFlag(ptr, Flags.Allow | Flags.Extra, flags);
}
-
+
void setRequirementExcept(const char* ptr, ui64 flags, ui64 exclflag) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(ptr, __FUNCTION__) << IntToString<16>(flags)
<< " & exclflag=" << IntToString<16>(exclflag)
<< " & mask=" << IntToString<16>(Flags.Allow | Flags.Extra);
PrintTail(ptr);
-#endif
+#endif
CurRange.AddFlagExcept(ptr, Flags.Allow | Flags.Extra, flags, exclflag);
}
-
+
void setRequirementUnless(const char* ptr, ui64 flags, ui64 exclmask) {
-#ifdef DO_PRN
+#ifdef DO_PRN
PrintHead(ptr, __FUNCTION__) << IntToString<16>(flags)
<< " & exclmask=" << IntToString<16>(exclmask)
<< " & mask=" << IntToString<16>(Flags.Allow | Flags.Extra);
PrintTail(ptr);
-#endif
+#endif
CurRange.AddFlagUnless(ptr, Flags.Allow | Flags.Extra, flags, exclmask);
}
-
+
void copyRequirementsImpl(const char* ptr);
void copyRequirements(const char* ptr) {
PctEnd(ptr);
@@ -347,7 +347,7 @@ namespace NUri {
HexReset();
PctBegin = ptr;
}
-
+
void checkSectionCollision(TField::EField fld1, TField::EField fld2) {
if (Sections[fld1].IsSet() && Sections[fld2].IsSet() && Sections[fld1].Beg == Sections[fld2].Beg) {
Sections[fld1].Reset();
@@ -357,5 +357,5 @@ namespace NUri {
bool doParse(const char* str_beg, size_t length);
TState::EParsed ParseImpl();
};
-
+
}