Compare commits

...
2 Commits
Author SHA1 Message Date
Riyyi 6f0e3d6063 Util: Add Container parser checks 2022-08-09 11:11:19 +02:00
Riyyi 3e2819cf93 Util: Use char literals instead of numbers in enums 2022-08-09 10:56:48 +02:00
5 changed files with 48 additions and 28 deletions
+6 -6
View File
@@ -17,16 +17,16 @@ class Builder {
public: public:
enum class Align : uint8_t { enum class Align : uint8_t {
None, None,
Left = 60, // '<' Left = '<',
Right = 62, // '>' Right = '>',
Center = 94, // '^' Center = '^',
}; };
enum class Sign : uint8_t { enum class Sign : uint8_t {
None, None,
Negative = 45, // '-' Negative = '-',
Both = 43, // '+' Both = '+',
Space = 32, // ' ' Space = ' ',
}; };
explicit Builder(std::stringstream& builder) explicit Builder(std::stringstream& builder)
+1 -2
View File
@@ -4,8 +4,7 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <cstddef> // size_t #include <cstdint> // uint8_t
#include <cstdint> // int32_t, uint32_t, int64_t,
#include <cstring> // strlen #include <cstring> // strlen
#include <string> #include <string>
#include <string_view> #include <string_view>
+20 -18
View File
@@ -23,29 +23,31 @@
namespace Util::Format { namespace Util::Format {
enum class PresentationType : uint8_t { enum class PresentationType : uint8_t {
None, // Defaults are any of: 'dgcsp', depending on the type None,
// Interger // Interger
Binary = 98, // 'b' Binary = 'b',
BinaryUppercase = 66, // 'B' BinaryUppercase = 'B',
Decimal = 100, // 'd' Decimal = 'd',
Octal = 111, // 'o' Octal = 'o',
Hex = 120, // 'x' Hex = 'x',
HexUppercase = 88, // 'X' HexUppercase = 'X',
// Floating-point // Floating-point
Hexfloat = 97, // 'a' Hexfloat = 'a',
HexfloatUppercase = 65, // 'A' HexfloatUppercase = 'A',
Exponent = 101, // 'e' Exponent = 'e',
ExponentUppercase = 69, // 'E' ExponentUppercase = 'E',
FixedPoint = 102, // 'f' FixedPoint = 'f',
FixedPointUppercase = 70, // 'F' FixedPointUppercase = 'F',
General = 103, // 'g' General = 'g',
GeneralUppercase = 71, // 'G' GeneralUppercase = 'G',
// Character // Character
Character = 99, // 'c' Character = 'c',
// String // String
String = 115, // 's' String = 's',
// Pointer // Pointer
Pointer = 112, // 'p' Pointer = 'p',
// Container
Container = 'C',
}; };
struct Specifier { struct Specifier {
+20 -2
View File
@@ -320,7 +320,7 @@ constexpr void Parser::checkSpecifierCharType(const Specifier& specifier)
{ {
checkSpecifierIntegralType(specifier); checkSpecifierIntegralType(specifier);
// Valid: fill, align, width // Valid: fill + align, width
// Invalid: sign, alternativeForm, zeroPadding, precision // Invalid: sign, alternativeForm, zeroPadding, precision
if (specifier.type == PresentationType::None if (specifier.type == PresentationType::None
|| specifier.type == PresentationType::Character) { || specifier.type == PresentationType::Character) {
@@ -342,7 +342,7 @@ constexpr void Parser::checkSpecifierCStringType(const Specifier& specifier)
VERIFY(false, "invalid type specifier"); VERIFY(false, "invalid type specifier");
} }
// Valid: fill, align, width // Valid: fill + align, width
// Invalid: sign, alternativeForm, zeroPadding, precision // Invalid: sign, alternativeForm, zeroPadding, precision
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option"); VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option");
VERIFY(specifier.alternativeForm == false, "invalid specifier option"); VERIFY(specifier.alternativeForm == false, "invalid specifier option");
@@ -362,6 +362,23 @@ constexpr void Parser::checkSpecifierPointerType(const Specifier& specifier)
VERIFY(specifier.type != PresentationType::String, "invalid type specifier"); VERIFY(specifier.type != PresentationType::String, "invalid type specifier");
} }
constexpr void Parser::checkSpecifierContainerType(const Specifier& specifier)
{
switch (specifier.type) {
case PresentationType::None:
case PresentationType::Container:
break;
default:
VERIFY(false, "invalid type specifier");
}
// Valid: fill + align, alternativeForm, width
// Invalid: sign, zeroPadding, precision
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option");
VERIFY(specifier.zeroPadding == false, "invalid specifier option");
VERIFY(specifier.precision == -1, "invalid specifier option");
}
constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterType type) constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterType type)
{ {
switch (type) { switch (type) {
@@ -384,6 +401,7 @@ constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterT
checkSpecifierPointerType(specifier); checkSpecifierPointerType(specifier);
break; break;
case ParameterType::Container: case ParameterType::Container:
checkSpecifierContainerType(specifier);
break; break;
default: default:
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
+1
View File
@@ -50,6 +50,7 @@ public:
constexpr void checkSpecifierCStringType(const Specifier& specifier); constexpr void checkSpecifierCStringType(const Specifier& specifier);
constexpr void checkSpecifierStringType(const Specifier& specifier); constexpr void checkSpecifierStringType(const Specifier& specifier);
constexpr void checkSpecifierPointerType(const Specifier& specifier); constexpr void checkSpecifierPointerType(const Specifier& specifier);
constexpr void checkSpecifierContainerType(const Specifier& specifier);
constexpr void checkSpecifierType(const Specifier& specifier, ParameterType type); constexpr void checkSpecifierType(const Specifier& specifier, ParameterType type);
private: private: