aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js20
-rw-r--r--tests/runner.py18
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 = '''