MCPcopy Create free account
hub / github.com/antimatter15/ocrad.js / stringToUTF8Array

Function stringToUTF8Array

ocrad.js:810–860  ·  view source on GitHub ↗
(str, outU8Array, outIdx, maxBytesToWrite)

Source from the content-addressed store, hash-verified

808// Returns the number of bytes written, EXCLUDING the null terminator.
809
810function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
811 if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
812 return 0;
813
814 var startIdx = outIdx;
815 var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
816 for (var i = 0; i < str.length; ++i) {
817 // 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.
818 // See http://unicode.org/faq/utf_bom.html#utf16-3
819 // 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
820 var u = str.charCodeAt(i); // possibly a lead surrogate
821 if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
822 if (u <= 0x7F) {
823 if (outIdx >= endIdx) break;
824 outU8Array[outIdx++] = u;
825 } else if (u <= 0x7FF) {
826 if (outIdx + 1 >= endIdx) break;
827 outU8Array[outIdx++] = 0xC0 | (u >> 6);
828 outU8Array[outIdx++] = 0x80 | (u & 63);
829 } else if (u <= 0xFFFF) {
830 if (outIdx + 2 >= endIdx) break;
831 outU8Array[outIdx++] = 0xE0 | (u >> 12);
832 outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
833 outU8Array[outIdx++] = 0x80 | (u & 63);
834 } else if (u <= 0x1FFFFF) {
835 if (outIdx + 3 >= endIdx) break;
836 outU8Array[outIdx++] = 0xF0 | (u >> 18);
837 outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
838 outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
839 outU8Array[outIdx++] = 0x80 | (u & 63);
840 } else if (u <= 0x3FFFFFF) {
841 if (outIdx + 4 >= endIdx) break;
842 outU8Array[outIdx++] = 0xF8 | (u >> 24);
843 outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63);
844 outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
845 outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
846 outU8Array[outIdx++] = 0x80 | (u & 63);
847 } else {
848 if (outIdx + 5 >= endIdx) break;
849 outU8Array[outIdx++] = 0xFC | (u >> 30);
850 outU8Array[outIdx++] = 0x80 | ((u >> 24) & 63);
851 outU8Array[outIdx++] = 0x80 | ((u >> 18) & 63);
852 outU8Array[outIdx++] = 0x80 | ((u >> 12) & 63);
853 outU8Array[outIdx++] = 0x80 | ((u >> 6) & 63);
854 outU8Array[outIdx++] = 0x80 | (u & 63);
855 }
856 }
857 // Null-terminate the pointer to the buffer.
858 outU8Array[outIdx] = 0;
859 return outIdx - startIdx;
860}
861Module["stringToUTF8Array"] = stringToUTF8Array;
862
863// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',

Callers 3

stringToUTF8Function · 0.85
intArrayFromStringFunction · 0.85
createOcradInstanceFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected