#ifndef __MOREUTF8 #define __MOREUTF8 static inline bool IsInsideGlyph(uchar ch) { return (ch & 0xC0) == 0x80; } static inline uint32 UTF8NextCharLen(const char *text) { const char *ptr = text; if (ptr == NULL || *ptr == 0) return 0; do { ptr++; } while (IsInsideGlyph(*ptr)); return ptr - text; } static inline uint32 UTF8PreviousCharLen(const char *text, const char *limit) { const char *ptr = text; if (ptr == NULL || limit == NULL) return 0; do { if (ptr == limit) break; ptr--; } while (IsInsideGlyph(*ptr)); return text - ptr; } static inline uint32 UTF8CountBytes(const char *text, uint32 numChars) { const char *ptr = text; while (numChars) { ptr += UTF8NextCharLen(ptr); numChars--; } return ptr - text; } static inline uint32 UTF8CountChars(const char *text, int32 numBytes) { const char* ptr = text; const char* last = ptr + numBytes - 1; uint32 count = 0; while (ptr <= last) { ptr += UTF8NextCharLen(ptr); count++; } return count; } #endif