Files
llgo/_embdemo/esp32/libc/main.go
2025-09-10 17:03:05 +08:00

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!")
}