summaryrefslogtreecommitdiffstats
path: root/tests/017/qsort.tl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/017/qsort.tl')
-rw-r--r--tests/017/qsort.tl38
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/017/qsort.tl b/tests/017/qsort.tl
new file mode 100644
index 00000000..c6e5960f
--- /dev/null
+++ b/tests/017/qsort.tl
@@ -0,0 +1,38 @@
+(load "../common")
+
+(with-dyn-lib (libc)
+ ;; FFI for sorting char *array[] with qsort.
+ (deffi qsort "qsort" void ((ptr (array str)) size-t size-t closure))
+ (deffi-cb qsort-cb int ((ptr str-d) (ptr str-d)))
+
+ ;; FFI for sorting wchar_t *array[] with qsort.
+ (deffi qsortw "qsort" void ((ptr (array wstr)) size-t size-t closure))
+ (deffi-cb qsortw-cb int ((ptr wstr-d) (ptr wstr-d))))
+
+;; sort vector of strings as char *
+(let ((vec #("the" "quick" "brown" "fox" "jumped" "over" "the" "lazy" "dogs")))
+ (prinl vec)
+ (qsort vec (length vec) (sizeof str) [qsort-cb cmp-str])
+ (prinl vec))
+
+;; sort vector of strings as wchar_t *
+(let ((vec #("the" "quick" "brown" "fox" "jumped" "over" "the" "lazy" "dogs")))
+ (prinl vec)
+ (qsortw vec (length vec) (sizeof str) [qsortw-cb cmp-str])
+ (prinl vec))
+
+;; abort callback with non-local transfer
+(let ((vec #("the" "quick" "brown" "fox" "jumped" "over" "the" "lazy" "dogs")))
+ (prinl vec)
+ (prinl (block foo
+ (qsort vec (length vec) (sizeof str)
+ [qsort-cb (lambda (x y) (return-from foo 42))])))
+ (prinl vec))
+
+;; abort callback with non-local transfer
+(let ((vec #("the" "quick")))
+ (prinl vec)
+ (prinl (block foo
+ (qsortw vec (length vec) (sizeof str)
+ [qsortw-cb (lambda (x y) (return-from foo 42))])))
+ (prinl vec))