1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:28:10 +00:00

tr: Utilize TRY more

This converts the local functions to return ErrorOr<T> and utilizes TRY
more.
This commit is contained in:
Kenneth Myhra 2022-03-29 21:28:13 +02:00 committed by Brian Gianforcaro
parent e548b2cff2
commit ab9a78a305

View file

@ -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'; return c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7';
} }
static void generate_character_class(Function<int(int)> oracle, StringBuilder& out) static ErrorOr<void> generate_character_class(Function<int(int)> oracle, StringBuilder& out)
{ {
for (int i = 0; i < 128; i++) { for (int i = 0; i < 128; i++) {
if (oracle(i)) if (oracle(i))
out.append(static_cast<char>(i)); TRY(out.try_append(static_cast<char>(i)));
} }
return {};
} }
static String build_set(StringView specification) static ErrorOr<String> build_set(StringView specification)
{ {
StringBuilder out; StringBuilder out;
GenericLexer lexer(specification); GenericLexer lexer(specification);
while (!lexer.is_eof()) { while (!lexer.is_eof()) {
if (lexer.consume_specific("[:alnum:]"sv)) if (lexer.consume_specific("[:alnum:]"sv))
generate_character_class(isalnum, out); TRY(generate_character_class(isalnum, out));
else if (lexer.consume_specific("[:blank:]"sv)) 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)) 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)) 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)) 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)) 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)) 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)) 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)) 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)) 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)) 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)) else if (lexer.consume_specific("[:xdigit:]"sv))
generate_character_class(isxdigit, out); TRY(generate_character_class(isxdigit, out));
else if (lexer.consume_specific("\\\\"sv)) else if (lexer.consume_specific("\\\\"sv))
out.append('\\'); TRY(out.try_append('\\'));
else if (lexer.consume_specific("\\a"sv)) else if (lexer.consume_specific("\\a"sv))
out.append('\a'); TRY(out.try_append('\a'));
else if (lexer.consume_specific("\\b"sv)) else if (lexer.consume_specific("\\b"sv))
out.append('\b'); TRY(out.try_append('\b'));
else if (lexer.consume_specific("\\f"sv)) else if (lexer.consume_specific("\\f"sv))
out.append('\f'); TRY(out.try_append('\f'));
else if (lexer.consume_specific("\\n"sv)) else if (lexer.consume_specific("\\n"sv))
out.append('\n'); TRY(out.try_append('\n'));
else if (lexer.consume_specific("\\r"sv)) else if (lexer.consume_specific("\\r"sv))
out.append('\r'); TRY(out.try_append('\r'));
else if (lexer.consume_specific("\\t"sv)) else if (lexer.consume_specific("\\t"sv))
out.append('\t'); TRY(out.try_append('\t'));
else if (lexer.consume_specific("\\v"sv)) 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))) { else if (lexer.next_is('\\') && is_octal(lexer.peek(1))) {
lexer.consume_specific('\\'); lexer.consume_specific('\\');
int max_left_over = 3; int max_left_over = 3;
@ -81,9 +83,9 @@ static String build_set(StringView specification)
int value = 0; int value = 0;
for (char ch : octal_digits) for (char ch : octal_digits)
value = value * 8 + (ch - '0'); value = value * 8 + (ch - '0');
out.append(static_cast<char>(value)); TRY(out.try_append(static_cast<char>(value)));
} else } else
out.append(lexer.consume(1)); TRY(out.try_append(lexer.consume(1)));
} }
return out.to_string(); return out.to_string();
@ -125,18 +127,18 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
return 1; return 1;
} }
String from_str = build_set(from_chars); auto from_str = TRY(build_set(from_chars));
if (complement_flag) { if (complement_flag) {
StringBuilder complement_set; StringBuilder complement_set;
for (int ch = 0; ch < 256; ch++) { for (int ch = 0; ch < 256; ch++) {
if (!from_str.contains(static_cast<char>(ch))) if (!from_str.contains(static_cast<char>(ch)))
complement_set.append(static_cast<char>(ch)); TRY(complement_set.try_append(static_cast<char>(ch)));
} }
from_str = complement_set.to_string(); from_str = complement_set.to_string();
} }
auto to_str = build_set(to_chars); auto to_str = TRY(build_set(to_chars));
String squeeze_string = build_set(to_chars ? to_chars : from_chars); auto squeeze_string = TRY(build_set(to_chars ? to_chars : from_chars));
Optional<char> last_char; Optional<char> last_char;
for (;;) { for (;;) {