webruby 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/rake/mruby.rake +1 -0
- data/modules/emscripten/AUTHORS +7 -0
- data/modules/emscripten/LICENSE +26 -0
- data/modules/emscripten/emcc +58 -20
- data/modules/emscripten/emlink.py +2 -265
- data/modules/emscripten/emscripten.py +38 -18
- data/modules/emscripten/scons-tools/emscripten.py +11 -6
- data/modules/emscripten/scons-tools/llvm.py +4 -3
- data/modules/emscripten/src/analyzer.js +32 -13
- data/modules/emscripten/src/embind/embind.js +13 -13
- data/modules/emscripten/src/embind/emval.js +8 -7
- data/modules/emscripten/src/intertyper.js +10 -0
- data/modules/emscripten/src/jsifier.js +28 -6
- data/modules/emscripten/src/library.js +2949 -1322
- data/modules/emscripten/src/library_browser.js +27 -23
- data/modules/emscripten/src/library_egl.js +7 -2
- data/modules/emscripten/src/library_gl.js +15 -2
- data/modules/emscripten/src/library_glut.js +1 -1
- data/modules/emscripten/src/library_jansson.js +1 -1
- data/modules/emscripten/src/library_openal.js +464 -132
- data/modules/emscripten/src/library_path.js +134 -0
- data/modules/emscripten/src/library_sdl.js +222 -50
- data/modules/emscripten/src/modules.js +22 -5
- data/modules/emscripten/src/parseTools.js +13 -2
- data/modules/emscripten/src/postamble.js +60 -34
- data/modules/emscripten/src/preamble.js +67 -18
- data/modules/emscripten/src/relooper/Relooper.cpp +1 -1
- data/modules/emscripten/src/runtime.js +12 -2
- data/modules/emscripten/src/settings.js +869 -826
- data/modules/emscripten/src/shell.js +63 -51
- data/modules/emscripten/src/utility.js +6 -0
- data/modules/emscripten/system/include/bsd/sys/mman.h +1 -1
- data/modules/emscripten/system/include/emscripten/bind.h +28 -28
- data/modules/emscripten/system/include/libc/math.h +8 -0
- data/modules/emscripten/system/include/libc/sys/signal.h +3 -1
- data/modules/emscripten/system/include/libc/sys/stat.h +2 -1
- data/modules/emscripten/system/include/libc/sys/types.h +4 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +24 -0
- data/modules/emscripten/system/include/libcxx/__bit_reference +27 -8
- data/modules/emscripten/system/include/libcxx/__config +62 -15
- data/modules/emscripten/system/include/libcxx/__debug +5 -1
- data/modules/emscripten/system/include/libcxx/__functional_03 +24 -24
- data/modules/emscripten/system/include/libcxx/__functional_base +22 -4
- data/modules/emscripten/system/include/libcxx/__hash_table +566 -54
- data/modules/emscripten/system/include/libcxx/__locale +11 -3
- data/modules/emscripten/system/include/libcxx/__split_buffer +6 -6
- data/modules/emscripten/system/include/libcxx/__std_stream +58 -30
- data/modules/emscripten/system/include/libcxx/__tree +58 -51
- data/modules/emscripten/system/include/libcxx/__tuple +9 -9
- data/modules/emscripten/system/include/libcxx/algorithm +223 -13
- data/modules/emscripten/system/include/libcxx/array +18 -17
- data/modules/emscripten/system/include/libcxx/atomic +15 -5
- data/modules/emscripten/system/include/libcxx/cctype +2 -2
- data/modules/emscripten/system/include/libcxx/chrono +131 -36
- data/modules/emscripten/system/include/libcxx/cmath +41 -36
- data/modules/emscripten/system/include/libcxx/complex +49 -49
- data/modules/emscripten/system/include/libcxx/cstdio +2 -2
- data/modules/emscripten/system/include/libcxx/cstdlib +5 -5
- data/modules/emscripten/system/include/libcxx/cstring +2 -2
- data/modules/emscripten/system/include/libcxx/cwchar +22 -13
- data/modules/emscripten/system/include/libcxx/deque +27 -14
- data/modules/emscripten/system/include/libcxx/forward_list +36 -35
- data/modules/emscripten/system/include/libcxx/fstream +16 -0
- data/modules/emscripten/system/include/libcxx/functional +348 -23
- data/modules/emscripten/system/include/libcxx/future +66 -0
- data/modules/emscripten/system/include/libcxx/ios +27 -0
- data/modules/emscripten/system/include/libcxx/istream +2 -4
- data/modules/emscripten/system/include/libcxx/iterator +17 -9
- data/modules/emscripten/system/include/libcxx/limits +2 -2
- data/modules/emscripten/system/include/libcxx/list +165 -105
- data/modules/emscripten/system/include/libcxx/locale +154 -43
- data/modules/emscripten/system/include/libcxx/map +165 -224
- data/modules/emscripten/system/include/libcxx/memory +113 -54
- data/modules/emscripten/system/include/libcxx/random +2 -29
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +60 -15
- data/modules/emscripten/system/include/libcxx/sstream +124 -40
- data/modules/emscripten/system/include/libcxx/string +345 -182
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +3 -3
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -2
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +3 -3
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +10 -11
- data/modules/emscripten/system/include/libcxx/thread +2 -2
- data/modules/emscripten/system/include/libcxx/tuple +134 -65
- data/modules/emscripten/system/include/libcxx/type_traits +232 -24
- data/modules/emscripten/system/include/libcxx/unordered_map +314 -161
- data/modules/emscripten/system/include/libcxx/unordered_set +160 -2
- data/modules/emscripten/system/include/libcxx/utility +225 -40
- data/modules/emscripten/system/include/libcxx/vector +52 -57
- data/modules/emscripten/system/include/net/if.h +20 -1
- data/modules/emscripten/system/include/net/netinet/in.h +69 -5
- data/modules/emscripten/system/include/netdb.h +36 -0
- data/modules/emscripten/system/include/sys/ioctl.h +55 -3
- data/modules/emscripten/system/include/sys/select.h +2 -0
- data/modules/emscripten/system/include/sys/sendfile.h +16 -0
- data/modules/emscripten/system/include/sys/socket.h +181 -35
- data/modules/emscripten/system/lib/dlmalloc.c +10 -12
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +19 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +25 -0
- data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +8 -0
- data/modules/emscripten/system/lib/libcextra.symbols +3 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +24 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +11 -9
- data/modules/emscripten/system/lib/libcxx/exception.cpp +9 -0
- data/modules/emscripten/system/lib/libcxx/hash.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +4 -4
- data/modules/emscripten/system/lib/libcxx/locale.cpp +91 -42
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +1 -1
- data/modules/emscripten/system/lib/libcxx/string.cpp +332 -491
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +4 -2
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +140 -41
- data/modules/emscripten/system/lib/libcxx/symbols +9 -256
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +16 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +12 -2
- data/modules/emscripten/third_party/stb_image.c +4673 -0
- data/modules/emscripten/tools/asm_module.py +273 -0
- data/modules/emscripten/tools/exec_llvm.py +2 -2
- data/modules/emscripten/tools/file_packager.py +36 -16
- data/modules/emscripten/tools/find_bigfuncs.py +9 -9
- data/modules/emscripten/tools/js-optimizer.js +485 -131
- data/modules/emscripten/tools/js_optimizer.py +22 -15
- data/modules/emscripten/tools/merge_asm.py +26 -0
- data/modules/emscripten/tools/nativize_llvm.py +2 -2
- data/modules/emscripten/tools/settings_template_readonly.py +1 -1
- data/modules/emscripten/tools/shared.py +63 -20
- data/modules/emscripten/tools/split_asm.py +30 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +686 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +263 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +747 -0
- data/modules/emscripten/tools/{test-js-optimizer-asm-outline.js → test-js-optimizer-asm-outline2.js} +1 -1
- data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +28 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +30 -0
- data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +4 -4
- data/modules/mruby/AUTHORS +1 -0
- data/modules/mruby/README.md +4 -2
- data/modules/mruby/build_config.rb +6 -6
- data/modules/mruby/doc/mrbgems/README.md +4 -4
- data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
- data/modules/mruby/include/mrbconf.h +3 -0
- data/modules/mruby/include/mruby/array.h +2 -2
- data/modules/mruby/include/mruby/class.h +4 -4
- data/modules/mruby/include/mruby/compile.h +1 -0
- data/modules/mruby/include/mruby/data.h +1 -1
- data/modules/mruby/include/mruby/hash.h +2 -2
- data/modules/mruby/include/mruby/irep.h +3 -2
- data/modules/mruby/include/mruby/proc.h +1 -1
- data/modules/mruby/include/mruby/range.h +1 -1
- data/modules/mruby/include/mruby/string.h +2 -2
- data/modules/mruby/include/mruby/value.h +43 -26
- data/modules/mruby/include/mruby.h +10 -2
- data/modules/mruby/minirake +2 -2
- data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +4 -1
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +32 -0
- data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +13 -5
- data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +10 -11
- data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +4 -0
- data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
- data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +4 -2
- data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +5 -7
- data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +2 -2
- data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +3 -3
- data/modules/mruby/mrbgems/mruby-object-ext/test/nil.rb +3 -3
- data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +1 -1
- data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +36 -37
- data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +8 -8
- data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +6 -6
- data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +6 -6
- data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +2 -2
- data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-time/src/time.c +2 -8
- data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -1
- data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +10 -10
- data/modules/mruby/mrblib/class.rb +15 -9
- data/modules/mruby/mrblib/string.rb +12 -0
- data/modules/mruby/src/array.c +4 -3
- data/modules/mruby/src/class.c +13 -8
- data/modules/mruby/src/codegen.c +9 -8
- data/modules/mruby/src/error.c +7 -5
- data/modules/mruby/src/error.h +1 -0
- data/modules/mruby/src/etc.c +1 -1
- data/modules/mruby/src/gc.c +163 -128
- data/modules/mruby/src/kernel.c +43 -15
- data/modules/mruby/src/numeric.c +9 -7
- data/modules/mruby/src/object.c +1 -1
- data/modules/mruby/src/parse.y +37 -19
- data/modules/mruby/src/range.c +10 -24
- data/modules/mruby/src/state.c +2 -6
- data/modules/mruby/src/string.c +0 -9
- data/modules/mruby/src/variable.c +2 -2
- data/modules/mruby/src/vm.c +12 -6
- data/modules/mruby/tasks/mrbgem_spec.rake +7 -0
- data/modules/mruby/tasks/mrbgems.rake +2 -1
- data/modules/mruby/tasks/mrbgems_test.rake +1 -1
- data/modules/mruby/tasks/mruby_build.rake +4 -3
- data/modules/mruby/tasks/mruby_build_commands.rake +6 -1
- data/modules/mruby/tasks/mruby_build_gem.rake +2 -2
- data/modules/mruby/tasks/toolchains/androideabi.rake +2 -0
- data/modules/mruby/test/assert.rb +2 -2
- data/modules/mruby/test/t/argumenterror.rb +3 -3
- data/modules/mruby/test/t/array.rb +55 -55
- data/modules/mruby/test/t/basicobject.rb +1 -1
- data/modules/mruby/test/t/bs_block.rb +12 -12
- data/modules/mruby/test/t/class.rb +21 -21
- data/modules/mruby/test/t/enumerable.rb +18 -18
- data/modules/mruby/test/t/exception.rb +20 -20
- data/modules/mruby/test/t/false.rb +3 -3
- data/modules/mruby/test/t/float.rb +40 -40
- data/modules/mruby/test/t/gc.rb +10 -10
- data/modules/mruby/test/t/hash.rb +41 -41
- data/modules/mruby/test/t/indexerror.rb +2 -2
- data/modules/mruby/test/t/integer.rb +41 -41
- data/modules/mruby/test/t/kernel.rb +33 -33
- data/modules/mruby/test/t/literals.rb +82 -82
- data/modules/mruby/test/t/localjumperror.rb +1 -1
- data/modules/mruby/test/t/module.rb +170 -31
- data/modules/mruby/test/t/nameerror.rb +5 -5
- data/modules/mruby/test/t/nil.rb +2 -2
- data/modules/mruby/test/t/nomethoderror.rb +1 -1
- data/modules/mruby/test/t/numeric.rb +5 -5
- data/modules/mruby/test/t/object.rb +2 -2
- data/modules/mruby/test/t/proc.rb +8 -8
- data/modules/mruby/test/t/range.rb +9 -9
- data/modules/mruby/test/t/rangeerror.rb +2 -2
- data/modules/mruby/test/t/runtimeerror.rb +1 -1
- data/modules/mruby/test/t/standarderror.rb +2 -2
- data/modules/mruby/test/t/string.rb +100 -100
- data/modules/mruby/test/t/symbol.rb +5 -5
- data/modules/mruby/test/t/syntax.rb +15 -6
- data/modules/mruby/test/t/true.rb +3 -3
- data/modules/mruby/test/t/typeerror.rb +2 -2
- data/modules/mruby/tools/mrbc/mrbc.c +10 -4
- data/modules/mruby/travis_config.rb +1 -0
- data/scripts/gen_gems_config.rb +5 -1
- metadata +19 -4
- 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 <
|
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 <
|
12
|
-
#include <
|
13
|
-
#include <
|
14
|
-
#include <
|
15
|
-
#include <
|
16
|
-
#include <
|
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
|
-
|
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,
|
22
|
-
int result
|
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
|
-
|
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 =
|
30
|
-
if(
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
//
|
40
|
-
//
|
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
|
71
|
+
size_t src_size_bytes, size_t max_dest_chars, mbstate_t *__restrict ps )
|
43
72
|
{
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
//
|
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
|
120
|
+
size_t max_source_chars, size_t dst_size_bytes, mbstate_t *__restrict ps )
|
59
121
|
{
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
}
|