This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix is_utf8_valid_partial_char()
authorKarl Williamson <khw@cpan.org>
Thu, 1 Sep 2016 18:07:33 +0000 (12:07 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 1 Sep 2016 18:24:30 +0000 (12:24 -0600)
This should have been part of 4dab108fb5e7e21a547733bb00ddb5d8bffd936d,
but when I was rebasing, these changes got moved to an unrelated commit
that hasn't been pushed yet, and I didn't notice immediately.  I will
add som API tests for this in the next few days.

inline.h

index 5cb9347..c3acf67 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -505,18 +505,22 @@ Perl_utf8_hop(const U8 *s, SSize_t off)
 
 =for apidoc is_utf8_valid_partial_char
 
-Returns 1 if the first few bytes of the string starting at C<s> and
-looking no further than S<C<e - 1>> are legal initial bytes of
-well-formed UTF-8; otherwise it returns 0.
+Returns 1 if there exists some sequence of bytes, call it C<s'>, that when
+appended to the sequence from C<s> through S<C<e - 1>> causes the entire
+sequence starting at C<s> (including C<s'>) to be the well-formed UTF-8 of
+some code point; otherwise returns 0.
+
+In other words this returns TRUE if C<s> points to the beginning, but partial,
+sequence of the UTF-8 for some code point.
 
 This is useful when some fixed-length buffer is being tested for being
-well-formed UTF-8, but the final few bytes in it are fewer than necessary to
-fully determine what code point they might mean.  (Presumably when the buffer
-is refreshed with the next chunk of data, the new first bytes will complete the
-partial code point.)   This function is used to verify that the final bytes in
-the current buffer are in fact the legal beginning of some code point, so that
-if they aren't, the failure can be signalled without having to wait for the
-next read.
+well-formed UTF-8, but the final few bytes in it don't comprise a full
+character: it is split somewhere in the middle of its UTF-8 representation.
+(Presumably when the buffer is refreshed with the next chunk of data, the new
+first bytes will complete the partial code point.)   This function is used to
+verify that the final bytes in the current buffer are in fact the legal
+beginning of some code point, so that if they aren't, the failure can be
+signalled without having to wait for the next read.
 
 If the bytes terminated at S<C<e - 1>> are a full character (or more), 0 is
 returned.
@@ -529,7 +533,7 @@ S_is_utf8_valid_partial_char(const U8 * const s, const U8 * const e)
 
     PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR;
 
-    if (s >= e || s + UTF8SKIP(s) >= e) {
+    if (s >= e || s + UTF8SKIP(s) < e) {
         return FALSE;
     }