mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +00:00 
			
		
		
		
	AK: Make string-to-number conversion helpers return Optional
Get rid of the weird old signature: - int StringType::to_int(bool& ok) const And replace it with sensible new signature: - Optional<int> StringType::to_int() const
This commit is contained in:
		
							parent
							
								
									15f4043a7a
								
							
						
					
					
						commit
						fdfda6dec2
					
				
					 55 changed files with 354 additions and 455 deletions
				
			
		|  | @ -26,6 +26,7 @@ | |||
| 
 | ||||
| #include <AK/FlyString.h> | ||||
| #include <AK/HashTable.h> | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <AK/StringUtils.h> | ||||
| #include <AK/StringView.h> | ||||
|  | @ -88,9 +89,9 @@ FlyString::FlyString(const char* string) | |||
| { | ||||
| } | ||||
| 
 | ||||
| int FlyString::to_int(bool& ok) const | ||||
| Optional<int> FlyString::to_int() const | ||||
| { | ||||
|     return StringUtils::convert_to_int(view(), ok); | ||||
|     return StringUtils::convert_to_int(view()); | ||||
| } | ||||
| 
 | ||||
| bool FlyString::equals_ignoring_case(const StringView& other) const | ||||
|  |  | |||
|  | @ -82,7 +82,7 @@ public: | |||
| 
 | ||||
|     FlyString to_lowercase() const; | ||||
| 
 | ||||
|     int to_int(bool& ok) const; | ||||
|     Optional<int> to_int() const; | ||||
| 
 | ||||
|     bool equals_ignoring_case(const StringView&) const; | ||||
|     bool ends_with(const StringView&, CaseSensitivity = CaseSensitivity::CaseSensitive) const; | ||||
|  |  | |||
|  | @ -78,18 +78,11 @@ public: | |||
|         auto parts = string.split_view('.'); | ||||
|         if (parts.size() != 4) | ||||
|             return {}; | ||||
|         bool ok; | ||||
|         auto a = parts[0].to_uint(ok); | ||||
|         if (!ok || a > 255) | ||||
|             return {}; | ||||
|         auto b = parts[1].to_uint(ok); | ||||
|         if (!ok || b > 255) | ||||
|             return {}; | ||||
|         auto c = parts[2].to_uint(ok); | ||||
|         if (!ok || c > 255) | ||||
|             return {}; | ||||
|         auto d = parts[3].to_uint(ok); | ||||
|         if (!ok || d > 255) | ||||
|         auto a = parts[0].to_uint().value_or(256); | ||||
|         auto b = parts[1].to_uint().value_or(256); | ||||
|         auto c = parts[2].to_uint().value_or(256); | ||||
|         auto d = parts[3].to_uint().value_or(256); | ||||
|         if (a > 255 || b > 255 || c > 255 || d > 255) | ||||
|             return {}; | ||||
|         return IPv4Address((u8)a, (u8)b, (u8)c, (u8)d); | ||||
|     } | ||||
|  |  | |||
|  | @ -123,10 +123,9 @@ String JsonParser::consume_quoted_string() | |||
|             sb.append(consume()); | ||||
|             sb.append(consume()); | ||||
| 
 | ||||
|             bool ok; | ||||
|             u32 codepoint = AK::StringUtils::convert_to_uint_from_hex(sb.to_string(), ok); | ||||
|             if (ok && codepoint < 128) { | ||||
|                 buffer.append((char)codepoint); | ||||
|             auto codepoint = AK::StringUtils::convert_to_uint_from_hex(sb.to_string()); | ||||
|             if (codepoint.has_value() && codepoint.value() < 0x80) { | ||||
|                 buffer.append((char)codepoint.value()); | ||||
|             } else { | ||||
|                 // FIXME: This is obviously not correct, but we don't have non-ASCII support so meh.
 | ||||
|                 buffer.append('?'); | ||||
|  | @ -202,7 +201,6 @@ JsonValue JsonParser::parse_string() | |||
| 
 | ||||
| JsonValue JsonParser::parse_number() | ||||
| { | ||||
|     bool ok; | ||||
|     JsonValue value; | ||||
|     Vector<char, 128> number_buffer; | ||||
|     Vector<char, 128> fraction_buffer; | ||||
|  | @ -231,14 +229,17 @@ JsonValue JsonParser::parse_number() | |||
| 
 | ||||
| #ifndef KERNEL | ||||
|     if (is_double) { | ||||
|         int whole = number_string.to_uint(ok); | ||||
|         if (!ok) | ||||
|             whole = number_string.to_int(ok); | ||||
|         ASSERT(ok); | ||||
|         // FIXME: This logic looks shaky.
 | ||||
|         int whole = 0; | ||||
|         auto to_signed_result = number_string.to_uint(); | ||||
|         if (to_signed_result.has_value()) { | ||||
|             whole = to_signed_result.value(); | ||||
|         } else { | ||||
|             whole = number_string.to_int().value(); | ||||
|         } | ||||
| 
 | ||||
|         int fraction = fraction_string.to_uint(ok); | ||||
|         int fraction = fraction_string.to_uint().value(); | ||||
|         fraction *= (whole < 0) ? -1 : 1; | ||||
|         ASSERT(ok); | ||||
| 
 | ||||
|         auto divider = 1; | ||||
|         for (size_t i = 0; i < fraction_buffer.size(); ++i) { | ||||
|  | @ -247,10 +248,12 @@ JsonValue JsonParser::parse_number() | |||
|         value = JsonValue((double)whole + ((double)fraction / divider)); | ||||
|     } else { | ||||
| #endif | ||||
|         value = JsonValue(number_string.to_uint(ok)); | ||||
|         if (!ok) | ||||
|             value = JsonValue(number_string.to_int(ok)); | ||||
|         ASSERT(ok); | ||||
|         auto to_unsigned_result = number_string.to_uint(); | ||||
|         if (to_unsigned_result.has_value()) { | ||||
|             value = JsonValue(to_unsigned_result.value()); | ||||
|         } else { | ||||
|             value = JsonValue(number_string.to_int().value()); | ||||
|         } | ||||
| #ifndef KERNEL | ||||
|     } | ||||
| #endif | ||||
|  |  | |||
|  | @ -196,14 +196,14 @@ ByteBuffer String::to_byte_buffer() const | |||
|     return ByteBuffer::copy(reinterpret_cast<const u8*>(characters()), length()); | ||||
| } | ||||
| 
 | ||||
| int String::to_int(bool& ok) const | ||||
| Optional<int> String::to_int() const | ||||
| { | ||||
|     return StringUtils::convert_to_int(this->view(), ok); | ||||
|     return StringUtils::convert_to_int(view()); | ||||
| } | ||||
| 
 | ||||
| unsigned String::to_uint(bool& ok) const | ||||
| Optional<unsigned> String::to_uint() const | ||||
| { | ||||
|     return StringUtils::convert_to_uint(this->view(), ok); | ||||
|     return StringUtils::convert_to_uint(view()); | ||||
| } | ||||
| 
 | ||||
| String String::number(unsigned long long value) | ||||
|  |  | |||
|  | @ -108,8 +108,8 @@ public: | |||
|     static String repeated(char, size_t count); | ||||
|     bool matches(const StringView& mask, CaseSensitivity = CaseSensitivity::CaseInsensitive) const; | ||||
| 
 | ||||
|     int to_int(bool& ok) const; | ||||
|     unsigned to_uint(bool& ok) const; | ||||
|     Optional<int> to_int() const; | ||||
|     Optional<unsigned> to_uint() const; | ||||
| 
 | ||||
|     String to_lowercase() const; | ||||
|     String to_uppercase() const; | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ | |||
|  */ | ||||
| 
 | ||||
| #include <AK/Memory.h> | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <AK/StringUtils.h> | ||||
| #include <AK/StringView.h> | ||||
|  | @ -87,69 +88,54 @@ bool matches(const StringView& str, const StringView& mask, CaseSensitivity case | |||
|     return (mask_ptr == mask_end) && string_ptr == string_end; | ||||
| } | ||||
| 
 | ||||
| int convert_to_int(const StringView& str, bool& ok) | ||||
| Optional<int> convert_to_int(const StringView& str) | ||||
| { | ||||
|     if (str.is_empty()) { | ||||
|         ok = false; | ||||
|         return 0; | ||||
|     } | ||||
|     if (str.is_empty()) | ||||
|         return {}; | ||||
| 
 | ||||
|     bool negative = false; | ||||
|     size_t i = 0; | ||||
|     const auto characters = str.characters_without_null_termination(); | ||||
| 
 | ||||
|     if (characters[0] == '-' || characters[0] == '+') { | ||||
|         if (str.length() == 1) { | ||||
|             ok = false; | ||||
|             return 0; | ||||
|         } | ||||
|         if (str.length() == 1) | ||||
|             return {}; | ||||
|         i++; | ||||
|         negative = (characters[0] == '-'); | ||||
|     } | ||||
| 
 | ||||
|     int value = 0; | ||||
|     for (; i < str.length(); i++) { | ||||
|         if (characters[i] < '0' || characters[i] > '9') { | ||||
|             ok = false; | ||||
|             return 0; | ||||
|         } | ||||
|         if (characters[i] < '0' || characters[i] > '9') | ||||
|             return {}; | ||||
|         value = value * 10; | ||||
|         value += characters[i] - '0'; | ||||
|     } | ||||
|     ok = true; | ||||
| 
 | ||||
|     return negative ? -value : value; | ||||
| } | ||||
| 
 | ||||
| unsigned convert_to_uint(const StringView& str, bool& ok) | ||||
| Optional<unsigned> convert_to_uint(const StringView& str) | ||||
| { | ||||
|     if (str.is_empty()) { | ||||
|         ok = false; | ||||
|         return 0; | ||||
|     } | ||||
|     if (str.is_empty()) | ||||
|         return {}; | ||||
| 
 | ||||
|     unsigned value = 0; | ||||
|     const auto characters = str.characters_without_null_termination(); | ||||
| 
 | ||||
|     for (size_t i = 0; i < str.length(); i++) { | ||||
|         if (characters[i] < '0' || characters[i] > '9') { | ||||
|             ok = false; | ||||
|             return 0; | ||||
|         } | ||||
|         if (characters[i] < '0' || characters[i] > '9') | ||||
|             return {}; | ||||
| 
 | ||||
|         value = value * 10; | ||||
|         value += characters[i] - '0'; | ||||
|     } | ||||
|     ok = true; | ||||
| 
 | ||||
|     return value; | ||||
| } | ||||
| 
 | ||||
| unsigned convert_to_uint_from_hex(const StringView& str, bool& ok) | ||||
| Optional<unsigned> convert_to_uint_from_hex(const StringView& str) | ||||
| { | ||||
|     if (str.is_empty()) { | ||||
|         ok = false; | ||||
|         return 0; | ||||
|     } | ||||
|     if (str.is_empty()) | ||||
|         return {}; | ||||
| 
 | ||||
|     unsigned value = 0; | ||||
|     const auto count = str.length(); | ||||
|  | @ -165,14 +151,11 @@ unsigned convert_to_uint_from_hex(const StringView& str, bool& ok) | |||
|         } else if (digit >= 'A' && digit <= 'F') { | ||||
|             digit_val = 10 + (digit - 'A'); | ||||
|         } else { | ||||
|             ok = false; | ||||
|             return 0; | ||||
|             return {}; | ||||
|         } | ||||
| 
 | ||||
|         value = (value << 4) + digit_val; | ||||
|     } | ||||
| 
 | ||||
|     ok = true; | ||||
|     return value; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -39,9 +39,9 @@ enum class CaseSensitivity { | |||
| namespace StringUtils { | ||||
| 
 | ||||
| bool matches(const StringView& str, const StringView& mask, CaseSensitivity = CaseSensitivity::CaseInsensitive); | ||||
| int convert_to_int(const StringView&, bool& ok); | ||||
| unsigned convert_to_uint(const StringView&, bool& ok); | ||||
| unsigned convert_to_uint_from_hex(const StringView&, bool& ok); | ||||
| Optional<int> convert_to_int(const StringView&); | ||||
| Optional<unsigned> convert_to_uint(const StringView&); | ||||
| Optional<unsigned> convert_to_uint_from_hex(const StringView&); | ||||
| bool equals_ignoring_case(const StringView&, const StringView&); | ||||
| bool ends_with(const StringView& a, const StringView& b, CaseSensitivity); | ||||
| } | ||||
|  |  | |||
|  | @ -215,14 +215,14 @@ StringView StringView::substring_view_starting_after_substring(const StringView& | |||
|     return { remaining_characters, remaining_length }; | ||||
| } | ||||
| 
 | ||||
| int StringView::to_int(bool& ok) const | ||||
| Optional<int> StringView::to_int() const | ||||
| { | ||||
|     return StringUtils::convert_to_int(*this, ok); | ||||
|     return StringUtils::convert_to_int(*this); | ||||
| } | ||||
| 
 | ||||
| unsigned StringView::to_uint(bool& ok) const | ||||
| Optional<unsigned> StringView::to_uint() const | ||||
| { | ||||
|     return StringUtils::convert_to_uint(*this, ok); | ||||
|     return StringUtils::convert_to_uint(*this); | ||||
| } | ||||
| 
 | ||||
| unsigned StringView::hash() const | ||||
|  |  | |||
|  | @ -96,8 +96,8 @@ public: | |||
|     // following newline.".
 | ||||
|     Vector<StringView> lines(bool consider_cr = true) const; | ||||
| 
 | ||||
|     int to_int(bool& ok) const; | ||||
|     unsigned to_uint(bool& ok) const; | ||||
|     Optional<int> to_int() const; | ||||
|     Optional<unsigned> to_uint() const; | ||||
| 
 | ||||
|     // Create a new substring view of this string view, starting either at the beginning of
 | ||||
|     // the given substring view, or after its end, and continuing until the end of this string
 | ||||
|  |  | |||
|  | @ -72,8 +72,7 @@ TEST_CASE(order) | |||
|     } | ||||
| 
 | ||||
|     for (int i = 0; i < 10000; ++i) { | ||||
|         bool ok; | ||||
|         EXPECT_EQ(strings.dequeue().to_int(ok), i); | ||||
|         EXPECT_EQ(strings.dequeue().to_int().value(), i); | ||||
|     } | ||||
| 
 | ||||
|     EXPECT(strings.is_empty()); | ||||
|  |  | |||
|  | @ -127,9 +127,8 @@ TEST_CASE(repeated) | |||
| 
 | ||||
| TEST_CASE(to_int) | ||||
| { | ||||
|     bool ok; | ||||
|     EXPECT(String("123").to_int(ok) == 123 && ok); | ||||
|     EXPECT(String("-123").to_int(ok) == -123 && ok); | ||||
|     EXPECT_EQ(String("123").to_int().value(), 123); | ||||
|     EXPECT_EQ(String("-123").to_int().value(), -123); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(to_lowercase) | ||||
|  |  | |||
|  | @ -69,79 +69,88 @@ TEST_CASE(matches_case_insensitive) | |||
| 
 | ||||
| TEST_CASE(convert_to_int) | ||||
| { | ||||
|     bool ok = false; | ||||
|     AK::StringUtils::convert_to_int(StringView(), ok); | ||||
|     EXPECT(!ok); | ||||
|     auto value = AK::StringUtils::convert_to_int(StringView()); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_int("", ok); | ||||
|     EXPECT(!ok); | ||||
|     AK::StringUtils::convert_to_int(""); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_int("a", ok); | ||||
|     EXPECT(!ok); | ||||
|     AK::StringUtils::convert_to_int("a"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_int("+", ok); | ||||
|     EXPECT(!ok); | ||||
|     AK::StringUtils::convert_to_int("+"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_int("-", ok); | ||||
|     EXPECT(!ok); | ||||
|     AK::StringUtils::convert_to_int("-"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     int actual = AK::StringUtils::convert_to_int("0", ok); | ||||
|     EXPECT(ok && actual == 0); | ||||
|     auto actual = AK::StringUtils::convert_to_int("0"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 0); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_int("1", ok); | ||||
|     EXPECT(ok && actual == 1); | ||||
|     actual = AK::StringUtils::convert_to_int("1"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 1); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_int("+1", ok); | ||||
|     EXPECT(ok && actual == 1); | ||||
|     actual = AK::StringUtils::convert_to_int("+1"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 1); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_int("-1", ok); | ||||
|     EXPECT(ok && actual == -1); | ||||
|     actual = AK::StringUtils::convert_to_int("-1"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), -1); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_int("01", ok); | ||||
|     EXPECT(ok && actual == 1); | ||||
|     actual = AK::StringUtils::convert_to_int("01"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 1); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_int("12345", ok); | ||||
|     EXPECT(ok && actual == 12345); | ||||
|     actual = AK::StringUtils::convert_to_int("12345"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 12345); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_int("-12345", ok); | ||||
|     EXPECT(ok && actual == -12345); | ||||
|     actual = AK::StringUtils::convert_to_int("-12345"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), -12345); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(convert_to_uint) | ||||
| { | ||||
|     bool ok = false; | ||||
|     AK::StringUtils::convert_to_uint(StringView(), ok); | ||||
|     EXPECT(!ok); | ||||
|     auto value = AK::StringUtils::convert_to_uint(StringView()); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_uint("", ok); | ||||
|     EXPECT(!ok); | ||||
|     value = AK::StringUtils::convert_to_uint(""); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_uint("a", ok); | ||||
|     EXPECT(!ok); | ||||
|     value = AK::StringUtils::convert_to_uint("a"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_uint("+", ok); | ||||
|     EXPECT(!ok); | ||||
|     value = AK::StringUtils::convert_to_uint("+"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_uint("-", ok); | ||||
|     EXPECT(!ok); | ||||
|     value = AK::StringUtils::convert_to_uint("-"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_uint("+1", ok); | ||||
|     EXPECT(!ok); | ||||
|     value = AK::StringUtils::convert_to_uint("+1"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     AK::StringUtils::convert_to_uint("-1", ok); | ||||
|     EXPECT(!ok); | ||||
|     AK::StringUtils::convert_to_uint("-1"); | ||||
|     EXPECT(!value.has_value()); | ||||
| 
 | ||||
|     unsigned actual = AK::StringUtils::convert_to_uint("0", ok); | ||||
|     EXPECT(ok && actual == 0u); | ||||
|     auto actual = AK::StringUtils::convert_to_uint("0"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 0u); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_uint("1", ok); | ||||
|     EXPECT(ok && actual == 1u); | ||||
|     actual = AK::StringUtils::convert_to_uint("1"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 1u); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_uint("01", ok); | ||||
|     EXPECT(ok && actual == 1u); | ||||
|     actual = AK::StringUtils::convert_to_uint("01"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 1u); | ||||
| 
 | ||||
|     actual = AK::StringUtils::convert_to_uint("12345", ok); | ||||
|     EXPECT(ok && actual == 12345u); | ||||
|     actual = AK::StringUtils::convert_to_uint("12345"); | ||||
|     EXPECT_EQ(actual.has_value(), true); | ||||
|     EXPECT_EQ(actual.value(), 12345u); | ||||
| } | ||||
| 
 | ||||
| TEST_CASE(ends_with) | ||||
|  |  | |||
|  | @ -152,11 +152,11 @@ bool URL::parse(const StringView& string) | |||
|             if (buffer.is_empty()) | ||||
|                 return false; | ||||
|             { | ||||
|                 bool ok; | ||||
|                 m_port = String::copy(buffer).to_uint(ok); | ||||
|                 auto port_opt = String::copy(buffer).to_uint(); | ||||
|                 buffer.clear(); | ||||
|                 if (!ok) | ||||
|                 if (!port_opt.has_value()) | ||||
|                     return false; | ||||
|                 m_port = port_opt.value(); | ||||
|             } | ||||
|             if (peek() == '/') { | ||||
|                 state = State::InPath; | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <AK/StringBuilder.h> | ||||
| #include <AK/StringUtils.h> | ||||
|  | @ -60,9 +61,8 @@ String urldecode(const StringView& input) | |||
|             builder.append(consume()); | ||||
|             continue; | ||||
|         } | ||||
|         bool ok; | ||||
|         u8 byte_point = StringUtils::convert_to_uint_from_hex(input.substring_view(cursor + 1, 2), ok); | ||||
|         builder.append(byte_point); | ||||
|         auto byte_point = StringUtils::convert_to_uint_from_hex(input.substring_view(cursor + 1, 2)); | ||||
|         builder.append(byte_point.value()); | ||||
|         consume(); | ||||
|         consume(); | ||||
|         consume(); | ||||
|  |  | |||
|  | @ -76,10 +76,10 @@ bool handle_disassemble_command(const String& command, void* first_instruction) | |||
|     auto parts = command.split(' '); | ||||
|     size_t number_of_instructions_to_disassemble = 5; | ||||
|     if (parts.size() == 2) { | ||||
|         bool ok; | ||||
|         number_of_instructions_to_disassemble = parts[1].to_uint(ok); | ||||
|         if (!ok) | ||||
|         auto number = parts[1].to_uint(); | ||||
|         if (!number.has_value()) | ||||
|             return false; | ||||
|         number_of_instructions_to_disassemble = number.value(); | ||||
|     } | ||||
| 
 | ||||
|     // FIXME: Instead of using a fixed "dump_size",
 | ||||
|  | @ -126,14 +126,13 @@ bool handle_breakpoint_command(const String& command) | |||
|         auto source_arguments = argument.split(':'); | ||||
|         if (source_arguments.size() != 2) | ||||
|             return false; | ||||
|         bool ok = false; | ||||
|         size_t line = source_arguments[1].to_uint(ok); | ||||
|         if (!ok) | ||||
|         auto line = source_arguments[1].to_uint(); | ||||
|         if (!line.has_value()) | ||||
|             return false; | ||||
|         auto file = source_arguments[0]; | ||||
|         if (!file.contains("/")) | ||||
|             file = String::format("./%s", file.characters()); | ||||
|         auto result = g_debug_session->debug_info().get_instruction_from_source(file, line); | ||||
|         auto result = g_debug_session->debug_info().get_instruction_from_source(file, line.value()); | ||||
|         if (!result.has_value()) { | ||||
|             printf("No matching instruction found\n"); | ||||
|             return false; | ||||
|  |  | |||
|  | @ -303,19 +303,9 @@ void DisplaySettingsWidget::load_current_settings() | |||
|     /// Resolution ////////////////////////////////////////////////////////////////////////////////
 | ||||
|     Gfx::IntSize find_size; | ||||
| 
 | ||||
|     bool okay = false; | ||||
|     // Let's attempt to find the current resolution and select it!
 | ||||
|     find_size.set_width(ws_config->read_entry("Screen", "Width", "1024").to_int(okay)); | ||||
|     if (!okay) { | ||||
|         fprintf(stderr, "DisplaySettings: failed to convert width to int!"); | ||||
|         ASSERT_NOT_REACHED(); | ||||
|     } | ||||
| 
 | ||||
|     find_size.set_height(ws_config->read_entry("Screen", "Height", "768").to_int(okay)); | ||||
|     if (!okay) { | ||||
|         fprintf(stderr, "DisplaySettings: failed to convert height to int!"); | ||||
|         ASSERT_NOT_REACHED(); | ||||
|     } | ||||
|     find_size.set_width(ws_config->read_num_entry("Screen", "Width", 1024)); | ||||
|     find_size.set_height(ws_config->read_num_entry("Screen", "Height", 768)); | ||||
| 
 | ||||
|     size_t index = m_resolutions.find_first_index(find_size).value_or(0); | ||||
|     Gfx::IntSize m_current_resolution = m_resolutions.at(index); | ||||
|  |  | |||
|  | @ -82,11 +82,10 @@ HexEditorWidget::HexEditorWidget() | |||
| 
 | ||||
|         auto input_box = GUI::InputBox::construct("Enter new file size:", "New file size", window()); | ||||
|         if (input_box->exec() == GUI::InputBox::ExecOK && !input_box->text_value().is_empty()) { | ||||
|             auto valid = false; | ||||
|             auto file_size = input_box->text_value().to_int(valid); | ||||
|             if (valid && file_size > 0) { | ||||
|             auto file_size = input_box->text_value().to_int(); | ||||
|             if (file_size.has_value() && file_size.value() > 0) { | ||||
|                 m_document_dirty = false; | ||||
|                 m_editor->set_buffer(ByteBuffer::create_zeroed(file_size)); | ||||
|                 m_editor->set_buffer(ByteBuffer::create_zeroed(file_size.value())); | ||||
|                 set_path(LexicalPath()); | ||||
|                 update_title(); | ||||
|             } else { | ||||
|  | @ -149,11 +148,9 @@ HexEditorWidget::HexEditorWidget() | |||
|     m_goto_decimal_offset_action = GUI::Action::create("Go To Offset (Decimal)...", { Mod_Ctrl | Mod_Shift, Key_G }, Gfx::Bitmap::load_from_file("/res/icons/16x16/go-forward.png"), [this](const GUI::Action&) { | ||||
|         auto input_box = GUI::InputBox::construct("Enter Decimal offset:", "Go To", window()); | ||||
|         if (input_box->exec() == GUI::InputBox::ExecOK && !input_box->text_value().is_empty()) { | ||||
|             auto valid = false; | ||||
|             auto new_offset = input_box->text_value().to_int(valid); | ||||
|             if (valid) { | ||||
|                 m_editor->set_position(new_offset); | ||||
|             } | ||||
|             auto new_offset = input_box->text_value().to_int(); | ||||
|             if (new_offset.has_value()) | ||||
|                 m_editor->set_position(new_offset.value()); | ||||
|         } | ||||
|     }); | ||||
| 
 | ||||
|  |  | |||
|  | @ -267,11 +267,10 @@ void IRCClient::handle(const Message& msg) | |||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     bool is_numeric; | ||||
|     int numeric = msg.command.to_uint(is_numeric); | ||||
|     auto numeric = msg.command.to_uint(); | ||||
| 
 | ||||
|     if (is_numeric) { | ||||
|         switch (numeric) { | ||||
|     if (numeric.has_value()) { | ||||
|         switch (numeric.value()) { | ||||
|         case RPL_WELCOME: | ||||
|             return handle_rpl_welcome(msg); | ||||
|         case RPL_WHOISCHANNELS: | ||||
|  | @ -798,10 +797,9 @@ void IRCClient::handle_rpl_topicwhotime(const Message& msg) | |||
|     auto& channel_name = msg.arguments[1]; | ||||
|     auto& nick = msg.arguments[2]; | ||||
|     auto setat = msg.arguments[3]; | ||||
|     bool ok; | ||||
|     time_t setat_time = setat.to_uint(ok); | ||||
|     if (ok) | ||||
|         setat = Core::DateTime::from_timestamp(setat_time).to_string(); | ||||
|     auto setat_time = setat.to_uint(); | ||||
|     if (setat_time.has_value()) | ||||
|         setat = Core::DateTime::from_timestamp(setat_time.value()).to_string(); | ||||
|     ensure_channel(channel_name).add_message(String::format("*** (set by %s at %s)", nick.characters(), setat.characters()), Color::Blue); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -124,9 +124,10 @@ static Optional<u32> string_to_variable_value(const StringView& string_value, co | |||
|     } | ||||
| 
 | ||||
|     if (variable.type_name == "int") { | ||||
|         bool success = false; | ||||
|         auto value = string_value.to_int(success); | ||||
|         return success ? value : Optional<u32>(); | ||||
|         auto value = string_value.to_int(); | ||||
|         if (value.has_value()) | ||||
|             return value.value(); | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|     if (variable.type_name == "bool") { | ||||
|  |  | |||
|  | @ -227,9 +227,7 @@ int main(int argc, char** argv) | |||
|         consume_specific('='); | ||||
|         consume_whitespace(); | ||||
|         auto magic_string = extract_while([](char ch) { return !isspace(ch) && ch != '{'; }); | ||||
|         bool ok; | ||||
|         endpoints.last().magic = magic_string.to_int(ok); | ||||
|         ASSERT(ok); | ||||
|         endpoints.last().magic = magic_string.to_int().value(); | ||||
|         consume_whitespace(); | ||||
|         consume_specific('{'); | ||||
|         parse_messages(); | ||||
|  |  | |||
|  | @ -65,11 +65,12 @@ int main(int argc, char** argv) | |||
|     if (argc != 2) | ||||
|         print_usage_and_exit(); | ||||
| 
 | ||||
|     bool ok; | ||||
|     pid_t pid = String(argv[1]).to_int(ok); | ||||
|     if (!ok) | ||||
|     auto pid_opt = String(argv[1]).to_int(); | ||||
|     if (!pid_opt.has_value()) | ||||
|         print_usage_and_exit(); | ||||
| 
 | ||||
|     pid_t pid = pid_opt.value(); | ||||
| 
 | ||||
|     GUI::Application app(argc, argv); | ||||
| 
 | ||||
|     auto window = GUI::Window::construct(); | ||||
|  |  | |||
|  | @ -177,10 +177,9 @@ RefPtr<Inode> DevPtsFSInode::lookup(StringView name) | |||
|     if (name == "." || name == "..") | ||||
|         return fs().get_inode(identifier()); | ||||
| 
 | ||||
|     bool ok; | ||||
|     unsigned pty_index = name.to_uint(ok); | ||||
|     if (ok && ptys->contains(pty_index)) { | ||||
|         return fs().get_inode({ fsid(), pty_index_to_inode_index(pty_index) }); | ||||
|     auto pty_index = name.to_uint(); | ||||
|     if (pty_index.has_value() && ptys->contains(pty_index.value())) { | ||||
|         return fs().get_inode({ fsid(), pty_index_to_inode_index(pty_index.value()) }); | ||||
|     } | ||||
| 
 | ||||
|     return {}; | ||||
|  |  | |||
|  | @ -1356,17 +1356,16 @@ RefPtr<Inode> ProcFSInode::lookup(StringView name) | |||
|                 } | ||||
|             } | ||||
|         } | ||||
|         bool ok; | ||||
|         unsigned name_as_number = name.to_uint(ok); | ||||
|         if (ok) { | ||||
|             bool process_exists = false; | ||||
|             { | ||||
|                 InterruptDisabler disabler; | ||||
|                 process_exists = Process::from_pid(name_as_number); | ||||
|             } | ||||
|             if (process_exists) | ||||
|                 return fs().get_inode(to_identifier(fsid(), PDI_Root, name_as_number, FI_PID)); | ||||
|         auto name_as_number = name.to_uint(); | ||||
|         if (!name_as_number.has_value()) | ||||
|             return {}; | ||||
|         bool process_exists = false; | ||||
|         { | ||||
|             InterruptDisabler disabler; | ||||
|             process_exists = Process::from_pid(name_as_number.value()); | ||||
|         } | ||||
|         if (process_exists) | ||||
|             return fs().get_inode(to_identifier(fsid(), PDI_Root, name_as_number.value(), FI_PID)); | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|  | @ -1413,18 +1412,17 @@ RefPtr<Inode> ProcFSInode::lookup(StringView name) | |||
|     } | ||||
| 
 | ||||
|     if (proc_file_type == FI_PID_fd) { | ||||
|         bool ok; | ||||
|         unsigned name_as_number = name.to_uint(ok); | ||||
|         if (ok) { | ||||
|             bool fd_exists = false; | ||||
|             { | ||||
|                 InterruptDisabler disabler; | ||||
|                 if (auto* process = Process::from_pid(to_pid(identifier()))) | ||||
|                     fd_exists = process->file_description(name_as_number); | ||||
|             } | ||||
|             if (fd_exists) | ||||
|                 return fs().get_inode(to_identifier_with_fd(fsid(), to_pid(identifier()), name_as_number)); | ||||
|         auto name_as_number = name.to_uint(); | ||||
|         if (!name_as_number.has_value()) | ||||
|             return {}; | ||||
|         bool fd_exists = false; | ||||
|         { | ||||
|             InterruptDisabler disabler; | ||||
|             if (auto* process = Process::from_pid(to_pid(identifier()))) | ||||
|                 fd_exists = process->file_description(name_as_number.value()); | ||||
|         } | ||||
|         if (fd_exists) | ||||
|             return fs().get_inode(to_identifier_with_fd(fsid(), to_pid(identifier()), name_as_number.value())); | ||||
|     } | ||||
|     return {}; | ||||
| } | ||||
|  |  | |||
|  | @ -251,10 +251,9 @@ void init_stage2() | |||
|     root = root.substring(strlen("/dev/hda"), root.length() - strlen("/dev/hda")); | ||||
| 
 | ||||
|     if (root.length()) { | ||||
|         bool ok; | ||||
|         unsigned partition_number = root.to_uint(ok); | ||||
|         auto partition_number = root.to_uint(); | ||||
| 
 | ||||
|         if (!ok) { | ||||
|         if (!partition_number.has_value()) { | ||||
|             klog() << "init_stage2: couldn't parse partition number from root kernel parameter"; | ||||
|             hang(); | ||||
|         } | ||||
|  | @ -273,9 +272,9 @@ void init_stage2() | |||
|                 klog() << "init_stage2: couldn't read GPT from disk"; | ||||
|                 hang(); | ||||
|             } | ||||
|             auto partition = gpt.partition(partition_number); | ||||
|             auto partition = gpt.partition(partition_number.value()); | ||||
|             if (!partition) { | ||||
|                 klog() << "init_stage2: couldn't get partition " << partition_number; | ||||
|                 klog() << "init_stage2: couldn't get partition " << partition_number.value(); | ||||
|                 hang(); | ||||
|             } | ||||
|             root_dev = *partition; | ||||
|  | @ -287,20 +286,20 @@ void init_stage2() | |||
|                     klog() << "init_stage2: couldn't read EBR from disk"; | ||||
|                     hang(); | ||||
|                 } | ||||
|                 auto partition = ebr.partition(partition_number); | ||||
|                 auto partition = ebr.partition(partition_number.value()); | ||||
|                 if (!partition) { | ||||
|                     klog() << "init_stage2: couldn't get partition " << partition_number; | ||||
|                     klog() << "init_stage2: couldn't get partition " << partition_number.value(); | ||||
|                     hang(); | ||||
|                 } | ||||
|                 root_dev = *partition; | ||||
|             } else { | ||||
|                 if (partition_number < 1 || partition_number > 4) { | ||||
|                     klog() << "init_stage2: invalid partition number " << partition_number << "; expected 1 to 4"; | ||||
|                 if (partition_number.value() < 1 || partition_number.value() > 4) { | ||||
|                     klog() << "init_stage2: invalid partition number " << partition_number.value() << "; expected 1 to 4"; | ||||
|                     hang(); | ||||
|                 } | ||||
|                 auto partition = mbr.partition(partition_number); | ||||
|                 auto partition = mbr.partition(partition_number.value()); | ||||
|                 if (!partition) { | ||||
|                     klog() << "init_stage2: couldn't get partition " << partition_number; | ||||
|                     klog() << "init_stage2: couldn't get partition " << partition_number.value(); | ||||
|                     hang(); | ||||
|                 } | ||||
|                 root_dev = *partition; | ||||
|  |  | |||
|  | @ -124,14 +124,13 @@ next_entry: | |||
|     auto& e_passwd = parts[1]; | ||||
|     auto& e_gid_string = parts[2]; | ||||
|     auto& e_members_string = parts[3]; | ||||
|     bool ok; | ||||
|     gid_t e_gid = e_gid_string.to_uint(ok); | ||||
|     if (!ok) { | ||||
|     auto e_gid = e_gid_string.to_uint(); | ||||
|     if (!e_gid.has_value()) { | ||||
|         fprintf(stderr, "getgrent(): Malformed GID on line %u\n", __grdb_line_number); | ||||
|         goto next_entry; | ||||
|     } | ||||
|     auto members = e_members_string.split(','); | ||||
|     __grdb_entry->gr_gid = e_gid; | ||||
|     __grdb_entry->gr_gid = e_gid.value(); | ||||
|     __grdb_entry->gr_name = __grdb_entry->name_buffer; | ||||
|     __grdb_entry->gr_passwd = __grdb_entry->passwd_buffer; | ||||
|     for (size_t i = 0; i < members.size(); ++i) { | ||||
|  |  | |||
|  | @ -383,12 +383,11 @@ static bool fill_getserv_buffers(char* line, ssize_t read) | |||
|         perror("malformed services file: port/protocol"); | ||||
|         return false; | ||||
|     } | ||||
|     bool conversion_checker; | ||||
|     __getserv_port_buffer = port_protocol_split[0].to_int(conversion_checker); | ||||
| 
 | ||||
|     if (!conversion_checker) { | ||||
|     auto number = port_protocol_split[0].to_int(); | ||||
|     if (!number.has_value()) | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     __getserv_port_buffer = number.value(); | ||||
| 
 | ||||
|     //Removing any annoying whitespace at the end of the protocol.
 | ||||
|     port_protocol_split[1].replace(" ", "", true); | ||||
|  | @ -571,12 +570,11 @@ static bool fill_getproto_buffers(char* line, ssize_t read) | |||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     bool conversion_checker; | ||||
|     __getproto_protocol_buffer = split_line[1].to_int(conversion_checker); | ||||
| 
 | ||||
|     if (!conversion_checker) { | ||||
|     auto number = split_line[1].to_int(); | ||||
|     if (!number.has_value()) | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     __getproto_protocol_buffer = number.value(); | ||||
| 
 | ||||
|     __getproto_alias_list_buffer.clear(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -128,19 +128,18 @@ next_entry: | |||
|     auto& e_gecos = parts[4]; | ||||
|     auto& e_dir = parts[5]; | ||||
|     auto& e_shell = parts[6]; | ||||
|     bool ok; | ||||
|     uid_t e_uid = e_uid_string.to_uint(ok); | ||||
|     if (!ok) { | ||||
|     auto e_uid = e_uid_string.to_uint(); | ||||
|     if (!e_uid.has_value()) { | ||||
|         fprintf(stderr, "getpwent(): Malformed UID on line %u\n", __pwdb_line_number); | ||||
|         goto next_entry; | ||||
|     } | ||||
|     gid_t e_gid = e_gid_string.to_uint(ok); | ||||
|     if (!ok) { | ||||
|     auto e_gid = e_gid_string.to_uint(); | ||||
|     if (!e_gid.has_value()) { | ||||
|         fprintf(stderr, "getpwent(): Malformed GID on line %u\n", __pwdb_line_number); | ||||
|         goto next_entry; | ||||
|     } | ||||
|     __pwdb_entry->pw_uid = e_uid; | ||||
|     __pwdb_entry->pw_gid = e_gid; | ||||
|     __pwdb_entry->pw_uid = e_uid.value(); | ||||
|     __pwdb_entry->pw_gid = e_gid.value(); | ||||
|     __pwdb_entry->pw_name = __pwdb_entry->name_buffer; | ||||
|     __pwdb_entry->pw_passwd = __pwdb_entry->passwd_buffer; | ||||
|     __pwdb_entry->pw_gecos = __pwdb_entry->gecos_buffer; | ||||
|  |  | |||
|  | @ -280,9 +280,9 @@ void ArgsParser::add_option(int& value, const char* help_string, const char* lon | |||
|         short_name, | ||||
|         value_name, | ||||
|         [&value](const char* s) { | ||||
|             bool ok; | ||||
|             value = StringView(s).to_int(ok); | ||||
|             return ok; | ||||
|             auto opt = StringView(s).to_int(); | ||||
|             value = opt.value_or(0); | ||||
|             return opt.has_value(); | ||||
|         } | ||||
|     }; | ||||
|     add_option(move(option)); | ||||
|  | @ -316,9 +316,9 @@ void ArgsParser::add_positional_argument(int& value, const char* help_string, co | |||
|         required == Required::Yes ? 1 : 0, | ||||
|         1, | ||||
|         [&value](const char* s) { | ||||
|             bool ok; | ||||
|             value = StringView(s).to_int(ok); | ||||
|             return ok; | ||||
|             auto opt = StringView(s).to_int(); | ||||
|             value = opt.value_or(0); | ||||
|             return opt.has_value(); | ||||
|         } | ||||
|     }; | ||||
|     add_positional_argument(move(arg)); | ||||
|  |  | |||
|  | @ -129,11 +129,7 @@ int ConfigFile::read_num_entry(const String& group, const String& key, int defau | |||
|         return default_value; | ||||
|     } | ||||
| 
 | ||||
|     bool ok; | ||||
|     int value = read_entry(group, key).to_int(ok); | ||||
|     if (!ok) | ||||
|         return default_value; | ||||
|     return value; | ||||
|     return read_entry(group, key).to_int().value_or(default_value); | ||||
| } | ||||
| 
 | ||||
| bool ConfigFile::read_bool_entry(const String& group, const String& key, bool default_value) const | ||||
|  |  | |||
|  | @ -35,10 +35,9 @@ SpinBox::SpinBox() | |||
|     m_editor = add<TextBox>(); | ||||
|     m_editor->set_text("0"); | ||||
|     m_editor->on_change = [this] { | ||||
|         bool ok; | ||||
|         int value = m_editor->text().to_uint(ok); | ||||
|         if (ok) | ||||
|             set_value(value); | ||||
|         auto value = m_editor->text().to_uint(); | ||||
|         if (value.has_value()) | ||||
|             set_value(value.value()); | ||||
|         else | ||||
|             m_editor->set_text(String::number(m_value)); | ||||
|     }; | ||||
|  |  | |||
|  | @ -91,10 +91,9 @@ void TextEditor::create_actions() | |||
|                 auto input_box = InputBox::construct("Line:", "Go to line", window()); | ||||
|                 auto result = input_box->exec(); | ||||
|                 if (result == InputBox::ExecOK) { | ||||
|                     bool ok; | ||||
|                     auto line_number = input_box->text_value().to_uint(ok); | ||||
|                     if (ok) | ||||
|                         set_cursor(line_number - 1, 0); | ||||
|                     auto line_number = input_box->text_value().to_uint(); | ||||
|                     if (line_number.has_value()) | ||||
|                         set_cursor(line_number.value() - 1, 0); | ||||
|                 } | ||||
|             }, | ||||
|             this); | ||||
|  |  | |||
|  | @ -158,13 +158,8 @@ public: | |||
|             ASSERT(as_uint() <= INT32_MAX); | ||||
|             return (int)as_uint(); | ||||
|         } | ||||
|         if (is_string()) { | ||||
|             bool ok; | ||||
|             int value = as_string().to_int(ok); | ||||
|             if (!ok) | ||||
|                 return 0; | ||||
|             return value; | ||||
|         } | ||||
|         if (is_string()) | ||||
|             return as_string().to_int().value_or(0); | ||||
|         return 0; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -77,13 +77,13 @@ void Job::on_socket_connected() | |||
|                 return deferred_invoke([this](auto&) { did_fail(Core::NetworkJob::Error::ProtocolFailed); }); | ||||
|             } | ||||
| 
 | ||||
|             bool ok; | ||||
|             m_status = parts[0].to_uint(ok); | ||||
|             if (!ok) { | ||||
|             auto status = parts[0].to_uint(); | ||||
|             if (!status.has_value()) { | ||||
|                 fprintf(stderr, "Job: Expected numeric status code\n"); | ||||
|                 return deferred_invoke([this](auto&) { did_fail(Core::NetworkJob::Error::ProtocolFailed); }); | ||||
|             } | ||||
| 
 | ||||
|             m_status = status.value(); | ||||
|             m_meta = parts[1]; | ||||
| 
 | ||||
|             if (m_status >= 10 && m_status < 20) { | ||||
|  |  | |||
|  | @ -139,22 +139,11 @@ static Optional<Color> parse_rgb_color(const StringView& string) | |||
|     if (parts.size() != 3) | ||||
|         return {}; | ||||
| 
 | ||||
|     bool ok; | ||||
|     auto r = parts[0].to_int(ok); | ||||
|     if (!ok) | ||||
|         return {}; | ||||
|     auto g = parts[1].to_int(ok); | ||||
|     if (!ok) | ||||
|         return {}; | ||||
|     auto b = parts[2].to_int(ok); | ||||
|     if (!ok) | ||||
|         return {}; | ||||
|     auto r = parts[0].to_uint().value_or(256); | ||||
|     auto g = parts[1].to_uint().value_or(256); | ||||
|     auto b = parts[2].to_uint().value_or(256); | ||||
| 
 | ||||
|     if (r < 0 || r > 255) | ||||
|         return {}; | ||||
|     if (g < 0 || g > 255) | ||||
|         return {}; | ||||
|     if (b < 0 || b > 255) | ||||
|     if (r > 255 || g > 255 || b > 255) | ||||
|         return {}; | ||||
| 
 | ||||
|     return Color(r, g, b); | ||||
|  | @ -171,27 +160,14 @@ static Optional<Color> parse_rgba_color(const StringView& string) | |||
|     if (parts.size() != 4) | ||||
|         return {}; | ||||
| 
 | ||||
|     bool ok; | ||||
|     auto r = parts[0].to_int(ok); | ||||
|     if (!ok) | ||||
|         return {}; | ||||
|     auto g = parts[1].to_int(ok); | ||||
|     if (!ok) | ||||
|         return {}; | ||||
|     auto b = parts[2].to_int(ok); | ||||
|     if (!ok) | ||||
|         return {}; | ||||
|     auto r = parts[0].to_int().value_or(256); | ||||
|     auto g = parts[1].to_int().value_or(256); | ||||
|     auto b = parts[2].to_int().value_or(256); | ||||
| 
 | ||||
|     double alpha = strtod(parts[3].to_string().characters(), nullptr); | ||||
|     int a = alpha * 255; | ||||
|     unsigned a = alpha * 255; | ||||
| 
 | ||||
|     if (r < 0 || r > 255) | ||||
|         return {}; | ||||
|     if (g < 0 || g > 255) | ||||
|         return {}; | ||||
|     if (b < 0 || b > 255) | ||||
|         return {}; | ||||
|     if (a < 0 || a > 255) | ||||
|     if (r > 255 || g > 255 || b > 255 || a > 255) | ||||
|         return {}; | ||||
| 
 | ||||
|     return Color(r, g, b, a); | ||||
|  |  | |||
|  | @ -108,12 +108,12 @@ void Job::on_socket_connected() | |||
|                 fprintf(stderr, "Job: Expected 3-part HTTP status, got '%s'\n", line.data()); | ||||
|                 return deferred_invoke([this](auto&) { did_fail(Core::NetworkJob::Error::ProtocolFailed); }); | ||||
|             } | ||||
|             bool ok; | ||||
|             m_code = parts[1].to_uint(ok); | ||||
|             if (!ok) { | ||||
|             auto code = parts[1].to_uint(); | ||||
|             if (!code.has_value()) { | ||||
|                 fprintf(stderr, "Job: Expected numeric HTTP status\n"); | ||||
|                 return deferred_invoke([this](auto&) { did_fail(Core::NetworkJob::Error::ProtocolFailed); }); | ||||
|             } | ||||
|             m_code = code.value(); | ||||
|             m_state = State::InHeaders; | ||||
|             return; | ||||
|         } | ||||
|  | @ -266,10 +266,9 @@ void Job::on_socket_connected() | |||
|             Optional<u32> content_length {}; | ||||
| 
 | ||||
|             if (content_length_header.has_value()) { | ||||
|                 bool ok; | ||||
|                 auto length = content_length_header.value().to_uint(ok); | ||||
|                 if (ok) | ||||
|                     content_length = length; | ||||
|                 auto length = content_length_header.value().to_uint(); | ||||
|                 if (length.has_value()) | ||||
|                     content_length = length.value(); | ||||
|             } | ||||
| 
 | ||||
|             deferred_invoke([this, content_length](auto&) { did_progress(content_length, m_received_size); }); | ||||
|  |  | |||
|  | @ -410,9 +410,8 @@ bool Object::define_property(PropertyName property_name, Value value, PropertyAt | |||
| { | ||||
|     if (property_name.is_number()) | ||||
|         return put_own_property_by_index(*this, property_name.as_number(), value, attributes, PutOwnPropertyMode::DefineProperty, throw_exceptions); | ||||
|     bool ok; | ||||
|     i32 property_index = property_name.as_string().to_int(ok); | ||||
|     if (ok && property_index >= 0) | ||||
|     i32 property_index = property_name.as_string().to_int().value_or(-1); | ||||
|     if (property_index >= 0) | ||||
|         return put_own_property_by_index(*this, property_index, value, attributes, PutOwnPropertyMode::DefineProperty, throw_exceptions); | ||||
|     return put_own_property(*this, property_name.as_string(), value, attributes, PutOwnPropertyMode::DefineProperty, throw_exceptions); | ||||
| } | ||||
|  | @ -543,9 +542,8 @@ Value Object::delete_property(PropertyName property_name) | |||
|     ASSERT(property_name.is_valid()); | ||||
|     if (property_name.is_number()) | ||||
|         return Value(m_indexed_properties.remove(property_name.as_number())); | ||||
|     bool ok; | ||||
|     int property_index = property_name.as_string().to_int(ok); | ||||
|     if (ok && property_index >= 0) | ||||
|     int property_index = property_name.as_string().to_int().value_or(-1); | ||||
|     if (property_index >= 0) | ||||
|         return Value(m_indexed_properties.remove(property_name.as_number())); | ||||
| 
 | ||||
|     auto metadata = shape().lookup(property_name.as_string()); | ||||
|  | @ -602,9 +600,8 @@ Value Object::get(PropertyName property_name) const | |||
|         return get_by_index(property_name.as_number()); | ||||
| 
 | ||||
|     auto property_string = property_name.to_string(); | ||||
|     bool ok; | ||||
|     i32 property_index = property_string.to_int(ok); | ||||
|     if (ok && property_index >= 0) | ||||
|     i32 property_index = property_string.to_int().value_or(-1); | ||||
|     if (property_index >= 0) | ||||
|         return get_by_index(property_index); | ||||
| 
 | ||||
|     const Object* object = this; | ||||
|  | @ -656,9 +653,8 @@ bool Object::put(PropertyName property_name, Value value) | |||
|     ASSERT(!value.is_empty()); | ||||
| 
 | ||||
|     auto property_string = property_name.to_string(); | ||||
|     bool ok; | ||||
|     i32 property_index = property_string.to_int(ok); | ||||
|     if (ok && property_index >= 0) | ||||
|     i32 property_index = property_string.to_int().value_or(-1); | ||||
|     if (property_index >= 0) | ||||
|         return put_by_index(property_index, value); | ||||
| 
 | ||||
|     // If there's a setter in the prototype chain, we go to the setter.
 | ||||
|  | @ -737,9 +733,8 @@ bool Object::has_own_property(PropertyName property_name) const | |||
|     if (property_name.is_number()) | ||||
|         return has_indexed_property(property_name.as_number()); | ||||
| 
 | ||||
|     bool ok; | ||||
|     i32 property_index = property_name.as_string().to_int(ok); | ||||
|     if (ok && property_index >= 0) | ||||
|     i32 property_index = property_name.as_string().to_int().value_or(-1); | ||||
|     if (property_index >= 0) | ||||
|         return has_indexed_property(property_index); | ||||
| 
 | ||||
|     return shape().lookup(property_name.as_string()).has_value(); | ||||
|  |  | |||
|  | @ -1431,14 +1431,17 @@ Vector<size_t, 2> Editor::vt_dsr() | |||
| 
 | ||||
|     if (buf[0] == '\033' && buf[1] == '[') { | ||||
|         auto parts = StringView(buf + 2, length - 3).split_view(';'); | ||||
|         bool ok; | ||||
|         row = parts[0].to_int(ok); | ||||
|         if (!ok) { | ||||
|         auto row_opt = parts[0].to_int(); | ||||
|         if (!row_opt.has_value()) { | ||||
|             dbg() << "Terminal DSR issue; received garbage row"; | ||||
|         } else { | ||||
|             row = row_opt.value(); | ||||
|         } | ||||
|         col = parts[1].to_int(ok); | ||||
|         if (!ok) { | ||||
|         auto col_opt = parts[1].to_int(); | ||||
|         if (!col_opt.has_value()) { | ||||
|             dbg() << "Terminal DSR issue; received garbage col"; | ||||
|         } else { | ||||
|             col = col_opt.value(); | ||||
|         } | ||||
|     } | ||||
|     return { row, col }; | ||||
|  |  | |||
|  | @ -544,11 +544,8 @@ void Terminal::execute_xterm_command() | |||
|     auto param_string = String::copy(m_xterm_parameters); | ||||
|     auto params = param_string.split(';', true); | ||||
|     m_xterm_parameters.clear_with_capacity(); | ||||
|     for (auto& parampart : params) { | ||||
|         bool ok; | ||||
|         unsigned value = parampart.to_uint(ok); | ||||
|         numeric_params.append(ok ? value : 0); | ||||
|     } | ||||
|     for (auto& parampart : params) | ||||
|         numeric_params.append(parampart.to_uint().value_or(0)); | ||||
| 
 | ||||
|     while (params.size() < 3) { | ||||
|         params.append(String::empty()); | ||||
|  | @ -594,15 +591,14 @@ void Terminal::execute_escape_sequence(u8 final) | |||
|     } | ||||
|     auto paramparts = String::copy(m_parameters).split(';'); | ||||
|     for (auto& parampart : paramparts) { | ||||
|         bool ok; | ||||
|         unsigned value = parampart.to_uint(ok); | ||||
|         if (!ok) { | ||||
|         auto value = parampart.to_uint(); | ||||
|         if (!value.has_value()) { | ||||
|             // FIXME: Should we do something else?
 | ||||
|             m_parameters.clear_with_capacity(); | ||||
|             m_intermediates.clear_with_capacity(); | ||||
|             return; | ||||
|         } | ||||
|         params.append(value); | ||||
|         params.append(value.value()); | ||||
|     } | ||||
| 
 | ||||
| #if defined(TERMINAL_DEBUG) | ||||
|  |  | |||
|  | @ -47,22 +47,12 @@ HTMLCanvasElement::~HTMLCanvasElement() | |||
| 
 | ||||
| int HTMLCanvasElement::requested_width() const | ||||
| { | ||||
|     bool ok = false; | ||||
|     unsigned width = attribute(HTML::AttributeNames::width).to_int(ok); | ||||
|     if (ok) | ||||
|         return width; | ||||
| 
 | ||||
|     return 300; | ||||
|     return attribute(HTML::AttributeNames::width).to_int().value_or(300); | ||||
| } | ||||
| 
 | ||||
| int HTMLCanvasElement::requested_height() const | ||||
| { | ||||
|     bool ok = false; | ||||
|     unsigned height = attribute(HTML::AttributeNames::height).to_int(ok); | ||||
|     if (ok) | ||||
|         return height; | ||||
| 
 | ||||
|     return 150; | ||||
|     return attribute(HTML::AttributeNames::height).to_int().value_or(150); | ||||
| } | ||||
| 
 | ||||
| RefPtr<LayoutNode> HTMLCanvasElement::create_layout_node(const StyleProperties* parent_style) const | ||||
|  |  | |||
|  | @ -122,28 +122,12 @@ void HTMLImageElement::animate() | |||
| 
 | ||||
| int HTMLImageElement::preferred_width() const | ||||
| { | ||||
|     bool ok = false; | ||||
|     int width = attribute(HTML::AttributeNames::width).to_int(ok); | ||||
|     if (ok) | ||||
|         return width; | ||||
| 
 | ||||
|     if (m_image_decoder) | ||||
|         return m_image_decoder->width(); | ||||
| 
 | ||||
|     return 0; | ||||
|     return attribute(HTML::AttributeNames::width).to_int().value_or(m_image_decoder ? m_image_decoder->width() : 0); | ||||
| } | ||||
| 
 | ||||
| int HTMLImageElement::preferred_height() const | ||||
| { | ||||
|     bool ok = false; | ||||
|     int height = attribute(HTML::AttributeNames::height).to_int(ok); | ||||
|     if (ok) | ||||
|         return height; | ||||
| 
 | ||||
|     if (m_image_decoder) | ||||
|         return m_image_decoder->height(); | ||||
| 
 | ||||
|     return 0; | ||||
|     return attribute(HTML::AttributeNames::height).to_int().value_or(m_image_decoder ? m_image_decoder->height() : 0); | ||||
| } | ||||
| 
 | ||||
| RefPtr<LayoutNode> HTMLImageElement::create_layout_node(const StyleProperties* parent_style) const | ||||
|  |  | |||
|  | @ -85,10 +85,9 @@ RefPtr<LayoutNode> HTMLInputElement::create_layout_node(const StyleProperties*) | |||
|         int text_width = Gfx::Font::default_font().width(value()); | ||||
|         auto size_value = attribute(HTML::AttributeNames::size); | ||||
|         if (!size_value.is_null()) { | ||||
|             bool ok; | ||||
|             auto size = size_value.to_int(ok); | ||||
|             if (ok && size >= 0) | ||||
|                 text_width = Gfx::Font::default_font().glyph_width('x') * size; | ||||
|             auto size = size_value.to_uint(); | ||||
|             if (size.has_value()) | ||||
|                 text_width = Gfx::Font::default_font().glyph_width('x') * size.value(); | ||||
|         } | ||||
|         text_box.set_relative_rect(0, 0, text_width + 20, 20); | ||||
|         widget = text_box; | ||||
|  |  | |||
|  | @ -53,9 +53,8 @@ void LayoutFrame::layout(LayoutMode layout_mode) | |||
|     set_has_intrinsic_width(true); | ||||
|     set_has_intrinsic_height(true); | ||||
|     // FIXME: Do proper error checking, etc.
 | ||||
|     bool ok; | ||||
|     set_intrinsic_width(node().attribute(HTML::AttributeNames::width).to_int(ok)); | ||||
|     set_intrinsic_height(node().attribute(HTML::AttributeNames::height).to_int(ok)); | ||||
|     set_intrinsic_width(node().attribute(HTML::AttributeNames::width).to_int().value_or(300)); | ||||
|     set_intrinsic_height(node().attribute(HTML::AttributeNames::height).to_int().value_or(150)); | ||||
| 
 | ||||
|     LayoutReplaced::layout(layout_mode); | ||||
| } | ||||
|  |  | |||
|  | @ -266,18 +266,17 @@ static bool parse_html_document(const StringView& html, Document& document, Pare | |||
|                         } | ||||
| 
 | ||||
|                         if (j < 7) { // We found ; char
 | ||||
|                             bool ok; | ||||
|                             u32 codepoint; | ||||
|                             Optional<u32> codepoint; | ||||
|                             String str_code_point = html.substring_view(i + 2, j - 2); | ||||
|                             if (str_code_point.starts_with('x')) { | ||||
|                                 String str = str_code_point.substring(1, str_code_point.length() - 1); | ||||
|                                 codepoint = AK::StringUtils::convert_to_uint_from_hex(str, ok); | ||||
|                                 codepoint = AK::StringUtils::convert_to_uint_from_hex(str); | ||||
|                             } else { | ||||
|                                 codepoint = str_code_point.to_uint(ok); | ||||
|                                 codepoint = str_code_point.to_uint(); | ||||
|                             } | ||||
| 
 | ||||
|                             if (ok) { | ||||
|                                 Vector<char> bytes = codepoint_to_bytes(codepoint); | ||||
|                             if (codepoint.has_value()) { | ||||
|                                 Vector<char> bytes = codepoint_to_bytes(codepoint.value()); | ||||
|                                 if (bytes.size() > 0) { | ||||
|                                     for (size_t i = 0; i < bytes.size(); i++) { | ||||
|                                         text_buffer.append(bytes.at(i)); | ||||
|  |  | |||
|  | @ -463,10 +463,9 @@ int Shell::builtin_disown(int argc, const char** argv) | |||
| 
 | ||||
|     Vector<size_t> job_ids; | ||||
|     for (auto& job_id : str_job_ids) { | ||||
|         bool ok; | ||||
|         auto id = StringView { job_id }.to_uint(ok); | ||||
|         if (ok) | ||||
|             job_ids.append(id); | ||||
|         auto id = StringView(job_id).to_uint(); | ||||
|         if (id.has_value()) | ||||
|             job_ids.append(id.value()); | ||||
|         else | ||||
|             printf("Invalid job id: %s\n", job_id); | ||||
|     } | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <LibCore/ElapsedTimer.h> | ||||
| #include <stdio.h> | ||||
|  | @ -36,7 +37,9 @@ void usage(void) | |||
|     exit(1); | ||||
| } | ||||
| 
 | ||||
| enum Unit { Bytes, KiloBytes, MegaBytes }; | ||||
| enum Unit { Bytes, | ||||
|     KiloBytes, | ||||
|     MegaBytes }; | ||||
| 
 | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|  | @ -44,11 +47,11 @@ int main(int argc, char** argv) | |||
|     Unit unit = MegaBytes; | ||||
| 
 | ||||
|     if (argc >= 2) { | ||||
|         bool ok; | ||||
|         count = String(argv[1]).to_uint(ok); | ||||
|         if (!ok) { | ||||
|         auto number = String(argv[1]).to_uint(); | ||||
|         if (!number.has_value()) { | ||||
|             usage(); | ||||
|         } | ||||
|         count = number.value(); | ||||
|     } | ||||
| 
 | ||||
|     if (argc >= 3) { | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <grp.h> | ||||
| #include <pwd.h> | ||||
|  | @ -52,10 +53,11 @@ int main(int argc, char** argv) | |||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     bool ok; | ||||
|     new_gid = gid_arg.to_uint(ok); | ||||
|     auto number = gid_arg.to_uint(); | ||||
| 
 | ||||
|     if (!ok) { | ||||
|     if (number.has_value()) { | ||||
|         new_gid = number.value(); | ||||
|     } else { | ||||
|         auto* group = getgrnam(gid_arg.characters()); | ||||
|         if (!group) { | ||||
|             fprintf(stderr, "Unknown group '%s'\n", gid_arg.characters()); | ||||
|  |  | |||
|  | @ -54,9 +54,10 @@ int main(int argc, char** argv) | |||
|         return 1; | ||||
|     } | ||||
| 
 | ||||
|     bool ok; | ||||
|     new_uid = parts[0].to_uint(ok); | ||||
|     if (!ok) { | ||||
|     auto number = parts[0].to_uint(); | ||||
|     if (number.has_value()) { | ||||
|         new_uid = number.value(); | ||||
|     } else { | ||||
|         auto* passwd = getpwnam(parts[0].characters()); | ||||
|         if (!passwd) { | ||||
|             fprintf(stderr, "Unknown user '%s'\n", parts[0].characters()); | ||||
|  | @ -66,8 +67,10 @@ int main(int argc, char** argv) | |||
|     } | ||||
| 
 | ||||
|     if (parts.size() == 2) { | ||||
|         new_gid = parts[1].to_uint(ok); | ||||
|         if (!ok) { | ||||
|         auto number = parts[1].to_uint(); | ||||
|         if (number.has_value()) { | ||||
|             new_gid = number.value(); | ||||
|         } else { | ||||
|             auto* group = getgrnam(parts[1].characters()); | ||||
|             if (!new_gid) { | ||||
|                 fprintf(stderr, "Unknown group '%s'\n", parts[1].characters()); | ||||
|  |  | |||
|  | @ -89,74 +89,70 @@ static void expand_list(Vector<String>& tokens, Vector<Index>& indexes) | |||
|         } | ||||
| 
 | ||||
|         if (token[0] == '-') { | ||||
|             bool ok = true; | ||||
|             ssize_t index = token.substring(1, token.length() - 1).to_int(ok); | ||||
|             if (!ok) { | ||||
|             auto index = token.substring(1, token.length() - 1).to_int(); | ||||
|             if (!index.has_value()) { | ||||
|                 fprintf(stderr, "cut: invalid byte/character position '%s'\n", token.characters()); | ||||
|                 print_usage_and_exit(1); | ||||
|             } | ||||
| 
 | ||||
|             if (index == 0) { | ||||
|             if (index.value() == 0) { | ||||
|                 fprintf(stderr, "cut: byte/character positions are numbered from 1\n"); | ||||
|                 print_usage_and_exit(1); | ||||
|             } | ||||
| 
 | ||||
|             Index tmp = { 1, index, Index::Type::RangedIndex }; | ||||
|             Index tmp = { 1, index.value(), Index::Type::RangedIndex }; | ||||
|             add_if_not_exists(indexes, tmp); | ||||
|         } else if (token[token.length() - 1] == '-') { | ||||
|             bool ok = true; | ||||
|             ssize_t index = token.substring(0, token.length() - 1).to_int(ok); | ||||
|             if (!ok) { | ||||
|             auto index = token.substring(0, token.length() - 1).to_int(); | ||||
|             if (!index.has_value()) { | ||||
|                 fprintf(stderr, "cut: invalid byte/character position '%s'\n", token.characters()); | ||||
|                 print_usage_and_exit(1); | ||||
|             } | ||||
| 
 | ||||
|             if (index == 0) { | ||||
|             if (index.value() == 0) { | ||||
|                 fprintf(stderr, "cut: byte/character positions are numbered from 1\n"); | ||||
|                 print_usage_and_exit(1); | ||||
|             } | ||||
|             Index tmp = { index, -1, Index::Type::SliceIndex }; | ||||
|             Index tmp = { index.value(), -1, Index::Type::SliceIndex }; | ||||
|             add_if_not_exists(indexes, tmp); | ||||
|         } else { | ||||
|             auto range = token.split('-'); | ||||
|             if (range.size() == 2) { | ||||
|                 bool ok = true; | ||||
|                 ssize_t index1 = range[0].to_int(ok); | ||||
|                 if (!ok) { | ||||
|                 auto index1 = range[0].to_int(); | ||||
|                 if (!index1.has_value()) { | ||||
|                     fprintf(stderr, "cut: invalid byte/character position '%s'\n", range[0].characters()); | ||||
|                     print_usage_and_exit(1); | ||||
|                 } | ||||
| 
 | ||||
|                 ssize_t index2 = range[1].to_int(ok); | ||||
|                 if (!ok) { | ||||
|                 auto index2 = range[1].to_int(); | ||||
|                 if (!index2.has_value()) { | ||||
|                     fprintf(stderr, "cut: invalid byte/character position '%s'\n", range[1].characters()); | ||||
|                     print_usage_and_exit(1); | ||||
|                 } | ||||
| 
 | ||||
|                 if (index1 > index2) { | ||||
|                 if (index1.value() > index2.value()) { | ||||
|                     fprintf(stderr, "cut: invalid decreasing range\n"); | ||||
|                     print_usage_and_exit(1); | ||||
|                 } else if (index1 == 0 || index2 == 0) { | ||||
|                 } else if (index1.value() == 0 || index2.value() == 0) { | ||||
|                     fprintf(stderr, "cut: byte/character positions are numbered from 1\n"); | ||||
|                     print_usage_and_exit(1); | ||||
|                 } | ||||
| 
 | ||||
|                 Index tmp = { index1, index2, Index::Type::RangedIndex }; | ||||
|                 Index tmp = { index1.value(), index2.value(), Index::Type::RangedIndex }; | ||||
|                 add_if_not_exists(indexes, tmp); | ||||
|             } else if (range.size() == 1) { | ||||
|                 bool ok = true; | ||||
|                 ssize_t index = range[0].to_int(ok); | ||||
|                 if (!ok) { | ||||
|                 auto index = range[0].to_int(); | ||||
|                 if (!index.has_value()) { | ||||
|                     fprintf(stderr, "cut: invalid byte/character position '%s'\n", range[0].characters()); | ||||
|                     print_usage_and_exit(1); | ||||
|                 } | ||||
| 
 | ||||
|                 if (index == 0) { | ||||
|                 if (index.value() == 0) { | ||||
|                     fprintf(stderr, "cut: byte/character positions are numbered from 1\n"); | ||||
|                     print_usage_and_exit(1); | ||||
|                 } | ||||
| 
 | ||||
|                 Index tmp = { index, index, Index::Type::SingleIndex }; | ||||
|                 Index tmp = { index.value(), index.value(), Index::Type::SingleIndex }; | ||||
|                 add_if_not_exists(indexes, tmp); | ||||
|             } else { | ||||
|                 fprintf(stderr, "cut: invalid byte or character range\n"); | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <LibCore/DateTime.h> | ||||
| #include <stdio.h> | ||||
|  | @ -44,12 +45,12 @@ int main(int argc, char** argv) | |||
|         return 0; | ||||
|     } | ||||
|     if (argc == 3 && !strcmp(argv[1], "-s")) { | ||||
|         bool ok; | ||||
|         timespec ts = { String(argv[2]).to_uint(ok), 0 }; | ||||
|         if (!ok) { | ||||
|         auto number = StringView(argv[2]).to_uint(); | ||||
|         if (!number.has_value()) { | ||||
|             fprintf(stderr, "date: Invalid timestamp value"); | ||||
|             return 1; | ||||
|         } | ||||
|         timespec ts = { number.value(), 0 }; | ||||
|         if (clock_settime(CLOCK_REALTIME, &ts) < 0) { | ||||
|             perror("clock_settime"); | ||||
|             return 1; | ||||
|  |  | |||
|  | @ -120,10 +120,10 @@ class LinksCommand final : public StatCommand { | |||
| public: | ||||
|     LinksCommand(const char* arg) | ||||
|     { | ||||
|         bool ok; | ||||
|         m_links = StringView(arg).to_uint(ok); | ||||
|         if (!ok) | ||||
|         auto number = StringView(arg).to_uint(); | ||||
|         if (!number.has_value()) | ||||
|             fatal_error("Invalid number: \033[1m%s", arg); | ||||
|         m_links = number.value(); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|  | @ -143,10 +143,10 @@ public: | |||
|             m_uid = passwd->pw_uid; | ||||
|         } else { | ||||
|             // Attempt to parse it as decimal UID.
 | ||||
|             bool ok; | ||||
|             m_uid = StringView(arg).to_uint(ok); | ||||
|             if (!ok) | ||||
|             auto number =  StringView(arg).to_uint(); | ||||
|             if (!number.has_value()) | ||||
|                 fatal_error("Invalid user: \033[1m%s", arg); | ||||
|             m_uid = number.value(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -167,10 +167,10 @@ public: | |||
|             m_gid = gr->gr_gid; | ||||
|         } else { | ||||
|             // Attempt to parse it as decimal GID.
 | ||||
|             bool ok; | ||||
|             m_gid = StringView(arg).to_int(ok); | ||||
|             if (!ok) | ||||
|             auto number = StringView(arg).to_int(); | ||||
|             if (!number.has_value()) | ||||
|                 fatal_error("Invalid group: \033[1m%s", arg); | ||||
|             m_gid = number.value(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -192,10 +192,10 @@ public: | |||
|             m_is_bytes = true; | ||||
|             view = view.substring_view(0, view.length() - 1); | ||||
|         } | ||||
|         bool ok; | ||||
|         m_size = view.to_uint(ok); | ||||
|         if (!ok) | ||||
|         auto number = view.to_uint(); | ||||
|         if (!number.has_value()) | ||||
|             fatal_error("Invalid size: \033[1m%s", arg); | ||||
|         m_size = number.value(); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| #include <AK/Optional.h> | ||||
| #include <AK/String.h> | ||||
| #include <signal.h> | ||||
| #include <stdio.h> | ||||
|  | @ -45,24 +46,25 @@ int main(int argc, char** argv) | |||
| 
 | ||||
|     if (argc != 2 && argc != 3) | ||||
|         print_usage_and_exit(); | ||||
|     bool ok; | ||||
|     unsigned signum = SIGTERM; | ||||
|     int pid_argi = 1; | ||||
|     if (argc == 3) { | ||||
|         pid_argi = 2; | ||||
|         if (argv[1][0] != '-') | ||||
|             print_usage_and_exit(); | ||||
|         signum = String(&argv[1][1]).to_uint(ok); | ||||
|         if (!ok) { | ||||
|         auto number = StringView(&argv[1][1]).to_uint(); | ||||
|         if (!number.has_value()) { | ||||
|             printf("'%s' is not a valid signal number\n", &argv[1][1]); | ||||
|             return 2; | ||||
|         } | ||||
|         signum = number.value(); | ||||
|     } | ||||
|     pid_t pid = String(argv[pid_argi]).to_int(ok); | ||||
|     if (!ok) { | ||||
|     auto pid_opt = String(argv[pid_argi]).to_int(); | ||||
|     if (!pid_opt.has_value()) { | ||||
|         printf("'%s' is not a valid PID\n", argv[pid_argi]); | ||||
|         return 3; | ||||
|     } | ||||
|     pid_t pid = pid_opt.value(); | ||||
| 
 | ||||
|     int rc = kill(pid, signum); | ||||
|     if (rc < 0) | ||||
|  |  | |||
|  | @ -54,7 +54,6 @@ static int kill_all(const String& process_name, const unsigned signum) | |||
| 
 | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     bool ok; | ||||
|     unsigned signum = SIGTERM; | ||||
|     int name_argi = 1; | ||||
| 
 | ||||
|  | @ -67,11 +66,12 @@ int main(int argc, char** argv) | |||
|         if (argv[1][0] != '-') | ||||
|             print_usage_and_exit(); | ||||
| 
 | ||||
|         signum = String(&argv[1][1]).to_uint(ok); | ||||
|         if (!ok) { | ||||
|         auto number = String(&argv[1][1]).to_uint(); | ||||
|         if (!number.has_value()) { | ||||
|             printf("'%s' is not a valid signal number\n", &argv[1][1]); | ||||
|             return 2; | ||||
|         } | ||||
|         signum = number.value(); | ||||
|     } | ||||
| 
 | ||||
|     return kill_all(argv[name_argi], signum); | ||||
|  |  | |||
|  | @ -74,15 +74,16 @@ int main(int argc, char** argv) | |||
| 
 | ||||
|     pid_t pid_to_omit = 0; | ||||
|     if (omit_pid_value) { | ||||
|         bool ok = true; | ||||
|         if (!strcmp(omit_pid_value, "%PPID")) | ||||
|         if (!strcmp(omit_pid_value, "%PPID")) { | ||||
|             pid_to_omit = getppid(); | ||||
|         else | ||||
|             pid_to_omit = StringView(omit_pid_value).to_uint(ok); | ||||
|         if (!ok) { | ||||
|             fprintf(stderr, "Invalid value for -o\n"); | ||||
|             args_parser.print_usage(stderr, argv[0]); | ||||
|             return 1; | ||||
|         } else { | ||||
|             auto number = StringView(omit_pid_value).to_uint(); | ||||
|             if (!number.has_value()) { | ||||
|                 fprintf(stderr, "Invalid value for -o\n"); | ||||
|                 args_parser.print_usage(stderr, argv[0]); | ||||
|                 return 1; | ||||
|             } | ||||
|             pid_to_omit = number.value(); | ||||
|         } | ||||
|     } | ||||
|     return pid_of(process_name, single_shot, omit_pid_value != nullptr, pid_to_omit); | ||||
|  |  | |||
|  | @ -75,12 +75,12 @@ int main(int argc, char** argv) | |||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         bool ok; | ||||
|         size = str.to_int(ok); | ||||
|         if (!ok) { | ||||
|         auto size_opt = str.to_int(); | ||||
|         if (!size_opt.has_value()) { | ||||
|             args_parser.print_usage(stderr, argv[0]); | ||||
|             return 1; | ||||
|         } | ||||
|         size = size_opt.value(); | ||||
|     } | ||||
| 
 | ||||
|     if (reference) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling