mem.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "__virtualmath.h"
  2. jmp_buf memVirtualMath_Env;
  3. bool memVirtualMathUseJmp;
  4. void *memCalloc(size_t num, size_t size){
  5. void *tmp = calloc(num, size);
  6. if (tmp == NULL) {
  7. if (memVirtualMathUseJmp)
  8. longjmp(memVirtualMath_Env, -1);
  9. else
  10. exit(2);
  11. }
  12. return tmp;
  13. }
  14. void *memRealloc(void *old, size_t size){
  15. void *tmp = realloc(old, size);
  16. if (tmp == NULL) {
  17. if (memVirtualMathUseJmp)
  18. longjmp(memVirtualMath_Env, -1);
  19. else
  20. exit(2);
  21. }
  22. return tmp;
  23. }
  24. char *memStrcpy(const char *str){
  25. char *tmp = memString(memStrlen(str));
  26. if (str != NULL)
  27. strcpy(tmp, str);
  28. return tmp;
  29. }
  30. wchar_t *memWidecpy(const wchar_t *str){
  31. wchar_t *tmp = memWide(memWidelen(str));
  32. if (str != NULL)
  33. wcscpy(tmp, str);
  34. return tmp;
  35. }
  36. // TODO-szh 检查useage
  37. char *memStrCharcpy(char *str, size_t nsize, bool free_old, bool write, ...) { // 复制str到新的空间,nszie是要扩展的大小。该函数支持让str=NULL,则变为单纯的memString
  38. char *tmp = memString(memStrlen(str) + nsize);
  39. size_t base_len = memStrlen(str);
  40. if (base_len != 0)
  41. strcpy(tmp, str);
  42. if (write){
  43. va_list argp;
  44. va_start(argp, write);
  45. for (int i = 0; i < nsize; i++)
  46. tmp[base_len + i] = (char)va_arg(argp, int);
  47. va_end(argp);
  48. }
  49. if (free_old)
  50. memFree(str);
  51. return tmp;
  52. }
  53. wchar_t *memWideCharcpy(wchar_t *str, size_t nsize, bool free_old, bool write, ...) { // 复制str到新的空间,nszie是要扩展的大小。该函数支持让str=NULL,则变为单纯的memString
  54. size_t base_len = memWidelen(str);
  55. wchar_t *tmp = memWide(base_len + nsize);
  56. if (base_len != 0)
  57. wcscpy(tmp, str);
  58. if (write){
  59. va_list argp;
  60. va_start(argp, write);
  61. for (int i = 0; i < nsize; i++)
  62. tmp[base_len + i] = (wchar_t)va_arg(argp, int);
  63. va_end(argp);
  64. }
  65. if (free_old)
  66. memFree(str);
  67. return tmp;
  68. }
  69. char *memStrcatIter(char *base, bool free_base, ...) {
  70. va_list ap;
  71. va_start(ap, free_base);
  72. for (char *ch = va_arg(ap, char *); ch != NULL; ch = va_arg(ap, char *)) {
  73. base = memStrcat(base, ch, free_base, false);
  74. free_base = true;
  75. }
  76. va_end(ap);
  77. return base;
  78. }
  79. char *memStrcat(char *first, char *second, bool free_first, bool free_last) {
  80. if (first == NULL && second == NULL)
  81. return NULL;
  82. else if (first == NULL){
  83. first = second;
  84. second = NULL;
  85. free_first = free_last;
  86. free_last = false;
  87. }
  88. char *new = memStrCharcpy(first, memStrlen(second), false, false);
  89. if (second != NULL)
  90. strcat(new, second);
  91. if (free_first)
  92. memFree(first);
  93. if (free_last)
  94. memFree(second);
  95. return new;
  96. }
  97. wchar_t *memWidecat(wchar_t *first, wchar_t *second, bool free_first, bool free_last) {
  98. if (first == NULL && second == NULL)
  99. return NULL;
  100. else if (first == NULL){
  101. first = second;
  102. second = NULL;
  103. free_first = free_last;
  104. free_last = false;
  105. }
  106. wchar_t *new = memWideCharcpy(first, memWidelen(second), false, false);
  107. if (second != NULL)
  108. wcscat(new, second);
  109. if (free_first)
  110. memFree(first);
  111. if (free_last)
  112. memFree(second);
  113. return new;
  114. }
  115. char *memStrcpySelf(char *str, long times){
  116. bool need_free = false;
  117. char *new_str = NULL;
  118. if (times < 0){
  119. str = memStrrev(str);
  120. times = -times;
  121. need_free = true;
  122. }
  123. for (long i=0; i < times; i++)
  124. new_str = memStrcat(new_str, str, true, false);
  125. if (need_free)
  126. memFree(str);
  127. return new_str;
  128. }
  129. wchar_t *memWidecpySelf(wchar_t *str, long times){
  130. bool need_free = false;
  131. wchar_t *new_str = NULL;
  132. if (times < 0){
  133. str = memWiderev(str);
  134. times = -times;
  135. need_free = true;
  136. }
  137. for (long i=0; i < times; i++)
  138. new_str = memWidecat(new_str, str, true, false);
  139. if (need_free)
  140. memFree(str);
  141. return new_str;
  142. }
  143. wchar_t *memWiderev(wchar_t *str){
  144. size_t len_str = memWidelen(str);
  145. wchar_t *new_str = memWide(len_str);
  146. for (int i = 0;i < len_str;i++)
  147. new_str[i] = str[len_str - i - 1];
  148. return new_str;
  149. }
  150. char *memStrrev(const char * str){
  151. size_t len_str = memStrlen(str);
  152. char *new_str = memString(len_str);
  153. for (int i = 0;i < len_str;i++)
  154. new_str[i] = str[len_str - i - 1];
  155. return new_str;
  156. }
  157. wchar_t *strToWcs(char *str, bool free_old) {
  158. size_t len = memStrlen(str);
  159. wchar_t *tmp = memWide(len);
  160. mbstowcs(tmp, str, len);
  161. if (free_old)
  162. memFree(str);
  163. return tmp;
  164. }
  165. char *wcsToStr(wchar_t *wcs, bool free_old) {
  166. size_t len = memWidelen(wcs);
  167. char *tmp = memString(len);
  168. wcstombs(tmp, wcs, len);
  169. if (free_old)
  170. memFree(wcs);
  171. return tmp;
  172. }