StdLib.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "types.h"
  2. #include "Assertions.h"
  3. #include "kmalloc.h"
  4. #include <AK/Types.h>
  5. extern "C" {
  6. void memcpy(void *dest_ptr, const void *src_ptr, dword n)
  7. {
  8. dword dest = (dword)dest_ptr;
  9. dword src = (dword)src_ptr;
  10. // FIXME: Support starting at an unaligned address.
  11. if (!(dest & 0x3) && !(src & 0x3) && n >= 12) {
  12. size_t dwords = n / sizeof(dword);
  13. asm volatile(
  14. "rep movsl\n"
  15. : "=S"(src), "=D"(dest)
  16. : "S"(src), "D"(dest), "c"(dwords)
  17. : "memory"
  18. );
  19. n -= dwords * sizeof(dword);
  20. if (n == 0)
  21. return;
  22. }
  23. asm volatile(
  24. "rep movsb\n"
  25. :: "S"(src), "D"(dest), "c"(n)
  26. : "memory"
  27. );
  28. }
  29. void strcpy(char* dest, const char *src)
  30. {
  31. while ((*dest++ = *src++) != '\0');
  32. }
  33. void* memset(void* dest_ptr, byte c, dword n)
  34. {
  35. dword dest = (dword)dest_ptr;
  36. // FIXME: Support starting at an unaligned address.
  37. if (!(dest & 0x3) && n >= 12) {
  38. size_t dwords = n / sizeof(dword);
  39. dword expanded_c = c;
  40. expanded_c <<= 8;
  41. expanded_c <<= 16;
  42. asm volatile(
  43. "rep stosl\n"
  44. : "=D"(dest)
  45. : "D"(dest), "c"(dwords), "a"(expanded_c)
  46. : "memory"
  47. );
  48. n -= dwords * sizeof(dword);
  49. if (n == 0)
  50. return dest_ptr;
  51. }
  52. asm volatile(
  53. "rep stosb\n"
  54. : "=D" (dest), "=c" (n)
  55. : "0" (dest), "1" (n), "a" (c)
  56. : "memory"
  57. );
  58. return dest_ptr;
  59. }
  60. char* strrchr(const char* str, int ch)
  61. {
  62. char *last = nullptr;
  63. char c;
  64. for (; (c = *str); ++str) {
  65. if (c == ch)
  66. last = const_cast<char*>(str);
  67. }
  68. return last;
  69. }
  70. dword strlen(const char* str)
  71. {
  72. dword len = 0;
  73. while (*(str++))
  74. ++len;
  75. return len;
  76. }
  77. int strcmp(const char *s1, const char *s2)
  78. {
  79. for (; *s1 == *s2; ++s1, ++s2) {
  80. if (*s1 == 0)
  81. return 0;
  82. }
  83. return *(const byte*)s1 < *(const byte*)s2 ? -1 : 1;
  84. }
  85. char* strdup(const char *str)
  86. {
  87. dword len = strlen(str);
  88. char *s = (char*)kmalloc(len);
  89. memcpy(s, str, len);
  90. return s;
  91. }
  92. int memcmp(const void* v1, const void* v2, size_t n)
  93. {
  94. auto* s1 = (const byte*)v1;
  95. auto* s2 = (const byte*)v2;
  96. while (n-- > 0) {
  97. if (*s1++ != *s2++)
  98. return s1[-1] < s2[-1] ? -1 : 1;
  99. }
  100. return 0;
  101. }
  102. void __cxa_pure_virtual() NORETURN;
  103. void __cxa_pure_virtual()
  104. {
  105. ASSERT_NOT_REACHED();
  106. }
  107. }