string.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * 文件名: string.c
  3. * 目标: 关于char和wchar_t的实用函数
  4. */
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include "tool.h"
  8. #include "str.h"
  9. #define EQ_STR(str1, str2) (!strcmp((str1), (str2)))
  10. #define EQ_WSTR(wid1, wid2) (!wcscmp((wid1), (wid2)))
  11. #define NEW_STR(size) calloc((size) + 1, char)
  12. #define NEW_WSTR(size) calloc((size) + 1, wchar_t)
  13. #define STR_LEN(p) (((p) == NULL) ? 0 : strlen((p)))
  14. #define WSTR_LEN(p) (((p) == NULL) ? 0 : wcslen((p)))
  15. namespace aFuntool {
  16. char *charToStr(char ch){
  17. if (ch == NUL)
  18. return nullptr;
  19. char *tmp = NEW_STR(1);
  20. *tmp = ch;
  21. return tmp;
  22. }
  23. char *strCopy(const char *str){
  24. if (str != nullptr) {
  25. char *tmp = NEW_STR(STR_LEN(str));
  26. strcpy(tmp, str);
  27. return tmp;
  28. }
  29. return nullptr;
  30. }
  31. /**
  32. * 拼接两个字符串
  33. */
  34. char *strJoin(const char *first, const char *second, bool free_first, bool free_last){
  35. if (first == nullptr && second == nullptr)
  36. return nullptr;
  37. else if (first == nullptr) {
  38. first = second;
  39. second = nullptr;
  40. free_first = free_last;
  41. free_last = false;
  42. }
  43. char *new_str = NEW_STR(STR_LEN(first) + STR_LEN(second));
  44. strcat(new_str, first);
  45. if (second != nullptr)
  46. strcat(new_str, second);
  47. if (free_first) {
  48. auto free_ = const_cast<char *>(first);
  49. free(free_);
  50. }
  51. if (free_last) {
  52. auto free_ = const_cast<char *>(second);
  53. free(free_);
  54. }
  55. return new_str;
  56. }
  57. /**
  58. * char *转换为wchar_t *
  59. */
  60. wchar_t *convertToWstr(const char *str, bool free_old){
  61. size_t len = STR_LEN(str);
  62. auto tmp = NEW_WSTR(len);
  63. mbstowcs(tmp, str, len);
  64. if (free_old) {
  65. auto free_ = const_cast<char *>(str);
  66. free(free_);
  67. }
  68. return tmp;
  69. }
  70. /**
  71. * wchar_t *转换为char *
  72. */
  73. char *convertToStr(const wchar_t *wstr, bool free_old){
  74. size_t len = WSTR_LEN(wstr);
  75. auto tmp = NEW_STR(len);
  76. wcstombs(tmp, wstr, len);
  77. if (free_old) {
  78. auto free_ = const_cast<wchar_t *>(wstr);
  79. free(free_);
  80. }
  81. return tmp;
  82. }
  83. }