string.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #pragma once
  2. #include <libc/sys/types.h>
  3. void *memset(void *dst, unsigned char C, uint64_t size);
  4. /**
  5. * @brief 获取字符串的大小
  6. *
  7. * @param s 字符串
  8. * @return size_t 大小
  9. */
  10. size_t strlen(const char *s);
  11. /*
  12. 比较字符串 FirstPart and SecondPart
  13. FirstPart = SecondPart => 0
  14. FirstPart > SecondPart => 1
  15. FirstPart < SecondPart => -1
  16. */
  17. int strcmp(const char *FirstPart, const char *SecondPart);
  18. /**
  19. * @brief 拷贝指定字节数的字符串
  20. *
  21. * @param dst 目标地址
  22. * @param src 源字符串
  23. * @param Count 字节数
  24. * @return char*
  25. */
  26. char *strncpy(char *dst, const char *src, size_t Count);
  27. /**
  28. * @brief 拷贝整个字符串
  29. *
  30. * @param dst 目标地址
  31. * @param src 源地址
  32. * @return char* 目标字符串
  33. */
  34. char* strcpy(char* dst, const char* src);
  35. /**
  36. * @brief 拼接两个字符串(将src接到dest末尾)
  37. *
  38. * @param dest 目标串
  39. * @param src 源串
  40. * @return char*
  41. */
  42. char *strcat(char *dest, const char *src);
  43. /**
  44. * @brief 内存拷贝函数
  45. *
  46. * @param dst 目标数组
  47. * @param src 源数组
  48. * @param Num 字节数
  49. * @return void*
  50. */
  51. static void *memcpy(void *dst, const void *src, long Num)
  52. {
  53. int d0 = 0, d1 = 0, d2 = 0;
  54. __asm__ __volatile__("cld \n\t"
  55. "rep \n\t"
  56. "movsq \n\t"
  57. "testb $4,%b4 \n\t"
  58. "je 1f \n\t"
  59. "movsl \n\t"
  60. "1:\ttestb $2,%b4 \n\t"
  61. "je 2f \n\t"
  62. "movsw \n\t"
  63. "2:\ttestb $1,%b4 \n\t"
  64. "je 3f \n\t"
  65. "movsb \n\t"
  66. "3: \n\t"
  67. : "=&c"(d0), "=&D"(d1), "=&S"(d2)
  68. : "0"(Num / 8), "q"(Num), "1"(dst), "2"(src)
  69. : "memory");
  70. return dst;
  71. }