mirror of
https://github.com/goplus/llgo.git
synced 2025-09-27 03:56:05 +08:00
1165 lines
27 KiB
Go
1165 lines
27 KiB
Go
package main
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"github.com/goplus/lib/c"
|
|
"github.com/goplus/llgo/_embdemo/esp32/watchdog"
|
|
)
|
|
|
|
//
|
|
//go:linkname strlen C.strlen
|
|
func strlen(str *c.Char) c.SizeT
|
|
|
|
//go:linkname strcpy C.strcpy
|
|
func strcpy(dest, src *c.Char) *c.Char
|
|
|
|
//go:linkname strncpy C.strncpy
|
|
func strncpy(dest, src *c.Char, n c.SizeT) *c.Char
|
|
|
|
//go:linkname strcat C.strcat
|
|
func strcat(dest, src *c.Char) *c.Char
|
|
|
|
//go:linkname strncat C.strncat
|
|
func strncat(dest, src *c.Char, n c.SizeT) *c.Char
|
|
|
|
//go:linkname strcmp C.strcmp
|
|
func strcmp(s1, s2 *c.Char) c.Int
|
|
|
|
//go:linkname strncmp C.strncmp
|
|
func strncmp(s1, s2 *c.Char, n c.SizeT) c.Int
|
|
|
|
//go:linkname strchr C.strchr
|
|
func strchr(s *c.Char, c c.Int) *c.Char
|
|
|
|
//go:linkname strrchr C.strrchr
|
|
func strrchr(s *c.Char, c c.Int) *c.Char
|
|
|
|
//go:linkname strstr C.strstr
|
|
func strstr(haystack, needle *c.Char) *c.Char
|
|
|
|
//go:linkname strtok C.strtok
|
|
func strtok(str, delim *c.Char) *c.Char
|
|
|
|
//go:linkname strtok_r C.strtok_r
|
|
func strtok_r(str, delim *c.Char, saveptr **c.Char) *c.Char
|
|
|
|
//go:linkname strspn C.strspn
|
|
func strspn(s, accept *c.Char) c.SizeT
|
|
|
|
//go:linkname strcspn C.strcspn
|
|
func strcspn(s, reject *c.Char) c.SizeT
|
|
|
|
//go:linkname strdup C.strdup
|
|
func strdup(s *c.Char) *c.Char
|
|
|
|
//go:linkname strndup C.strndup
|
|
func strndup(s *c.Char, n c.SizeT) *c.Char
|
|
|
|
//go:linkname memcpy C.memcpy
|
|
func memcpy(dest, src unsafe.Pointer, n c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname memmove C.memmove
|
|
func memmove(dest, src unsafe.Pointer, n c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname memset C.memset
|
|
func memset(s unsafe.Pointer, c c.Int, n c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname memcmp C.memcmp
|
|
func memcmp(s1, s2 unsafe.Pointer, n c.SizeT) c.Int
|
|
|
|
//go:linkname memchr C.memchr
|
|
func memchr(s unsafe.Pointer, c c.Int, n c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname memrchr C.memrchr
|
|
func memrchr(s unsafe.Pointer, c c.Int, n c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname bcmp C.bcmp
|
|
func bcmp(s1, s2 unsafe.Pointer, n c.SizeT) c.Int
|
|
|
|
//go:linkname bcopy C.bcopy
|
|
func bcopy(src, dest unsafe.Pointer, n c.SizeT)
|
|
|
|
//go:linkname bzero C.bzero
|
|
func bzero(s unsafe.Pointer, n c.SizeT)
|
|
|
|
//go:linkname explicit_bzero C.explicit_bzero
|
|
func explicit_bzero(s unsafe.Pointer, n c.SizeT)
|
|
|
|
//go:linkname ffs C.ffs
|
|
func ffs(i c.Int) c.Int
|
|
|
|
//go:linkname ffsl C.ffsl
|
|
func ffsl(i c.Long) c.Int
|
|
|
|
//go:linkname ffsll C.ffsll
|
|
func ffsll(i c.LongLong) c.Int
|
|
|
|
//go:linkname fls C.fls
|
|
func fls(i c.Int) c.Int
|
|
|
|
//go:linkname flsl C.flsl
|
|
func flsl(i c.Long) c.Int
|
|
|
|
//go:linkname flsll C.flsll
|
|
func flsll(i c.LongLong) c.Int
|
|
|
|
//go:linkname index C.index
|
|
func index(s *c.Char, c c.Int) *c.Char
|
|
|
|
//go:linkname rindex C.rindex
|
|
func rindex(s *c.Char, c c.Int) *c.Char
|
|
|
|
//go:linkname strcasecmp C.strcasecmp
|
|
func strcasecmp(s1, s2 *c.Char) c.Int
|
|
|
|
//go:linkname strncasecmp C.strncasecmp
|
|
func strncasecmp(s1, s2 *c.Char, n c.SizeT) c.Int
|
|
|
|
//go:linkname strlcat C.strlcat
|
|
func strlcat(dst, src *c.Char, size c.SizeT) c.SizeT
|
|
|
|
//go:linkname strlcpy C.strlcpy
|
|
func strlcpy(dst, src *c.Char, size c.SizeT) c.SizeT
|
|
|
|
//go:linkname strsep C.strsep
|
|
func strsep(stringp **c.Char, delim *c.Char) *c.Char
|
|
|
|
//go:linkname strcoll C.strcoll
|
|
func strcoll(s1, s2 *c.Char) c.Int
|
|
|
|
//go:linkname strxfrm C.strxfrm
|
|
func strxfrm(dest, src *c.Char, n c.SizeT) c.SizeT
|
|
|
|
//go:linkname strerror C.strerror
|
|
func strerror(errnum c.Int) *c.Char
|
|
|
|
//go:linkname strerror_r C.strerror_r
|
|
func strerror_r(errnum c.Int, buf *c.Char, buflen c.SizeT) c.Int
|
|
|
|
//go:linkname strverscmp C.strverscmp
|
|
func strverscmp(s1, s2 *c.Char) c.Int
|
|
|
|
// 内存分配函数
|
|
//
|
|
//go:linkname malloc C.malloc
|
|
func malloc(size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname calloc C.calloc
|
|
func calloc(nmemb, size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname realloc C.realloc
|
|
func realloc(ptr unsafe.Pointer, size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname reallocarray C.reallocarray
|
|
func reallocarray(ptr unsafe.Pointer, nmemb, size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname reallocf C.reallocf
|
|
func reallocf(ptr unsafe.Pointer, size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname valloc C.valloc
|
|
func valloc(size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname pvalloc C.pvalloc
|
|
func pvalloc(size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname memalign C.memalign
|
|
func memalign(alignment, size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname aligned_alloc C.aligned_alloc
|
|
func aligned_alloc(alignment, size c.SizeT) unsafe.Pointer
|
|
|
|
//go:linkname posix_memalign C.posix_memalign
|
|
func posix_memalign(memptr *unsafe.Pointer, alignment, size c.SizeT) c.Int
|
|
|
|
//go:linkname free C.free
|
|
func free(ptr unsafe.Pointer)
|
|
|
|
//go:linkname malloc_size C.malloc_size
|
|
func malloc_size(ptr unsafe.Pointer) c.SizeT
|
|
|
|
//go:linkname malloc_usable_size C.malloc_usable_size
|
|
func malloc_usable_size(ptr unsafe.Pointer) c.SizeT
|
|
|
|
//go:linkname malloc_stats C.malloc_stats
|
|
func malloc_stats()
|
|
|
|
//go:linkname malloc_info C.malloc_info
|
|
func malloc_info(options c.Int, stream c.FilePtr) c.Int
|
|
|
|
//go:linkname mallopt C.mallopt
|
|
func mallopt(param, value c.Int) c.Int
|
|
|
|
// 标准I/O函数
|
|
//
|
|
//go:linkname fopen C.fopen
|
|
func fopen(pathname, mode *c.Char) c.FilePtr
|
|
|
|
//go:linkname fdopen C.fdopen
|
|
func fdopen(fd c.Int, mode *c.Char) c.FilePtr
|
|
|
|
//go:linkname freopen C.freopen
|
|
func freopen(pathname, mode *c.Char, stream c.FilePtr) c.FilePtr
|
|
|
|
//go:linkname fclose C.fclose
|
|
func fclose(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname fflush C.fflush
|
|
func fflush(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname fseek C.fseek
|
|
func fseek(stream c.FilePtr, offset c.Long, whence c.Int) c.Int
|
|
|
|
//go:linkname ftell C.ftell
|
|
func ftell(stream c.FilePtr) c.Long
|
|
|
|
// //go:linkname fseeko C.fseeko
|
|
// func fseeko(stream c.FilePtr, offset C.off_t, whence c.Int) c.Int
|
|
|
|
// //go:linkname ftello C.ftello
|
|
// func ftello(stream c.FilePtr) C.off_t
|
|
|
|
//go:linkname rewind C.rewind
|
|
func rewind(stream c.FilePtr)
|
|
|
|
// //go:linkname fgetpos C.fgetpos
|
|
// func fgetpos(stream c.FilePtr, pos *C.fpos_t) c.Int
|
|
|
|
// //go:linkname fsetpos C.fsetpos
|
|
// func fsetpos(stream c.FilePtr, pos *C.fpos_t) c.Int
|
|
|
|
//go:linkname fread C.fread
|
|
func fread(ptr unsafe.Pointer, size, nmemb c.SizeT, stream c.FilePtr) c.SizeT
|
|
|
|
//go:linkname fwrite C.fwrite
|
|
func fwrite(ptr unsafe.Pointer, size, nmemb c.SizeT, stream c.FilePtr) c.SizeT
|
|
|
|
//go:linkname fgetc C.fgetc
|
|
func fgetc(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname getc C.getc
|
|
func getc(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname getchar C.getchar
|
|
func getchar() c.Int
|
|
|
|
//go:linkname ungetc C.ungetc
|
|
func ungetc(c c.Int, stream c.FilePtr) c.Int
|
|
|
|
//go:linkname fgets C.fgets
|
|
func fgets(s *c.Char, size c.Int, stream c.FilePtr) *c.Char
|
|
|
|
//go:linkname fputc C.fputc
|
|
func fputc(c c.Int, stream c.FilePtr) c.Int
|
|
|
|
//go:linkname putc C.putc
|
|
func putc(c c.Int, stream c.FilePtr) c.Int
|
|
|
|
//go:linkname putchar C.putchar
|
|
func putchar(c c.Int) c.Int
|
|
|
|
//go:linkname fputs C.fputs
|
|
func fputs(s *c.Char, stream c.FilePtr) c.Int
|
|
|
|
//go:linkname puts C.puts
|
|
func puts(s *c.Char) c.Int
|
|
|
|
//go:linkname printf C.printf
|
|
func printf(format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname fprintf C.fprintf
|
|
func fprintf(stream c.FilePtr, format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname sprintf C.sprintf
|
|
func sprintf(str, format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname snprintf C.snprintf
|
|
func snprintf(str *c.Char, size c.SizeT, format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
// //go:linkname vprintf C.vprintf
|
|
// func vprintf(format *c.Char, ap C.va_list) c.Int
|
|
|
|
// //go:linkname vfprintf C.vfprintf
|
|
// func vfprintf(stream c.FilePtr, format *c.Char, ap C.va_list) c.Int
|
|
|
|
// //go:linkname vsprintf C.vsprintf
|
|
// func vsprintf(str, format *c.Char, ap C.va_list) c.Int
|
|
|
|
// //go:linkname vsnprintf C.vsnprintf
|
|
// func vsnprintf(str *c.Char, size c.SizeT, format *c.Char, ap C.va_list) c.Int
|
|
|
|
//go:linkname scanf C.scanf
|
|
func scanf(format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname fscanf C.fscanf
|
|
func fscanf(stream c.FilePtr, format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname sscanf C.sscanf
|
|
func sscanf(str, format *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname remove C.remove
|
|
func remove(pathname *c.Char) c.Int
|
|
|
|
//go:linkname rename C.rename
|
|
func rename(oldpath, newpath *c.Char) c.Int
|
|
|
|
//go:linkname tmpfile C.tmpfile
|
|
func tmpfile() c.FilePtr
|
|
|
|
//go:linkname tmpnam C.tmpnam
|
|
func tmpnam(s *c.Char) *c.Char
|
|
|
|
//go:linkname tempnam C.tempnam
|
|
func tempnam(dir, pfx *c.Char) *c.Char
|
|
|
|
//go:linkname fileno C.fileno
|
|
func fileno(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname feof C.feof
|
|
func feof(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname ferror C.ferror
|
|
func ferror(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname clearerr C.clearerr
|
|
func clearerr(stream c.FilePtr)
|
|
|
|
//go:linkname perror C.perror
|
|
func perror(s *c.Char)
|
|
|
|
//go:linkname setvbuf C.setvbuf
|
|
func setvbuf(stream c.FilePtr, buf *c.Char, mode c.Int, size c.SizeT) c.Int
|
|
|
|
//go:linkname setbuf C.setbuf
|
|
func setbuf(stream c.FilePtr, buf *c.Char)
|
|
|
|
//go:linkname setbuffer C.setbuffer
|
|
func setbuffer(stream c.FilePtr, buf *c.Char, size c.SizeT)
|
|
|
|
//go:linkname setlinebuf C.setlinebuf
|
|
func setlinebuf(stream c.FilePtr)
|
|
|
|
//go:linkname fcloseall C.fcloseall
|
|
func fcloseall() c.Int
|
|
|
|
//go:linkname fmemopen C.fmemopen
|
|
func fmemopen(buf unsafe.Pointer, size c.SizeT, mode *c.Char) c.FilePtr
|
|
|
|
//go:linkname open_memstream C.open_memstream
|
|
func open_memstream(ptr **c.Char, sizeloc *c.SizeT) c.FilePtr
|
|
|
|
//go:linkname fpurge C.fpurge
|
|
func fpurge(stream c.FilePtr) c.Int
|
|
|
|
//go:linkname __fpurge C.__fpurge
|
|
func __fpurge(stream c.FilePtr) c.Int
|
|
|
|
//
|
|
// //go:linkname acos C.acos
|
|
// func acos(x c.Double) c.Double
|
|
|
|
// //go:linkname asin C.asin
|
|
// func asin(x c.Double) c.Double
|
|
|
|
// //go:linkname atan C.atan
|
|
// func atan(x c.Double) c.Double
|
|
|
|
// //go:linkname atan2 C.atan2
|
|
// func atan2(y, x c.Double) c.Double
|
|
|
|
// //go:linkname cos C.cos
|
|
// func cos(x c.Double) c.Double
|
|
|
|
// //go:linkname sin C.sin
|
|
// func sin(x c.Double) c.Double
|
|
|
|
// //go:linkname tan C.tan
|
|
// func tan(x c.Double) c.Double
|
|
|
|
// //go:linkname cosh C.cosh
|
|
// func cosh(x c.Double) c.Double
|
|
|
|
// //go:linkname sinh C.sinh
|
|
// func sinh(x c.Double) c.Double
|
|
|
|
// //go:linkname tanh C.tanh
|
|
// func tanh(x c.Double) c.Double
|
|
|
|
// //go:linkname exp C.exp
|
|
// func exp(x c.Double) c.Double
|
|
|
|
// //go:linkname frexp C.frexp
|
|
// func frexp(value c.Double, exp *c.Int) c.Double
|
|
|
|
// //go:linkname ldexp C.ldexp
|
|
// func ldexp(x c.Double, exp c.Int) c.Double
|
|
|
|
// //go:linkname log C.log
|
|
// func log(x c.Double) c.Double
|
|
|
|
// //go:linkname log10 C.log10
|
|
// func log10(x c.Double) c.Double
|
|
|
|
// //go:linkname modf C.modf
|
|
// func modf(value c.Double, iptr *c.Double) c.Double
|
|
|
|
// //go:linkname pow C.pow
|
|
// func pow(x, y c.Double) c.Double
|
|
|
|
// //go:linkname sqrt C.sqrt
|
|
// func sqrt(x c.Double) c.Double
|
|
|
|
// //go:linkname ceil C.ceil
|
|
// func ceil(x c.Double) c.Double
|
|
|
|
// //go:linkname fabs C.fabs
|
|
// func fabs(x c.Double) c.Double
|
|
|
|
// //go:linkname floor C.floor
|
|
// func floor(x c.Double) c.Double
|
|
|
|
// //go:linkname fmod C.fmod
|
|
// func fmod(x, y c.Double) c.Double
|
|
|
|
// //go:linkname erf C.erf
|
|
// func erf(x c.Double) c.Double
|
|
|
|
// //go:linkname erfc C.erfc
|
|
// func erfc(x c.Double) c.Double
|
|
|
|
// //go:linkname gamma C.gamma
|
|
// func gamma(x c.Double) c.Double
|
|
|
|
// //go:linkname hypot C.hypot
|
|
// func hypot(x, y c.Double) c.Double
|
|
|
|
// //go:linkname isnan C.isnan
|
|
// func isnan(x c.Double) c.Int
|
|
|
|
// //go:linkname isinf C.isinf
|
|
// func isinf(x c.Double) c.Int
|
|
|
|
// //go:linkname j0 C.j0
|
|
// func j0(x c.Double) c.Double
|
|
|
|
// //go:linkname j1 C.j1
|
|
// func j1(x c.Double) c.Double
|
|
|
|
// //go:linkname jn C.jn
|
|
// func jn(n c.Int, x c.Double) c.Double
|
|
|
|
// //go:linkname lgamma C.lgamma
|
|
// func lgamma(x c.Double) c.Double
|
|
|
|
// //go:linkname y0 C.y0
|
|
// func y0(x c.Double) c.Double
|
|
|
|
// //go:linkname y1 C.y1
|
|
// func y1(x c.Double) c.Double
|
|
|
|
// //go:linkname yn C.yn
|
|
// func yn(n c.Int, x c.Double) c.Double
|
|
|
|
// //go:linkname acosh C.acosh
|
|
// func acosh(x c.Double) c.Double
|
|
|
|
// //go:linkname asinh C.asinh
|
|
// func asinh(x c.Double) c.Double
|
|
|
|
// //go:linkname atanh C.atanh
|
|
// func atanh(x c.Double) c.Double
|
|
|
|
// //go:linkname cbrt C.cbrt
|
|
// func cbrt(x c.Double) c.Double
|
|
|
|
// //go:linkname expm1 C.expm1
|
|
// func expm1(x c.Double) c.Double
|
|
|
|
// //go:linkname ilogb C.ilogb
|
|
// func ilogb(x c.Double) c.Int
|
|
|
|
// //go:linkname log1p C.log1p
|
|
// func log1p(x c.Double) c.Double
|
|
|
|
// //go:linkname logb C.logb
|
|
// func logb(x c.Double) c.Double
|
|
|
|
// //go:linkname nextafter C.nextafter
|
|
// func nextafter(x, y c.Double) c.Double
|
|
|
|
// //go:linkname remainder C.remainder
|
|
// func remainder(x, y c.Double) c.Double
|
|
|
|
// //go:linkname scalbn C.scalbn
|
|
// func scalbn(x c.Double, n c.Int) c.Double
|
|
|
|
// //go:linkname scalbln C.scalbln
|
|
// func scalbln(x c.Double, n c.Long) c.Double
|
|
|
|
// //go:linkname nearbyint C.nearbyint
|
|
// func nearbyint(x c.Double) c.Double
|
|
|
|
// //go:linkname rint C.rint
|
|
// func rint(x c.Double) c.Double
|
|
|
|
// //go:linkname lrint C.lrint
|
|
// func lrint(x c.Double) c.Long
|
|
|
|
// //go:linkname llrint C.llrint
|
|
// func llrint(x c.Double) c.LongLong
|
|
|
|
// //go:linkname round C.round
|
|
// func round(x c.Double) c.Double
|
|
|
|
// //go:linkname lround C.lround
|
|
// func lround(x c.Double) c.Long
|
|
|
|
// //go:linkname llround C.llround
|
|
// func llround(x c.Double) c.LongLong
|
|
|
|
// //go:linkname trunc C.trunc
|
|
// func trunc(x c.Double) c.Double
|
|
|
|
// //go:linkname fdim C.fdim
|
|
// func fdim(x, y c.Double) c.Double
|
|
|
|
// //go:linkname fmax C.fmax
|
|
// func fmax(x, y c.Double) c.Double
|
|
|
|
// //go:linkname fmin C.fmin
|
|
// func fmin(x, y c.Double) c.Double
|
|
|
|
// //go:linkname fma C.fma
|
|
// func fma(x, y, z c.Double) c.Double
|
|
|
|
// // 浮点版本
|
|
// //
|
|
// //go:linkname acosf C.acosf
|
|
// func acosf(x c.Float) c.Float
|
|
|
|
// //go:linkname asinf C.asinf
|
|
// func asinf(x c.Float) c.Float
|
|
|
|
// //go:linkname atanf C.atanf
|
|
// func atanf(x c.Float) c.Float
|
|
|
|
// //go:linkname atan2f C.atan2f
|
|
// func atan2f(y, x c.Float) c.Float
|
|
|
|
// //go:linkname cosf C.cosf
|
|
// func cosf(x c.Float) c.Float
|
|
|
|
// //go:linkname sinf C.sinf
|
|
// func sinf(x c.Float) c.Float
|
|
|
|
// //go:linkname tanf C.tanf
|
|
// func tanf(x c.Float) c.Float
|
|
|
|
// //go:linkname coshf C.coshf
|
|
// func coshf(x c.Float) c.Float
|
|
|
|
// //go:linkname sinhf C.sinhf
|
|
// func sinhf(x c.Float) c.Float
|
|
|
|
// //go:linkname tanhf C.tanhf
|
|
// func tanhf(x c.Float) c.Float
|
|
|
|
// //go:linkname expf C.expf
|
|
// func expf(x c.Float) c.Float
|
|
|
|
// //go:linkname frexpf C.frexpf
|
|
// func frexpf(value c.Float, exp *c.Int) c.Float
|
|
|
|
// //go:linkname ldexpf C.ldexpf
|
|
// func ldexpf(x c.Float, exp c.Int) c.Float
|
|
|
|
// //go:linkname logf C.log极
|
|
// func logf(x c.Float) c.Float
|
|
|
|
// //go:linkname log10f C.log10f
|
|
// func log10f(x c.Float) c.Float
|
|
|
|
// //go:linkname modff C.modff
|
|
// func modff(value c.Float, iptr *c.Float) c.Float
|
|
|
|
// //go:linkname powf C.powf
|
|
// func powf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname sqrtf C.sqrtf
|
|
// func sqrtf(x c.Float) c.Float
|
|
|
|
// //go:linkname ceilf C.ceilf
|
|
// func ceilf(x c.Float) c.Float
|
|
|
|
// //go:linkname fabsf C.fabsf
|
|
// func fabsf(x c.Float) c.Float
|
|
|
|
// //go:linkname floorf C.floorf
|
|
// func floorf(x c.Float) c.Float
|
|
|
|
// //go:linkname fmodf C.fmodf
|
|
// func fmodf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname erff C.erff
|
|
// func erff(x c.Float) c.Float
|
|
|
|
// //go:linkname erfcf C.erfcf
|
|
// func erfcf(x c.Float) c.Float
|
|
|
|
// //go:linkname gammaf C.gammaf
|
|
// func gammaf(x c.Float) c.Float
|
|
|
|
// //go:linkname hypotf C.hypotf
|
|
// func hypotf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname isnanf C.isnanf
|
|
// func isnanf(x c.Float) c.Int
|
|
|
|
// //go:linkname isinff C.isinff
|
|
// func isinff(x c.Float) c.Int
|
|
|
|
// //go:linkname j0f C.j0f
|
|
// func j0f(x c.Float) c.Float
|
|
|
|
// //go:linkname j1f C.j1f
|
|
// func j1f(x c.Float) c.Float
|
|
|
|
// //go:linkname jnf C.jnf
|
|
// func jnf(n c.Int, x c.Float) c.Float
|
|
|
|
// //go:linkname lgammaf C.lgammaf
|
|
// func lgammaf(x c.Float) c.Float
|
|
|
|
// //go:linkname y0f C.y0f
|
|
// func y0f(x c.Float) c.Float
|
|
|
|
// //go:linkname y1f C.y1f
|
|
// func y1f(x c.Float) c.Float
|
|
|
|
// //go:linkname ynf C.ynf
|
|
// func ynf(n c.Int, x c.Float) c.Float
|
|
|
|
// //go:linkname acoshf C.acoshf
|
|
// func acoshf(x c.Float) c.Float
|
|
|
|
// //go:linkname asinhf C.asinhf
|
|
// func asinhf(x c.Float) c.Float
|
|
|
|
// //go:linkname atanhf C.atanhf
|
|
// func atanhf(x c.Float) c.Float
|
|
|
|
// //go:linkname cbrtf C.cbrtf
|
|
// func cbrtf(x c.Float) c.Float
|
|
|
|
// //go:linkname expm1f C.expm1f
|
|
// func expm1f(x c.Float) c.Float
|
|
|
|
// //go:linkname ilogbf C.ilogbf
|
|
// func ilogbf(x c.Float) c.Int
|
|
|
|
// //go:linkname log1pf C.log1pf
|
|
// func log1pf(x c.Float) c.Float
|
|
|
|
// //go:linkname logbf C.logbf
|
|
// func logbf(x c.Float) c.Float
|
|
|
|
// //go:linkname nextafterf C.nextafterf
|
|
// func nextafterf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname remainderf C.remainderf
|
|
// func remainderf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname scalbnf C.scalbnf
|
|
// func scalbnf(x c.Float, n c.Int) c.Float
|
|
|
|
// //go:linkname scalblnf C.scalblnf
|
|
// func scalblnf(x c.Float, n c.Long) c.Float
|
|
|
|
// //go:linkname nearbyintf C.nearbyintf
|
|
// func nearbyintf(x c.Float) c.Float
|
|
|
|
// //go:linkname rintf C.rintf
|
|
// func rintf(x c.Float) c.Float
|
|
|
|
// //go:linkname lrintf C.lrintf
|
|
// func lrintf(x c.Float) c.Long
|
|
|
|
// //go:linkname llrintf C.llrintf
|
|
// func llrintf(x c.Float) c.LongLong
|
|
|
|
// //go:linkname roundf C.roundf
|
|
// func roundf(x c.Float) c.Float
|
|
|
|
// //go:linkname lroundf C.lroundf
|
|
// func lroundf(x c.Float) c.Long
|
|
|
|
// //go:linkname llroundf C.llroundf
|
|
// func llroundf(x c.Float) c.LongLong
|
|
|
|
// //go:linkname truncf C.truncf
|
|
// func truncf(x c.Float) c.Float
|
|
|
|
// //go:linkname fdimf C.fdimf
|
|
// func fdimf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname fmaxf C.fmaxf
|
|
// func fmaxf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname fminf C.fminf
|
|
// func fminf(x, y c.Float) c.Float
|
|
|
|
// //go:linkname fmaf C.fmaf
|
|
// func fmaf(x, y, z c.Float) c.Float
|
|
|
|
//
|
|
// //go:linkname time C.time
|
|
// func time(t *c.ti) C.time_t
|
|
|
|
// //go:linkname localtime C.localtime
|
|
// func localtime(t *C.time_t) *C.tm
|
|
|
|
// //go:linkname gmtime C.gmtime
|
|
// func gmtime(t *C.time_t) *C.tm
|
|
|
|
// //go:linkname mktime C.mktime
|
|
// func mktime(t *C.tm) C.time_t
|
|
|
|
// //go:linkname strftime C.strftime
|
|
// func strftime(s *c.Char, max c.SizeT, format *c.Char, tm *C.tm) c.SizeT
|
|
|
|
// //go:linkname clock C.clock
|
|
// func clock() C.clock_t
|
|
|
|
// //go:linkname difftime C.difftime
|
|
// func difftime(time1, time0 C.time_t) c.Double
|
|
|
|
// //go:linkname asctime C.asctime
|
|
// func asctime(tm *C.tm) *c.Char
|
|
|
|
// //go:linkname ctime C.ctime
|
|
// func ctime(t *C.time_t) *c.Char
|
|
|
|
//
|
|
//go:linkname exit C.exit
|
|
func exit(status c.Int)
|
|
|
|
//go:linkname abort C.abort
|
|
func abort()
|
|
|
|
//go:linkname system C.system
|
|
func system(command *c.Char) c.Int
|
|
|
|
//go:linkname getenv C.getenv
|
|
func getenv(name *c.Char) *c.Char
|
|
|
|
//go:linkname setenv C.setenv
|
|
func setenv(name, value *c.Char, overwrite c.Int) c.Int
|
|
|
|
//go:linkname unsetenv C.unsetenv
|
|
func unsetenv(name *c.Char) c.Int
|
|
|
|
//go:linkname putenv C.putenv
|
|
func putenv(string *c.Char) c.Int
|
|
|
|
//go:linkname clearenv C.clearenv
|
|
func clearenv() c.Int
|
|
|
|
// //go:linkname getpid C.getpid
|
|
// func getpid() C.pid_t
|
|
|
|
// //go:linkname getppid C.getppid
|
|
// func getppid() C.pid_t
|
|
|
|
// //go:linkname fork C.fork
|
|
// func fork() C.pid_t
|
|
|
|
// //go:linkname vfork C.vfork
|
|
// func vfork() C.pid_t
|
|
|
|
//go:linkname execve C.execve
|
|
func execve(path *c.Char, argv **c.Char, envp **c.Char) c.Int
|
|
|
|
//go:linkname execv C.execv
|
|
func execv(path *c.Char, argv **c.Char) c.Int
|
|
|
|
//go:linkname execvp C.execvp
|
|
func execvp(file *c.Char, argv **c.Char) c.Int
|
|
|
|
//go:linkname execl C.execl
|
|
func execl(path *c.Char, arg0 *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname execlp C.execlp
|
|
func execlp(file *c.Char, arg0 *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
//go:linkname execle C.execle
|
|
func execle(path *c.Char, arg0 *c.Char, __llgo_va_list ...any) c.Int
|
|
|
|
// //go:linkname wait C.wait
|
|
// func wait(status *c.Int) C.piI_t
|
|
|
|
// //go:linkname waitpid C.waitpid
|
|
// func waitpid(pid C.pid_t, status *c.Int, options c.Int) C.piI_t
|
|
|
|
//
|
|
//go:linkname signal C.signal
|
|
func signal(sig c.Int, handler unsafe.Pointer) unsafe.Pointer
|
|
|
|
//go:linkname raise C.raise
|
|
func raise(sig c.Int) c.Int
|
|
|
|
// //go:linkname kill C.kill
|
|
// func kill(pid C.pid_t, sig c.Int) c.Int
|
|
|
|
// //go:linkname alarm C.alarm
|
|
// func alarm(seconds C.uint) C.uint
|
|
|
|
//go:linkname pause C.pause
|
|
func pause() c.Int
|
|
|
|
//
|
|
// //go:linkname opendir C.opendir
|
|
// func opendir(name *c.Char) *C.DIR
|
|
|
|
// //go:linkname readdir C.readdir
|
|
// func readdir(dirp *C.DIR) *C.dirent
|
|
|
|
// //go:linkname closedir C.closedir
|
|
// func closedir(dirp *C.DIR) c.Int
|
|
|
|
// //go:linkname rewinddir C.rewinddir
|
|
// func rewinddir(dirp *C.DIR)
|
|
|
|
// //go:linkname seekdir C.seekdir
|
|
// func seekdir(dirp *C.DIR, loc c.Long)
|
|
|
|
// //go:linkname telldir C.telldir
|
|
// func telldir(dirp *C.DIR) c.Long
|
|
|
|
//
|
|
//go:linkname open C.open
|
|
func open(path *c.Char, oflag c.Int, mode c.Int) c.Int
|
|
|
|
//go:linkname creat C.creat
|
|
func creat(path *c.Char, mode c.Int) c.Int
|
|
|
|
//go:linkname close C.close
|
|
func close(fd c.Int) c.Int
|
|
|
|
//go:linkname read C.read
|
|
func read(fd c.Int, buf unsafe.Pointer, count c.SizeT) c.SsizeT
|
|
|
|
//go:linkname write C.write
|
|
func write(fd c.Int, buf unsafe.Pointer, count c.SizeT) c.SsizeT
|
|
|
|
// //go:linkname lseek C.lseek
|
|
// func lseek(fd c.Int, offset C.off_t, whence c.Int) C.ofI_t
|
|
|
|
//go:linkname fsync C.fsync
|
|
func fsync(fd c.Int) c.Int
|
|
|
|
//go:linkname fdatasync C.fdatasync
|
|
func fdatasync(fd c.Int) c.Int
|
|
|
|
// //go:linkname ftruncate C.ftruncate
|
|
// func ftruncate(fd c.Int, length C.off_t) c.Int
|
|
|
|
//go:linkname dup C.dup
|
|
func dup(fd c.Int) c.Int
|
|
|
|
//go:linkname dup2 C.dup2
|
|
func dup2(oldfd, newfd c.Int) c.Int
|
|
|
|
//go:linkname pipe C.pipe
|
|
func pipe(fildes *[2]c.Int) c.Int
|
|
|
|
//go:linkname chdir C.chdir
|
|
func chdir(path *c.Char) c.Int
|
|
|
|
//go:linkname fchdir C.fchdir
|
|
func fchdir(fd c.Int) c.Int
|
|
|
|
//go:linkname getcwd C.getcwd
|
|
func getcwd(buf *c.Char, size c.SizeT) *c.Char
|
|
|
|
//go:linkname chmod C.chmod
|
|
func chmod(path *c.Char, mode c.Int) c.Int
|
|
|
|
//go:linkname fchmod C.fchmod
|
|
func fchmod(fd c.Int, mode c.Int) c.Int
|
|
|
|
// //go:linkname chown C.chown
|
|
// func chown(path *c.Char, owner C.uid_t, group C.gid_t) c.Int
|
|
|
|
// //go:linkname fchown C.fchown
|
|
// func fchown(fd c.Int, owner C.uid_t, group C.gid_t) c.Int
|
|
|
|
// //go:linkname lchown C.lchown
|
|
// func lchown(path *c.Char, owner C.uid_t, group C.gid_t) c.Int
|
|
|
|
//go:linkname link C.link
|
|
func link(oldpath, newpath *c.Char) c.Int
|
|
|
|
//go:linkname unlink C.unlink
|
|
func unlink(path *c.Char) c.Int
|
|
|
|
//go:linkname symlink C.symlink
|
|
func symlink(oldpath, newpath *c.Char) c.Int
|
|
|
|
//go:linkname readlink C.readlink
|
|
func readlink(path *c.Char, buf *c.Char, bufsiz c.SizeT) c.SsizeT
|
|
|
|
//go:linkname mkdir C.mkdir
|
|
func mkdir(path *c.Char, mode c.Int) c.Int
|
|
|
|
//go:linkname rmdir C.rmdir
|
|
func rmdir(path *c.Char) c.Int
|
|
|
|
// //go:linkname stat C.stat
|
|
// func stat(path *c.Char, buf *C.struct_stat) c.Int
|
|
|
|
// //go:linkname fstat C.fstat
|
|
// func fstat(fd c.Int, buf *C.struct_stat) c.Int
|
|
|
|
// //go:linkname lstat C.lstat
|
|
// func lstat(path *c.Char, buf *C.struct_stat) c.Int
|
|
|
|
//go:linkname access C.access
|
|
func access(path *c.Char, mode c.Int) c.Int
|
|
|
|
//go:linkname umask C.umask
|
|
func umask(mask c.Int) c.Int
|
|
|
|
func testStringFunctions() {
|
|
println("Testing string functions...")
|
|
|
|
// Test strlen
|
|
s := c.AllocaCStr("Hello, World!")
|
|
// FIXME: defer
|
|
// defer c.Free(unsafe.Pointer(s))
|
|
if strlen(s) != 13 {
|
|
println("FAIL: strlen")
|
|
} else {
|
|
println("PASS: strlen")
|
|
}
|
|
|
|
// Test strcpy
|
|
dest := make([]byte, 20)
|
|
strcpy((*c.Char)(unsafe.Pointer(&dest[0])), s)
|
|
if c.GoString((*c.Char)(unsafe.Pointer(&dest[0]))) != "Hello, World!" {
|
|
println("FAIL: strcpy")
|
|
} else {
|
|
println("PASS: strcpy")
|
|
}
|
|
|
|
// Test strcmp
|
|
s1 := c.AllocaCStr("abc")
|
|
s2 := c.AllocaCStr("abc")
|
|
s3 := c.AllocaCStr("abd")
|
|
// defer c.Free(unsafe.Pointer(s1))
|
|
// defer c.Free(unsafe.Pointer(s2))
|
|
// defer c.Free(unsafe.Pointer(s3))
|
|
if strcmp(s1, s2) != 0 {
|
|
println("FAIL: strcmp (equal)")
|
|
} else if strcmp(s1, s3) >= 0 {
|
|
println("FAIL: strcmp (less than)")
|
|
} else {
|
|
println("PASS: strcmp")
|
|
}
|
|
}
|
|
|
|
func testMemoryFunctions() {
|
|
println("Testing memory functions...")
|
|
|
|
// Test malloc/free
|
|
ptr := malloc(100)
|
|
if ptr == nil {
|
|
println("FAIL: malloc")
|
|
} else {
|
|
println("PASS: malloc")
|
|
free(ptr)
|
|
}
|
|
|
|
// Test memcpy
|
|
src := []byte("Hello")
|
|
dest := make([]byte, 10)
|
|
memcpy(unsafe.Pointer(&dest[0]), unsafe.Pointer(&src[0]), 5)
|
|
if string(dest[:5]) != "Hello" {
|
|
println("FAIL: memcpy")
|
|
} else {
|
|
println("PASS: memcpy")
|
|
}
|
|
|
|
// Test memset
|
|
memset(unsafe.Pointer(&dest[0]), 'A', 5)
|
|
if string(dest[:5]) != "AAAAA" {
|
|
println("FAIL: memset")
|
|
} else {
|
|
println("PASS: memset")
|
|
}
|
|
}
|
|
|
|
// func testMathFunctions() {
|
|
// println("Testing math functions...")
|
|
|
|
// // Test abs
|
|
// if c.ab(-5) != 5 || abs(5) != 5 {
|
|
// println("FAIL: abs")
|
|
// } else {
|
|
// println("PASS: abs")
|
|
// }
|
|
|
|
// // Test atoi
|
|
// s := c.AllocaCStr("12345")
|
|
// defer c.Free(unsafe.Pointer(s))
|
|
// if c.Atoi(s) != 12345 {
|
|
// println("FAIL: atoi")
|
|
// } else {
|
|
// println("PASS: atoi")
|
|
// }
|
|
|
|
// }
|
|
|
|
func testIOFunctions() {
|
|
println("Testing I/O functions...")
|
|
|
|
// Test fopen/fclose
|
|
filename := c.AllocaCStr("test.txt")
|
|
// defer c.Free(unsafe.Pointer(filename))
|
|
mode := c.AllocaCStr("w")
|
|
// defer c.Free(unsafe.Pointer(mode))
|
|
file := fopen(filename, mode)
|
|
if file == nil {
|
|
println("FAIL: fopen")
|
|
} else {
|
|
println("PASS: fopen")
|
|
if fclose(file) != 0 {
|
|
println("FAIL: fclose")
|
|
} else {
|
|
println("PASS: fclose")
|
|
}
|
|
}
|
|
|
|
// Test printf
|
|
format := c.AllocaCStr("Test: %d\n")
|
|
// defer c.Free(unsafe.Pointer(format))
|
|
if printf(format, 42) < 0 {
|
|
println("FAIL: printf")
|
|
} else {
|
|
println("PASS: printf")
|
|
}
|
|
}
|
|
|
|
// func testTimeFunctions() {
|
|
// println("Testing time functions...")
|
|
|
|
// // Test time
|
|
// t := time(nil)
|
|
// if t == 0 {
|
|
// println("FAIL: time")
|
|
// } else {
|
|
// println("PASS: time")
|
|
// }
|
|
|
|
// // Test localtime
|
|
// tm := localtime(&t)
|
|
// if tm == nil {
|
|
// println("FAIL: localtime")
|
|
// } else {
|
|
// println("PASS: localtime")
|
|
// }
|
|
// }
|
|
|
|
// func testProcessFunctions() {
|
|
// println("Testing process functions...")
|
|
|
|
// // Test getpid
|
|
// pid := getpid()
|
|
// if pid <= 0 {
|
|
// println("FAIL: getpid")
|
|
// } else {
|
|
// println("PASS: getpid")
|
|
// }
|
|
|
|
// // Test getenv
|
|
// env := c.AllocaCStr("PATH")
|
|
// defer c.Free(unsafe.Pointer(env))
|
|
// path := getenv(env)
|
|
// if path == nil {
|
|
// println("FAIL: getenv")
|
|
// } else {
|
|
// println("PASS: getenv")
|
|
// }
|
|
// }
|
|
|
|
// func testDirectoryFunctions() {
|
|
// println("Testing directory functions...")
|
|
|
|
// // Test opendir/closedir
|
|
// dirname := c.AllocaCStr(".")
|
|
// defer c.Free(unsafe.Pointer(dirname))
|
|
// dir := opendir(dirname)
|
|
// if dir == nil {
|
|
// println("FAIL: opendir")
|
|
// } else {
|
|
// println("PASS: opendir")
|
|
// if closedir(dir) != 0 {
|
|
// println("FAIL: closedir")
|
|
// } else {
|
|
// println("PASS: closedir")
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// func testFileFunctions() {
|
|
// println("Testing file functions...")
|
|
|
|
// // Test open/close
|
|
// filename := c.AllocaCStr("testfile.txt")
|
|
// defer c.Free(unsafe.Pointer(filename))
|
|
// fd := open(filename, C.O_CREAT|C.O_WRONLY, 0644)
|
|
// if fd < 0 {
|
|
// println("FAIL: open")
|
|
// } else {
|
|
// println("PASS: open")
|
|
// if close(fd) != 0 {
|
|
// println("FAIL: close")
|
|
// } else {
|
|
// println("PASS: close")
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// func testSignalFunctions() {
|
|
// println("Testing signal functions...")
|
|
|
|
// // Test signal
|
|
// handler := signal(c.Int(syscall.SIGINT), unsafe.Pointer(syscall.SIG_IGN))
|
|
// if handler == nil {
|
|
// println("FAIL: signal")
|
|
// } else {
|
|
// println("PASS: signal")
|
|
// }
|
|
|
|
// // Test raise
|
|
// if raise(C.SIGINT) != 0 {
|
|
// println("FAIL: raise")
|
|
// } else {
|
|
// println("PASS: raise")
|
|
// }
|
|
// }
|
|
|
|
func main() {
|
|
watchdog.Disable()
|
|
println("Starting libc tests...")
|
|
testStringFunctions()
|
|
testMemoryFunctions()
|
|
// testMathFunctions()
|
|
testIOFunctions()
|
|
// testTimeFunctions()
|
|
// testProcessFunctions()
|
|
// testDirectoryFunctions()
|
|
// testFileFunctions()
|
|
// testSignalFunctions()
|
|
println("All tests completed!")
|
|
}
|