libglez/ftgl/utf8-utils.c
2017-12-07 17:07:55 +03:00

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;
}