string.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <stdint.h>
  2. #define BYTES_PER_MAX_COPY_UNIT (sizeof(uint32_t) / sizeof(uint8_t))
  3. void* memcpy(void* _dst, const void* _src, size_t n)
  4. {
  5. void* orig_dst = _dst;
  6. uint8_t* dst = (uint8_t*)_dst;
  7. const uint8_t* src = (const uint8_t*)_src;
  8. for (size_t i = 0; i < n / BYTES_PER_MAX_COPY_UNIT; ++i) {
  9. *(uint32_t*)dst = *(uint32_t*)src;
  10. dst += BYTES_PER_MAX_COPY_UNIT;
  11. src += BYTES_PER_MAX_COPY_UNIT;
  12. }
  13. for (size_t i = 0; i < (n % BYTES_PER_MAX_COPY_UNIT); ++i) {
  14. *((char*)dst++) = *((char*)src++);
  15. }
  16. return orig_dst;
  17. }
  18. void* memset(void* _dst, int c, size_t n)
  19. {
  20. uint8_t* dst = (uint8_t*)_dst;
  21. c &= 0xff;
  22. int cc = (c + (c << 8) + (c << 16) + (c << 24));
  23. for (size_t i = 0; i < n / BYTES_PER_MAX_COPY_UNIT; ++i) {
  24. *(uint32_t*)dst = cc;
  25. dst += BYTES_PER_MAX_COPY_UNIT;
  26. }
  27. for (size_t i = 0; i < (n % BYTES_PER_MAX_COPY_UNIT); ++i) {
  28. *((char*)dst++) = c;
  29. }
  30. return dst;
  31. }
  32. size_t strlen(const char* str)
  33. {
  34. size_t n = 0;
  35. while (*(str++) != '\0')
  36. ++n;
  37. return n;
  38. }
  39. char* strncpy(char* dst, const char* src, size_t n)
  40. {
  41. size_t len = strlen(src);
  42. if (len < n) {
  43. memset(dst + len, 0x00, n - len);
  44. memcpy(dst, src, len);
  45. } else {
  46. memcpy(dst, src, n);
  47. }
  48. return dst;
  49. }
  50. int strcmp(const char* s1, const char* s2)
  51. {
  52. int c;
  53. while ((c = *s1 - *s2) == 0 && *s1 != 0) {
  54. ++s1;
  55. ++s2;
  56. }
  57. return c;
  58. }