diff --git a/gio/gdatainputstream.c b/gio/gdatainputstream.c index ef728f006..bf2e71cd4 100644 --- a/gio/gdatainputstream.c +++ b/gio/gdatainputstream.c @@ -861,11 +861,8 @@ scan_for_chars (GDataInputStream *stream, gsize start, end, peeked; gsize i; gsize available, checked; - const char *stop_char; - const char *stop_end; bstream = G_BUFFERED_INPUT_STREAM (stream); - stop_end = stop_chars + stop_chars_len; checked = *checked_out; @@ -874,8 +871,8 @@ scan_for_chars (GDataInputStream *stream, end = available; peeked = end - start; - /* For single-char case such as \0, defer to memchr which can - * take advantage of simd/etc. + /* For single-char case such as \0, defer the entire operation to memchr which + * can take advantage of simd/etc. */ if (stop_chars_len == 1) { @@ -888,11 +885,13 @@ scan_for_chars (GDataInputStream *stream, { for (i = 0; checked < available && i < peeked; i++) { - for (stop_char = stop_chars; stop_char != stop_end; stop_char++) - { - if (buffer[i] == *stop_char) - return (start + i); - } + /* We can use memchr() the other way round. Less fast than the + * single-char case above, but still faster than doing our own inner + * loop. */ + const char *p = memchr (stop_chars, buffer[i], stop_chars_len); + + if (p != NULL) + return (start + i); } } diff --git a/gio/tests/data-input-stream.c b/gio/tests/data-input-stream.c index 11c997bce..163231e1c 100644 --- a/gio/tests/data-input-stream.c +++ b/gio/tests/data-input-stream.c @@ -314,7 +314,7 @@ test_read_upto (void) const char *data_sep; size_t data_sep_len; } vectors[] = { - { 10, " part1 # part2 $ part3 \0 part4 ", 32, 7, "#$\0^", 4 }, + { 10, " part1 # part2 $ part3 \0 part4 \0", 32, 7, "#$\0^", 4 }, { 20, "{\"key\": \"value\"}\0", 17, 16, "\0", 1 }, };