From d1a7f637975ac6b8d6017c3824a65e9a7910b23d Mon Sep 17 00:00:00 2001 From: xushiwei Date: Mon, 6 May 2024 13:26:09 +0800 Subject: [PATCH] demo: qsort --- README.md | 3 ++- _demo/qsort/qsort.go | 17 +++++++++++++++++ c/c.go | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 _demo/qsort/qsort.go diff --git a/README.md b/README.md index 4cfc0868..b4b6e72b 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ go install -v ./... The `_demo` directory contains our demos (it start with `_` to prevent the `go` command from compiling it): -* genints: closure usage in llgo +* [qsort](_demo/qsort): call C function with callback +* [genints](_demo/genints): closure usage in llgo ### How to run demos diff --git a/_demo/qsort/qsort.go b/_demo/qsort/qsort.go new file mode 100644 index 00000000..95658371 --- /dev/null +++ b/_demo/qsort/qsort.go @@ -0,0 +1,17 @@ +package main + +import ( + "unsafe" + + "github.com/goplus/llgo/c" +) + +func main() { + a := [...]int{100, 8, 23, 2, 7} + c.Qsort(c.Pointer(&a), 5, unsafe.Sizeof(0), func(a, b c.Pointer) c.Int { + return c.Int(*(*int)(a) - *(*int)(b)) + }) + for _, v := range a { + c.Printf(c.Str("%d\n"), v) + } +} diff --git a/c/c.go b/c/c.go index ac88b11a..340edd2c 100644 --- a/c/c.go +++ b/c/c.go @@ -71,3 +71,6 @@ func Printf(format *Char, __llgo_va_list ...any) Int //go:linkname Fprintf C.fprintf func Fprintf(fp FilePtr, format *Char, __llgo_va_list ...any) Int + +//go:linkname Qsort C.qsort +func Qsort(base Pointer, count, elem uintptr, compar func(a, b Pointer) Int)