wchar.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Assertions.h>
  7. #include <AK/Format.h>
  8. #include <wchar.h>
  9. extern "C" {
  10. size_t wcslen(const wchar_t* str)
  11. {
  12. size_t len = 0;
  13. while (*(str++))
  14. ++len;
  15. return len;
  16. }
  17. wchar_t* wcscpy(wchar_t* dest, const wchar_t* src)
  18. {
  19. wchar_t* original_dest = dest;
  20. while ((*dest++ = *src++) != '\0')
  21. ;
  22. return original_dest;
  23. }
  24. wchar_t* wcsncpy(wchar_t* dest, const wchar_t* src, size_t num)
  25. {
  26. wchar_t* original_dest = dest;
  27. while (((*dest++ = *src++) != '\0') && ((size_t)(dest - original_dest) < num))
  28. ;
  29. return original_dest;
  30. }
  31. int wcscmp(const wchar_t* s1, const wchar_t* s2)
  32. {
  33. while (*s1 == *s2++)
  34. if (*s1++ == 0)
  35. return 0;
  36. return *(const wchar_t*)s1 - *(const wchar_t*)--s2;
  37. }
  38. int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n)
  39. {
  40. if (!n)
  41. return 0;
  42. do {
  43. if (*s1 != *s2++)
  44. return *(const wchar_t*)s1 - *(const wchar_t*)--s2;
  45. if (*s1++ == 0)
  46. break;
  47. } while (--n);
  48. return 0;
  49. }
  50. wchar_t* wcschr(const wchar_t* str, int c)
  51. {
  52. wchar_t ch = c;
  53. for (;; ++str) {
  54. if (*str == ch)
  55. return const_cast<wchar_t*>(str);
  56. if (!*str)
  57. return nullptr;
  58. }
  59. }
  60. const wchar_t* wcsrchr(const wchar_t* str, wchar_t wc)
  61. {
  62. wchar_t* last = nullptr;
  63. wchar_t c;
  64. for (; (c = *str); ++str) {
  65. if (c == wc)
  66. last = const_cast<wchar_t*>(str);
  67. }
  68. return last;
  69. }
  70. wchar_t* wcscat(wchar_t* dest, const wchar_t* src)
  71. {
  72. size_t dest_length = wcslen(dest);
  73. size_t i;
  74. for (i = 0; src[i] != '\0'; i++)
  75. dest[dest_length + i] = src[i];
  76. dest[dest_length + i] = '\0';
  77. return dest;
  78. }
  79. wchar_t* wcsncat(wchar_t* dest, const wchar_t* src, size_t n)
  80. {
  81. size_t dest_length = wcslen(dest);
  82. size_t i;
  83. for (i = 0; i < n && src[i] != '\0'; i++)
  84. dest[dest_length + i] = src[i];
  85. dest[dest_length + i] = '\0';
  86. return dest;
  87. }
  88. wchar_t* wcstok(wchar_t* str, const wchar_t* delim, wchar_t** ptr)
  89. {
  90. wchar_t* used_str = str;
  91. if (!used_str) {
  92. used_str = *ptr;
  93. }
  94. size_t token_start = 0;
  95. size_t token_end = 0;
  96. size_t str_len = wcslen(used_str);
  97. size_t delim_len = wcslen(delim);
  98. for (size_t i = 0; i < str_len; ++i) {
  99. bool is_proper_delim = false;
  100. for (size_t j = 0; j < delim_len; ++j) {
  101. if (used_str[i] == delim[j]) {
  102. // Skip beginning delimiters
  103. if (token_end - token_start == 0) {
  104. ++token_start;
  105. break;
  106. }
  107. is_proper_delim = true;
  108. }
  109. }
  110. ++token_end;
  111. if (is_proper_delim && token_end > 0) {
  112. --token_end;
  113. break;
  114. }
  115. }
  116. if (used_str[token_start] == '\0')
  117. return nullptr;
  118. if (token_end == 0) {
  119. return &used_str[token_start];
  120. }
  121. used_str[token_end] = '\0';
  122. return &used_str[token_start];
  123. }
  124. long wcstol(const wchar_t*, wchar_t**, int)
  125. {
  126. dbgln("FIXME: Implement wcstol()");
  127. TODO();
  128. }
  129. long long wcstoll(const wchar_t*, wchar_t**, int)
  130. {
  131. dbgln("FIXME: Implement wcstoll()");
  132. TODO();
  133. }
  134. wint_t btowc(int)
  135. {
  136. dbgln("FIXME: Implement btowc()");
  137. TODO();
  138. }
  139. }