EAScanf.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <EAStdC/internal/Config.h>
  5. #include <EAStdC/EAScanf.h>
  6. #include <EAStdC/internal/ScanfCore.h>
  7. namespace EA
  8. {
  9. namespace StdC
  10. {
  11. ///////////////////////////////////////////////////////////////////////////////
  12. // char8_t functions
  13. ///////////////////////////////////////////////////////////////////////////////
  14. EASTDC_API int Cscanf(ReadFunction8 pReadFunction8, void* pContext, const char8_t* pFormat, ...)
  15. {
  16. va_list arguments;
  17. va_start(arguments, pFormat);
  18. return ScanfLocal::VscanfCore(pReadFunction8, pContext, pFormat, arguments);
  19. }
  20. EASTDC_API int Fscanf(FILE* pFile, const char8_t* pFormat, ...)
  21. {
  22. va_list arguments;
  23. va_start(arguments, pFormat);
  24. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader8, pFile, pFormat, arguments);
  25. }
  26. EASTDC_API int Scanf(const char8_t* pFormat, ...)
  27. {
  28. va_list arguments;
  29. va_start(arguments, pFormat);
  30. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader8, stdin, pFormat, arguments);
  31. }
  32. EASTDC_API int Sscanf(const char8_t* pDestination, const char8_t* pFormat, ...)
  33. {
  34. ScanfLocal::SscanfContext8 sc(pDestination);
  35. va_list arguments;
  36. va_start(arguments, pFormat);
  37. return ScanfLocal::VscanfCore(ScanfLocal::StringReader8, &sc, pFormat, arguments);
  38. }
  39. EASTDC_API int Vcscanf(ReadFunction8 pReadFunction8, void* pContext, const char8_t* pFormat, va_list arguments)
  40. {
  41. return ScanfLocal::VscanfCore(pReadFunction8, pContext, pFormat, arguments);
  42. }
  43. EASTDC_API int Vfscanf(FILE* pFile, const char8_t* pFormat, va_list arguments)
  44. {
  45. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader8, pFile, pFormat, arguments);
  46. }
  47. EASTDC_API int Vscanf(const char8_t* pFormat, va_list arguments)
  48. {
  49. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader8, stdin, pFormat, arguments);
  50. }
  51. EASTDC_API int Vsscanf(const char8_t* pDestination, const char8_t* pFormat, va_list arguments)
  52. {
  53. ScanfLocal::SscanfContext8 sc(pDestination);
  54. return ScanfLocal::VscanfCore(ScanfLocal::StringReader8, &sc, pFormat, arguments);
  55. }
  56. ///////////////////////////////////////////////////////////////////////////////
  57. // char16_t functions
  58. ///////////////////////////////////////////////////////////////////////////////
  59. EASTDC_API int Cscanf(ReadFunction16 pReadFunction16, void* pContext, const char16_t* pFormat, ...)
  60. {
  61. va_list arguments;
  62. va_start(arguments, pFormat);
  63. return ScanfLocal::VscanfCore(pReadFunction16, pContext, pFormat, arguments);
  64. }
  65. EASTDC_API int Fscanf(FILE* pFile, const char16_t* pFormat, ...)
  66. {
  67. va_list arguments;
  68. va_start(arguments, pFormat);
  69. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader16, pFile, pFormat, arguments);
  70. }
  71. EASTDC_API int Scanf(const char16_t* pFormat, ...)
  72. {
  73. va_list arguments;
  74. va_start(arguments, pFormat);
  75. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader16, stdin, pFormat, arguments);
  76. }
  77. EASTDC_API int Sscanf(const char16_t* pDestination, const char16_t* pFormat, ...)
  78. {
  79. ScanfLocal::SscanfContext16 sc(pDestination);
  80. va_list arguments;
  81. va_start(arguments, pFormat);
  82. return ScanfLocal::VscanfCore(ScanfLocal::StringReader16, &sc, pFormat, arguments);
  83. }
  84. EASTDC_API int Vcscanf(ReadFunction16 pReadFunction16, void* pContext, const char16_t* pFormat, va_list arguments)
  85. {
  86. return ScanfLocal::VscanfCore(pReadFunction16, pContext, pFormat, arguments);
  87. }
  88. EASTDC_API int Vfscanf(FILE* pFile, const char16_t* pFormat, va_list arguments)
  89. {
  90. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader16, pFile, pFormat, arguments);
  91. }
  92. EASTDC_API int Vscanf(const char16_t* pFormat, va_list arguments)
  93. {
  94. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader16, stdin, pFormat, arguments);
  95. }
  96. EASTDC_API int Vsscanf(const char16_t* pDestination, const char16_t* pFormat, va_list arguments)
  97. {
  98. ScanfLocal::SscanfContext16 sc(pDestination);
  99. return ScanfLocal::VscanfCore(ScanfLocal::StringReader16, &sc, pFormat, arguments);
  100. }
  101. ///////////////////////////////////////////////////////////////////////////////
  102. // char32_t functions
  103. ///////////////////////////////////////////////////////////////////////////////
  104. EASTDC_API int Cscanf(ReadFunction32 pReadFunction32, void* pContext, const char32_t* pFormat, ...)
  105. {
  106. va_list arguments;
  107. va_start(arguments, pFormat);
  108. return ScanfLocal::VscanfCore(pReadFunction32, pContext, pFormat, arguments);
  109. }
  110. EASTDC_API int Fscanf(FILE* pFile, const char32_t* pFormat, ...)
  111. {
  112. va_list arguments;
  113. va_start(arguments, pFormat);
  114. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader32, pFile, pFormat, arguments);
  115. }
  116. EASTDC_API int Scanf(const char32_t* pFormat, ...)
  117. {
  118. va_list arguments;
  119. va_start(arguments, pFormat);
  120. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader32, stdin, pFormat, arguments);
  121. }
  122. EASTDC_API int Sscanf(const char32_t* pDestination, const char32_t* pFormat, ...)
  123. {
  124. ScanfLocal::SscanfContext32 sc(pDestination);
  125. va_list arguments;
  126. va_start(arguments, pFormat);
  127. return ScanfLocal::VscanfCore(ScanfLocal::StringReader32, &sc, pFormat, arguments);
  128. }
  129. EASTDC_API int Vcscanf(ReadFunction32 pReadFunction32, void* pContext, const char32_t* pFormat, va_list arguments)
  130. {
  131. return ScanfLocal::VscanfCore(pReadFunction32, pContext, pFormat, arguments);
  132. }
  133. EASTDC_API int Vfscanf(FILE* pFile, const char32_t* pFormat, va_list arguments)
  134. {
  135. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader32, pFile, pFormat, arguments);
  136. }
  137. EASTDC_API int Vscanf(const char32_t* pFormat, va_list arguments)
  138. {
  139. return ScanfLocal::VscanfCore(ScanfLocal::FILEReader32, stdin, pFormat, arguments);
  140. }
  141. EASTDC_API int Vsscanf(const char32_t* pDestination, const char32_t* pFormat, va_list arguments)
  142. {
  143. ScanfLocal::SscanfContext32 sc(pDestination);
  144. return ScanfLocal::VscanfCore(ScanfLocal::StringReader32, &sc, pFormat, arguments);
  145. }
  146. #if defined(EA_WCHAR_UNIQUE) && EA_WCHAR_UNIQUE
  147. EASTDC_API int Cscanf(ReadFunctionW pReadFunctionW, void* pContext, const wchar_t* pFormat, ...)
  148. {
  149. va_list arguments;
  150. va_start(arguments, pFormat);
  151. int result = Vcscanf(pReadFunctionW, pContext, pFormat, arguments);
  152. va_end(arguments);
  153. return result;
  154. }
  155. EASTDC_API int Fscanf(FILE* pFile, const wchar_t* pFormat, ...)
  156. {
  157. va_list arguments;
  158. va_start(arguments, pFormat);
  159. int result = Vfscanf(pFile, pFormat, arguments);
  160. va_end(arguments);
  161. return result;
  162. }
  163. EASTDC_API int Scanf(const wchar_t* pFormat, ...)
  164. {
  165. va_list arguments;
  166. va_start(arguments, pFormat);
  167. int result = Vscanf(pFormat, arguments);
  168. va_end(arguments);
  169. return result;
  170. }
  171. EASTDC_API int Sscanf(const wchar_t* pTextBuffer, const wchar_t* pFormat, ...)
  172. {
  173. va_list arguments;
  174. va_start(arguments, pFormat);
  175. int result = Vsscanf(pTextBuffer, pFormat, arguments);
  176. va_end(arguments);
  177. return result;
  178. }
  179. EASTDC_API int Vcscanf(ReadFunctionW pReadFunctionW, void* pContext, const wchar_t* pFormat, va_list arguments)
  180. {
  181. #if (EA_WCHAR_SIZE == 2)
  182. return Vcscanf(reinterpret_cast<ReadFunction16>(pReadFunctionW), pContext, reinterpret_cast<const char16_t *>(pFormat), arguments);
  183. #else
  184. return Vcscanf(reinterpret_cast<ReadFunction32>(pReadFunctionW), pContext, reinterpret_cast<const char32_t *>(pFormat), arguments);
  185. #endif
  186. }
  187. EASTDC_API int Vfscanf(FILE* pFile, const wchar_t* pFormat, va_list arguments)
  188. {
  189. #if (EA_WCHAR_SIZE == 2)
  190. return Vfscanf(pFile, reinterpret_cast<const char16_t *>(pFormat), arguments);
  191. #else
  192. return Vfscanf(pFile, reinterpret_cast<const char32_t *>(pFormat), arguments);
  193. #endif
  194. }
  195. EASTDC_API int Vscanf(const wchar_t* pFormat, va_list arguments)
  196. {
  197. #if (EA_WCHAR_SIZE == 2)
  198. return Vscanf(reinterpret_cast<const char16_t *>(pFormat), arguments);
  199. #else
  200. return Vscanf(reinterpret_cast<const char32_t *>(pFormat), arguments);
  201. #endif
  202. }
  203. EASTDC_API int Vsscanf(const wchar_t* pTextBuffer, const wchar_t* pFormat, va_list arguments)
  204. {
  205. #if (EA_WCHAR_SIZE == 2)
  206. return Vsscanf(reinterpret_cast<const char16_t *>(pTextBuffer), reinterpret_cast<const char16_t *>(pFormat), arguments);
  207. #else
  208. return Vsscanf(reinterpret_cast<const char32_t *>(pTextBuffer), reinterpret_cast<const char32_t *>(pFormat), arguments);
  209. #endif
  210. }
  211. #endif
  212. } // namespace StdC
  213. } // namespace EA