Reverted to the previous version. Axel, your change completely broke all kinds

of stuff. I think the trouble is that you keep decrementing charCount while
still inside the same UTF8 glyph. I cannot really tell, I am hoping you don't
mind me reverting to the old version, since the new one is only three lines,
so it should be easy to correct and re-commit.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24172 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2008-02-28 15:56:31 +00:00
parent a9ab9cf19a
commit ccf6ad1d8b
+35 -9
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2004-2008, Haiku, Inc. * Copyright 2004-2006, Haiku, Inc.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef _UTF8_FUNCTIONS_H #ifndef _UTF8_FUNCTIONS_H
@@ -64,22 +64,48 @@ UTF8PreviousCharLen(const char *text, const char *limit)
static inline uint32 static inline uint32
UTF8CountBytes(const char *bytes, int32 numChars) UTF8CountBytes(const char *bytes, int32 numChars)
{ {
if (bytes == NULL) if (!bytes)
return 0; return 0;
if (numChars < 0) if (numChars < 0)
numChars = INT_MAX; numChars = INT_MAX;
const char *base = bytes; const char *base = bytes;
while (bytes[0] != '\0') { while (*bytes && numChars-- > 0) {
if ((bytes[0] & 0xc0) != 0x80) { if (bytes[0] & 0x80) {
if (--numChars <= 0) if (bytes[0] & 0x40) {
break; if (bytes[0] & 0x20) {
} if (bytes[0] & 0x10) {
bytes++; if (bytes[1] == 0 || bytes[2] == 0 || bytes[3] == 0)
return (bytes - base);
bytes += 4;
continue;
} }
return bytes - base; if (bytes[1] == 0 || bytes[2] == 0)
return (bytes - base);
bytes += 3;
continue;
}
if (bytes[1] == 0)
return (bytes - base);
bytes += 2;
continue;
}
/* Not a startbyte - skip */
bytes += 1;
continue;
}
bytes += 1;
}
return (bytes - base);
} }