/Tools/ColladaConverter/Collada15/FCollada/FUtils/FUStringConversion.cpp

https://bitbucket.org/ardalanaz/dava.framework · C++ · 319 lines · 252 code · 33 blank · 34 comment · 89 complexity · 0d0a5857f467862af9f71a74f958c363 MD5 · raw file

  1. /*
  2. Copyright (C) 2005-2007 Feeling Software Inc.
  3. Portions of the code are:
  4. Copyright (C) 2005-2007 Sony Computer Entertainment America
  5. MIT License: http://www.opensource.org/licenses/mit-license.php
  6. */
  7. /*
  8. Based on the FS Import classes:
  9. Copyright (C) 2005-2006 Feeling Software Inc
  10. Copyright (C) 2005-2006 Autodesk Media Entertainment
  11. MIT License: http://www.opensource.org/licenses/mit-license.php
  12. */
  13. #include "StdAfx.h"
  14. #include "FUStringConversion.h"
  15. #ifndef __APPLE__
  16. #include "FUStringConversion.hpp"
  17. #endif // __APPLE__
  18. //
  19. // FUStringConversion
  20. //
  21. // Convert a UTF-8 string to a fstring
  22. #ifdef UNICODE
  23. fstring FUStringConversion::ToFString(const char* value)
  24. {
  25. FUStringBuilder builder;
  26. if (value != NULL)
  27. {
  28. uint32 length = (uint32) strlen(value);
  29. builder.reserve(length + 1);
  30. for (uint32 i = 0; i < length; ++i)
  31. {
  32. builder.append((fchar) value[i]);
  33. }
  34. }
  35. return builder.ToString();
  36. }
  37. #else // UNICODE
  38. fstring FUStringConversion::ToFString(const char* value)
  39. {
  40. return fstring(value);
  41. }
  42. #endif // UNICODE
  43. // Convert a fstring string to a UTF-8 string
  44. #ifdef UNICODE
  45. fm::string FUStringConversion::ToString(const fchar* value)
  46. {
  47. FUSStringBuilder builder;
  48. if (value != NULL)
  49. {
  50. uint32 length = (uint32) fstrlen(value);
  51. builder.reserve(length + 1);
  52. for (uint32 i = 0; i < length; ++i)
  53. {
  54. if (value[i] < 0xFF || (value[i] & (~0xFF)) >= 32) builder.append((char)value[i]);
  55. else builder.append('_'); // some generic enough character
  56. }
  57. }
  58. return builder.ToString();
  59. }
  60. #else // UNICODE
  61. fm::string FUStringConversion::ToString(const fchar* value)
  62. {
  63. return fm::string(value);
  64. }
  65. #endif // UNICODE
  66. fm::string FUStringConversion::ToString(const FMMatrix44& m)
  67. {
  68. FUSStringBuilder builder;
  69. ToString(builder, m);
  70. return builder.ToString();
  71. }
  72. fm::string FUStringConversion::ToString(const FUDateTime& dateTime)
  73. {
  74. char sz[21];
  75. snprintf(sz, 21, "%04u-%02u-%02uT%02u:%02u:%02uZ", (unsigned int) dateTime.GetYear(), (unsigned int) dateTime.GetMonth(), (unsigned int) dateTime.GetDay(), (unsigned int) dateTime.GetHour(), (unsigned int) dateTime.GetMinutes(), (unsigned) dateTime.GetSeconds());
  76. sz[20] = 0;
  77. return fm::string(sz);
  78. }
  79. fstring FUStringConversion::ToFString(const FMMatrix44& m)
  80. {
  81. FUStringBuilder builder;
  82. ToString(builder, m);
  83. return builder.ToString();
  84. }
  85. fstring FUStringConversion::ToFString(const FUDateTime& dateTime)
  86. {
  87. fchar sz[21];
  88. fsnprintf(sz, 21, FC("%04u-%02u-%02uT%02u:%02u:%02uZ"), (unsigned int) dateTime.GetYear(), (unsigned int) dateTime.GetMonth(), (unsigned int) dateTime.GetDay(), (unsigned int) dateTime.GetHour(), (unsigned int) dateTime.GetMinutes(), (unsigned int) dateTime.GetSeconds());
  89. sz[20] = 0;
  90. return fstring(sz);
  91. }
  92. #ifdef HAS_VECTORTYPES
  93. // Split a fstring into multiple substrings
  94. void FUStringConversion::ToFStringList(const fstring& value, FStringList& array)
  95. {
  96. const fchar* s = value.c_str();
  97. // Skip beginning white spaces
  98. fchar c;
  99. while ((c = *s) != 0 && (c == ' ' || c == '\t' || c == '\r' || c == '\n')) { ++s; }
  100. size_t index = 0;
  101. while (*s != 0)
  102. {
  103. const fchar* word = s;
  104. // Find next white space
  105. while ((c = *s) != 0 && c != ' ' && c != '\t' && c != '\r' && c != '\n') { ++s; }
  106. if (index < array.size()) array[index++].append(word, s - word);
  107. else { array.push_back(fstring(word, s - word)); ++index; }
  108. // Skip all white spaces
  109. while ((c = *s) != 0 && (c == ' ' || c == '\t' || c == '\r' || c == '\n')) { ++s; }
  110. }
  111. array.resize(index);
  112. }
  113. void FUStringConversion::ToStringList(const char* s, StringList& array)
  114. {
  115. // Skip beginning white spaces
  116. char c;
  117. while ((c = *s) != 0 && (c == ' ' || c == '\t' || c == '\r' || c == '\n')) { ++s; }
  118. size_t index = 0;
  119. while (*s != 0)
  120. {
  121. const char* word = s;
  122. // Find next white space
  123. while ((c = *s) != 0 && c != ' ' && c != '\t' && c != '\r' && c != '\n') { ++s; }
  124. if (index < array.size()) array[index++].append(word, s - word);
  125. else { array.push_back(fm::string(word, s - word)); ++index; }
  126. // Skip all white spaces
  127. while ((c = *s) != 0 && (c == ' ' || c == '\t' || c == '\r' || c == '\n')) { ++s; }
  128. }
  129. array.resize(index);
  130. }
  131. #ifdef UNICODE
  132. void FUStringConversion::ToStringList(const fchar* value, StringList& array)
  133. {
  134. // Performance could be improved...
  135. ToStringList(ToString(value), array);
  136. }
  137. #endif // UNICODE
  138. #endif // HAS_VECTORTYPES
  139. // Convert a 2D point to a string
  140. fm::string FUStringConversion::ToString(const FMVector2& p)
  141. {
  142. FUSStringBuilder builder;
  143. ToString(builder, p);
  144. return builder.ToString();
  145. }
  146. fstring FUStringConversion::ToFString(const FMVector2& p)
  147. {
  148. FUStringBuilder builder;
  149. ToString(builder, p);
  150. return builder.ToString();
  151. }
  152. // Convert a point to a string
  153. fm::string FUStringConversion::ToString(const FMVector3& p)
  154. {
  155. FUSStringBuilder builder;
  156. ToString(builder, p);
  157. return builder.ToString();
  158. }
  159. // Convert a vector4 to a string
  160. fm::string FUStringConversion::ToString(const FMVector4& p)
  161. {
  162. FUSStringBuilder builder;
  163. ToString(builder, p);
  164. return builder.ToString();
  165. }
  166. fstring FUStringConversion::ToFString(const FMVector4& p)
  167. {
  168. FUStringBuilder builder;
  169. ToString(builder, p);
  170. return builder.ToString();
  171. }
  172. // Convert a point to a fstring
  173. fstring FUStringConversion::ToFString(const FMVector3& p)
  174. {
  175. FUStringBuilder builder;
  176. ToString(builder, p);
  177. return builder.ToString();
  178. }
  179. // Split the target string into its pointer and its qualifier(s)
  180. void FUStringConversion::SplitTarget(const fm::string& target, fm::string& pointer, fm::string& qualifier)
  181. {
  182. size_t splitIndex = target.find_first_of("([.");
  183. if (splitIndex != fm::string::npos)
  184. {
  185. pointer = target.substr(0, splitIndex);
  186. qualifier = target.substr(splitIndex);
  187. }
  188. else
  189. {
  190. pointer = target;
  191. qualifier.clear();
  192. }
  193. }
  194. int32 FUStringConversion::ParseQualifier(const char* qualifier)
  195. {
  196. int32 returnValue = -1;
  197. const char* c = qualifier;
  198. while (*c == '(' || *c == '[')
  199. {
  200. const char* number = ++c;
  201. while (*c >= '0' && *c <= '9') ++c;
  202. if (*c == ')' || *c == ']')
  203. {
  204. returnValue = FUStringConversion::ToInt32(number);
  205. // qualifier.erase(0, c + 1 - qualifier.c_str());
  206. break;
  207. }
  208. }
  209. return returnValue;
  210. }
  211. // Called by TrickLinker2 in FUStringBuilder.cpp
  212. extern void TrickLinkerFUStringConversion(void)
  213. {
  214. // Exercise the template functions in order to force the linker to generate and expose the methods.
  215. FUSStringBuilder sbuilder;
  216. FUStringBuilder fbuilder;
  217. const char* c = emptyCharString;
  218. const fchar* fc = emptyFCharString;
  219. float f = FUStringConversion::ToFloat(&c);
  220. f = FUStringConversion::ToFloat(&fc);
  221. bool b = FUStringConversion::ToBoolean(c);
  222. b = FUStringConversion::ToBoolean(fc);
  223. int32 i32 = FUStringConversion::ToInt32(&c);
  224. i32 = FUStringConversion::ToInt32(&fc);
  225. uint32 u32 = FUStringConversion::ToUInt32(&c);
  226. u32 = FUStringConversion::ToUInt32(&fc);
  227. u32 = FUStringConversion::HexToUInt32(&c);
  228. u32 = FUStringConversion::HexToUInt32(&fc);
  229. FMMatrix44 m44;
  230. FUStringConversion::ToMatrix(&c, m44);
  231. FUStringConversion::ToMatrix(&fc, m44);
  232. FUStringConversion::ToString(sbuilder, m44);
  233. FUStringConversion::ToString(fbuilder, m44);
  234. FUDateTime dt;
  235. FUStringConversion::ToDateTime(c, dt);
  236. FUStringConversion::ToDateTime(fc, dt);
  237. FMVector2 f2 = FUStringConversion::ToVector2(&c);
  238. FUStringConversion::ToString(sbuilder, f2);
  239. FUStringConversion::ToString(fbuilder, f2);
  240. f2 = FUStringConversion::ToVector2(&fc);
  241. FMVector3 f3 = FUStringConversion::ToVector3(&c);
  242. f3 = FUStringConversion::ToVector3(&fc);
  243. FUStringConversion::ToString(sbuilder, f3);
  244. FUStringConversion::ToString(fbuilder, f3);
  245. FMVector4 f4 = FUStringConversion::ToVector4(&c);
  246. f4 = FUStringConversion::ToVector4(&fc);
  247. FUStringConversion::ToString(sbuilder, f4);
  248. FUStringConversion::ToString(fbuilder, f4);
  249. BooleanList bl;
  250. FUStringConversion::ToBooleanList(c, bl);
  251. FUStringConversion::ToBooleanList(fc, bl);
  252. Int32List il;
  253. FUStringConversion::ToInt32List(c, il);
  254. FUStringConversion::ToInt32List(fc, il);
  255. FUStringConversion::ToString(fbuilder, il);
  256. FUStringConversion::ToString(sbuilder, il);
  257. UInt32List ul;
  258. FUStringConversion::ToUInt32List(c, ul);
  259. FUStringConversion::ToUInt32List(fc, ul);
  260. FUStringConversion::ToString(fbuilder, ul);
  261. FUStringConversion::ToString(sbuilder, ul);
  262. FloatList fl;
  263. FUStringConversion::ToFloatList(c, fl);
  264. FUStringConversion::ToFloatList(fc, fl);
  265. FUStringConversion::ToString(fbuilder, fl);
  266. FUStringConversion::ToString(sbuilder, fl);
  267. FMVector2List f2l;
  268. FUStringConversion::ToVector2List(c, f2l);
  269. FUStringConversion::ToVector2List(fc, f2l);
  270. FMVector3List f3l;
  271. FUStringConversion::ToVector3List(c, f3l);
  272. FUStringConversion::ToVector3List(fc, f3l);
  273. FMVector4List f4l;
  274. FUStringConversion::ToVector4List(c, f4l);
  275. FUStringConversion::ToVector4List(fc, f4l);
  276. FMMatrix44List m44l;
  277. FUStringConversion::ToMatrixList(c, m44l);
  278. FUStringConversion::ToMatrixList(fc, m44l);
  279. fm::pvector<FloatList> pfl;
  280. FUStringConversion::ToInterleavedFloatList(c, pfl);
  281. FUStringConversion::ToInterleavedFloatList(fc, pfl);
  282. fm::pvector<UInt32List> pul;
  283. FUStringConversion::ToInterleavedUInt32List(c, pul);
  284. FUStringConversion::ToInterleavedUInt32List(fc, pul);
  285. }