ft_unicode.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* ft_unicode.c :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@students.42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2016/03/10 01:44:46 by bchanot #+# #+# */
  9. /* Updated: 2016/10/16 22:15:23 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include "libft.h"
  13. #include <locale.h>
  14. char *ft_widechar(wchar_t c)
  15. {
  16. char str[5];
  17. ft_bzero(str, 5);
  18. if (c < 128)
  19. str[0] = (char)c;
  20. else if (c < 2048)
  21. {
  22. str[0] = (c >> 6) + 192;
  23. str[1] = (c & 63) + 128;
  24. }
  25. else if (c < 65536)
  26. {
  27. str[0] = (c >> 12) + 224;
  28. str[1] = ((c >> 6) & 63) + 128;
  29. str[2] = (c & 63) + 128;
  30. }
  31. else if (c < 1114112)
  32. {
  33. str[0] = (c >> 18) + 240;
  34. str[1] = ((c >> 12) & 63) + 128;
  35. str[2] = ((c >> 6) & 63) + 128;
  36. str[3] = (c & 63) + 128;
  37. }
  38. return (ft_strdup(str));
  39. }
  40. char *ft_widestr(wchar_t *src)
  41. {
  42. char *str;
  43. char *ante;
  44. char *post;
  45. if (!(str = ft_strnew(0)))
  46. return (NULL);
  47. while (*src)
  48. {
  49. ante = str;
  50. if (!(post = ft_widechar(*src)))
  51. return (NULL);
  52. if (!(str = ft_strjoin(ante, post)))
  53. return (NULL);
  54. src++;
  55. ft_strdel(&ante);
  56. ft_strdel(&post);
  57. }
  58. return (str);
  59. }