#include #include #include #include #include #include // This code tests that Unicode std::wstrings can be marshalled between C++ and JS. int main() { const char asciiString[] = "Hello world!"; char asciiString2[128] = {}; EM_ASM_INT({ var str = Module.AsciiToString($0); Module.print(str); Module.stringToAscii(str, $1); }, asciiString, asciiString2); assert(!strcmp(asciiString, asciiString2)); char asciiString3[128] = {}; EM_ASM_INT({ var str = Module.UTF8ToString($0); Module.print(str); var numBytesWritten = Module.stringToUTF8(str, $1, $2); if (numBytesWritten != 12) throw 'stringToUTF8 wrote an invalid length ' + numBytesWritten; }, asciiString, asciiString3, 128); assert(!strcmp(asciiString, asciiString3)); const char utf8String[] = u8"Hyv\u00E4\u00E4 p\u00E4iv\u00E4\u00E4! T\u00F6\u00F6\u00F6\u00F6t! abc\u2603\u20AC\U0002007C123 --- abc\u2603\u20AC\U0002007C123."; // U+2603 is snowman, U+20AC is the Euro sign, U+2007C is a Chinese Han character that looks like three raindrops. char utf8String2[128] = {}; EM_ASM_INT({ var str = Module.UTF8ToString($0); Module.print(str); var numBytesWritten = Module.stringToUTF8(str, $1, $2); if (numBytesWritten != 69) throw 'stringToUTF8 wrote an invalid length ' + numBytesWritten; }, utf8String, utf8String2, 128); assert(strlen(utf8String) == strlen(utf8String2)); for(int i = 0; i < strlen(utf8String)+1; ++i) if (utf8String[i] != utf8String2[i]) printf("i=%d:%u,%u\n", i, (unsigned int)(unsigned char)utf8String[i], (unsigned int)(unsigned char)utf8String2[i]); assert(!strcmp(utf8String, utf8String2)); // Test that text gets properly cut off if output buffer is too small. EM_ASM_INT({ var str = Module.UTF8ToString($0); Module.print(str); var numBytesWritten = Module.stringToUTF8(str, $1, $2); if (numBytesWritten != 9) throw 'stringToUTF8 wrote an invalid length ' + numBytesWritten; }, utf8String, utf8String2, 10); assert(strlen(utf8String2) == 9); // Zero-length string. EM_ASM_INT({ var str = Module.UTF8ToString($0); Module.print(str); var numBytesWritten = Module.stringToUTF8(str, $1, $2); if (numBytesWritten != 0) throw 'stringToUTF8 wrote an invalid length ' + numBytesWritten; }, utf8String, utf8String2, 1); assert(utf8String2[0] == 0); // No bytes output. utf8String2[0] = 'X'; EM_ASM_INT({ var str = Module.UTF8ToString($0); Module.print(str); var numBytesWritten = Module.stringToUTF8(str, $1, $2); if (numBytesWritten != 0) throw 'stringToUTF8 wrote an invalid length ' + numBytesWritten; }, utf8String, utf8String2, 0); assert(utf8String2[0] == 'X'); printf("OK.\n"); }