MCPcopy Index your code
hub / github.com/jvilk/BrowserFS / stringToUTF8Array

Function stringToUTF8Array

test/tests/emscripten/readdir_empty.js:760–810  ·  view source on GitHub ↗
(str, outU8Array, outIdx, maxBytesToWrite)

Source from the content-addressed store, hash-verified

758// Returns the number of bytes written, EXCLUDING the null terminator.
759
760function 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}
811Module["stringToUTF8Array"] = stringToUTF8Array;
812
813// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',

Callers 3

stringToUTF8Function · 0.70
intArrayFromStringFunction · 0.70
readdir_empty.jsFile · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected