std_string_osx.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include <bfc/std.h>
  2. // not perfect but it should work
  3. int WCSICMP(const wchar_t *str1, const wchar_t *str2)
  4. {
  5. while (*str1 && *str2)
  6. {
  7. if (towlower(*str1) < towlower(*str2))
  8. return -1;
  9. if (towlower(*str2) < towlower(*str1))
  10. return 1;
  11. str1++;
  12. str2++;
  13. }
  14. if (!*str1 && !*str2) return 0;
  15. if (*str1) return 1;
  16. if (*str2) return -1;
  17. return -1; // shouldn't get here but we'll make the compiler shut up
  18. }
  19. int WCSNICMP(const wchar_t *str1, const wchar_t *str2, size_t len)
  20. {
  21. while (*str1 && *str2 && len)
  22. {
  23. if (towlower(*str1) < towlower(*str2))
  24. return -1;
  25. if (towlower(*str2) < towlower(*str1))
  26. return 1;
  27. str1++;
  28. str2++;
  29. len--;
  30. }
  31. if (!len) return 0;
  32. if (!*str1 && !*str2) return 0;
  33. if (*str1) return 1;
  34. if (*str2) return -1;
  35. return -1; // shouldn't get here but we'll make the compiler shut up
  36. }
  37. /* these are super slow because of memory allocation, but will tide us over until apple adds wcscasecmp and family to their BSD API */
  38. #if 0 // remember this if we ever decide to use -fshort-wchar
  39. int WCSICMP(const wchar_t *str1, const wchar_t *str2)
  40. {
  41. CFStringRef cfstr1 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str1, wcslen(str1)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  42. CFStringRef cfstr2 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str2, wcslen(str2)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  43. int result = CFStringCompare(cfstr1, cfstr2, kCFCompareCaseInsensitive);
  44. CFRelease(cfstr1);
  45. CFRelease(cfstr2);
  46. return result;
  47. }
  48. int WCSNICMP(const wchar_t *str1, const wchar_t *str2, size_t len)
  49. {
  50. CFStringRef cfstr1 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str1, wcslen(str1)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  51. CFStringRef cfstr2 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str2, wcslen(str2)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  52. int result = CFStringCompareWithOptions(cfstr1, cfstr2, CFRangeMake(0, len), kCFCompareCaseInsensitive);
  53. CFRelease(cfstr1);
  54. CFRelease(cfstr2);
  55. return result;
  56. }
  57. #endif
  58. int WCSICOLL(const wchar_t *str1, const wchar_t *str2)
  59. {
  60. CFStringRef cfstr1 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str1, wcslen(str1)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  61. CFStringRef cfstr2 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str2, wcslen(str2)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  62. int result = CFStringCompare(cfstr1, cfstr2, kCFCompareCaseInsensitive|kCFCompareNonliteral);
  63. CFRelease(cfstr1);
  64. CFRelease(cfstr2);
  65. return result;
  66. }
  67. bool WCSIPREFIX(const wchar_t *str1, const wchar_t *prefix)
  68. {
  69. CFStringRef cfstr1 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str1, wcslen(str1)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  70. CFStringRef cfstr2 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)prefix, wcslen(prefix)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
  71. bool result = CFStringHasPrefix(cfstr1, cfstr2);
  72. CFRelease(cfstr1);
  73. CFRelease(cfstr2);
  74. return result;
  75. }
  76. wchar_t *DO_WCSDUP(const wchar_t *ptr EXTRA_INFO)
  77. {
  78. if (ptr == NULL) return NULL;
  79. int size = wcslen(ptr);
  80. wchar_t *ret = (wchar_t *)MALLOC((size + 1) * sizeof(wchar_t));
  81. if (ret != NULL)
  82. {
  83. WCSCPYN(ret, ptr, size+1);
  84. }
  85. return ret;
  86. }
  87. void WCSCPYN(wchar_t *dest, const wchar_t *src, int maxchar)
  88. {
  89. ASSERT(dest != NULL);
  90. ASSERT(src != NULL);
  91. wcsncpy(dest, src, maxchar-1); // TODO: switch to a less brain dead function
  92. dest[maxchar-1]=0;
  93. }
  94. void STRTOUPPER(char *str)
  95. {
  96. if (str)
  97. {
  98. while (*str)
  99. {
  100. *str = toupper(*str);
  101. }
  102. }
  103. }
  104. void STRTOLOWER(char *str)
  105. {
  106. if (str)
  107. {
  108. while (*str)
  109. {
  110. *str = towlower(*str);
  111. }
  112. }
  113. }
  114. COMEXP void WCSTOUPPER(wchar_t *str)
  115. {
  116. if (str)
  117. {
  118. while (*str)
  119. {
  120. *str = towupper(*str);
  121. }
  122. }
  123. }
  124. COMEXP void WCSTOLOWER(wchar_t *str)
  125. {
  126. if (str)
  127. {
  128. while (*str)
  129. {
  130. *str = towlower(*str);
  131. }
  132. }
  133. }
  134. int WCSICMPSAFE(const wchar_t *str1, const wchar_t *str2, const wchar_t *defval1, const wchar_t *defval2)
  135. {
  136. if (str1 == NULL) str1 = defval1;
  137. if (str2 == NULL) str2 = defval2;
  138. return WCSICMP(str1, str2);
  139. }
  140. wchar_t *WCSTOK(wchar_t *str, const wchar_t *sep, wchar_t **last)
  141. {
  142. return wcstok(str, sep, last);
  143. }
  144. int WCSCASEEQLSAFE(const wchar_t *str1, const wchar_t *str2, const wchar_t *defval1, const wchar_t *defval2)
  145. {
  146. return !WCSICMPSAFE(str1, str2, defval1, defval2);
  147. }
  148. int STRLEN(const char *str)
  149. {
  150. ASSERT(str != NULL);
  151. return strlen(str);
  152. }
  153. bool ISALPHA(wchar_t alpha)
  154. {
  155. return iswalpha(alpha);
  156. }
  157. bool ISDIGIT(wchar_t digit)
  158. {
  159. return iswdigit(digit);
  160. }
  161. bool ISSPACE(wchar_t space)
  162. {
  163. return iswspace(space);
  164. }
  165. bool ISPUNCT(wchar_t punct)
  166. {
  167. return iswpunct(punct);
  168. }
  169. int STRCMP(const char *str1, const char *str2)
  170. {
  171. ASSERT(str1!=NULL);
  172. ASSERT(str2!=NULL);
  173. return strcmp(str1, str2);
  174. }
  175. int STRCMPSAFE(const char *str1, const char *str2, const char *defval1, const char *defval2)
  176. {
  177. if (str1 == NULL) str1 = defval1;
  178. if (str2 == NULL) str2 = defval2;
  179. return STRCMP(str1, str2);
  180. }
  181. void STRNCPY(char *dest, const char *src, int maxchar)
  182. {
  183. ASSERT(dest != NULL);
  184. ASSERT(src != NULL);
  185. strncpy(dest, src, maxchar);
  186. //INLINE
  187. }
  188. int STRICMPSAFE(const char *str1, const char *str2, const char *defval1, const char *defval2)
  189. {
  190. if (str1 == NULL) str1 = defval1;
  191. if (str2 == NULL) str2 = defval2;
  192. return STRICMP(str1, str2);
  193. }
  194. int STRICMP(const char *str1, const char *str2)
  195. {
  196. ASSERT(str1!=NULL);
  197. ASSERT(str2!=NULL);
  198. return strcasecmp(str1, str2);
  199. }
  200. void STRCPY(char *dest, const char *src)
  201. {
  202. ASSERT(dest != NULL);
  203. ASSERT(src != NULL);
  204. ASSERT(dest != src);
  205. strcpy(dest, src);
  206. //INLINE
  207. }
  208. char *STRSTR(const char *str1, const char *str2)
  209. {
  210. ASSERT(str1!=NULL);
  211. ASSERT(str2!=NULL);
  212. ASSERT(str1 != str2);
  213. return strstr(str1, str2);
  214. }