Fixed missing '\u85' line separator from str.splitlines (#524)

Very thanks! Your contribution is professional and exceptional.
This commit is contained in:
Rob McMullen 2026-06-30 20:43:16 -07:00 committed by GitHub
parent 664ce091f8
commit ea82f56373
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 14 deletions

View File

@ -232,9 +232,12 @@ c11_vector /* T=c11_sv */ c11_sv__splitlines(c11_sv self, bool keepends) {
eol_size = c11__u8_header(c, false); eol_size = c11__u8_header(c, false);
if(c == '\n' || c == '\r' || c == '\v' || c == '\f' || c == '\x1c' || c == '\x1d' || c == '\x1e') if(c == '\n' || c == '\r' || c == '\v' || c == '\f' || c == '\x1c' || c == '\x1d' || c == '\x1e')
break; break;
if(eol_size == 3 && j + 2 < self.size) { else if(eol_size == 2 && j + 1 < self.size) {
int val = c11__u8_value(eol_size, &data[j]); if(c == '\xc2' && data[j+1] == '\x85')
if(val == 0x2028 || val == 0x2029) break;
}
else if(eol_size == 3 && j + 2 < self.size) {
if(c == '\xe2' && data[j+1] == '\x80' && (data[j+2] == '\xa8' || data[j+2] == '\xa9'))
break; break;
} }
j += eol_size; j += eol_size;

View File

@ -14,19 +14,20 @@ assert ''.splitlines() == []
assert ''.splitlines(False) == [] assert ''.splitlines(False) == []
assert ''.splitlines(True) == [] assert ''.splitlines(True) == []
assert '\n'.splitlines() == [''] assert '\n'.splitlines() == [''] # Line Feed
assert '\r'.splitlines() == [''] assert '\r'.splitlines() == [''] # Carriage return
assert '\r\n'.splitlines() == [''] assert '\r\n'.splitlines() == [''] # Line feed + carriage return
assert '\v'.splitlines() == [''] assert '\v'.splitlines() == [''] # Line tabulation
assert '\f'.splitlines() == [''] assert '\f'.splitlines() == [''] # Form field
assert '\x1c'.splitlines() == [''] assert '\x1c'.splitlines() == [''] # File separator
assert '\x1d'.splitlines() == [''] assert '\x1d'.splitlines() == [''] # Group separator
assert '\x1e'.splitlines() == [''] assert '\x1e'.splitlines() == [''] # Record separator
assert b'\xe2\x80\xa8'.decode().splitlines() == [''] assert b'\xc2\x85'.decode().splitlines() == [''] # \u85 Next line (C1 control code)
assert b'\xe2\x80\xa9'.decode().splitlines() == [''] assert b'\xe2\x80\xa8'.decode().splitlines() == [''] # \u2028 Unicode line separator
assert b'\xe2\x80\xa9'.decode().splitlines() == [''] # \u2029 Unicode paragraph separator
assert '🥕'.splitlines() == ['🥕'] assert '🥕'.splitlines() == ['🥕']
all_ends = ['\n', '\r', '\r\n', '\v', '\f', '\x1c', '\x1d', '\x1e', b'\xe2\x80\xa8'.decode(), b'\xe2\x80\xa9'.decode()] all_ends = ['\n', '\r', '\r\n', '\v', '\f', '\x1c', '\x1d', '\x1e', b'\xc2\x85'.decode(), b'\xe2\x80\xa8'.decode(), b'\xe2\x80\xa9'.decode()]
for eol in all_ends: for eol in all_ends:
assert (eol).splitlines() == [''] assert (eol).splitlines() == ['']
assert (eol).splitlines(False) == [''] assert (eol).splitlines(False) == ['']