AndroidStrings.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2013 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "platformAndroid/platformAndroid.h"
  23. #include "platform/platform.h"
  24. #include <stdlib.h>
  25. #include <stdarg.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28. #include <stdio.h>
  29. #include "console/console.h"
  30. #include "debug/profiler.h"
  31. char *dStrdup_r(const char *src, const char *file, dsize_t line)
  32. {
  33. char *buffer = (char *) dMalloc_r(dStrlen(src) + 1, file, line);
  34. dStrcpy(buffer, src);
  35. return buffer;
  36. }
  37. char *dStrnew(const char *src)
  38. {
  39. char *buffer = new char[dStrlen(src) + 1];
  40. dStrcpy(buffer, src);
  41. return buffer;
  42. }
  43. char* dStrcat(char *dst, const char *src)
  44. {
  45. return strcat(dst,src);
  46. }
  47. char* dStrncat(char *dst, const char *src, dsize_t len)
  48. {
  49. return strncat(dst,src,len);
  50. }
  51. // concatenates a list of src's onto the end of dst
  52. // the list of src's MUST be terminated by a NULL parameter
  53. // dStrcatl(dst, sizeof(dst), src1, src2, NULL);
  54. char* dStrcatl(char *dst, dsize_t dstSize, ...)
  55. {
  56. const char* src;
  57. char *p = dst;
  58. AssertFatal(dstSize > 0, "dStrcatl: destination size is set zero");
  59. dstSize--; // leave room for string termination
  60. // find end of dst
  61. while (dstSize && *p)
  62. {
  63. p++;
  64. dstSize--;
  65. }
  66. va_list args;
  67. va_start(args, dstSize);
  68. // concatenate each src to end of dst
  69. while ( (src = va_arg(args, const char*)) != NULL )
  70. while( dstSize && *src )
  71. {
  72. *p++ = *src++;
  73. dstSize--;
  74. }
  75. va_end(args);
  76. // make sure the string is terminated
  77. *p = 0;
  78. return dst;
  79. }
  80. // copy a list of src's into dst
  81. // the list of src's MUST be terminated by a NULL parameter
  82. // dStrccpyl(dst, sizeof(dst), src1, src2, NULL);
  83. char* dStrcpyl(char *dst, dsize_t dstSize, ...)
  84. {
  85. const char* src;
  86. char *p = dst;
  87. AssertFatal(dstSize > 0, "dStrcpyl: destination size is set zero");
  88. dstSize--; // leave room for string termination
  89. va_list args;
  90. va_start(args, dstSize);
  91. // concatenate each src to end of dst
  92. while ( (src = va_arg(args, const char*)) != NULL )
  93. while( dstSize && *src )
  94. {
  95. *p++ = *src++;
  96. dstSize--;
  97. }
  98. va_end(args);
  99. // make sure the string is terminated
  100. *p = 0;
  101. return dst;
  102. }
  103. int dStrcmp(const char *str1, const char *str2)
  104. {
  105. return strcmp(str1, str2);
  106. }
  107. int dStrcmp( const UTF16 *str1, const UTF16 *str2)
  108. {
  109. int ret;
  110. const UTF16 *a, *b;
  111. a = str1;
  112. b = str2;
  113. while(*a && *b && (ret = *a - *b) == 0)
  114. {
  115. a++, b++;
  116. }
  117. if ( *a == 0 && *b != 0 )
  118. return -1;
  119. if ( *b == 0 && *a != 0 )
  120. return 1;
  121. return ret;
  122. }
  123. int dStricmp(const char *str1, const char *str2)
  124. {
  125. char c1, c2;
  126. while (1)
  127. {
  128. c1 = tolower(*str1++);
  129. c2 = tolower(*str2++);
  130. if (c1 < c2) return -1;
  131. if (c1 > c2) return 1;
  132. if (c1 == 0) return 0;
  133. }
  134. }
  135. int dStrncmp(const char *str1, const char *str2, dsize_t len)
  136. {
  137. return strncmp(str1, str2, len);
  138. }
  139. int dStrnicmp(const char *str1, const char *str2, dsize_t len)
  140. {
  141. S32 i;
  142. char c1, c2;
  143. for (i=0; i<len; i++)
  144. {
  145. c1 = tolower(*str1++);
  146. c2 = tolower(*str2++);
  147. if (c1 < c2) return -1;
  148. if (c1 > c2) return 1;
  149. if (!c1) return 0;
  150. }
  151. return 0;
  152. }
  153. char* dStrcpy(char *dst, const char *src)
  154. {
  155. AssertFatal(dst && src, "bad strings passed to dStrcpy()");
  156. return strcpy(dst,src);
  157. }
  158. char* dStrncpy(char *dst, const char *src, dsize_t len)
  159. {
  160. return strncpy(dst,src,len);
  161. }
  162. U32 dStrlen(const char *str)
  163. {
  164. return str ? strlen(str) : 0;
  165. }
  166. char* dStrupr(char *str)
  167. {
  168. char* saveStr = str;
  169. while (*str)
  170. {
  171. *str = toupper(*str);
  172. str++;
  173. }
  174. return saveStr;
  175. }
  176. char* dStrlwr(char *str)
  177. {
  178. char* saveStr = str;
  179. while (*str)
  180. {
  181. *str = tolower(*str);
  182. str++;
  183. }
  184. return saveStr;
  185. }
  186. char* dStrchr(char *str, int c)
  187. {
  188. return strchr(str,c);
  189. }
  190. const char* dStrchr(const char *str, int c)
  191. {
  192. return strchr(str,c);
  193. }
  194. const char* dStrrchr(const char *str, int c)
  195. {
  196. return strrchr(str,c);
  197. }
  198. char* dStrrchr(char *str, int c)
  199. {
  200. return strrchr(str,c);
  201. }
  202. U32 dStrspn(const char *str, const char *set)
  203. {
  204. return(strspn(str, set));
  205. }
  206. U32 dStrcspn(const char *str, const char *set)
  207. {
  208. return strcspn(str, set);
  209. }
  210. char* dStrstr(char *str1, const char *str2)
  211. {
  212. return strstr(str1,str2);
  213. }
  214. const char* dStrstr(const char *str1, const char *str2)
  215. {
  216. return strstr(str1,str2);
  217. }
  218. char* dStrtok(char *str, const char *sep)
  219. {
  220. return strtok(str, sep);
  221. }
  222. int dAtoi(const char *str)
  223. {
  224. if(!str)
  225. return 0;
  226. return atoi(str);
  227. }
  228. float dAtof(const char *str)
  229. {
  230. if(!str)
  231. return 0;
  232. return atof(str);
  233. }
  234. bool dAtob(const char *str)
  235. {
  236. return !dStricmp(str, "true") || !dStricmp(str, "1") || (0!=dAtoi(str));
  237. }
  238. bool dIsalnum(const char c)
  239. {
  240. return isalnum(c);
  241. }
  242. bool dIsalpha(const char c)
  243. {
  244. return(isalpha(c));
  245. }
  246. bool dIsspace(const char c)
  247. {
  248. return(isspace(c));
  249. }
  250. bool dIsdigit(const char c)
  251. {
  252. return(isdigit(c));
  253. }
  254. void dPrintf(const char *format, ...)
  255. {
  256. va_list args;
  257. va_start(args, format);
  258. vprintf(format, args);
  259. }
  260. int dVprintf(const char *format, va_list arglist)
  261. {
  262. S32 len = vprintf(format, arglist);
  263. return (len);
  264. }
  265. int dSprintf(char *buffer, dsize_t bufferSize, const char *format, ...)
  266. {
  267. va_list args;
  268. va_start(args, format);
  269. S32 len = vsprintf(buffer, format, args);
  270. // Sanity!
  271. AssertFatal(len <= bufferSize, "dSprintf - String format exceeded buffer size. This will cause corruption.");
  272. return (len);
  273. }
  274. int dVsprintf(char *buffer, dsize_t bufferSize, const char *format, va_list arglist)
  275. {
  276. S32 len = vsprintf(buffer, format, arglist);
  277. // Sanity!
  278. AssertFatal(len <= bufferSize, "dSprintf - String format exceeded buffer size. This will cause corruption.");
  279. return (len);
  280. }
  281. //%PUAP% -Mat -----------------------------------------------------------------------------------------------
  282. int dStrrev(char* str)
  283. {
  284. int l=dStrlen(str)-1; //get the string length
  285. for(int x=0;x < l;x++,l--)
  286. {
  287. str[x]^=str[l]; //triple XOR Trick
  288. str[l]^=str[x]; //for not using a temp
  289. str[x]^=str[l];
  290. }
  291. return l;
  292. }
  293. //-Mat hack
  294. int dItoa(int n, char s[])
  295. {
  296. int i, sign;
  297. if ((sign = n) < 0) /* record sign */
  298. n = -n; /* make n positivNSStringe */
  299. i = 0;
  300. do { /* generate digits in reverse order */
  301. s[i++] = n % 10 + '0'; /* get next digit */
  302. } while ((n /= 10) > 0); /* delete it */
  303. if (sign < 0)
  304. s[i++] = '-';
  305. s[i] = '\0';
  306. // Reverse string.
  307. dStrrev(s);
  308. // Return length.
  309. return dStrlen(s);
  310. }
  311. //%PUAP%-----------------------------------------------------------------------------------------------------
  312. int dSscanf(const char *buffer, const char *format, ...)
  313. {
  314. va_list args;
  315. va_start(args, format);
  316. return vsscanf(buffer, format, args);
  317. }
  318. int dFflushStdout()
  319. {
  320. return fflush(stdout);
  321. }
  322. int dFflushStderr()
  323. {
  324. return fflush(stderr);
  325. }
  326. void dQsort(void *base, U32 nelem, U32 width, int (QSORT_CALLBACK *fcmp)(const void *, const void *))
  327. {
  328. qsort(base, nelem, width, fcmp);
  329. }
  330. StringTableEntry Platform::createUUID( void )
  331. {
  332. Con::errorf("createUUID not supported on Android");
  333. return StringTable->insert("");
  334. }