webruby 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/rake/mruby.rake +1 -0
  3. data/modules/emscripten/AUTHORS +7 -0
  4. data/modules/emscripten/LICENSE +26 -0
  5. data/modules/emscripten/emcc +58 -20
  6. data/modules/emscripten/emlink.py +2 -265
  7. data/modules/emscripten/emscripten.py +38 -18
  8. data/modules/emscripten/scons-tools/emscripten.py +11 -6
  9. data/modules/emscripten/scons-tools/llvm.py +4 -3
  10. data/modules/emscripten/src/analyzer.js +32 -13
  11. data/modules/emscripten/src/embind/embind.js +13 -13
  12. data/modules/emscripten/src/embind/emval.js +8 -7
  13. data/modules/emscripten/src/intertyper.js +10 -0
  14. data/modules/emscripten/src/jsifier.js +28 -6
  15. data/modules/emscripten/src/library.js +2949 -1322
  16. data/modules/emscripten/src/library_browser.js +27 -23
  17. data/modules/emscripten/src/library_egl.js +7 -2
  18. data/modules/emscripten/src/library_gl.js +15 -2
  19. data/modules/emscripten/src/library_glut.js +1 -1
  20. data/modules/emscripten/src/library_jansson.js +1 -1
  21. data/modules/emscripten/src/library_openal.js +464 -132
  22. data/modules/emscripten/src/library_path.js +134 -0
  23. data/modules/emscripten/src/library_sdl.js +222 -50
  24. data/modules/emscripten/src/modules.js +22 -5
  25. data/modules/emscripten/src/parseTools.js +13 -2
  26. data/modules/emscripten/src/postamble.js +60 -34
  27. data/modules/emscripten/src/preamble.js +67 -18
  28. data/modules/emscripten/src/relooper/Relooper.cpp +1 -1
  29. data/modules/emscripten/src/runtime.js +12 -2
  30. data/modules/emscripten/src/settings.js +869 -826
  31. data/modules/emscripten/src/shell.js +63 -51
  32. data/modules/emscripten/src/utility.js +6 -0
  33. data/modules/emscripten/system/include/bsd/sys/mman.h +1 -1
  34. data/modules/emscripten/system/include/emscripten/bind.h +28 -28
  35. data/modules/emscripten/system/include/libc/math.h +8 -0
  36. data/modules/emscripten/system/include/libc/sys/signal.h +3 -1
  37. data/modules/emscripten/system/include/libc/sys/stat.h +2 -1
  38. data/modules/emscripten/system/include/libc/sys/types.h +4 -0
  39. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +24 -0
  40. data/modules/emscripten/system/include/libcxx/__bit_reference +27 -8
  41. data/modules/emscripten/system/include/libcxx/__config +62 -15
  42. data/modules/emscripten/system/include/libcxx/__debug +5 -1
  43. data/modules/emscripten/system/include/libcxx/__functional_03 +24 -24
  44. data/modules/emscripten/system/include/libcxx/__functional_base +22 -4
  45. data/modules/emscripten/system/include/libcxx/__hash_table +566 -54
  46. data/modules/emscripten/system/include/libcxx/__locale +11 -3
  47. data/modules/emscripten/system/include/libcxx/__split_buffer +6 -6
  48. data/modules/emscripten/system/include/libcxx/__std_stream +58 -30
  49. data/modules/emscripten/system/include/libcxx/__tree +58 -51
  50. data/modules/emscripten/system/include/libcxx/__tuple +9 -9
  51. data/modules/emscripten/system/include/libcxx/algorithm +223 -13
  52. data/modules/emscripten/system/include/libcxx/array +18 -17
  53. data/modules/emscripten/system/include/libcxx/atomic +15 -5
  54. data/modules/emscripten/system/include/libcxx/cctype +2 -2
  55. data/modules/emscripten/system/include/libcxx/chrono +131 -36
  56. data/modules/emscripten/system/include/libcxx/cmath +41 -36
  57. data/modules/emscripten/system/include/libcxx/complex +49 -49
  58. data/modules/emscripten/system/include/libcxx/cstdio +2 -2
  59. data/modules/emscripten/system/include/libcxx/cstdlib +5 -5
  60. data/modules/emscripten/system/include/libcxx/cstring +2 -2
  61. data/modules/emscripten/system/include/libcxx/cwchar +22 -13
  62. data/modules/emscripten/system/include/libcxx/deque +27 -14
  63. data/modules/emscripten/system/include/libcxx/forward_list +36 -35
  64. data/modules/emscripten/system/include/libcxx/fstream +16 -0
  65. data/modules/emscripten/system/include/libcxx/functional +348 -23
  66. data/modules/emscripten/system/include/libcxx/future +66 -0
  67. data/modules/emscripten/system/include/libcxx/ios +27 -0
  68. data/modules/emscripten/system/include/libcxx/istream +2 -4
  69. data/modules/emscripten/system/include/libcxx/iterator +17 -9
  70. data/modules/emscripten/system/include/libcxx/limits +2 -2
  71. data/modules/emscripten/system/include/libcxx/list +165 -105
  72. data/modules/emscripten/system/include/libcxx/locale +154 -43
  73. data/modules/emscripten/system/include/libcxx/map +165 -224
  74. data/modules/emscripten/system/include/libcxx/memory +113 -54
  75. data/modules/emscripten/system/include/libcxx/random +2 -29
  76. data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
  77. data/modules/emscripten/system/include/libcxx/regex +60 -15
  78. data/modules/emscripten/system/include/libcxx/sstream +124 -40
  79. data/modules/emscripten/system/include/libcxx/string +345 -182
  80. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +3 -3
  81. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -2
  82. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +3 -3
  83. data/modules/emscripten/system/include/libcxx/support/win32/support.h +10 -11
  84. data/modules/emscripten/system/include/libcxx/thread +2 -2
  85. data/modules/emscripten/system/include/libcxx/tuple +134 -65
  86. data/modules/emscripten/system/include/libcxx/type_traits +232 -24
  87. data/modules/emscripten/system/include/libcxx/unordered_map +314 -161
  88. data/modules/emscripten/system/include/libcxx/unordered_set +160 -2
  89. data/modules/emscripten/system/include/libcxx/utility +225 -40
  90. data/modules/emscripten/system/include/libcxx/vector +52 -57
  91. data/modules/emscripten/system/include/net/if.h +20 -1
  92. data/modules/emscripten/system/include/net/netinet/in.h +69 -5
  93. data/modules/emscripten/system/include/netdb.h +36 -0
  94. data/modules/emscripten/system/include/sys/ioctl.h +55 -3
  95. data/modules/emscripten/system/include/sys/select.h +2 -0
  96. data/modules/emscripten/system/include/sys/sendfile.h +16 -0
  97. data/modules/emscripten/system/include/sys/socket.h +181 -35
  98. data/modules/emscripten/system/lib/dlmalloc.c +10 -12
  99. data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +19 -0
  100. data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +25 -0
  101. data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +8 -0
  102. data/modules/emscripten/system/lib/libcextra.symbols +3 -0
  103. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +24 -0
  104. data/modules/emscripten/system/lib/libcxx/debug.cpp +11 -9
  105. data/modules/emscripten/system/lib/libcxx/exception.cpp +9 -0
  106. data/modules/emscripten/system/lib/libcxx/hash.cpp +6 -0
  107. data/modules/emscripten/system/lib/libcxx/iostream.cpp +4 -4
  108. data/modules/emscripten/system/lib/libcxx/locale.cpp +91 -42
  109. data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
  110. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +1 -1
  111. data/modules/emscripten/system/lib/libcxx/string.cpp +332 -491
  112. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +4 -2
  113. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +140 -41
  114. data/modules/emscripten/system/lib/libcxx/symbols +9 -256
  115. data/modules/emscripten/system/lib/libcxx/system_error.cpp +3 -0
  116. data/modules/emscripten/system/lib/libcxx/thread.cpp +16 -3
  117. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +12 -2
  118. data/modules/emscripten/third_party/stb_image.c +4673 -0
  119. data/modules/emscripten/tools/asm_module.py +273 -0
  120. data/modules/emscripten/tools/exec_llvm.py +2 -2
  121. data/modules/emscripten/tools/file_packager.py +36 -16
  122. data/modules/emscripten/tools/find_bigfuncs.py +9 -9
  123. data/modules/emscripten/tools/js-optimizer.js +485 -131
  124. data/modules/emscripten/tools/js_optimizer.py +22 -15
  125. data/modules/emscripten/tools/merge_asm.py +26 -0
  126. data/modules/emscripten/tools/nativize_llvm.py +2 -2
  127. data/modules/emscripten/tools/settings_template_readonly.py +1 -1
  128. data/modules/emscripten/tools/shared.py +63 -20
  129. data/modules/emscripten/tools/split_asm.py +30 -0
  130. data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +686 -0
  131. data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +263 -0
  132. data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +747 -0
  133. data/modules/emscripten/tools/{test-js-optimizer-asm-outline.js → test-js-optimizer-asm-outline2.js} +1 -1
  134. data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +28 -0
  135. data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +30 -0
  136. data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +4 -4
  137. data/modules/mruby/AUTHORS +1 -0
  138. data/modules/mruby/README.md +4 -2
  139. data/modules/mruby/build_config.rb +6 -6
  140. data/modules/mruby/doc/mrbgems/README.md +4 -4
  141. data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
  142. data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
  143. data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
  144. data/modules/mruby/include/mrbconf.h +3 -0
  145. data/modules/mruby/include/mruby/array.h +2 -2
  146. data/modules/mruby/include/mruby/class.h +4 -4
  147. data/modules/mruby/include/mruby/compile.h +1 -0
  148. data/modules/mruby/include/mruby/data.h +1 -1
  149. data/modules/mruby/include/mruby/hash.h +2 -2
  150. data/modules/mruby/include/mruby/irep.h +3 -2
  151. data/modules/mruby/include/mruby/proc.h +1 -1
  152. data/modules/mruby/include/mruby/range.h +1 -1
  153. data/modules/mruby/include/mruby/string.h +2 -2
  154. data/modules/mruby/include/mruby/value.h +43 -26
  155. data/modules/mruby/include/mruby.h +10 -2
  156. data/modules/mruby/minirake +2 -2
  157. data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -1
  158. data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +4 -1
  159. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +32 -0
  160. data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
  161. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +13 -5
  162. data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -1
  163. data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +10 -11
  164. data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -1
  165. data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +4 -0
  166. data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
  167. data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -1
  168. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +4 -2
  169. data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +1 -1
  170. data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +5 -7
  171. data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -1
  172. data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -1
  173. data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +2 -2
  174. data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
  175. data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +3 -3
  176. data/modules/mruby/mrbgems/mruby-object-ext/test/nil.rb +3 -3
  177. data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +1 -1
  178. data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -1
  179. data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +36 -37
  180. data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -1
  181. data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -1
  182. data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +8 -8
  183. data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -1
  184. data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -1
  185. data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +6 -6
  186. data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -1
  187. data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -1
  188. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +6 -6
  189. data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -1
  190. data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -1
  191. data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +2 -2
  192. data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -1
  193. data/modules/mruby/mrbgems/mruby-time/src/time.c +2 -8
  194. data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -1
  195. data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +10 -10
  196. data/modules/mruby/mrblib/class.rb +15 -9
  197. data/modules/mruby/mrblib/string.rb +12 -0
  198. data/modules/mruby/src/array.c +4 -3
  199. data/modules/mruby/src/class.c +13 -8
  200. data/modules/mruby/src/codegen.c +9 -8
  201. data/modules/mruby/src/error.c +7 -5
  202. data/modules/mruby/src/error.h +1 -0
  203. data/modules/mruby/src/etc.c +1 -1
  204. data/modules/mruby/src/gc.c +163 -128
  205. data/modules/mruby/src/kernel.c +43 -15
  206. data/modules/mruby/src/numeric.c +9 -7
  207. data/modules/mruby/src/object.c +1 -1
  208. data/modules/mruby/src/parse.y +37 -19
  209. data/modules/mruby/src/range.c +10 -24
  210. data/modules/mruby/src/state.c +2 -6
  211. data/modules/mruby/src/string.c +0 -9
  212. data/modules/mruby/src/variable.c +2 -2
  213. data/modules/mruby/src/vm.c +12 -6
  214. data/modules/mruby/tasks/mrbgem_spec.rake +7 -0
  215. data/modules/mruby/tasks/mrbgems.rake +2 -1
  216. data/modules/mruby/tasks/mrbgems_test.rake +1 -1
  217. data/modules/mruby/tasks/mruby_build.rake +4 -3
  218. data/modules/mruby/tasks/mruby_build_commands.rake +6 -1
  219. data/modules/mruby/tasks/mruby_build_gem.rake +2 -2
  220. data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
  221. data/modules/mruby/test/assert.rb +2 -2
  222. data/modules/mruby/test/t/argumenterror.rb +3 -3
  223. data/modules/mruby/test/t/array.rb +55 -55
  224. data/modules/mruby/test/t/basicobject.rb +1 -1
  225. data/modules/mruby/test/t/bs_block.rb +12 -12
  226. data/modules/mruby/test/t/class.rb +21 -21
  227. data/modules/mruby/test/t/enumerable.rb +18 -18
  228. data/modules/mruby/test/t/exception.rb +20 -20
  229. data/modules/mruby/test/t/false.rb +3 -3
  230. data/modules/mruby/test/t/float.rb +40 -40
  231. data/modules/mruby/test/t/gc.rb +10 -10
  232. data/modules/mruby/test/t/hash.rb +41 -41
  233. data/modules/mruby/test/t/indexerror.rb +2 -2
  234. data/modules/mruby/test/t/integer.rb +41 -41
  235. data/modules/mruby/test/t/kernel.rb +33 -33
  236. data/modules/mruby/test/t/literals.rb +82 -82
  237. data/modules/mruby/test/t/localjumperror.rb +1 -1
  238. data/modules/mruby/test/t/module.rb +170 -31
  239. data/modules/mruby/test/t/nameerror.rb +5 -5
  240. data/modules/mruby/test/t/nil.rb +2 -2
  241. data/modules/mruby/test/t/nomethoderror.rb +1 -1
  242. data/modules/mruby/test/t/numeric.rb +5 -5
  243. data/modules/mruby/test/t/object.rb +2 -2
  244. data/modules/mruby/test/t/proc.rb +8 -8
  245. data/modules/mruby/test/t/range.rb +9 -9
  246. data/modules/mruby/test/t/rangeerror.rb +2 -2
  247. data/modules/mruby/test/t/runtimeerror.rb +1 -1
  248. data/modules/mruby/test/t/standarderror.rb +2 -2
  249. data/modules/mruby/test/t/string.rb +100 -100
  250. data/modules/mruby/test/t/symbol.rb +5 -5
  251. data/modules/mruby/test/t/syntax.rb +15 -6
  252. data/modules/mruby/test/t/true.rb +3 -3
  253. data/modules/mruby/test/t/typeerror.rb +2 -2
  254. data/modules/mruby/tools/mrbc/mrbc.c +10 -4
  255. data/modules/mruby/travis_config.rb +1 -0
  256. data/scripts/gen_gems_config.rb +5 -1
  257. metadata +19 -4
  258. data/modules/emscripten/tools/test-js-optimizer-asm-outline-output.js +0 -570
@@ -9,8 +9,8 @@
9
9
  //===----------------------------------------------------------------------===//
10
10
 
11
11
  #include "support/win32/locale_win32.h"
12
-
13
- #include <stdarg.h> // va_start, va_end
12
+ #include <cstdarg> // va_start, va_end
13
+ #include <cwchar> // mbstate_t
14
14
 
15
15
  // FIXME: base currently unused. Needs manual work to construct the new locale
16
16
  locale_t newlocale( int mask, const char * locale, locale_t /*base*/ )
@@ -20,6 +20,8 @@ locale_t newlocale( int mask, const char * locale, locale_t /*base*/ )
20
20
  locale_t uselocale( locale_t newloc )
21
21
  {
22
22
  locale_t old_locale = _get_current_locale();
23
+ if ( newloc == NULL )
24
+ return old_locale;
23
25
  // uselocale sets the thread's locale by definition, so unconditionally use thread-local locale
24
26
  _configthreadlocale( _ENABLE_PER_THREAD_LOCALE );
25
27
  // uselocale sets all categories
@@ -8,63 +8,162 @@
8
8
  //
9
9
  //===----------------------------------------------------------------------===//
10
10
 
11
- #include <support/win32/support.h>
12
- #include <stdarg.h> // va_start, va_end
13
- #include <stddef.h> // size_t
14
- #include <stdlib.h> // malloc
15
- #include <stdio.h> // vsprintf, vsnprintf
16
- #include <string.h> // strcpy, wcsncpy
11
+ #include <cstdarg> // va_start, va_end
12
+ #include <cstddef> // size_t
13
+ #include <cstdlib> // malloc
14
+ #include <cstdio> // vsprintf, vsnprintf
15
+ #include <cstring> // strcpy, wcsncpy
16
+ #include <cwchar> // mbstate_t
17
+ #include <memory> // unique_ptr
17
18
 
18
- int asprintf(char **sptr, const char *__restrict fmt, ...)
19
+ namespace { // Private
20
+
21
+ struct free_deleter {
22
+ inline void operator()(char* p) { free(p); }
23
+ };
24
+ }
25
+ // Some of these functions aren't standard or if they conform, the name does not.
26
+
27
+ int asprintf(char **sptr, const char *__restrict format, ...)
19
28
  {
20
29
  va_list ap;
21
- va_start(ap, fmt);
22
- int result = vasprintf(sptr, fmt, ap);
30
+ va_start(ap, format);
31
+ int result;
32
+ #ifndef _LIBCPP_NO_EXCEPTIONS
33
+ try {
34
+ #endif
35
+ result = vasprintf(sptr, format, ap);
36
+ #ifndef _LIBCPP_NO_EXCEPTIONS
37
+ } catch( ... ) {
38
+ va_end(ap);
39
+ throw;
40
+ }
41
+ #endif
23
42
  va_end(ap);
24
43
  return result;
25
44
  }
26
- int vasprintf( char **sptr, const char *__restrict fmt, va_list ap )
45
+
46
+ // Like sprintf, but when return value >= 0 it returns a pointer to a malloc'd string in *sptr.
47
+ // If return >= 0, use free to delete *sptr.
48
+ int vasprintf( char **sptr, const char *__restrict format, va_list ap )
27
49
  {
28
50
  *sptr = NULL;
29
- int count = vsnprintf( *sptr, 0, fmt, ap );
30
- if( (count >= 0) && ((*sptr = (char*)malloc(count+1)) != NULL) )
31
- {
32
- vsprintf( *sptr, fmt, ap );
33
- sptr[count] = '\0';
51
+ int count = _vsnprintf( NULL, 0, format, ap ); // Query the buffer size required.
52
+ if( count >= 0 ) {
53
+ std::unique_ptr<char, free_deleter> p( static_cast<char*>(malloc(count+1)) );
54
+ if ( ! p )
55
+ return -1;
56
+ if ( vsnprintf( p.get(), count+1, format, ap ) == count ) // We should have used exactly what was required.
57
+ *sptr = p.release();
58
+ else // Otherwise something is wrong, likely a bug in vsnprintf. If so free the memory and report the error.
59
+ return -1; // Pointer will get automaticlaly deleted.
34
60
  }
35
61
 
36
62
  return count;
37
63
  }
38
64
 
39
- // FIXME: use wcrtomb and avoid copy
40
- // use mbsrtowcs which is available, first copy first nwc elements of src
65
+ // Returns >= 0: the number of wide characters found in the multi byte sequence src (of src_size_bytes),
66
+ // that fit in the buffer dst (of max_dest_chars elements size). The count returned excludes the null terminator.
67
+ // When dst is NULL, no characters are copied and no "out" parameters are updated.
68
+ // Returns (size_t) -1: an incomplete sequence encountered.
69
+ // Leaves *src pointing the next character to convert or NULL if a null character was converted from *src.
41
70
  size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src,
42
- size_t nmc, size_t len, mbstate_t *__restrict ps )
71
+ size_t src_size_bytes, size_t max_dest_chars, mbstate_t *__restrict ps )
43
72
  {
44
- char* local_src = new char[nmc+1];
45
- char* nmcsrc = local_src;
46
- strncpy( nmcsrc, *src, nmc );
47
- nmcsrc[nmc] = '\0';
48
- const size_t result = mbsrtowcs( dst, const_cast<const char **>(&nmcsrc), len, ps );
49
- // propagate error
50
- if( nmcsrc == NULL )
51
- *src = NULL;
52
- delete[] local_src;
53
- return result;
73
+ const size_t terminated_sequence = static_cast<size_t>(0);
74
+ //const size_t invalid_sequence = static_cast<size_t>(-1);
75
+ const size_t incomplete_sequence = static_cast< size_t>(-2);
76
+
77
+ size_t dest_converted = 0;
78
+ size_t source_converted = 0;
79
+ size_t source_remaining = src_size_bytes;
80
+ size_t result = 0;
81
+ bool have_result = false;
82
+
83
+ while ( source_remaining ) {
84
+ if ( dst && dest_converted >= max_dest_chars )
85
+ break;
86
+ // Converts one multi byte character.
87
+ // if result > 0, it's the size in bytes of that character.
88
+ // othewise if result is zero it indicates the null character has been found.
89
+ // otherwise it's an error and errno may be set.
90
+ size_t char_size = mbrtowc( dst ? dst + dest_converted : NULL, *src + source_converted, source_remaining, ps );
91
+ // Don't do anything to change errno from here on.
92
+ if ( char_size > 0 ) {
93
+ source_remaining -= char_size;
94
+ source_converted += char_size;
95
+ ++dest_converted;
96
+ continue;
97
+ }
98
+ result = char_size;
99
+ have_result = true;
100
+ break;
101
+ }
102
+ if ( dst ) {
103
+ if ( have_result && result == terminated_sequence )
104
+ *src = NULL;
105
+ else
106
+ *src += source_converted;
107
+ }
108
+ if ( have_result && result != terminated_sequence && result != incomplete_sequence )
109
+ return static_cast<size_t>(-1);
110
+
111
+ return dest_converted;
54
112
  }
55
- // FIXME: use wcrtomb and avoid copy
56
- // use wcsrtombs which is available, first copy first nwc elements of src
113
+
114
+ // Converts max_source_chars from the wide character buffer pointer to by *src,
115
+ // into the multi byte character sequence buffer stored at dst which must be dst_size_bytes bytes in size.
116
+ // Returns >= 0: the number of bytes in the sequence sequence converted frome *src, excluding the null terminator.
117
+ // Returns size_t(-1) if an error occurs, also sets errno.
118
+ // If dst is NULL dst_size_bytes is ignored and no bytes are copied to dst and no "out" parameters are updated.
57
119
  size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src,
58
- size_t nwc, size_t len, mbstate_t *__restrict ps )
120
+ size_t max_source_chars, size_t dst_size_bytes, mbstate_t *__restrict ps )
59
121
  {
60
- wchar_t* local_src = new wchar_t[nwc];
61
- wchar_t* nwcsrc = local_src;
62
- wcsncpy(nwcsrc, *src, nwc);
63
- nwcsrc[nwc] = '\0';
64
- const size_t result = wcsrtombs( dst, const_cast<const wchar_t **>(&nwcsrc), len, ps );
65
- // propogate error
66
- if( nwcsrc == NULL )
67
- *src = NULL;
68
- delete[] nwcsrc;
69
- return result;
122
+ //const size_t invalid_sequence = static_cast<size_t>(-1);
123
+
124
+ size_t source_converted = 0;
125
+ size_t dest_converted = 0;
126
+ size_t dest_remaining = dst_size_bytes;
127
+ size_t char_size = 0;
128
+ const errno_t no_error = ( errno_t) 0;
129
+ errno_t result = ( errno_t ) 0;
130
+ bool have_result = false;
131
+ bool terminator_found = false;
132
+
133
+ while ( source_converted != max_source_chars ) {
134
+ if ( ! dest_remaining )
135
+ break;
136
+ wchar_t c = (*src)[source_converted];
137
+ if ( dst )
138
+ result = wcrtomb_s( &char_size, dst + dest_converted, dest_remaining, c, ps);
139
+ else
140
+ result = wcrtomb_s( &char_size, NULL, 0, c, ps);
141
+ // If result is zero there is no error and char_size contains the size of the multi-byte-sequence converted.
142
+ // Otherwise result indicates an errno type error.
143
+ if ( result == no_error ) {
144
+ if ( c == L'\0' ) {
145
+ terminator_found = true;
146
+ break;
147
+ }
148
+ ++source_converted;
149
+ if ( dst )
150
+ dest_remaining -= char_size;
151
+ dest_converted += char_size;
152
+ continue;
153
+ }
154
+ have_result = true;
155
+ break;
156
+ }
157
+ if ( dst ) {
158
+ if ( terminator_found )
159
+ *src = NULL;
160
+ else
161
+ *src = *src + source_converted;
162
+ }
163
+ if ( have_result && result != no_error ) {
164
+ errno = result;
165
+ return static_cast<size_t>(-1);
166
+ }
167
+
168
+ return dest_converted;
70
169
  }