From 97425c7dfb8fd7728617601d1bff3203f409a7e8 Mon Sep 17 00:00:00 2001 From: Max Wipfli Date: Thu, 3 Jun 2021 12:40:04 +0200 Subject: [PATCH] AK: Make debugging URLParser easier This patch adds a state_name method to URLParser to convert a state to a string. With this, the debugging statements now display the state names. Furthermore, this fixes a bug where non-ASCII code points were formatted as characters, which fails an assertion in the formatting system. --- AK/URLParser.cpp | 8 ++++--- AK/URLParser.h | 61 +++++++++++++++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/AK/URLParser.cpp b/AK/URLParser.cpp index daedbc50c9..880ef04a50 100644 --- a/AK/URLParser.cpp +++ b/AK/URLParser.cpp @@ -228,10 +228,12 @@ URL URLParser::parse(Badge, StringView const& raw_input, URL const* base_ur code_point = *iterator; if constexpr (URL_PARSER_DEBUG) { - if (code_point) - dbgln("URLParser::parse: State {:2d} with code point '{:c}' (U+{:04X}).", (int)state, code_point, code_point); + if (!code_point) + dbgln("URLParser::parse: {} state with EOF.", state_name(state)); + else if (is_ascii_printable(code_point)) + dbgln("URLParser::parse: {} state with code point U+{:04X} ({:c}).", state_name(state), code_point, code_point); else - dbgln("URLParser::parse: State {:2d} with code point EOF (U+0000).", (int)state); + dbgln("URLParser::parse: {} state with code point U+{:04X}.", state_name(state), code_point); } switch (state) { diff --git a/AK/URLParser.h b/AK/URLParser.h index ea403751d0..d58451daf9 100644 --- a/AK/URLParser.h +++ b/AK/URLParser.h @@ -12,38 +12,57 @@ namespace AK { +#define ENUMERATE_STATES \ + STATE(SchemeStart) \ + STATE(Scheme) \ + STATE(NoScheme) \ + STATE(SpecialRelativeOrAuthority) \ + STATE(PathOrAuthority) \ + STATE(Relative) \ + STATE(RelativeSlash) \ + STATE(SpecialAuthoritySlashes) \ + STATE(SpecialAuthorityIgnoreSlashes) \ + STATE(Authority) \ + STATE(Host) \ + STATE(Hostname) \ + STATE(Port) \ + STATE(File) \ + STATE(FileSlash) \ + STATE(FileHost) \ + STATE(PathStart) \ + STATE(Path) \ + STATE(CannotBeABaseUrlPath) \ + STATE(Query) \ + STATE(Fragment) + class URLParser { public: enum class State { - SchemeStart, - Scheme, - NoScheme, - SpecialRelativeOrAuthority, - PathOrAuthority, - Relative, - RelativeSlash, - SpecialAuthoritySlashes, - SpecialAuthorityIgnoreSlashes, - Authority, - Host, - Hostname, - Port, - File, - FileSlash, - FileHost, - PathStart, - Path, - CannotBeABaseUrlPath, - Query, - Fragment +#define STATE(state) state, + ENUMERATE_STATES +#undef STATE }; + static char const* state_name(State const& state) + { + switch (state) { +#define STATE(state) \ + case State::state: \ + return #state; + ENUMERATE_STATES +#undef STATE + } + VERIFY_NOT_REACHED(); + } + static URL parse(Badge, StringView const& input, URL const* base_url = nullptr); private: static Optional parse_data_url(StringView const& raw_input); }; +#undef ENUMERATE_STATES + } using AK::URLParser;