JS: Fix encoding conversion from utf16 to utf8 (#131)

This commit is contained in:
Sebastian Miasojed
2024-12-11 09:23:02 +01:00
committed by GitHub
parent 2cb8f82266
commit afe44ad21b
7 changed files with 52 additions and 81 deletions
+26 -21
View File
@@ -1,47 +1,52 @@
var Module = {
stdinData: "",
stdoutCallback: null,
stderrCallback: null,
stdinData: null,
stdinDataPosition: 0,
stdoutData: [],
stderrData: [],
// Function to set a callback for stdout
setStdoutCallback: function(callback) {
this.stdoutCallback = callback;
// Function to read and return all collected stdout data as a string
readFromStdout: function() {
if (!this.stdoutData.length) return "";
const decoder = new TextDecoder('utf-8');
const data = decoder.decode(new Uint8Array(this.stdoutData));
this.stdoutData = [];
return data;
},
// Function to set a callback for stderr
setStderrCallback: function(callback) {
this.stderrCallback = callback;
// Function to read and return all collected stderr data as a string
readFromStderr: function() {
if (!this.stderrData.length) return "";
const decoder = new TextDecoder('utf-8');
const data = decoder.decode(new Uint8Array(this.stderrData));
this.stderrData = [];
return data;
},
// Function to set input data for stdin
setStdinData: function(data) {
this.stdinData = data;
writeToStdin: function(data) {
const encoder = new TextEncoder();
this.stdinData = encoder.encode(data);
this.stdinDataPosition = 0;
},
// `preRun` is called before the program starts running
preRun: function() {
// Define a custom stdin function
function customStdin() {
if (Module.stdinData.length === 0) {
if (!Module.stdinData || Module.stdinDataPosition >= Module.stdinData.length) {
return null; // End of input (EOF)
}
const char = Module.stdinData.charCodeAt(0);
Module.stdinData = Module.stdinData.slice(1); // Remove the character from input
return char;
return Module.stdinData[Module.stdinDataPosition++];
}
// Define a custom stdout function
function customStdout(char) {
if (Module.stdoutCallback) {
Module.stdoutCallback(String.fromCharCode(char));
}
Module.stdoutData.push(char);
}
// Define a custom stderr function
function customStderr(char) {
if (Module.stderrCallback) {
Module.stderrCallback(String.fromCharCode(char));
}
Module.stderrData.push(char);
}
FS.init(customStdin, customStdout, customStderr);