LibGfx/PortableFormat: Make read_whitespace return an ErrorOr

This commit is contained in:
Lucas CHOLLET 2023-03-12 16:05:12 -04:00 committed by Andreas Kling
parent 74f893e9f4
commit bab2113ec1
Notes: sideshowbarker 2024-07-17 18:46:57 +09:00
3 changed files with 23 additions and 19 deletions

View file

@ -39,7 +39,7 @@ bool read_image_data(PGMLoadingContext& context, Streamer& streamer)
break; break;
auto value = number_or_error.value(); auto value = number_or_error.value();
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
break; break;
color_data.append({ (u8)value, (u8)value, (u8)value }); color_data.append({ (u8)value, (u8)value, (u8)value });

View file

@ -27,21 +27,21 @@ bool read_image_data(PPMLoadingContext& context, Streamer& streamer)
if (red_or_error.is_error()) if (red_or_error.is_error())
break; break;
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
break; break;
auto const green_or_error = read_number(streamer); auto const green_or_error = read_number(streamer);
if (green_or_error.is_error()) if (green_or_error.is_error())
break; break;
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
break; break;
auto const blue_or_error = read_number(streamer); auto const blue_or_error = read_number(streamer);
if (blue_or_error.is_error()) if (blue_or_error.is_error())
break; break;
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
break; break;
Color color { (u8)red_or_error.value(), (u8)green_or_error.value(), (u8)blue_or_error.value() }; Color color { (u8)red_or_error.value(), (u8)green_or_error.value(), (u8)blue_or_error.value() };

View file

@ -109,25 +109,29 @@ static bool read_magic_number(TContext& context, Streamer& streamer)
} }
template<typename TContext> template<typename TContext>
static bool read_whitespace(TContext& context, Streamer& streamer) static ErrorOr<void> read_whitespace(TContext& context, Streamer& streamer)
{ {
bool exist = false; bool is_first_char = true;
u8 byte {}; u8 byte {};
while (streamer.read(byte)) { while (streamer.read(byte)) {
if (byte == ' ' || byte == '\t' || byte == '\n' || byte == '\r') { if (byte == '#') {
exist = true;
} else if (byte == '#') {
streamer.step_back(); streamer.step_back();
if (read_comment(context, streamer).is_error()) TRY(read_comment(context, streamer));
return false; continue;
} else {
streamer.step_back();
return exist;
} }
if (byte != ' ' && byte != '\t' && byte != '\n' && byte != '\r') {
streamer.step_back();
if (is_first_char)
return Error::from_string_literal("Can't read whitespace from stream");
break;
} }
return exist; if (is_first_char)
is_first_char = false;
}
return {};
} }
template<typename TContext> template<typename TContext>
@ -212,13 +216,13 @@ static bool decode(TContext& context)
if (!read_magic_number(context, streamer)) if (!read_magic_number(context, streamer))
return false; return false;
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
return false; return false;
if (!read_width(context, streamer)) if (!read_width(context, streamer))
return false; return false;
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
return false; return false;
if (!read_height(context, streamer)) if (!read_height(context, streamer))
@ -229,14 +233,14 @@ static bool decode(TContext& context)
return false; return false;
} }
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
return false; return false;
if constexpr (requires { context.format_details.max_val; }) { if constexpr (requires { context.format_details.max_val; }) {
if (!read_max_val(context, streamer)) if (!read_max_val(context, streamer))
return false; return false;
if (!read_whitespace(context, streamer)) if (read_whitespace(context, streamer).is_error())
return false; return false;
} }