mirror of
https://github.com/clockworkpi/DevTerm.git
synced 2026-03-22 03:42:39 +01:00
ser_cache add utf8idx to store utf8 chars
This commit is contained in:
83
Code/thermal_printer/utf8-utils.c
Normal file
83
Code/thermal_printer/utf8-utils.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/* 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 )
|
||||
{
|
||||
if( !character )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( ( character[0] & 0x80 ) == 0x0 )
|
||||
{
|
||||
return character[0];
|
||||
}
|
||||
|
||||
if( ( character[0] & 0xE0 ) == 0xC0 )
|
||||
{
|
||||
return ( ( character[0] & 0x3F ) << 6 ) | ( character[1] & 0x3F );
|
||||
}
|
||||
|
||||
if( ( character[0] & 0xF0 ) == 0xE0 )
|
||||
{
|
||||
return ( ( character[0] & 0x1F ) << ( 6 + 6 ) ) | ( ( character[1] & 0x3F ) << 6 ) | ( character[2] & 0x3F );
|
||||
}
|
||||
|
||||
if( ( character[0] & 0xF8 ) == 0xF0 )
|
||||
{
|
||||
return ( ( character[0] & 0x0F ) << ( 6 + 6 + 6 ) ) | ( ( character[1] & 0x3F ) << ( 6 + 6 ) ) | ( ( character[2] & 0x3F ) << 6 ) | ( character[3] & 0x3F );
|
||||
}
|
||||
|
||||
if( ( character[0] & 0xFC ) == 0xF8 )
|
||||
{
|
||||
return ( ( 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 0xFFFD; // invalid character
|
||||
}
|
||||
Reference in New Issue
Block a user