fixed memory corruption in the stuff I added to moreUTF8. This fixes GetEscapement crashes. The rest of the file needs reviewing as well, but I wanted to commit this ASAP
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13155 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,22 +1,20 @@
|
||||
#ifndef __MOREUTF8
|
||||
#define __MOREUTF8
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
static inline bool
|
||||
IsInsideGlyph(uchar ch)
|
||||
{
|
||||
return (ch & 0xC0) == 0x80;
|
||||
// return (ch & 0x80);
|
||||
}
|
||||
|
||||
|
||||
static inline uint32
|
||||
UTF8NextCharLen(const char *text)
|
||||
UTF8NextCharLenUnsafe(const char *text)
|
||||
{
|
||||
const char *ptr = text;
|
||||
|
||||
if (ptr == NULL || *ptr == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
do {
|
||||
ptr++;
|
||||
} while (IsInsideGlyph(*ptr));
|
||||
@@ -24,6 +22,15 @@ UTF8NextCharLen(const char *text)
|
||||
return ptr - text;
|
||||
}
|
||||
|
||||
static inline uint32
|
||||
UTF8NextCharLen(const char *text)
|
||||
{
|
||||
if (text == NULL || *text == 0)
|
||||
return 0;
|
||||
|
||||
return UTF8NextCharLenUnsafe(text);
|
||||
}
|
||||
|
||||
static inline uint32
|
||||
UTF8PreviousCharLen(const char *text, const char *limit)
|
||||
{
|
||||
@@ -41,17 +48,39 @@ UTF8PreviousCharLen(const char *text, const char *limit)
|
||||
return text - ptr;
|
||||
}
|
||||
|
||||
// TODO: use this function in other places of this file...
|
||||
static inline uint32
|
||||
count_utf8_bytes(uchar ch)
|
||||
{
|
||||
// the number of high bits set until the first
|
||||
// unset bit determine the count of bytes used for
|
||||
// this glyph from this byte on
|
||||
uchar bit = 1 << 7;
|
||||
uint32 count = 1;
|
||||
if (ch & bit) {
|
||||
bit = bit >> 1;
|
||||
while (ch & bit) {
|
||||
count++;
|
||||
bit = bit >> 1;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static inline uint32
|
||||
UTF8CountBytes(const char *text, uint32 numChars)
|
||||
{
|
||||
const char *ptr = text;
|
||||
|
||||
while (numChars) {
|
||||
ptr += UTF8NextCharLen(ptr);
|
||||
numChars--;
|
||||
if (text) {
|
||||
// iterate over numChars glyphs incrementing ptr by the
|
||||
// number of bytes for each glyph, which is encoded in
|
||||
// the first byte of any glyph.
|
||||
const char *ptr = text;
|
||||
while (numChars--) {
|
||||
ptr += count_utf8_bytes(*ptr);
|
||||
}
|
||||
return ptr - text;
|
||||
}
|
||||
|
||||
return ptr - text;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32
|
||||
|
||||
Reference in New Issue
Block a user