89 lines
1.9 KiB
C
89 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 <string.h>
|
|
#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;
|
|
}
|