Code: Select all
analyzePath: (function(path, dontResolveLastLink, linksVisited) {
var ret = {
isRoot: false,
exists: false,
error: 0,
name: null,
path: null,
object: null,
parentExists: false,
parentPath: null,
parentObject: null
};
path = FS.absolutePath(path);
if (path == "/") {
ret.isRoot = true;
ret.exists = ret.parentExists = true;
ret.name = "/";
ret.path = ret.parentPath = "/";
ret.object = ret.parentObject = FS.root;
} else if (path !== null) {
linksVisited = linksVisited || 0;
path = path.slice(1).split("/");
var current = FS.root;
var traversed = [ "" ];
while (path.length) {
if (path.length == 1 && current.isFolder) {
ret.parentExists = true;
ret.parentPath = traversed.length == 1 ? "/" : traversed.join("/");
ret.parentObject = current;
ret.name = path[0];
}
var target = path.shift();
if (!current.isFolder) {
ret.error = ERRNO_CODES.ENOTDIR;
break;
} else if (!current.read) {
ret.error = ERRNO_CODES.EACCES;
break;
} else if (!current.contents.hasOwnProperty(target)) {
ret.error = ERRNO_CODES.ENOENT;
break;
}
current = current.contents[target];
if (current.link && !(dontResolveLastLink && path.length == 0)) {
if (linksVisited > 40) {
ret.error = ERRNO_CODES.ELOOP;
break;
}
var link = FS.absolutePath(current.link, traversed.join("/"));
ret = FS.analyzePath([ link ].concat(path).join("/"), dontResolveLastLink, linksVisited + 1);
return ret;
}
traversed.push(target);
if (path.length == 0) {
ret.exists = true;
ret.path = traversed.join("/");
ret.object = current;
}
}
}
return ret;
}),
findObject: (function(path, dontResolveLastLink) {
FS.ensureRoot();
var ret = FS.analyzePath(path, dontResolveLastLink);
if (ret.exists) {
return ret.object;
} else {
___setErrNo(ret.error);
return null;
}
}),
createObject: (function(parent, name, properties, canRead, canWrite) {
if (!parent) parent = "/";
if (typeof parent === "string") parent = FS.findObject(parent);
if (!parent) {
___setErrNo(ERRNO_CODES.EACCES);
throw new Error("Parent path must exist.");
}
if (!parent.isFolder) {
___setErrNo(ERRNO_CODES.ENOTDIR);
throw new Error("Parent must be a folder.");
}
if (!parent.write && !FS.ignorePermissions) {
___setErrNo(ERRNO_CODES.EACCES);
throw new Error("Parent folder must be writeable.");
}
if (!name || name == "." || name == "..") {
___setErrNo(ERRNO_CODES.ENOENT);
throw new Error("Name must not be empty.");
}
if (parent.contents.hasOwnProperty(name)) {
___setErrNo(ERRNO_CODES.EEXIST);
throw new Error("Can't overwrite object.");
}
parent.contents[name] = {
read: canRead === undefined ? true : canRead,
write: canWrite === undefined ? false : canWrite,
timestamp: Date.now(),
inodeNumber: FS.nextInode++
};
for (var key in properties) {
if (properties.hasOwnProperty(key)) {
parent.contents[name][key] = properties[key];
}
}
return parent.contents[name];
}),
createFolder: (function(parent, name, canRead, canWrite) {
var properties = {
isFolder: true,
isDevice: false,
contents: {}
};
return FS.createObject(parent, name, properties, canRead, canWrite);
}),
createPath: (function(parent, path, canRead, canWrite) {
var current = FS.findObject(parent);
if (current === null) throw new Error("Invalid parent.");
path = path.split("/").reverse();
while (path.length) {
var part = path.pop();
if (!part) continue;
if (!current.contents.hasOwnProperty(part)) {
FS.createFolder(current, part, canRead, canWrite);
}
current = current.contents[part];
}
return current;
}),
createFile: (function(parent, name, properties, canRead, canWrite) {
properties.isFolder = false;
return FS.createObject(parent, name, properties, canRead, canWrite);
}),
createDataFile: (function(parent, name, data, canRead, canWrite) {
if (typeof data === "string") {
var dataArray = new Array(data.length);
for (var i = 0, len = data.length; i < len; ++i) dataArray[i] = data.charCodeAt(i);
data = dataArray;
}
var properties = {
isDevice: false,
contents: data.subarray ? data.subarray(0) : data
};
return FS.createFile(parent, name, properties, canRead, canWrite);
}),
createLazyFile: (function(parent, name, url, canRead, canWrite) {
if (typeof XMLHttpRequest !== "undefined") {
if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
var LazyUint8Array = (function(chunkSize, length) {
this.length = length;
this.chunkSize = chunkSize;
this.chunks = [];
});
LazyUint8Array.prototype.get = (function(idx) {
if (idx > this.length - 1 || idx < 0) {
return undefined;
}
var chunkOffset = idx % chunkSize;
var chunkNum = Math.floor(idx / chunkSize);
return this.getter(chunkNum)[chunkOffset];
});
LazyUint8Array.prototype.setDataGetter = (function(getter) {
this.getter = getter;
});
var xhr = new XMLHttpRequest;
xhr.open("HEAD", url, false);
xhr.send(null);
if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
var datalength = Number(xhr.getResponseHeader("Content-length"));
var header;
var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
var chunkSize = 1024 * 1024;
if (!hasByteServing) chunkSize = datalength;
var doXHR = (function(from, to) {
if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!");
var xhr = new XMLHttpRequest;
xhr.open("GET", url, false);
if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to);
if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer";
if (xhr.overrideMimeType) {
xhr.overrideMimeType("text/plain; charset=x-user-defined");
}
xhr.send(null);
if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
if (xhr.response !== undefined) {
return new Uint8Array(xhr.response || []);
} else {
return intArrayFromString(xhr.responseText || "", true);
}
});
var lazyArray = new LazyUint8Array(chunkSize, datalength);
lazyArray.setDataGetter((function(chunkNum) {
var start = chunkNum * lazyArray.chunkSize;
var end = (chunkNum + 1) * lazyArray.chunkSize - 1;
end = Math.min(end, datalength - 1);
if (typeof lazyArray.chunks[chunkNum] === "undefined") {
lazyArray.chunks[chunkNum] = doXHR(start, end);
}
if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!");
return lazyArray.chunks[chunkNum];
}));
var properties = {
isDevice: false,
contents: lazyArray
};
} else {
var properties = {
isDevice: false,
url: url
};
}
return FS.createFile(parent, name, properties, canRead, canWrite);
}),
createPreloadedFile: (function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile) {
Browser.ensureObjects();
var fullname = FS.joinPath([ parent, name ], true);
function processData(byteArray) {
function finish(byteArray) {
if (!dontCreateFile) {
FS.createDataFile(parent, name, byteArray, canRead, canWrite);
}
if (onload) onload();
removeRunDependency("cp " + fullname);
}
var handled = false;
Module["preloadPlugins"].forEach((function(plugin) {
if (handled) return;
if (plugin["canHandle"](fullname)) {
plugin["handle"](byteArray, fullname, finish, (function() {
if (onerror) onerror();
removeRunDependency("cp " + fullname);
}));
handled = true;
}
}));
if (!handled) finish(byteArray);
}
addRunDependency("cp " + fullname);
if (typeof url == "string") {
Browser.asyncLoad(url, (function(byteArray) {
processData(byteArray);
}), onerror);
} else {
processData(url);
}
}),
createLink: (function(parent, name, target, canRead, canWrite) {
var properties = {
isDevice: false,
link: target
};
return FS.createFile(parent, name, properties, canRead, canWrite);
}),
createDevice: (function(parent, name, input, output) {
if (!(input || output)) {
throw new Error("A device must have at least one callback defined.");
}
var ops = {
isDevice: true,
input: input,
output: output
};
return FS.createFile(parent, name, ops, Boolean(input), Boolean(output));
}),
forceLoadFile: (function(obj) {
if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true;
var success = true;
if (typeof XMLHttpRequest !== "undefined") {
throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
} else if (Module["read"]) {
try {
obj.contents = intArrayFromString(Module["read"](obj.url), true);
} catch (e) {
success = false;
}
} else {
throw new Error("Cannot load without read() or XMLHttpRequest.");
}
if (!success) ___setErrNo(ERRNO_CODES.EIO);
return success;
}),
ensureRoot: (function() {
if (FS.root) return;
FS.root = {
read: true,
write: true,
isFolder: true,
isDevice: false,
timestamp: Date.now(),
inodeNumber: 1,
contents: {}
};
}),
init: (function(input, output, error) {
assert(!FS.init.initialized, "FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
FS.init.initialized = true;
FS.ensureRoot();
input = input || Module["stdin"];
output = output || Module["stdout"];
error = error || Module["stderr"];
var stdinOverridden = true, stdoutOverridden = true, stderrOverridden = true;
if (!input) {
stdinOverridden = false;
input = (function() {
if (!input.cache || !input.cache.length) {
var result;
if (typeof window != "undefined" && typeof window.prompt == "function") {
result = window.prompt("Input: ");
if (result === null) result = String.fromCharCode(0);
} else if (typeof readline == "function") {
result = readline();
}
if (!result) result = "";
input.cache = intArrayFromString(result + "\n", true);
}
return input.cache.shift();
});
}
var utf8 = new Runtime.UTF8Processor;
function simpleOutput(val) {
if (val === null || val === "\n".charCodeAt(0)) {
output.printer(output.buffer.join(""));
output.buffer = [];
} else {
output.buffer.push(utf8.processCChar(val));
}
}
if (!output) {
stdoutOverridden = false;
output = simpleOutput;
}
if (!output.printer) output.printer = Module["print"];
if (!output.buffer) output.buffer = [];
if (!error) {
stderrOverridden = false;
error = simpleOutput;
}
if (!error.printer) error.printer = Module["print"];
if (!error.buffer) error.buffer = [];
try {
FS.createFolder("/", "tmp", true, true);
} catch (e) {}
var devFolder = FS.createFolder("/", "dev", true, true);
var stdin = FS.createDevice(devFolder, "stdin", input);
var stdout = FS.createDevice(devFolder, "stdout", null, output);
var stderr = FS.createDevice(devFolder, "stderr", null, error);
FS.createDevice(devFolder, "tty", input, output);
FS.streams[1] = {
path: "/dev/stdin",
object: stdin,
position: 0,
isRead: true,
isWrite: false,
isAppend: false,
isTerminal: !stdinOverridden,
error: false,
eof: false,
ungotten: []
};
FS.streams[2] = {
path: "/dev/stdout",
object: stdout,
position: 0,
isRead: false,
isWrite: true,
isAppend: false,
isTerminal: !stdoutOverridden,
error: false,
eof: false,
ungotten: []
};
FS.streams[3] = {
path: "/dev/stderr",
object: stderr,
position: 0,
isRead: false,
isWrite: true,
isAppend: false,
isTerminal: !stderrOverridden,
error: false,
eof: false,
ungotten: []
};
_stdin = allocate([ 1 ], "void*", ALLOC_STACK);
_stdout = allocate([ 2 ], "void*", ALLOC_STACK);
_stderr = allocate([ 3 ], "void*", ALLOC_STACK);
FS.createPath("/", "dev/shm/tmp", true, true);
for (var i = FS.streams.length; i < Math.max(_stdin, _stdout, _stderr) + 4; i++) {
FS.streams[i] = null;
}
FS.streams[_stdin] = FS.streams[1];
FS.streams[_stdout] = FS.streams[2];
FS.streams[_stderr] = FS.streams[3];
__impure_ptr = allocate([ allocate([ 0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0 ], "void*", ALLOC_STATIC) ], "void*", ALLOC_STATIC);
}),
quit: (function() {
if (!FS.init.initialized) return;
if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output("\n".charCodeAt(0));
if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output("\n".charCodeAt(0));
}),
standardizePath: (function(path) {
if (path.substr(0, 2) == "./") path = path.substr(2);
return path;
}),
deleteFile: (function(path) {
var path = FS.analyzePath(path);
if (!path.parentExists || !path.exists) {
throw "Invalid path " + path;
}
delete path.parentObject.contents[path.name];
})
};
function _pwrite(fildes, buf, nbyte, offset) {
var stream = FS.streams[fildes];
if (!stream || stream.object.isDevice) {
___setErrNo(ERRNO_CODES.EBADF);
return -1;
} else if (!stream.isWrite) {
___setErrNo(ERRNO_CODES.EACCES);
return -1;
} else if (stream.object.isFolder) {
___setErrNo(ERRNO_CODES.EISDIR);
return -1;
} else if (nbyte < 0 || offset < 0) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
} else {
var contents = stream.object.contents;
while (contents.length < offset) contents.push(0);
for (var i = 0; i < nbyte; i++) {
contents[offset + i] = HEAP[buf + i];
}
stream.object.timestamp = Date.now();
return i;
}
}
function _write(fildes, buf, nbyte) {
var stream = FS.streams[fildes];
if (!stream) {
___setErrNo(ERRNO_CODES.EBADF);
return -1;
} else if (!stream.isWrite) {
___setErrNo(ERRNO_CODES.EACCES);
return -1;
} else if (nbyte < 0) {
___setErrNo(ERRNO_CODES.EINVAL);
return -1;
} else {
if (stream.object.isDevice) {
if (stream.object.output) {
for (var i = 0; i < nbyte; i++) {
try {
stream.object.output(HEAP[buf + i]);
} catch (e) {
___setErrNo(ERRNO_CODES.EIO);
return -1;
}
}
stream.object.timestamp = Date.now();
return i;
} else {
___setErrNo(ERRNO_CODES.ENXIO);
return -1;
}
} else {
var bytesWritten = _pwrite(fildes, buf, nbyte, stream.position);
if (bytesWritten != -1) stream.position += bytesWritten;
return bytesWritten;
}
}
}
function _fwrite(ptr, size, nitems, stream) {
var bytesToWrite = nitems * size;
if (bytesToWrite == 0) return 0;
var bytesWritten = _write(stream, ptr, bytesToWrite);
if (bytesWritten == -1) {
if (FS.streams[stream]) FS.streams[stream].error = true;
return -1;
} else {
return Math.floor(bytesWritten / size);
}
}
function __formatString(format, varargs) {
var textIndex = format;
var argIndex = 0;
function getNextArg(type) {
var ret;
if (type === "double") {
ret = HEAP[varargs + argIndex];
} else if (type == "i64") {
ret = HEAP[varargs + argIndex];
} else {
type = "i32";
ret = HEAP[varargs + argIndex];
}
argIndex += Runtime.getNativeFieldSize(type);
return ret;
}
var ret = [];
var curr, next, currArg;
while (1) {
var startTextIndex = textIndex;
curr = HEAP[textIndex];
if (curr === 0) break;
next = HEAP[textIndex + 1];
if (curr == "%".charCodeAt(0)) {
var flagAlwaysSigned = false;
var flagLeftAlign = false;
var flagAlternative = false;
var flagZeroPad = false;
flagsLoop : while (1) {
switch (next) {
case "+".charCodeAt(0):
flagAlwaysSigned = true;
break;
case "-".charCodeAt(0):
flagLeftAlign = true;
break;
case "#".charCodeAt(0):
flagAlternative = true;
break;
case "0".charCodeAt(0):
if (flagZeroPad) {
break flagsLoop;
} else {
flagZeroPad = true;
break;
}
default:
break flagsLoop;
}
textIndex++;
next = HEAP[textIndex + 1];
}
var width = 0;
if (next == "*".charCodeAt(0)) {
width = getNextArg("i32");
textIndex++;
next = HEAP[textIndex + 1];
} else {
while (next >= "0".charCodeAt(0) && next <= "9".charCodeAt(0)) {
width = width * 10 + (next - "0".charCodeAt(0));
textIndex++;
next = HEAP[textIndex + 1];
}
}
var precisionSet = false;
if (next == ".".charCodeAt(0)) {
var precision = 0;
precisionSet = true;
textIndex++;
next = HEAP[textIndex + 1];
if (next == "*".charCodeAt(0)) {
precision = getNextArg("i32");
textIndex++;
} else {
while (1) {
var precisionChr = HEAP[textIndex + 1];
if (precisionChr < "0".charCodeAt(0) || precisionChr > "9".charCodeAt(0)) break;
precision = precision * 10 + (precisionChr - "0".charCodeAt(0));
textIndex++;
}
}
next = HEAP[textIndex + 1];
} else {
var precision = 6;
}
var argSize;
switch (String.fromCharCode(next)) {
case "h":
var nextNext = HEAP[textIndex + 2];
if (nextNext == "h".charCodeAt(0)) {
textIndex++;
argSize = 1;
} else {
argSize = 2;
}
break;
case "l":
var nextNext = HEAP[textIndex + 2];
if (nextNext == "l".charCodeAt(0)) {
textIndex++;
argSize = 8;
} else {
argSize = 4;
}
break;
case "L":
case "q":
case "j":
argSize = 8;
break;
case "z":
case "t":
case "I":
argSize = 4;
break;
default:
argSize = null;
}
if (argSize) textIndex++;
next = HEAP[textIndex + 1];
if ([ "d", "i", "u", "o", "x", "X", "p" ].indexOf(String.fromCharCode(next)) != -1) {
var signed = next == "d".charCodeAt(0) || next == "i".charCodeAt(0);
argSize = argSize || 4;
var currArg = getNextArg("i" + argSize * 8);
var origArg = currArg;
var argText;
if (argSize <= 4) {
var limit = Math.pow(256, argSize) - 1;
currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8);
}
var currAbsArg = Math.abs(currArg);
var prefix = "";
if (next == "d".charCodeAt(0) || next == "i".charCodeAt(0)) {
if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1]); else argText = reSign(currArg, 8 * argSize, 1).toString(10);
} else if (next == "u".charCodeAt(0)) {
if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else argText = unSign(currArg, 8 * argSize, 1).toString(10);
currArg = Math.abs(currArg);
} else if (next == "o".charCodeAt(0)) {
argText = (flagAlternative ? "0" : "") + currAbsArg.toString(8);
} else if (next == "x".charCodeAt(0) || next == "X".charCodeAt(0)) {
prefix = flagAlternative ? "0x" : "";
if (currArg < 0) {
currArg = -currArg;
argText = (currAbsArg - 1).toString(16);
var buffer = [];
for (var i = 0; i < argText.length; i++) {
buffer.push((15 - parseInt(argText[i], 16)).toString(16));
}
argText = buffer.join("");
while (argText.length < argSize * 2) argText = "f" + argText;
} else {
argText = currAbsArg.toString(16);
}
if (next == "X".charCodeAt(0)) {
prefix = prefix.toUpperCase();
argText = argText.toUpperCase();
}
} else if (next == "p".charCodeAt(0)) {
if (currAbsArg === 0) {
argText = "(nil)";
} else {
prefix = "0x";
argText = currAbsArg.toString(16);
}
}
if (precisionSet) {
while (argText.length < precision) {
argText = "0" + argText;
}
}
if (flagAlwaysSigned) {
if (currArg < 0) {
prefix = "-" + prefix;
} else {
prefix = "+" + prefix;
}
}
while (prefix.length + argText.length < width) {
if (flagLeftAlign) {
argText += " ";
} else {
if (flagZeroPad) {
argText = "0" + argText;
} else {
prefix = " " + prefix;
}
}
}
argText = prefix + argText;
argText.split("").forEach((function(chr) {
ret.push(chr.charCodeAt(0));
}));
} else if ([ "f", "F", "e", "E", "g", "G" ].indexOf(String.fromCharCode(next)) != -1) {
var currArg = getNextArg("double");
var argText;
if (isNaN(currArg)) {
argText = "nan";
flagZeroPad = false;
} else if (!isFinite(currArg)) {
argText = (currArg < 0 ? "-" : "") + "inf";
flagZeroPad = false;
} else {
var isGeneral = false;
var effectivePrecision = Math.min(precision, 20);
if (next == "g".charCodeAt(0) || next == "G".charCodeAt(0)) {
isGeneral = true;
precision = precision || 1;
var exponent = parseInt(currArg.toExponential(effectivePrecision).split("e")[1], 10);
if (precision > exponent && exponent >= -4) {
next = (next == "g".charCodeAt(0) ? "f" : "F").charCodeAt(0);
precision -= exponent + 1;
} else {
next = (next == "g".charCodeAt(0) ? "e" : "E").charCodeAt(0);
precision--;
}
effectivePrecision = Math.min(precision, 20);
}
if (next == "e".charCodeAt(0) || next == "E".charCodeAt(0)) {
argText = currArg.toExponential(effectivePrecision);
if (/[eE][-+]\d$/.test(argText)) {
argText = argText.slice(0, -1) + "0" + argText.slice(-1);
}
} else if (next == "f".charCodeAt(0) || next == "F".charCodeAt(0)) {
argText = currArg.toFixed(effectivePrecision);
}
var parts = argText.split("e");
if (isGeneral && !flagAlternative) {
while (parts[0].length > 1 && parts[0].indexOf(".") != -1 && (parts[0].slice(-1) == "0" || parts[0].slice(-1) == ".")) {
parts[0] = parts[0].slice(0, -1);
}
} else {
if (flagAlternative && argText.indexOf(".") == -1) parts[0] += ".";
while (precision > effectivePrecision++) parts[0] += "0";
}
argText = parts[0] + (parts.length > 1 ? "e" + parts[1] : "");
if (next == "E".charCodeAt(0)) argText = argText.toUpperCase();
if (flagAlwaysSigned && currArg >= 0) {
argText = "+" + argText;
}
}
while (argText.length < width) {
if (flagLeftAlign) {
argText += " ";
} else {
if (flagZeroPad && (argText[0] == "-" || argText[0] == "+")) {
argText = argText[0] + "0" + argText.slice(1);
} else {
argText = (flagZeroPad ? "0" : " ") + argText;
}
}
}
if (next < "a".charCodeAt(0)) argText = argText.toUpperCase();
argText.split("").forEach((function(chr) {
ret.push(chr.charCodeAt(0));
}));
} else if (next == "s".charCodeAt(0)) {
var arg = getNextArg("i8*") || nullString;
var argLength = String_len(arg);
if (precisionSet) argLength = Math.min(argLength, precision);
if (!flagLeftAlign) {
while (argLength < width--) {
ret.push(" ".charCodeAt(0));
}
}
for (var i = 0; i < argLength; i++) {
ret.push(HEAP[arg++]);
}
if (flagLeftAlign) {
while (argLength < width--) {
ret.push(" ".charCodeAt(0));
}
}
} else if (next == "c".charCodeAt(0)) {
if (flagLeftAlign) ret.push(getNextArg("i8"));
while (--width > 0) {
ret.push(" ".charCodeAt(0));
}
if (!flagLeftAlign) ret.push(getNextArg("i8"));
} else if (next == "n".charCodeAt(0)) {
var ptr = getNextArg("i32*");
HEAP[ptr] = ret.length;
} else if (next == "%".charCodeAt(0)) {
ret.push(curr);
} else {
for (var i = startTextIndex; i < textIndex + 2; i++) {
ret.push(HEAP[i]);
}
}
textIndex += 2;
} else {
ret.push(curr);
textIndex += 1;
}
}
return ret;
}
function _fprintf(stream, format, varargs) {
var result = __formatString(format, varargs);
var stack = Runtime.stackSave();
var ret = _fwrite(allocate(result, "i8", ALLOC_STACK), 1, result.length, stream);
Runtime.stackRestore(stack);
return ret;
}
function _printf(format, varargs) {
var stdout = HEAP[_stdout];
return _fprintf(stdout, format, varargs);
}
function _memcpy(dest, src, num, align) {
for (var $$src = src, $$dest = dest, $$stop = $$src + num; $$src < $$stop; $$src++, $$dest++) {
HEAP[$$dest] = HEAP[$$src];
}
}
function _memset(ptr, value, num, align) {
for (var $$dest = ptr, $$stop = $$dest + num; $$dest < $$stop; $$dest++) {
HEAP[$$dest] = value;
}
}
function _malloc(bytes) {
ptr = Runtime.staticAlloc(bytes + 8);
return ptr + 8 & 4294967288;
}
Module["_malloc"] = _malloc;
function _free() {}
Module["_free"] = _free;
var Browser = {
mainLoop: {
scheduler: null,
shouldPause: false,
paused: false,
queue: [],
pause: (function() {
Browser.mainLoop.shouldPause = true;
}),
resume: (function() {
if (Browser.mainLoop.paused) {
Browser.mainLoop.paused = false;
Browser.mainLoop.scheduler();
}
Browser.mainLoop.shouldPause = false;
}),
updateStatus: (function() {
if (Module["setStatus"]) {
var message = Module["statusMessage"] || "Please wait...";
var remaining = Browser.mainLoop.remainingBlockers;
var expected = Browser.mainLoop.expectedBlockers;
if (remaining) {
if (remaining < expected) {
Module["setStatus"](message + " (" + (expected - remaining) + "/" + expected + ")");
} else {
Module["setStatus"](message);
}
} else {
Module["setStatus"]("");
}
}
})
},
pointerLock: false,
moduleContextCreatedCallbacks: [],
workers: [],
ensureObjects: (function() {
if (Browser.ensured) return;
Browser.ensured = true;
try {
new Blob;
Browser.hasBlobConstructor = true;
} catch (e) {
Browser.hasBlobConstructor = false;
console.log("warning: no blob constructor, cannot create blobs with mimetypes");
}
Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : !Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null;
Browser.URLObject = typeof window != "undefined" ? window.URL ? window.URL : window.webkitURL : console.log("warning: cannot create object URLs");
function getMimetype(name) {
return {
"jpg": "image/jpeg",
"png": "image/png",
"bmp": "image/bmp",
"ogg": "audio/ogg",
"wav": "audio/wav",
"mp3": "audio/mpeg"
}[name.substr(-3)];
return ret;
}
if (!Module["preloadPlugins"]) Module["preloadPlugins"] = [];
var imagePlugin = {};
imagePlugin["canHandle"] = (function(name) {
return name.substr(-4) in {
".jpg": 1,
".png": 1,
".bmp": 1
};
});
imagePlugin["handle"] = (function(byteArray, name, onload, onerror) {
var b = null;
if (Browser.hasBlobConstructor) {
try {
b = new Blob([ byteArray ], {
type: getMimetype(name)
});
} catch (e) {
Runtime.warnOnce("Blob constructor present but fails: " + e + "; falling back to blob builder");
}
}
if (!b) {
var bb = new Browser.BlobBuilder;
bb.append((new Uint8Array(byteArray)).buffer);
b = bb.getBlob();
}
var url = Browser.URLObject.createObjectURL(b);
var img = new Image;
img.onload = (function() {
assert(img.complete, "Image " + name + " could not be decoded");
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
Module["preloadedImages"][name] = canvas;
Browser.URLObject.revokeObjectURL(url);
if (onload) onload(byteArray);
});
img.onerror = (function(event) {
console.log("Image " + url + " could not be decoded");
if (onerror) onerror();
});
img.src = url;
});
Module["preloadPlugins"].push(imagePlugin);
var audioPlugin = {};
audioPlugin["canHandle"] = (function(name) {
return name.substr(-4) in {
".ogg": 1,
".wav": 1,
".mp3": 1
};
});
audioPlugin["handle"] = (function(byteArray, name, onload, onerror) {
var done = false;
function finish(audio) {
if (done) return;
done = true;
Module["preloadedAudios"][name] = audio;
if (onload) onload(byteArray);
}
function fail() {
if (done) return;
done = true;
Module["preloadedAudios"][name] = new Audio;
if (onerror) onerror();
}
if (Browser.hasBlobConstructor) {
try {
var b = new Blob([ byteArray ], {
type: getMimetype(name)
});
} catch (e) {
return fail();
}
var url = Browser.URLObject.createObjectURL(b);
var audio = new Audio;
audio.addEventListener("canplaythrough", (function() {
finish(audio);
}), false);
audio.onerror = (function(event) {
if (done) return;
console.log("warning: browser could not fully decode audio " + name + ", trying slower base64 approach");
function encode64(data) {
var BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var PAD = "=";
var ret = "";
var leftchar = 0;
var leftbits = 0;
for (var i = 0; i < data.length; i++) {
leftchar = leftchar << 8 | data[i];
leftbits += 8;
while (leftbits >= 6) {
var curr = leftchar >> leftbits - 6 & 63;
leftbits -= 6;
ret += BASE[curr];
}
}
if (leftbits == 2) {
ret += BASE[(leftchar & 3) << 4];
ret += PAD + PAD;
} else if (leftbits == 4) {
ret += BASE[(leftchar & 15) << 2];
ret += PAD;
}
return ret;
}
audio.src = "data:audio/x-" + name.substr(-3) + ";base64," + encode64(byteArray);
finish(audio);
});
audio.src = url;
setTimeout((function() {
finish(audio);
}), 1e4);
} else {
return fail();
}
});
Module["preloadPlugins"].push(audioPlugin);
}),
createContext: (function(canvas, useWebGL, setInModule) {
try {
var ctx = canvas.getContext(useWebGL ? "experimental-webgl" : "2d");
if (!ctx) throw ":(";
} catch (e) {
Module.print("Could not create canvas - " + e);
return null;
}
if (useWebGL) {
canvas.style.backgroundColor = "black";
canvas.addEventListener("webglcontextlost", (function(event) {
alert("WebGL context lost. You will need to reload the page.");
}), false);
}
if (setInModule) {
Module.ctx = ctx;
Module.useWebGL = useWebGL;
Browser.moduleContextCreatedCallbacks.forEach((function(callback) {
callback();
}));
}
return ctx;
}),
requestFullScreen: (function() {
var canvas = Module["canvas"];
function fullScreenChange() {
var isFullScreen = false;
if ((document["webkitFullScreenElement"] || document["webkitFullscreenElement"] || document["mozFullScreenElement"] || document["mozFullscreenElement"] || document["fullScreenElement"] || document["fullscreenElement"]) === canvas) {
canvas.requestPointerLock = canvas["requestPointerLock"] || canvas["mozRequestPointerLock"] || canvas["webkitRequestPointerLock"];
canvas.requestPointerLock();
isFullScreen = true;
}
if (Module["onFullScreen"]) Module["onFullScreen"](isFullScreen);
}
document.addEventListener("fullscreenchange", fullScreenChange, false);
document.addEventListener("mozfullscreenchange", fullScreenChange, false);
document.addEventListener("webkitfullscreenchange", fullScreenChange, false);
function pointerLockChange() {
Browser.pointerLock = document["pointerLockElement"] === canvas || document["mozPointerLockElement"] === canvas || document["webkitPointerLockElement"] === canvas;
}
document.addEventListener("pointerlockchange", pointerLockChange, false);
document.addEventListener("mozpointerlockchange", pointerLockChange, false);
document.addEventListener("webkitpointerlockchange", pointerLockChange, false);
canvas.requestFullScreen = canvas["requestFullScreen"] || canvas["mozRequestFullScreen"] || (canvas["webkitRequestFullScreen"] ? (function() {
canvas["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]);
}) : null);
canvas.requestFullScreen();
}),
requestAnimationFrame: (function(func) {
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = window["requestAnimationFrame"] || window["mozRequestAnimationFrame"] || window["webkitRequestAnimationFrame"] || window["msRequestAnimationFrame"] || window["oRequestAnimationFrame"] || window["setTimeout"];
}
window.requestAnimationFrame(func);
}),
getMovementX: (function(event) {
return event["movementX"] || event["mozMovementX"] || event["webkitMovementX"] || 0;
}),
getMovementY: (function(event) {
return event["movementY"] || event["mozMovementY"] || event["webkitMovementY"] || 0;
}),
xhrLoad: (function(url, onload, onerror) {
var xhr = new XMLHttpRequest;
xhr.open("GET", url, true);
xhr.responseType = "arraybuffer";
xhr.onload = (function() {
if (xhr.status == 200) {
onload(xhr.response);
} else {
onerror();
}
});
xhr.onerror = onerror;
xhr.send(null);
}),
asyncLoad: (function(url, onload, onerror) {
Browser.xhrLoad(url, (function(arrayBuffer) {
assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
onload(new Uint8Array(arrayBuffer));
removeRunDependency("al " + url);
}), (function(event) {
if (onerror) {
onerror();
} else {
throw 'Loading data file "' + url + '" failed.';
}
}));
addRunDependency("al " + url);
}),
resizeListeners: [],
updateResizeListeners: (function() {
var canvas = Module["canvas"];
Browser.resizeListeners.forEach((function(listener) {
listener(canvas.width, canvas.height);
}));
}),
setCanvasSize: (function(width, height, noUpdates) {
var canvas = Module["canvas"];
canvas.width = width;
canvas.height = height;
if (!noUpdates) Browser.updateResizeListeners();
})
};
__ATINIT__.unshift({
func: (function() {
if (!Module["noFSInit"] && !FS.init.initialized) FS.init();
})
});
__ATMAIN__.push({
func: (function() {
FS.ignorePermissions = false;
})
});
__ATEXIT__.push({
func: (function() {
FS.quit();
})
});
Module["FS_createFolder"] = FS.createFolder;
Module["FS_createPath"] = FS.createPath;
Module["FS_createDataFile"] = FS.createDataFile;
Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
Module["FS_createLazyFile"] = FS.createLazyFile;
Module["FS_createLink"] = FS.createLink;
Module["FS_createDevice"] = FS.createDevice;
___setErrNo(0);
Module["requestFullScreen"] = (function() {
Browser.requestFullScreen();
});
Module["requestAnimationFrame"] = (function(func) {
Browser.requestAnimationFrame(func);
});
Module["pauseMainLoop"] = (function() {
Browser.mainLoop.pause();
});
Module["resumeMainLoop"] = (function() {
Browser.mainLoop.resume();
});
Module.callMain = function callMain(args) {
var argc = args.length + 1;
function pad() {
for (var i = 0; i < 4 - 1; i++) {
argv.push(0);
}
}
var argv = [ allocate(intArrayFromString("/bin/this.program"), "i8", ALLOC_STATIC) ];
pad();
for (var i = 0; i < argc - 1; i = i + 1) {
argv.push(allocate(intArrayFromString(args[i]), "i8", ALLOC_STATIC));
pad();
}
argv.push(0);
argv = allocate(argv, "i32", ALLOC_STATIC);
return _main(argc, argv, 0);
};
STRING_TABLE.__str = allocate([ 37, 115, 0 ], "i8", ALLOC_STATIC);
STRING_TABLE.__str1 = allocate([ 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 0 ], "i8", ALLOC_STATIC);
FUNCTION_TABLE = [ 0, 0 ];
Module["FUNCTION_TABLE"] = FUNCTION_TABLE;
function run(args) {
args = args || Module["arguments"];
if (runDependencies > 0) {
Module.printErr("run() called, but dependencies remain, so not running");
return 0;
}
if (Module["preRun"]) {
if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ];
var toRun = Module["preRun"];
Module["preRun"] = [];
for (var i = toRun.length - 1; i >= 0; i--) {
toRun[i]();
}
if (runDependencies > 0) {
return 0;
}
}
function doRun() {
var ret = 0;
calledRun = true;
if (Module["_main"]) {
preMain();
ret = Module.callMain(args);
if (!Module["noExitRuntime"]) {
exitRuntime();
}
}
if (Module["postRun"]) {
if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ];
while (Module["postRun"].length > 0) {
Module["postRun"].pop()();
}
}
return ret;
}
if (Module["setStatus"]) {
Module["setStatus"]("Running...");
setTimeout((function() {
setTimeout((function() {
Module["setStatus"]("");
}), 1);
doRun();
}), 1);
return 0;
} else {
return doRun();
}
}
Module["run"] = run;
if (Module["preInit"]) {
if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ];
while (Module["preInit"].length > 0) {
Module["preInit"].pop()();
}
}
initRuntime();
var shouldRunNow = true;
if (Module["noInitialRun"]) {
shouldRunNow = false;
}
if (shouldRunNow) {
var ret = run();
}
// EMSCRIPTEN_GENERATED_FUNCTIONS: ["_main"]