(str, outU8Array, outIdx, maxBytesToWrite)
| 758 | // Returns the number of bytes written, EXCLUDING the null terminator. |
| 759 | |
| 760 | function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) { |
| 761 | if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. |
| 762 | return 0; |
| 763 | |
| 764 | var startIdx = outIdx; |
| 765 | var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. |
| 766 | for (var i = 0; i < str.length; ++i) { |
| 767 | // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. |
| 768 | // See http://unicode.org/faq/utf_bom.html#utf16-3 |
| 769 | // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 |
| 770 | var u = str.charCodeAt(i); // possibly a lead surrogate |
| 771 | if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); |
| 772 | if (u <= 0x7F) { |
| 773 | if (outIdx >= endIdx) break; |
| 774 | outU8Array[outIdx++] = u; |
| 775 | } else if (u <= 0x7FF) { |
| 776 | if (outIdx + 1 >= endIdx) break; |
| 777 | outU8Array[outIdx++] = 0xC0 | (u >> 6); |
| 778 | outU8Array[outIdx++] = 0x80 | (u & 63); |
| 779 | } else if (u <= 0xFFFF) { |
| 780 | if (outIdx + 2 >= endIdx) break; |
| 781 | outU8Array[outIdx++] = 0xE0 | (u >> 12); |
| 782 | outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); |
| 783 | outU8Array[outIdx++] = 0x80 | (u & 63); |
| 784 | } else if (u <= 0x1FFFFF) { |
| 785 | if (outIdx + 3 >= endIdx) break; |
| 786 | outU8Array[outIdx++] = 0xF0 | (u >> 18); |
| 787 | outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); |
| 788 | outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); |
| 789 | outU8Array[outIdx++] = 0x80 | (u & 63); |
| 790 | } else if (u <= 0x3FFFFFF) { |
| 791 | if (outIdx + 4 >= endIdx) break; |
| 792 | outU8Array[outIdx++] = 0xF8 | (u >> 24); |
| 793 | outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); |
| 794 | outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); |
| 795 | outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); |
| 796 | outU8Array[outIdx++] = 0x80 | (u & 63); |
| 797 | } else { |
| 798 | if (outIdx + 5 >= endIdx) break; |
| 799 | outU8Array[outIdx++] = 0xFC | (u >> 30); |
| 800 | outU8Array[outIdx++] = 0x80 | ((u >> 24) & 63); |
| 801 | outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63); |
| 802 | outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63); |
| 803 | outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63); |
| 804 | outU8Array[outIdx++] = 0x80 | (u & 63); |
| 805 | } |
| 806 | } |
| 807 | // Null-terminate the pointer to the buffer. |
| 808 | outU8Array[outIdx] = 0; |
| 809 | return outIdx - startIdx; |
| 810 | } |
| 811 | Module["stringToUTF8Array"] = stringToUTF8Array; |
| 812 | |
| 813 | // Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', |
no outgoing calls
no test coverage detected