Corewar-Final/libft/printf/ft_unicode.c
Jeremy FLEURY 748d10f4f3 push
2019-07-17 11:22:24 +02:00

71 lines
1.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_unicode.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: igarbuz <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/01/30 01:52:28 by igarbuz #+# #+# */
/* Updated: 2019/01/30 01:52:31 by igarbuz ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
int ft_wcsize(wchar_t wc)
{
if (wc <= 0x007F)
return (1);
if (wc <= 0x07FF)
return (2);
if (wc <= 0xFFFF)
return (3);
if (wc <= 0x10FFFF)
return (4);
return (0);
}
static int ft_wc_to_tbl(unsigned char *s, unsigned int wchar)
{
int len;
unsigned int rshift;
unsigned int mask[2];
int i;
if (!s || !(len = ft_wcsize(wchar)))
return (0);
rshift = (len - 1) * 6;
mask[0] = 0xFF;
mask[1] = 0xC0;
if (len > 2)
mask[1] += (len - 1) * 16;
i = 0;
while (i < len)
{
s[i++] = (wchar >> rshift & mask[0]) | mask[1];
mask[0] = 0x3F;
mask[1] = 0x80;
rshift -= 6;
}
return (len);
}
wchar_t ft_utf8_encode(unsigned int wchar)
{
int len;
unsigned char s[4];
unsigned int lshift;
if (!(len = ft_wc_to_tbl(s, wchar)))
return (0);
if (!(lshift = (len - 1) * 8))
return (wchar);
wchar = 0;
while (len--)
{
wchar |= s[len] << lshift;
lshift -= 8;
}
return (wchar);
}