diff --git a/Userland/Utilities/tr.cpp b/Userland/Utilities/tr.cpp index 1e1f162c0d..bcb8e9b7ac 100644 --- a/Userland/Utilities/tr.cpp +++ b/Userland/Utilities/tr.cpp @@ -17,60 +17,62 @@ static bool is_octal(int c) return c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7'; } -static void generate_character_class(Function oracle, StringBuilder& out) +static ErrorOr generate_character_class(Function oracle, StringBuilder& out) { for (int i = 0; i < 128; i++) { if (oracle(i)) - out.append(static_cast(i)); + TRY(out.try_append(static_cast(i))); } + + return {}; } -static String build_set(StringView specification) +static ErrorOr build_set(StringView specification) { StringBuilder out; GenericLexer lexer(specification); while (!lexer.is_eof()) { if (lexer.consume_specific("[:alnum:]"sv)) - generate_character_class(isalnum, out); + TRY(generate_character_class(isalnum, out)); else if (lexer.consume_specific("[:blank:]"sv)) - generate_character_class(isblank, out); + TRY(generate_character_class(isblank, out)); else if (lexer.consume_specific("[:digit:]"sv)) - generate_character_class(isdigit, out); + TRY(generate_character_class(isdigit, out)); else if (lexer.consume_specific("[:lower:]"sv)) - generate_character_class(islower, out); + TRY(generate_character_class(islower, out)); else if (lexer.consume_specific("[:punct:]"sv)) - generate_character_class(ispunct, out); + TRY(generate_character_class(ispunct, out)); else if (lexer.consume_specific("[:upper:]"sv)) - generate_character_class(isupper, out); + TRY(generate_character_class(isupper, out)); else if (lexer.consume_specific("[:alpha:]"sv)) - generate_character_class(isalpha, out); + TRY(generate_character_class(isalpha, out)); else if (lexer.consume_specific("[:cntrl:]"sv)) - generate_character_class(iscntrl, out); + TRY(generate_character_class(iscntrl, out)); else if (lexer.consume_specific("[:graph:]"sv)) - generate_character_class(isgraph, out); + TRY(generate_character_class(isgraph, out)); else if (lexer.consume_specific("[:print:]"sv)) - generate_character_class(isprint, out); + TRY(generate_character_class(isprint, out)); else if (lexer.consume_specific("[:space:]"sv)) - generate_character_class(isspace, out); + TRY(generate_character_class(isspace, out)); else if (lexer.consume_specific("[:xdigit:]"sv)) - generate_character_class(isxdigit, out); + TRY(generate_character_class(isxdigit, out)); else if (lexer.consume_specific("\\\\"sv)) - out.append('\\'); + TRY(out.try_append('\\')); else if (lexer.consume_specific("\\a"sv)) - out.append('\a'); + TRY(out.try_append('\a')); else if (lexer.consume_specific("\\b"sv)) - out.append('\b'); + TRY(out.try_append('\b')); else if (lexer.consume_specific("\\f"sv)) - out.append('\f'); + TRY(out.try_append('\f')); else if (lexer.consume_specific("\\n"sv)) - out.append('\n'); + TRY(out.try_append('\n')); else if (lexer.consume_specific("\\r"sv)) - out.append('\r'); + TRY(out.try_append('\r')); else if (lexer.consume_specific("\\t"sv)) - out.append('\t'); + TRY(out.try_append('\t')); else if (lexer.consume_specific("\\v"sv)) - out.append('\v'); + TRY(out.try_append('\v')); else if (lexer.next_is('\\') && is_octal(lexer.peek(1))) { lexer.consume_specific('\\'); int max_left_over = 3; @@ -81,9 +83,9 @@ static String build_set(StringView specification) int value = 0; for (char ch : octal_digits) value = value * 8 + (ch - '0'); - out.append(static_cast(value)); + TRY(out.try_append(static_cast(value))); } else - out.append(lexer.consume(1)); + TRY(out.try_append(lexer.consume(1))); } return out.to_string(); @@ -125,18 +127,18 @@ ErrorOr serenity_main(Main::Arguments arguments) return 1; } - String from_str = build_set(from_chars); + auto from_str = TRY(build_set(from_chars)); if (complement_flag) { StringBuilder complement_set; for (int ch = 0; ch < 256; ch++) { if (!from_str.contains(static_cast(ch))) - complement_set.append(static_cast(ch)); + TRY(complement_set.try_append(static_cast(ch))); } from_str = complement_set.to_string(); } - auto to_str = build_set(to_chars); - String squeeze_string = build_set(to_chars ? to_chars : from_chars); + auto to_str = TRY(build_set(to_chars)); + auto squeeze_string = TRY(build_set(to_chars ? to_chars : from_chars)); Optional last_char; for (;;) {