diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-12-21 16:56:21 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-12-21 16:56:21 -0800 |
commit | 6ba8e7a1cbb1a161020c92c1cc78d4191151b611 (patch) | |
tree | fcd9551d4b8cf5243039f55eaedbfe47f8444eba | |
parent | d71d791c840ce0c4e1f5f4645464ba577db3f776 (diff) | |
parent | 008024ad8c06daeec4af7c9f1c0938ce96eb9bbf (diff) |
Merge branch 'master' into incoming
-rw-r--r-- | emmake | 11 | ||||
-rw-r--r-- | src/library.js | 23 | ||||
-rw-r--r-- | tests/runner.py | 51 |
3 files changed, 85 insertions, 0 deletions
@@ -0,0 +1,11 @@ +#!/usr/bin/env python + +''' +This is a helper script. See emcc. +''' + +import os, sys +from tools import shared + +shared.Building.make(sys.argv[1:]) + diff --git a/src/library.js b/src/library.js index a665fc8f..1971ab66 100644 --- a/src/library.js +++ b/src/library.js @@ -3201,6 +3201,29 @@ LibraryManager.library = { throw 'ABORT: ' + code + ', at ' + (new Error().stack); }, + bsearch: function(key, base, num, size, compar) { + var cmp = FUNCTION_TABLE[compar]; + var left = 0; + var right = num; + var mid, test, addr; + + while (left < right) { + mid = (left + right) >>> 1; + addr = base + (mid * size); + test = cmp(key, addr); + + if (test < 0) { + right = mid; + } else if (test > 0) { + left = mid + 1; + } else { + return addr; + } + } + + return 0; + }, + realloc__deps: ['memcpy'], realloc: function(ptr, size) { // Very simple, inefficient implementation - if you use a real malloc, best to use diff --git a/tests/runner.py b/tests/runner.py index f3e705be..ae72ec49 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -2201,6 +2201,57 @@ def process(filename): ''' self.do_run(src) + def test_bsearch(self): + src = ''' + #include <stdlib.h> + #include <stdio.h> + + int cmp(const void* key, const void* member) { + return *(int *)key - *(int *)member; + } + + void printResult(int* needle, int* haystack, unsigned int len) { + void *result = bsearch(needle, haystack, len, sizeof(unsigned int), cmp); + + if (result == NULL) { + printf("null\\n"); + } else { + printf("%d\\n", *(unsigned int *)result); + } + } + + int main() { + int a[] = { -2, -1, 0, 6, 7, 9 }; + int b[] = { 0, 1 }; + + /* Find all keys that exist. */ + for(int i = 0; i < 6; i++) { + int val = a[i]; + + printResult(&val, a, 6); + } + + /* Keys that are covered by the range of the array but aren't in + * the array cannot be found. + */ + int v1 = 3; + int v2 = 8; + printResult(&v1, a, 6); + printResult(&v2, a, 6); + + /* Keys outside the range of the array cannot be found. */ + int v3 = -1; + int v4 = 2; + + printResult(&v3, b, 2); + printResult(&v4, b, 2); + + return 0; + } + ''' + + self.do_run(src, '-2\n-1\n0\n6\n7\n9\nnull\nnull\nnull\nnull') + def test_nestedstructs(self): src = ''' #include <stdio.h> |