aboutsummaryrefslogtreecommitdiff
path: root/src/preamble.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/preamble.js')
-rw-r--r--src/preamble.js96
1 files changed, 53 insertions, 43 deletions
diff --git a/src/preamble.js b/src/preamble.js
index aa58e172..da6660ba 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -152,15 +152,11 @@ function Pointer_make(slab, pos, allocator) {
}
function Pointer_stringify(ptr) {
- ptr = Pointer_niceify(ptr);
-
var ret = "";
var i = 0;
var t;
while (1) {
-// if ((ptr.pos + i) >= ptr.slab.length) { return "<< Invalid read: " + (ptr.pos+i) + " : " + ptr.slab.length + " >>"; } else {}
- if ((ptr.pos+i) >= ptr.slab.length) { break; } else {}
- t = String.fromCharCode(ptr.slab[ptr.pos + i]);
+ t = String.fromCharCode(IHEAP[ptr + i]);
if (t == "\0") { break; } else {}
ret += t;
i += 1;
@@ -263,48 +259,54 @@ function __formatString() {
while (curr) { // Note: should be curr != 0, technically. But this helps catch bugs with undefineds
curr = IHEAP[textIndex];
next = IHEAP[textIndex+1];
- if (curr == '%'.charCodeAt(0) && ['d', 'u', 'f', '.'].indexOf(String.fromCharCode(next)) != -1) {
- var currArg;
- var argText;
- // Handle very very simply formatting, namely only %.Xf
- if (next == '.'.charCodeAt(0)) {
- var limit = 0;
- while(1) {
- var limitChr = IHEAP[textIndex+2];
- if (!(limitChr >= '0'.charCodeAt(0) && limitChr <= '9'.charCodeAt(0))) break;
- limit *= 10;
- limit += limitChr - '0'.charCodeAt(0);
- textIndex++;
- }
- textIndex--;
+ if (curr == '%'.charCodeAt(0)) {
+ if (next == 'l'.charCodeAt(0)) {
+ textIndex++;
next = IHEAP[textIndex+1];
- currArg = getNextArg(next);
- argText = String(+currArg); // +: boolean=>int
- var dotIndex = argText.indexOf('.');
- if (dotIndex == -1) {
- dotIndex = argText.length;
- argText += '.';
+ }
+ if (['d', 'u', 'f', '.'].indexOf(String.fromCharCode(next)) != -1) {
+ var currArg;
+ var argText;
+ // Handle very very simply formatting, namely only %.Xf
+ if (next == '.'.charCodeAt(0)) {
+ var limit = 0;
+ while(1) {
+ var limitChr = IHEAP[textIndex+2];
+ if (!(limitChr >= '0'.charCodeAt(0) && limitChr <= '9'.charCodeAt(0))) break;
+ limit *= 10;
+ limit += limitChr - '0'.charCodeAt(0);
+ textIndex++;
+ }
+ textIndex--;
+ next = IHEAP[textIndex+1];
+ currArg = getNextArg(next);
+ argText = String(+currArg); // +: boolean=>int
+ var dotIndex = argText.indexOf('.');
+ if (dotIndex == -1) {
+ dotIndex = argText.length;
+ argText += '.';
+ }
+ argText += '00000000000'; // padding
+ argText = argText.substr(0, dotIndex+1+limit);
+ textIndex += 2;
+ } else if (next == 'u'.charCodeAt(0)) {
+ currArg = getNextArg(next);
+ argText = String(unSign(currArg, 32));
+ } else {
+ currArg = getNextArg(next);
+ argText = String(+currArg); // +: boolean=>int
}
- argText += '00000000000'; // padding
- argText = argText.substr(0, dotIndex+1+limit);
+ argText.split('').forEach(function(chr) {
+ ret.push(chr.charCodeAt(0));
+ });
+ textIndex += 2;
+ } else if (next == 's'.charCodeAt(0)) {
+ ret = ret.concat(String_copy(getNextArg(next)));
+ textIndex += 2;
+ } else if (next == 'c'.charCodeAt(0)) {
+ ret = ret.concat(getNextArg(next));
textIndex += 2;
- } else if (next == 'u'.charCodeAt(0)) {
- currArg = getNextArg(next);
- argText = String(unSign(currArg, 32));
- } else {
- currArg = getNextArg(next);
- argText = String(+currArg); // +: boolean=>int
}
- argText.split('').forEach(function(chr) {
- ret.push(chr.charCodeAt(0));
- });
- textIndex += 2;
- } else if (curr == '%'.charCodeAt(0) && next == 's'.charCodeAt(0)) {
- ret = ret.concat(String_copy(getNextArg(next)));
- textIndex += 2;
- } else if (curr == '%'.charCodeAt(0) && next == 'c'.charCodeAt(0)) {
- ret = ret.concat(getNextArg(next));
- textIndex += 2;
} else {
ret.push(curr);
textIndex += 1;
@@ -418,6 +420,14 @@ function intArrayFromString(stringy) {
return ret;
}
+function intArrayToString(array) {
+ var ret = '';
+ for (var i = 0; i < array.length; i++) {
+ ret += String.fromCharCode(array[i]);
+ }
+ return ret;
+}
+
// Converts a value we have as signed, into an unsigned value. For
// example, -1 in int32 would be a very large number as unsigned.
function unSign(value, bits) {