StdLib.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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, const void *src, DWORD n)
  7. {
  8. BYTE* bdest = (BYTE*)dest;
  9. const BYTE* bsrc = (const BYTE*)src;
  10. for (; n; --n)
  11. *(bdest++) = *(bsrc++);
  12. }
  13. void strcpy(char* dest, const char *src)
  14. {
  15. while ((*dest++ = *src++) != '\0');
  16. }
  17. void* memset(void* dest, BYTE c, DWORD n)
  18. {
  19. BYTE *bdest = (BYTE *)dest;
  20. for (; n; --n)
  21. *(bdest++) = c;
  22. return dest;
  23. }
  24. char* strrchr(const char* str, int ch)
  25. {
  26. char *last = nullptr;
  27. char c;
  28. for (; (c = *str); ++str) {
  29. if (c == ch)
  30. last = const_cast<char*>(str);
  31. }
  32. return last;
  33. }
  34. DWORD strlen(const char* str)
  35. {
  36. DWORD len = 0;
  37. while (*(str++))
  38. ++len;
  39. return len;
  40. }
  41. int strcmp(const char *s1, const char *s2)
  42. {
  43. for (; *s1 == *s2; ++s1, ++s2) {
  44. if (*s1 == 0)
  45. return 0;
  46. }
  47. return *(const BYTE*)s1 < *(const BYTE*)s2 ? -1 : 1;
  48. }
  49. char* strdup(const char *str)
  50. {
  51. DWORD len = strlen(str);
  52. char *s = (char*)kmalloc(len);
  53. memcpy(s, str, len);
  54. return s;
  55. }
  56. int memcmp(const void* v1, const void* v2, size_t n)
  57. {
  58. auto* s1 = (const byte*)v1;
  59. auto* s2 = (const byte*)v2;
  60. while (n-- > 0) {
  61. if (*s1++ != *s2++)
  62. return s1[-1] < s2[-1] ? -1 : 1;
  63. }
  64. return 0;
  65. }
  66. void __cxa_pure_virtual() NORETURN;
  67. void __cxa_pure_virtual()
  68. {
  69. ASSERT_NOT_REACHED();
  70. }
  71. }