This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

76 lines
1.9 KiB
C

/* Freetype GL - A C OpenGL Freetype engine
*
* Distributed under the OSI-approved BSD 2-Clause License. See accompanying
* file `LICENSE` for more details.
*/
#include "utf8-utils.h"
#include <string.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;
}