diff --git a/maca_common/src/char16.c b/maca_common/src/char16.c new file mode 100644 index 0000000000000000000000000000000000000000..74fbd94fe5d69055cfbccd54f65df3f8c0a6f59b --- /dev/null +++ b/maca_common/src/char16.c @@ -0,0 +1,94 @@ +#include<stdio.h> +#include<stdlib.h> +#include<string.h> + +typedef short char16; + +#define char_bit1(c) ((c) & 1) +#define char_bit2(c) (((c) & 2) >> 1) +#define char_bit3(c) (((c) & 4) >> 2) +#define char_bit4(c) (((c) & 8) >> 3) +#define char_bit5(c) (((c) & 16) >> 4) +#define char_bit6(c) (((c) & 32) >> 5) +#define char_bit7(c) (((c) & 64) >> 6) +#define char_bit8(c) (((c) & 128) >> 7) +#define length(c) ((!char_bit8((c)) || (char_bit8(c) && !char_bit7(c)))? 1 : 2) +/* +int length(char c) +{ + if(!char_bit8(c)) return 1; + if(char_bit8(c) && !char_bit7(c)) return 1; + if(char_bit7(c)) return 2; + if(char_bit6(c)) return 3; + if(char_bit5(4)) return 4; + +} +*/ +int utf8_strlen(char *utf8_string) +{ + int l = 0; + while(*utf8_string){ + l += (length(*utf8_string) == 1) ? 1 : 0; + utf8_string++; + } + return l; +} + +char *char16toutf8(char16 *char16_string) +{ + +} + + +int char16_strlen(char16 *string) +{ + int i=0; + while(string[i]) i++; + return i; +} + +char16 *utf8tochar16(char *utf8_string) +{ + char16 c16; + int i,j; + int utf8_length = strlen(utf8_string); + int char16_length = 0; + char16 *char16_string; + for(i=0; i < utf8_length; i++) + char16_length += length(utf8_string[i]); + + char16_string = malloc((char16_length + 1)* sizeof(char)); + for(i=0, j=0; i < utf8_length; i++, j++){ + if(length(utf8_string[i]) == 1){ + char16_string[j] = (char16)utf8_string[i]; + } + if(length(utf8_string[i]) == 2){ + char16_string[j] = utf8_string[i]; + char16_string[j] << 8; + char16_string[j] += utf8_string[++i]; + } + } + char16_string[j] = 0; + return char16_string; +} + +int main(void) +{ + int i; + char string[200]; + char16 *char16_string; + strcpy(string, "élémentaire"); + /* strcpy(string, "konjunktúra-időszaknál"); */ + + printf("string = %s\n", string); + printf("length = %d\n", (int)strlen(string)); + printf("utf8 length = %d\n", (int)utf8_strlen(string)); + for(i=0; i < strlen(string); i++){ + printf("%d\t%c\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\tl=%d\n", i, string[i], (int)string[i], char_bit1(string[i]), char_bit2(string[i]), char_bit3(string[i]), char_bit4(string[i]), char_bit5(string[i]), char_bit6(string[i]), char_bit7(string[i]), char_bit8(string[i]), length(string[i])); + } + + + char16_string = utf8tochar16(string); + printf("char16_strlen = %d\n", char16_strlen(char16_string)); + +}