add utf32 function

git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@239 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
NishiOwO
2025-10-09 10:46:09 +00:00
parent 051e6a8344
commit 59910e65d2
4 changed files with 90 additions and 1 deletions

60
src/unicode.c Normal file
View File

@@ -0,0 +1,60 @@
/* $Id$ */
#include <Mw/Milsko.h>
/* this code was taken from my old code... :) */
#define CAST_I32(x) ((int)(x))
static int utf8_count(unsigned char c) {
if(c < 0x80) {
return 1;
}
if(0xc2 <= c && c < 0xe0) {
return 2;
}
if(0xe0 <= c && c < 0xf0) {
return 3;
}
if(0xf0 <= c && c < 0xf8) {
return 4;
}
return 0;
}
static int utf8_later(unsigned char c) {
return 0x80 <= c && c < 0xc0;
}
int MwUTF8ToUTF32(const char* input, int32_t* output) {
const unsigned char* inbuf = (const unsigned char*)input;
int b = utf8_count(inbuf[0]);
if(b == 0) return 0;
if(b == 1) *output = inbuf[0];
if(b == 2) {
if(!utf8_later(inbuf[1])) return 0;
if((inbuf[0] & 0x1e) == 0) return 0;
*output = CAST_I32(inbuf[0] & 0x1f) << 6;
*output |= CAST_I32(inbuf[1] & 0x3f);
}
if(b == 3) {
if(!utf8_later(inbuf[1]) || !utf8_later(inbuf[2])) return 0;
if((inbuf[0] & 0x0f) == 0 && (inbuf[1] & 0x20) == 0) return 0;
*output = CAST_I32(inbuf[0] & 0x0f) << 12;
*output |= CAST_I32(inbuf[1] & 0x3f) << 6;
*output |= CAST_I32(inbuf[2] & 0x3f);
}
if(b == 4) {
if(!utf8_later(inbuf[1]) || !utf8_later(inbuf[2]) || !utf8_later(inbuf[3])) return 0;
if((inbuf[0] & 0x07) == 0 && (inbuf[1] & 0x30) == 0) return 0;
*output = CAST_I32(inbuf[0] & 0x07) << 18;
*output |= CAST_I32(inbuf[1] & 0x3f) << 12;
*output |= CAST_I32(inbuf[2] & 0x3f) << 6;
*output |= CAST_I32(inbuf[3] & 0x3f);
}
return b;
}