diff options
-rw-r--r-- | src/preamble.js | 4 | ||||
-rw-r--r-- | src/snippets.js | 37 |
2 files changed, 37 insertions, 4 deletions
diff --git a/src/preamble.js b/src/preamble.js index 8b10b3c2..82dbdcb3 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -140,9 +140,9 @@ function _strlen(p) { // return p.slab.length; // XXX might want to find the null terminator... } -function String_copy(p) { +function String_copy(p, addZero) { // XXX hardcoded ptr impl - return HEAP.slice(p, p+_strlen(p)).concat([0]); + return HEAP.slice(p, p+_strlen(p)).concat(addZero ? [0] : []); } // stdlib.h diff --git a/src/snippets.js b/src/snippets.js index a93fd0fd..83cc26e6 100644 --- a/src/snippets.js +++ b/src/snippets.js @@ -17,12 +17,45 @@ var Snippets = { }, strspn: function(pstr, pset) { - var str = String_copy(pstr); + var str = String_copy(pstr, true); var set = String_copy(pset); var i = 0; - while (set.indexOf(str[i]) != -1) i++; // Must halt, as 0 is in both + while (set.indexOf(str[i]) != -1) i++; // Must halt, as 0 is in str but not set return i; }, + + strcspn: function(pstr, pset) { + var str = String_copy(pstr, true); + var set = String_copy(pset, true); + var i = 0; + while (set.indexOf(str[i]) == -1) i++; // Must halt, as 0 is in both + return i; + }, + + strncpy: function(pdest, psrc, num) { + var padding = false; + for (var i = 0; i < num; i++) { + HEAP[pdest+i] = padding ? 0 : HEAP[psrc+i]; + padding = padding || HEAP[psrc+i] == 0; + } + }, + + strcmp: function(px, py) { + var i = 0; + while (true) { + var x = HEAP[px+i]; + var y = HEAP[py+i]; + if (x == y && x == 0) return 0; + if (x == 0) return -1; + if (y == 0) return 1; + if (x == y) { + i ++; + continue; + } else { + return x > y ? 1 : -1; + } + } + }, }; // Aliases |