summaryrefslogtreecommitdiff
path: root/tests/run/libc_stdlib.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/libc_stdlib.pyx')
-rw-r--r--tests/run/libc_stdlib.pyx32
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/run/libc_stdlib.pyx b/tests/run/libc_stdlib.pyx
new file mode 100644
index 000000000..6d9e4870f
--- /dev/null
+++ b/tests/run/libc_stdlib.pyx
@@ -0,0 +1,32 @@
+# mode: run
+
+from libc.stdlib cimport abs as c_int_abs, qsort as libc_qsort
+
+
+def libc_int_abs(int x):
+ """
+ >>> libc_int_abs(5)
+ 5
+ >>> libc_int_abs(-5)
+ 5
+ """
+ return c_int_abs(x)
+
+
+cdef int gt(const void* v1, const void* v2) noexcept nogil:
+ return ((<int*>v1)[0] - (<int*>v2)[0])
+
+cdef int lt(const void* v1, const void* v2) noexcept nogil:
+ return - gt(v1, v2)
+
+def qsort(values, direction='lt'):
+ """
+ >>> data = [1, 9, 3, 2, 5]
+ >>> qsort(data, 'gt')
+ [1, 2, 3, 5, 9]
+ >>> qsort(data, 'lt')
+ [9, 5, 3, 2, 1]
+ """
+ cdef int[5] carray = values[:5]
+ libc_qsort(carray, 5, sizeof(int), lt if direction == 'lt' else gt)
+ return carray