diff options
-rw-r--r-- | src/library.js | 20 | ||||
-rw-r--r-- | tests/runner.py | 18 |
2 files changed, 36 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js index fc5932d9..8b698623 100644 --- a/src/library.js +++ b/src/library.js @@ -142,6 +142,26 @@ var Library = { return ret; }, + qsort: function(base, num, size, comparator) { + // forward calls to the JavaScript sort method + // first, sort the items logically + comparator = FUNCTION_TABLE[comparator]; + var keys = []; + for (var i = 0; i < num; i++) keys.push(i); + keys.sort(function(a, b) { + return comparator(base+a*size, base+b*size); + }); + print("KEYS:" + keys) + // apply the sort + var temp = _malloc(num*size); + _memcpy(temp, base, num*size); + for (var i = 0; i < num; i++) { + if (keys[i] == i) continue; // already in place + _memcpy(base+i*size, temp+keys[i]*size, size); + } + _free(temp); + }, + // string.h strspn: function(pstr, pset) { diff --git a/tests/runner.py b/tests/runner.py index 59e44102..42920946 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -901,15 +901,29 @@ if 'benchmark' not in sys.argv: printf("*cleaned*\\n"); } + int comparer(const void *a, const void *b) { + int aa = *((int*)a); + int bb = *((int*)b); + return aa - bb; + } + int main() { + // timeofday timeval t; gettimeofday(&t, NULL); - printf("*%d,%d\\n", int(t.tv_sec), int(t.tv_usec)); + printf("*%d,%d\\n", int(t.tv_sec), int(t.tv_usec)); // should not crash + + // atexit atexit(clean); + + // qsort + int values[6] = { 3, 2, 5, 1, 5, 6 }; + qsort(values, 5, sizeof(int), comparer); + printf("*%d,%d,%d,%d,%d,%d*\\n", values[0], values[1], values[2], values[3], values[4], values[5]); return 0; } ''' - self.do_test(src, '*cleaned*') + self.do_test(src, '*1,2,3,5,5,6*\n*cleaned*') def test_statics(self): src = ''' |