/* Freetype GL - A C OpenGL Freetype engine * * Distributed under the OSI-approved BSD 2-Clause License. See accompanying * file `LICENSE` for more details. */ #include #include "utf8-utils.h" // ----------------------------------------------------- utf8_surrogate_len --- size_t utf8_surrogate_len(const char *character) { size_t result = 0; char test_char; if (!character) return 0; test_char = character[0]; if ((test_char & 0x80) == 0) return 1; while (test_char & 0x80) { test_char <<= 1; result++; } return result; } // ------------------------------------------------------------ utf8_strlen --- size_t utf8_strlen(const char *string) { const char *ptr = string; size_t result = 0; while (*ptr) { ptr += utf8_surrogate_len(ptr); result++; } return result; } uint32_t utf8_to_utf32(const char *character) { uint32_t result = -1; if (!character) { return result; } if ((character[0] & 0x80) == 0x0) { result = character[0]; } if ((character[0] & 0xC0) == 0xC0) { result = ((character[0] & 0x3F) << 6) | (character[1] & 0x3F); } if ((character[0] & 0xE0) == 0xE0) { result = ((character[0] & 0x1F) << (6 + 6)) | ((character[1] & 0x3F) << 6) | (character[2] & 0x3F); } if ((character[0] & 0xF0) == 0xF0) { result = ((character[0] & 0x0F) << (6 + 6 + 6)) | ((character[1] & 0x3F) << (6 + 6)) | ((character[2] & 0x3F) << 6) | (character[3] & 0x3F); } if ((character[0] & 0xF8) == 0xF8) { result = ((character[0] & 0x07) << (6 + 6 + 6 + 6)) | ((character[1] & 0x3F) << (6 + 6 + 6)) | ((character[2] & 0x3F) << (6 + 6)) | ((character[3] & 0x3F) << 6) | (character[4] & 0x3F); } return result; }