From 1f4d74f500984500b12dfc95916804b6afd3428c Mon Sep 17 00:00:00 2001 From: "Magomed Kostoev (mkostoevr)" Date: Tue, 2 Mar 2021 17:58:11 +0000 Subject: [PATCH] Relocate kolibri-libc from GitHub git-svn-id: svn://kolibrios.org@8622 a494cfbc-eb01-0410-851d-a64ba20cac60 --- contrib/kolibri-libc/.gitignore | 6 + contrib/kolibri-libc/LICENSE | 339 +++++ contrib/kolibri-libc/README.md | 2 + contrib/kolibri-libc/SYMBOLS.md | 1193 +++++++++++++++++ contrib/kolibri-libc/bin/clink | Bin 0 -> 23292 bytes contrib/kolibri-libc/bin/fasm | Bin 0 -> 106884 bytes contrib/kolibri-libc/bin/kos32-tcc | Bin 0 -> 105944 bytes contrib/kolibri-libc/bin/kos32-tcc.exe | Bin 0 -> 335375 bytes contrib/kolibri-libc/bin/kpack | Bin 0 -> 25532 bytes contrib/kolibri-libc/linuxtools/kgcc | 24 + contrib/kolibri-libc/linuxtools/kld | 24 + contrib/kolibri-libc/source/Makefile | 55 + contrib/kolibri-libc/source/Makefile.shared | 3 + contrib/kolibri-libc/source/crt/crt0.asm | 220 +++ .../kolibri-libc/source/crt/inc/config.inc | 1 + contrib/kolibri-libc/source/crt/inc/dll.inc | 158 +++ .../kolibri-libc/source/crt/inc/macros.inc | 597 +++++++++ .../kolibri-libc/source/crt/inc/proc32.inc | 301 +++++ .../kolibri-libc/source/crt/inc/struct.inc | 240 ++++ contrib/kolibri-libc/source/ctype/is.c | 21 + contrib/kolibri-libc/source/exports/exports.c | 121 ++ contrib/kolibri-libc/source/include/ctype.h | 41 + contrib/kolibri-libc/source/include/errno.h | 144 ++ contrib/kolibri-libc/source/include/float.h | 65 + contrib/kolibri-libc/source/include/ksys.h | 918 +++++++++++++ contrib/kolibri-libc/source/include/limits.h | 18 + contrib/kolibri-libc/source/include/math.h | 171 +++ contrib/kolibri-libc/source/include/setjmp.h | 17 + contrib/kolibri-libc/source/include/stdarg.h | 77 ++ contrib/kolibri-libc/source/include/stdbool.h | 11 + contrib/kolibri-libc/source/include/stddef.h | 39 + contrib/kolibri-libc/source/include/stdint.h | 28 + contrib/kolibri-libc/source/include/stdio.h | 142 ++ contrib/kolibri-libc/source/include/stdlib.h | 38 + contrib/kolibri-libc/source/include/string.h | 186 +++ .../kolibri-libc/source/include/sys/dirent.h | 34 + .../kolibri-libc/source/include/sys/socket.h | 244 ++++ contrib/kolibri-libc/source/include/time.h | 30 + contrib/kolibri-libc/source/math/acos.s | 22 + contrib/kolibri-libc/source/math/acosh.c | 8 + contrib/kolibri-libc/source/math/asin.s | 14 + contrib/kolibri-libc/source/math/asinh.c | 9 + contrib/kolibri-libc/source/math/atan.s | 8 + contrib/kolibri-libc/source/math/atan2.s | 35 + contrib/kolibri-libc/source/math/atanh.c | 8 + contrib/kolibri-libc/source/math/ceil.s | 24 + contrib/kolibri-libc/source/math/cos.s | 15 + contrib/kolibri-libc/source/math/cosh.c | 8 + contrib/kolibri-libc/source/math/exp.s | 31 + contrib/kolibri-libc/source/math/fabs.s | 6 + contrib/kolibri-libc/source/math/floor.s | 24 + contrib/kolibri-libc/source/math/fmod.s | 29 + contrib/kolibri-libc/source/math/frexp.c | 26 + contrib/kolibri-libc/source/math/hypot.c | 100 ++ contrib/kolibri-libc/source/math/ldexp.c | 32 + contrib/kolibri-libc/source/math/libc/asm.h | 9 + contrib/kolibri-libc/source/math/log.s | 7 + contrib/kolibri-libc/source/math/modf.s | 33 + contrib/kolibri-libc/source/math/modfl.s | 22 + contrib/kolibri-libc/source/math/pow.s | 86 ++ contrib/kolibri-libc/source/math/pow10.s | 33 + contrib/kolibri-libc/source/math/pow2.s | 31 + contrib/kolibri-libc/source/math/sin.s | 16 + contrib/kolibri-libc/source/math/sinh.c | 16 + contrib/kolibri-libc/source/math/sqrt.s | 6 + contrib/kolibri-libc/source/math/tan.s | 16 + contrib/kolibri-libc/source/math/tanh.c | 17 + contrib/kolibri-libc/source/setjmp/longjmp.s | 15 + contrib/kolibri-libc/source/setjmp/setjmp.s | 20 + contrib/kolibri-libc/source/stdio/clearerr.c | 6 + contrib/kolibri-libc/source/stdio/conio.c | 56 + contrib/kolibri-libc/source/stdio/conio.h | 76 ++ .../kolibri-libc/source/stdio/debug_printf.c | 14 + contrib/kolibri-libc/source/stdio/fclose.c | 7 + contrib/kolibri-libc/source/stdio/feof.c | 5 + contrib/kolibri-libc/source/stdio/ferror.c | 5 + contrib/kolibri-libc/source/stdio/fflush.c | 5 + contrib/kolibri-libc/source/stdio/fgetc.c | 11 + contrib/kolibri-libc/source/stdio/fgetpos.c | 6 + contrib/kolibri-libc/source/stdio/fgets.c | 24 + contrib/kolibri-libc/source/stdio/fopen.c | 7 + .../kolibri-libc/source/stdio/format_print.c | 816 +++++++++++ .../kolibri-libc/source/stdio/format_print.h | 12 + .../kolibri-libc/source/stdio/format_scan.c | 403 ++++++ .../kolibri-libc/source/stdio/format_scan.h | 20 + contrib/kolibri-libc/source/stdio/fputc.c | 9 + contrib/kolibri-libc/source/stdio/fputs.c | 10 + contrib/kolibri-libc/source/stdio/fread.c | 16 + contrib/kolibri-libc/source/stdio/freopen.c | 36 + contrib/kolibri-libc/source/stdio/fscanf.c | 13 + contrib/kolibri-libc/source/stdio/fseek.c | 17 + contrib/kolibri-libc/source/stdio/fsetpos.c | 7 + contrib/kolibri-libc/source/stdio/ftell.c | 5 + contrib/kolibri-libc/source/stdio/fwrite.c | 16 + contrib/kolibri-libc/source/stdio/getchar.c | 10 + contrib/kolibri-libc/source/stdio/gets.c | 15 + contrib/kolibri-libc/source/stdio/perror.c | 5 + contrib/kolibri-libc/source/stdio/printf.c | 13 + contrib/kolibri-libc/source/stdio/puts.c | 13 + contrib/kolibri-libc/source/stdio/remove.c | 6 + contrib/kolibri-libc/source/stdio/rename.c | 6 + contrib/kolibri-libc/source/stdio/rewind.c | 5 + contrib/kolibri-libc/source/stdio/scanf.c | 20 + contrib/kolibri-libc/source/stdio/setbuf.c | 5 + contrib/kolibri-libc/source/stdio/setvbuf.c | 5 + contrib/kolibri-libc/source/stdio/snprintf.c | 12 + contrib/kolibri-libc/source/stdio/sprintf.c | 12 + contrib/kolibri-libc/source/stdio/sscanf.c | 12 + contrib/kolibri-libc/source/stdio/tmpfile.c | 11 + contrib/kolibri-libc/source/stdio/tmpnam.c | 16 + contrib/kolibri-libc/source/stdio/vfscanf.c | 55 + contrib/kolibri-libc/source/stdio/vprintf.c | 18 + contrib/kolibri-libc/source/stdio/vscanf.c | 44 + contrib/kolibri-libc/source/stdio/vsnprintf.c | 6 + contrib/kolibri-libc/source/stdio/vsscanf.c | 32 + .../kolibri-libc/source/stdlib/___chkstk_ms.c | 1 + contrib/kolibri-libc/source/stdlib/abs.c | 6 + contrib/kolibri-libc/source/stdlib/atoi.c | 21 + contrib/kolibri-libc/source/stdlib/atol.c | 17 + contrib/kolibri-libc/source/stdlib/atoll.c | 17 + contrib/kolibri-libc/source/stdlib/calloc.c | 6 + contrib/kolibri-libc/source/stdlib/difftime.c | 6 + contrib/kolibri-libc/source/stdlib/div.c | 6 + contrib/kolibri-libc/source/stdlib/exit.c | 12 + contrib/kolibri-libc/source/stdlib/free.c | 6 + contrib/kolibri-libc/source/stdlib/itoa.c | 20 + contrib/kolibri-libc/source/stdlib/labs.c | 6 + contrib/kolibri-libc/source/stdlib/ldiv.c | 6 + contrib/kolibri-libc/source/stdlib/libtcc1.c | 763 +++++++++++ contrib/kolibri-libc/source/stdlib/llabs.c | 6 + contrib/kolibri-libc/source/stdlib/lldiv.c | 6 + .../kolibri-libc/source/stdlib/localtime.c | 32 + contrib/kolibri-libc/source/stdlib/malloc.c | 6 + contrib/kolibri-libc/source/stdlib/mktime.c | 23 + contrib/kolibri-libc/source/stdlib/realloc.c | 6 + contrib/kolibri-libc/source/stdlib/time.c | 9 + contrib/kolibri-libc/source/string/memccpy.c | 14 + contrib/kolibri-libc/source/string/memchr.c | 24 + contrib/kolibri-libc/source/string/memcmp.c | 26 + contrib/kolibri-libc/source/string/memcpy.c | 20 + contrib/kolibri-libc/source/string/memmove.c | 33 + contrib/kolibri-libc/source/string/memset.c | 20 + contrib/kolibri-libc/source/string/strcat.c | 27 + contrib/kolibri-libc/source/string/strchr.c | 20 + contrib/kolibri-libc/source/string/strcmp.c | 13 + contrib/kolibri-libc/source/string/strcoll.c | 13 + contrib/kolibri-libc/source/string/strcpy.c | 19 + contrib/kolibri-libc/source/string/strcspn.c | 30 + contrib/kolibri-libc/source/string/strdup.c | 10 + contrib/kolibri-libc/source/string/strerror.c | 82 ++ contrib/kolibri-libc/source/string/strlen.c | 19 + contrib/kolibri-libc/source/string/strncat.c | 29 + contrib/kolibri-libc/source/string/strncmp.c | 26 + contrib/kolibri-libc/source/string/strncpy.c | 29 + contrib/kolibri-libc/source/string/strpbrk.c | 30 + contrib/kolibri-libc/source/string/strrchr.c | 27 + contrib/kolibri-libc/source/string/strrev.c | 15 + contrib/kolibri-libc/source/string/strspn.c | 37 + contrib/kolibri-libc/source/string/strstr.c | 34 + contrib/kolibri-libc/source/string/strtok.c | 30 + contrib/kolibri-libc/source/string/strxfrm.c | 26 + contrib/kolibri-libc/source/sys/closedir.c | 14 + contrib/kolibri-libc/source/sys/opendir.c | 53 + contrib/kolibri-libc/source/sys/readdir.c | 14 + contrib/kolibri-libc/source/sys/rewinddir.c | 9 + contrib/kolibri-libc/source/sys/seekdir.c | 12 + contrib/kolibri-libc/source/sys/telldir.c | 12 + contrib/kolibri-libc/tests/Makefile.gcc | 16 + contrib/kolibri-libc/tests/Makefile.tcc | 16 + contrib/kolibri-libc/tests/argtest.c | 21 + contrib/kolibri-libc/tests/mathtest.c | 24 + contrib/kolibri-libc/tests/static.lds | 113 ++ contrib/kolibri-libc/tests/test_dirent.c | 20 + 173 files changed, 10115 insertions(+) create mode 100644 contrib/kolibri-libc/.gitignore create mode 100644 contrib/kolibri-libc/LICENSE create mode 100644 contrib/kolibri-libc/README.md create mode 100644 contrib/kolibri-libc/SYMBOLS.md create mode 100644 contrib/kolibri-libc/bin/clink create mode 100644 contrib/kolibri-libc/bin/fasm create mode 100644 contrib/kolibri-libc/bin/kos32-tcc create mode 100644 contrib/kolibri-libc/bin/kos32-tcc.exe create mode 100644 contrib/kolibri-libc/bin/kpack create mode 100644 contrib/kolibri-libc/linuxtools/kgcc create mode 100644 contrib/kolibri-libc/linuxtools/kld create mode 100644 contrib/kolibri-libc/source/Makefile create mode 100644 contrib/kolibri-libc/source/Makefile.shared create mode 100644 contrib/kolibri-libc/source/crt/crt0.asm create mode 100644 contrib/kolibri-libc/source/crt/inc/config.inc create mode 100644 contrib/kolibri-libc/source/crt/inc/dll.inc create mode 100644 contrib/kolibri-libc/source/crt/inc/macros.inc create mode 100644 contrib/kolibri-libc/source/crt/inc/proc32.inc create mode 100644 contrib/kolibri-libc/source/crt/inc/struct.inc create mode 100644 contrib/kolibri-libc/source/ctype/is.c create mode 100644 contrib/kolibri-libc/source/exports/exports.c create mode 100644 contrib/kolibri-libc/source/include/ctype.h create mode 100644 contrib/kolibri-libc/source/include/errno.h create mode 100644 contrib/kolibri-libc/source/include/float.h create mode 100644 contrib/kolibri-libc/source/include/ksys.h create mode 100644 contrib/kolibri-libc/source/include/limits.h create mode 100644 contrib/kolibri-libc/source/include/math.h create mode 100644 contrib/kolibri-libc/source/include/setjmp.h create mode 100644 contrib/kolibri-libc/source/include/stdarg.h create mode 100644 contrib/kolibri-libc/source/include/stdbool.h create mode 100644 contrib/kolibri-libc/source/include/stddef.h create mode 100644 contrib/kolibri-libc/source/include/stdint.h create mode 100644 contrib/kolibri-libc/source/include/stdio.h create mode 100644 contrib/kolibri-libc/source/include/stdlib.h create mode 100644 contrib/kolibri-libc/source/include/string.h create mode 100644 contrib/kolibri-libc/source/include/sys/dirent.h create mode 100644 contrib/kolibri-libc/source/include/sys/socket.h create mode 100644 contrib/kolibri-libc/source/include/time.h create mode 100644 contrib/kolibri-libc/source/math/acos.s create mode 100644 contrib/kolibri-libc/source/math/acosh.c create mode 100644 contrib/kolibri-libc/source/math/asin.s create mode 100644 contrib/kolibri-libc/source/math/asinh.c create mode 100644 contrib/kolibri-libc/source/math/atan.s create mode 100644 contrib/kolibri-libc/source/math/atan2.s create mode 100644 contrib/kolibri-libc/source/math/atanh.c create mode 100644 contrib/kolibri-libc/source/math/ceil.s create mode 100644 contrib/kolibri-libc/source/math/cos.s create mode 100644 contrib/kolibri-libc/source/math/cosh.c create mode 100644 contrib/kolibri-libc/source/math/exp.s create mode 100644 contrib/kolibri-libc/source/math/fabs.s create mode 100644 contrib/kolibri-libc/source/math/floor.s create mode 100644 contrib/kolibri-libc/source/math/fmod.s create mode 100644 contrib/kolibri-libc/source/math/frexp.c create mode 100644 contrib/kolibri-libc/source/math/hypot.c create mode 100644 contrib/kolibri-libc/source/math/ldexp.c create mode 100644 contrib/kolibri-libc/source/math/libc/asm.h create mode 100644 contrib/kolibri-libc/source/math/log.s create mode 100644 contrib/kolibri-libc/source/math/modf.s create mode 100644 contrib/kolibri-libc/source/math/modfl.s create mode 100644 contrib/kolibri-libc/source/math/pow.s create mode 100644 contrib/kolibri-libc/source/math/pow10.s create mode 100644 contrib/kolibri-libc/source/math/pow2.s create mode 100644 contrib/kolibri-libc/source/math/sin.s create mode 100644 contrib/kolibri-libc/source/math/sinh.c create mode 100644 contrib/kolibri-libc/source/math/sqrt.s create mode 100644 contrib/kolibri-libc/source/math/tan.s create mode 100644 contrib/kolibri-libc/source/math/tanh.c create mode 100644 contrib/kolibri-libc/source/setjmp/longjmp.s create mode 100644 contrib/kolibri-libc/source/setjmp/setjmp.s create mode 100644 contrib/kolibri-libc/source/stdio/clearerr.c create mode 100644 contrib/kolibri-libc/source/stdio/conio.c create mode 100644 contrib/kolibri-libc/source/stdio/conio.h create mode 100644 contrib/kolibri-libc/source/stdio/debug_printf.c create mode 100644 contrib/kolibri-libc/source/stdio/fclose.c create mode 100644 contrib/kolibri-libc/source/stdio/feof.c create mode 100644 contrib/kolibri-libc/source/stdio/ferror.c create mode 100644 contrib/kolibri-libc/source/stdio/fflush.c create mode 100644 contrib/kolibri-libc/source/stdio/fgetc.c create mode 100644 contrib/kolibri-libc/source/stdio/fgetpos.c create mode 100644 contrib/kolibri-libc/source/stdio/fgets.c create mode 100644 contrib/kolibri-libc/source/stdio/fopen.c create mode 100644 contrib/kolibri-libc/source/stdio/format_print.c create mode 100644 contrib/kolibri-libc/source/stdio/format_print.h create mode 100644 contrib/kolibri-libc/source/stdio/format_scan.c create mode 100644 contrib/kolibri-libc/source/stdio/format_scan.h create mode 100644 contrib/kolibri-libc/source/stdio/fputc.c create mode 100644 contrib/kolibri-libc/source/stdio/fputs.c create mode 100644 contrib/kolibri-libc/source/stdio/fread.c create mode 100644 contrib/kolibri-libc/source/stdio/freopen.c create mode 100644 contrib/kolibri-libc/source/stdio/fscanf.c create mode 100644 contrib/kolibri-libc/source/stdio/fseek.c create mode 100644 contrib/kolibri-libc/source/stdio/fsetpos.c create mode 100644 contrib/kolibri-libc/source/stdio/ftell.c create mode 100644 contrib/kolibri-libc/source/stdio/fwrite.c create mode 100644 contrib/kolibri-libc/source/stdio/getchar.c create mode 100644 contrib/kolibri-libc/source/stdio/gets.c create mode 100644 contrib/kolibri-libc/source/stdio/perror.c create mode 100644 contrib/kolibri-libc/source/stdio/printf.c create mode 100644 contrib/kolibri-libc/source/stdio/puts.c create mode 100644 contrib/kolibri-libc/source/stdio/remove.c create mode 100644 contrib/kolibri-libc/source/stdio/rename.c create mode 100644 contrib/kolibri-libc/source/stdio/rewind.c create mode 100644 contrib/kolibri-libc/source/stdio/scanf.c create mode 100644 contrib/kolibri-libc/source/stdio/setbuf.c create mode 100644 contrib/kolibri-libc/source/stdio/setvbuf.c create mode 100644 contrib/kolibri-libc/source/stdio/snprintf.c create mode 100644 contrib/kolibri-libc/source/stdio/sprintf.c create mode 100644 contrib/kolibri-libc/source/stdio/sscanf.c create mode 100644 contrib/kolibri-libc/source/stdio/tmpfile.c create mode 100644 contrib/kolibri-libc/source/stdio/tmpnam.c create mode 100644 contrib/kolibri-libc/source/stdio/vfscanf.c create mode 100644 contrib/kolibri-libc/source/stdio/vprintf.c create mode 100644 contrib/kolibri-libc/source/stdio/vscanf.c create mode 100644 contrib/kolibri-libc/source/stdio/vsnprintf.c create mode 100644 contrib/kolibri-libc/source/stdio/vsscanf.c create mode 100644 contrib/kolibri-libc/source/stdlib/___chkstk_ms.c create mode 100644 contrib/kolibri-libc/source/stdlib/abs.c create mode 100644 contrib/kolibri-libc/source/stdlib/atoi.c create mode 100644 contrib/kolibri-libc/source/stdlib/atol.c create mode 100644 contrib/kolibri-libc/source/stdlib/atoll.c create mode 100644 contrib/kolibri-libc/source/stdlib/calloc.c create mode 100644 contrib/kolibri-libc/source/stdlib/difftime.c create mode 100644 contrib/kolibri-libc/source/stdlib/div.c create mode 100644 contrib/kolibri-libc/source/stdlib/exit.c create mode 100644 contrib/kolibri-libc/source/stdlib/free.c create mode 100644 contrib/kolibri-libc/source/stdlib/itoa.c create mode 100644 contrib/kolibri-libc/source/stdlib/labs.c create mode 100644 contrib/kolibri-libc/source/stdlib/ldiv.c create mode 100644 contrib/kolibri-libc/source/stdlib/libtcc1.c create mode 100644 contrib/kolibri-libc/source/stdlib/llabs.c create mode 100644 contrib/kolibri-libc/source/stdlib/lldiv.c create mode 100644 contrib/kolibri-libc/source/stdlib/localtime.c create mode 100644 contrib/kolibri-libc/source/stdlib/malloc.c create mode 100644 contrib/kolibri-libc/source/stdlib/mktime.c create mode 100644 contrib/kolibri-libc/source/stdlib/realloc.c create mode 100644 contrib/kolibri-libc/source/stdlib/time.c create mode 100644 contrib/kolibri-libc/source/string/memccpy.c create mode 100644 contrib/kolibri-libc/source/string/memchr.c create mode 100644 contrib/kolibri-libc/source/string/memcmp.c create mode 100644 contrib/kolibri-libc/source/string/memcpy.c create mode 100644 contrib/kolibri-libc/source/string/memmove.c create mode 100644 contrib/kolibri-libc/source/string/memset.c create mode 100644 contrib/kolibri-libc/source/string/strcat.c create mode 100644 contrib/kolibri-libc/source/string/strchr.c create mode 100644 contrib/kolibri-libc/source/string/strcmp.c create mode 100644 contrib/kolibri-libc/source/string/strcoll.c create mode 100644 contrib/kolibri-libc/source/string/strcpy.c create mode 100644 contrib/kolibri-libc/source/string/strcspn.c create mode 100644 contrib/kolibri-libc/source/string/strdup.c create mode 100644 contrib/kolibri-libc/source/string/strerror.c create mode 100644 contrib/kolibri-libc/source/string/strlen.c create mode 100644 contrib/kolibri-libc/source/string/strncat.c create mode 100644 contrib/kolibri-libc/source/string/strncmp.c create mode 100644 contrib/kolibri-libc/source/string/strncpy.c create mode 100644 contrib/kolibri-libc/source/string/strpbrk.c create mode 100644 contrib/kolibri-libc/source/string/strrchr.c create mode 100644 contrib/kolibri-libc/source/string/strrev.c create mode 100644 contrib/kolibri-libc/source/string/strspn.c create mode 100644 contrib/kolibri-libc/source/string/strstr.c create mode 100644 contrib/kolibri-libc/source/string/strtok.c create mode 100644 contrib/kolibri-libc/source/string/strxfrm.c create mode 100644 contrib/kolibri-libc/source/sys/closedir.c create mode 100644 contrib/kolibri-libc/source/sys/opendir.c create mode 100644 contrib/kolibri-libc/source/sys/readdir.c create mode 100644 contrib/kolibri-libc/source/sys/rewinddir.c create mode 100644 contrib/kolibri-libc/source/sys/seekdir.c create mode 100644 contrib/kolibri-libc/source/sys/telldir.c create mode 100644 contrib/kolibri-libc/tests/Makefile.gcc create mode 100644 contrib/kolibri-libc/tests/Makefile.tcc create mode 100644 contrib/kolibri-libc/tests/argtest.c create mode 100644 contrib/kolibri-libc/tests/mathtest.c create mode 100644 contrib/kolibri-libc/tests/static.lds create mode 100644 contrib/kolibri-libc/tests/test_dirent.c diff --git a/contrib/kolibri-libc/.gitignore b/contrib/kolibri-libc/.gitignore new file mode 100644 index 0000000000..8246cf8e38 --- /dev/null +++ b/contrib/kolibri-libc/.gitignore @@ -0,0 +1,6 @@ +*.swp +lib +lib/* +*.o +tests/argtest +source/make.bat diff --git a/contrib/kolibri-libc/LICENSE b/contrib/kolibri-libc/LICENSE new file mode 100644 index 0000000000..d159169d10 --- /dev/null +++ b/contrib/kolibri-libc/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/contrib/kolibri-libc/README.md b/contrib/kolibri-libc/README.md new file mode 100644 index 0000000000..abc79e4fb9 --- /dev/null +++ b/contrib/kolibri-libc/README.md @@ -0,0 +1,2 @@ +# kolibri-libc +Standart C library for KolibriOS diff --git a/contrib/kolibri-libc/SYMBOLS.md b/contrib/kolibri-libc/SYMBOLS.md new file mode 100644 index 0000000000..37ba8ff2e9 --- /dev/null +++ b/contrib/kolibri-libc/SYMBOLS.md @@ -0,0 +1,1193 @@ +| Status | Symbol | +| ------------------ | --- | +| :x: | [_FD_CLR_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/FD_CLR.html) | +| :x: | [_FD_ISSET_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/FD_ISSET.html) | +| :x: | [_FD_SET_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/FD_SET.html) | +| :x: | [_FD_ZERO_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/FD_ZERO.html) | +| :x: | [__Exit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html) | +| :x: | [__exit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/_exit.html) | +| :x: | [__longjmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/_longjmp.html) | +| :x: | [__setjmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/_setjmp.html) | +| :x: | [__tolower_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/_tolower.html) | +| :x: | [__toupper_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/_toupper.html) | +| :x: | [_a64l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/a64l.html) | +| :x: | [_abort_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/abort.html) | +| :heavy_check_mark: | [_abs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/abs.html) | +| :x: | [_accept_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html) | +| :x: | [_access_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/access.html) | +| :x: | [_acosf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/acosf.html) | +| :x: | [_acoshf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/acoshf.html) | +| :x: | [_acosh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/acosh.html) | +| :x: | [_acoshl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/acoshl.html) | +| :x: | [_acos_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/acos.html) | +| :x: | [_acosl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/acosl.html) | +| :x: | [_aio_cancel_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_cancel.html) | +| :x: | [_aio_error_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_error.html) | +| :x: | [_aio_fsync_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_fsync.html) | +| :x: | [_aio_read_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_read.html) | +| :x: | [_aio_return_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_return.html) | +| :x: | [_aio_suspend_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_suspend.html) | +| :x: | [_aio_write_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/aio_write.html) | +| :x: | [_alarm_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/alarm.html) | +| :x: | [_alphasort_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/alphasort.html) | +| :x: | [_asctime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asctime.html) | +| :x: | [_asctime_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asctime_r.html) | +| :x: | [_asinf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asinf.html) | +| :x: | [_asinhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asinhf.html) | +| :x: | [_asinh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asinh.html) | +| :x: | [_asinhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asinhl.html) | +| :x: | [_asin_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asin.html) | +| :x: | [_asinl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/asinl.html) | +| :x: | [_assert_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/assert.html) | +| :x: | [_atan2f_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atan2f.html) | +| :x: | [_atan2_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atan2.html) | +| :x: | [_atan2l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atan2l.html) | +| :x: | [_atanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atanf.html) | +| :x: | [_atanhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atanhf.html) | +| :x: | [_atanh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atanh.html) | +| :x: | [_atanhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atanhl.html) | +| :x: | [_atan_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atan.html) | +| :x: | [_atanl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atanl.html) | +| :x: | [_atexit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atexit.html) | +| :x: | [_atof_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atof.html) | +| :heavy_check_mark: | [_atoi_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atoi.html) | +| :heavy_check_mark: | [_atol_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atol.html) | +| :heavy_check_mark: | [_atoll_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/atoll.html) | +| :x: | [_basename_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html) | +| :x: | [_bind_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html) | +| :x: | [_bsearch_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/bsearch.html) | +| :x: | [_btowc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/btowc.html) | +| :x: | [_cabsf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cabsf.html) | +| :x: | [_cabs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cabs.html) | +| :x: | [_cabsl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cabsl.html) | +| :x: | [_cacosf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cacosf.html) | +| :x: | [_cacoshf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cacoshf.html) | +| :x: | [_cacosh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cacosh.html) | +| :x: | [_cacoshl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cacoshl.html) | +| :x: | [_cacos_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cacos.html) | +| :x: | [_cacosl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cacosl.html) | +| :heavy_check_mark: | [_calloc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/calloc.html) | +| :x: | [_cargf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cargf.html) | +| :x: | [_carg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/carg.html) | +| :x: | [_cargl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cargl.html) | +| :x: | [_casinf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/casinf.html) | +| :x: | [_casinhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/casinhf.html) | +| :x: | [_casinh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/casinh.html) | +| :x: | [_casinhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/casinhl.html) | +| :x: | [_casin_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/casin.html) | +| :x: | [_casinl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/casinl.html) | +| :x: | [_catanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catanf.html) | +| :x: | [_catanhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catanhf.html) | +| :x: | [_catanh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catanh.html) | +| :x: | [_catanhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catanhl.html) | +| :x: | [_catan_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catan.html) | +| :x: | [_catanl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catanl.html) | +| :x: | [_catclose_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catclose.html) | +| :x: | [_catgets_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catgets.html) | +| :x: | [_catopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/catopen.html) | +| :x: | [_cbrtf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cbrtf.html) | +| :x: | [_cbrt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cbrt.html) | +| :x: | [_cbrtl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cbrtl.html) | +| :x: | [_ccosf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ccosf.html) | +| :x: | [_ccoshf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ccoshf.html) | +| :x: | [_ccosh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ccosh.html) | +| :x: | [_ccoshl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ccoshl.html) | +| :x: | [_ccos_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ccos.html) | +| :x: | [_ccosl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ccosl.html) | +| :x: | [_ceilf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ceilf.html) | +| :x: | [_ceil_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ceil.html) | +| :x: | [_ceill_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ceill.html) | +| :x: | [_cexpf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cexpf.html) | +| :x: | [_cexp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cexp.html) | +| :x: | [_cexpl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cexpl.html) | +| :x: | [_cfgetispeed_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cfgetispeed.html) | +| :x: | [_cfgetospeed_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cfgetospeed.html) | +| :x: | [_cfsetispeed_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cfsetispeed.html) | +| :x: | [_cfsetospeed_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cfsetospeed.html) | +| :x: | [_chdir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/chdir.html) | +| :x: | [_chmod_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html) | +| :x: | [_chown_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html) | +| :x: | [_cimagf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cimagf.html) | +| :x: | [_cimag_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cimag.html) | +| :x: | [_cimagl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cimagl.html) | +| :x: | [_clearerr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clearerr.html) | +| :x: | [_clock_getcpuclockid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getcpuclockid.html) | +| :x: | [_clock_getres_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html) | +| :x: | [_clock_gettime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_gettime.html) | +| :x: | [_clock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock.html) | +| :x: | [_clock_nanosleep_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_nanosleep.html) | +| :x: | [_clock_settime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_settime.html) | +| :x: | [_clogf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clogf.html) | +| :x: | [_clog_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clog.html) | +| :x: | [_clogl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/clogl.html) | +| :heavy_check_mark: | [_closedir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/closedir.html) | +| :x: | [_close_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html) | +| :x: | [_closelog_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/closelog.html) | +| :x: | [_confstr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/confstr.html) | +| :x: | [_conjf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/conjf.html) | +| :x: | [_conj_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/conj.html) | +| :x: | [_conjl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/conjl.html) | +| :x: | [_connect_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html) | +| :x: | [_copysignf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/copysignf.html) | +| :x: | [_copysign_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/copysign.html) | +| :x: | [_copysignl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/copysignl.html) | +| :x: | [_cosf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cosf.html) | +| :x: | [_coshf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/coshf.html) | +| :x: | [_cosh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cosh.html) | +| :x: | [_coshl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/coshl.html) | +| :x: | [_cos_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cos.html) | +| :x: | [_cosl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cosl.html) | +| :x: | [_cpowf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cpowf.html) | +| :x: | [_cpow_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cpow.html) | +| :x: | [_cpowl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cpowl.html) | +| :x: | [_cprojf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cprojf.html) | +| :x: | [_cproj_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cproj.html) | +| :x: | [_cprojl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/cprojl.html) | +| :x: | [_crealf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/crealf.html) | +| :x: | [_creal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/creal.html) | +| :x: | [_creall_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/creall.html) | +| :x: | [_creat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/creat.html) | +| :x: | [_crypt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/crypt.html) | +| :x: | [_csinf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csinf.html) | +| :x: | [_csinhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csinhf.html) | +| :x: | [_csinh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csinh.html) | +| :x: | [_csinhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csinhl.html) | +| :x: | [_csin_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csin.html) | +| :x: | [_csinl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csinl.html) | +| :x: | [_csqrtf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csqrtf.html) | +| :x: | [_csqrt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csqrt.html) | +| :x: | [_csqrtl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/csqrtl.html) | +| :x: | [_ctanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctanf.html) | +| :x: | [_ctanhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctanhf.html) | +| :x: | [_ctanh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctanh.html) | +| :x: | [_ctanhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctanhl.html) | +| :x: | [_ctan_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctan.html) | +| :x: | [_ctanl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctanl.html) | +| :x: | [_ctermid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctermid.html) | +| :x: | [_ctime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html) | +| :x: | [_ctime_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime_r.html) | +| :x: | [_daylight_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/daylight.html) | +| :x: | [_dbm_clearerr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_clearerr.html) | +| :x: | [_dbm_close_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_close.html) | +| :x: | [_dbm_delete_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_delete.html) | +| :x: | [_dbm_error_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_error.html) | +| :x: | [_dbm_fetch_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_fetch.html) | +| :x: | [_dbm_firstkey_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_firstkey.html) | +| :x: | [_dbm_nextkey_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_nextkey.html) | +| :x: | [_dbm_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_open.html) | +| :x: | [_dbm_store_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dbm_store.html) | +| :x: | [_difftime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/difftime.html) | +| :x: | [_dirfd_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dirfd.html) | +| :x: | [_dirname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dirname.html) | +| :heavy_check_mark: | [_div_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/div.html) | +| :x: | [_dlclose_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dlclose.html) | +| :x: | [_dlerror_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dlerror.html) | +| :x: | [_dlopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dlopen.html) | +| :x: | [_dlsym_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dlsym.html) | +| :x: | [_dprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dprintf.html) | +| :x: | [_drand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/drand48.html) | +| :x: | [_dup2_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html) | +| :x: | [_dup_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup.html) | +| :x: | [_duplocale_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/duplocale.html) | +| :x: | [_encrypt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/encrypt.html) | +| :x: | [_endgrent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endgrent.html) | +| :x: | [_endhostent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endhostent.html) | +| :x: | [_endnetent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endnetent.html) | +| :x: | [_endprotoent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endprotoent.html) | +| :x: | [_endpwent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endpwent.html) | +| :x: | [_endservent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endservent.html) | +| :x: | [_endutxent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/endutxent.html) | +| :x: | [_environ_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/environ.html) | +| :x: | [_erand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erand48.html) | +| :x: | [_erfcf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erfcf.html) | +| :x: | [_erfc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erfc.html) | +| :x: | [_erfcl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erfcl.html) | +| :x: | [_erff_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erff.html) | +| :x: | [_erf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erf.html) | +| :x: | [_erfl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/erfl.html) | +| :x: | [_errno_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html) | +| :x: | [_execle_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/execle.html) | +| :x: | [_execl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/execl.html) | +| :x: | [_execlp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/execlp.html) | +| :x: | [_execve_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/execve.html) | +| :x: | [_execv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/execv.html) | +| :x: | [_execvp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/execvp.html) | +| :x: | [_exit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html) | +| :x: | [_exp2f_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/exp2f.html) | +| :x: | [_exp2_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/exp2.html) | +| :x: | [_exp2l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/exp2l.html) | +| :x: | [_expf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/expf.html) | +| :x: | [_exp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/exp.html) | +| :x: | [_expl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/expl.html) | +| :x: | [_expm1f_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/expm1f.html) | +| :x: | [_expm1_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/expm1.html) | +| :x: | [_expm1l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/expm1l.html) | +| :x: | [_fabsf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fabsf.html) | +| :x: | [_fabs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fabs.html) | +| :x: | [_fabsl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fabsl.html) | +| :x: | [_faccessat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/faccessat.html) | +| :x: | [_fattach_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fattach.html) | +| :x: | [_fchdir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html) | +| :x: | [_fchmodat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchmodat.html) | +| :x: | [_fchmod_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchmod.html) | +| :x: | [_fchownat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchownat.html) | +| :x: | [_fchown_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchown.html) | +| :x: | [_fclose_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fclose.html) | +| :x: | [_fcntl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html) | +| :x: | [_fdatasync_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html) | +| :x: | [_fdetach_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdetach.html) | +| :x: | [_fdimf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdimf.html) | +| :x: | [_fdim_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdim.html) | +| :x: | [_fdiml_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdiml.html) | +| :x: | [_fdopendir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopendir.html) | +| :x: | [_fdopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopen.html) | +| :x: | [_feclearexcept_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/feclearexcept.html) | +| :x: | [_fegetenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fegetenv.html) | +| :x: | [_fegetexceptflag_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fegetexceptflag.html) | +| :x: | [_fegetround_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fegetround.html) | +| :x: | [_feholdexcept_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/feholdexcept.html) | +| :x: | [_feof_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/feof.html) | +| :x: | [_feraiseexcept_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/feraiseexcept.html) | +| :x: | [_ferror_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ferror.html) | +| :x: | [_fesetenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fesetenv.html) | +| :x: | [_fesetexceptflag_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fesetexceptflag.html) | +| :x: | [_fesetround_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fesetround.html) | +| :x: | [_fetestexcept_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fetestexcept.html) | +| :x: | [_feupdateenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/feupdateenv.html) | +| :x: | [_fexecve_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fexecve.html) | +| :x: | [_fflush_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html) | +| :x: | [_ffs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ffs.html) | +| :x: | [_fgetc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetc.html) | +| :x: | [_fgetpos_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetpos.html) | +| :x: | [_fgets_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html) | +| :x: | [_fgetwc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetwc.html) | +| :x: | [_fgetws_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetws.html) | +| :x: | [_fileno_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fileno.html) | +| :x: | [_flockfile_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/flockfile.html) | +| :x: | [_floorf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/floorf.html) | +| :x: | [_floor_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/floor.html) | +| :x: | [_floorl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/floorl.html) | +| :x: | [_fmaf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmaf.html) | +| :x: | [_fma_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fma.html) | +| :x: | [_fmal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmal.html) | +| :x: | [_fmaxf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmaxf.html) | +| :x: | [_fmax_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmax.html) | +| :x: | [_fmaxl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmaxl.html) | +| :x: | [_fmemopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmemopen.html) | +| :x: | [_fminf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fminf.html) | +| :x: | [_fmin_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmin.html) | +| :x: | [_fminl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fminl.html) | +| :x: | [_fmodf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmodf.html) | +| :x: | [_fmod_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmod.html) | +| :x: | [_fmodl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmodl.html) | +| :x: | [_fmtmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmtmsg.html) | +| :x: | [_fnmatch_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fnmatch.html) | +| :x: | [_fopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html) | +| :x: | [_fork_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html) | +| :x: | [_fpathconf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fpathconf.html) | +| :x: | [_fpclassify_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fpclassify.html) | +| :x: | [_fprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html) | +| :x: | [_fputc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fputc.html) | +| :x: | [_fputs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fputs.html) | +| :x: | [_fputwc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fputwc.html) | +| :x: | [_fputws_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fputws.html) | +| :x: | [_fread_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fread.html) | +| :x: | [_freeaddrinfo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html) | +| :heavy_check_mark: | [_free_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/free.html) | +| :x: | [_freelocale_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/freelocale.html) | +| :x: | [_freopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.html) | +| :x: | [_frexpf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/frexpf.html) | +| :x: | [_frexp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/frexp.html) | +| :x: | [_frexpl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/frexpl.html) | +| :x: | [_fscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html) | +| :x: | [_fseek_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html) | +| :x: | [_fseeko_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseeko.html) | +| :x: | [_fsetpos_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsetpos.html) | +| :x: | [_fstatat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fstatat.html) | +| :x: | [_fstat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fstat.html) | +| :x: | [_fstatvfs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fstatvfs.html) | +| :x: | [_fsync_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html) | +| :x: | [_ftell_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftell.html) | +| :x: | [_ftello_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftello.html) | +| :x: | [_ftok_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftok.html) | +| :x: | [_ftruncate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html) | +| :x: | [_ftrylockfile_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftrylockfile.html) | +| :x: | [_ftw_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftw.html) | +| :x: | [_funlockfile_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/funlockfile.html) | +| :x: | [_futimens_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html) | +| :x: | [_fwide_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fwide.html) | +| :x: | [_fwprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fwprintf.html) | +| :x: | [_fwrite_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fwrite.html) | +| :x: | [_fwscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/fwscanf.html) | +| :x: | [_gai_strerror_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gai_strerror.html) | +| :x: | [_getaddrinfo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html) | +| :x: | [_getchar_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html) | +| :x: | [_getchar_unlocked_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar_unlocked.html) | +| :x: | [_getc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getc.html) | +| :x: | [_getc_unlocked_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getc_unlocked.html) | +| :x: | [_getcwd_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html) | +| :x: | [_getdate_err_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdate_err.html) | +| :x: | [_getdate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdate.html) | +| :x: | [_getdelim_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html) | +| :x: | [_getegid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getegid.html) | +| :x: | [_getenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getenv.html) | +| :x: | [_geteuid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/geteuid.html) | +| :x: | [_getgid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgid.html) | +| :x: | [_getgrent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrent.html) | +| :x: | [_getgrgid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrgid.html) | +| :x: | [_getgrgid_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrgid_r.html) | +| :x: | [_getgrnam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrnam.html) | +| :x: | [_getgrnam_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgrnam_r.html) | +| :x: | [_getgroups_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgroups.html) | +| :x: | [_gethostent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gethostent.html) | +| :x: | [_gethostid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gethostid.html) | +| :x: | [_gethostname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gethostname.html) | +| :x: | [_getitimer_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getitimer.html) | +| :x: | [_getline_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) | +| :x: | [_getlogin_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html) | +| :x: | [_getlogin_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin_r.html) | +| :x: | [_getmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getmsg.html) | +| :x: | [_getnameinfo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html) | +| :x: | [_getnetbyaddr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getnetbyaddr.html) | +| :x: | [_getnetbyname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getnetbyname.html) | +| :x: | [_getnetent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getnetent.html) | +| :x: | [_getopt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html) | +| :x: | [_getpeername_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpeername.html) | +| :x: | [_getpgid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpgid.html) | +| :x: | [_getpgrp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpgrp.html) | +| :x: | [_getpid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpid.html) | +| :x: | [_getpmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpmsg.html) | +| :x: | [_getppid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getppid.html) | +| :x: | [_getpriority_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpriority.html) | +| :x: | [_getprotobyname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getprotobyname.html) | +| :x: | [_getprotobynumber_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getprotobynumber.html) | +| :x: | [_getprotoent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getprotoent.html) | +| :x: | [_getpwent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwent.html) | +| :x: | [_getpwnam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam.html) | +| :x: | [_getpwnam_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwnam_r.html) | +| :x: | [_getpwuid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwuid.html) | +| :x: | [_getpwuid_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpwuid_r.html) | +| :x: | [_getrlimit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getrlimit.html) | +| :x: | [_getrusage_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getrusage.html) | +| :x: | [_getservbyname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getservbyname.html) | +| :x: | [_getservbyport_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getservbyport.html) | +| :x: | [_getservent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getservent.html) | +| :x: | [_gets_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gets.html) | +| :x: | [_getsid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsid.html) | +| :x: | [_getsockname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockname.html) | +| :x: | [_getsockopt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html) | +| :x: | [_getsubopt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html) | +| :x: | [_gettimeofday_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gettimeofday.html) | +| :x: | [_getuid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getuid.html) | +| :x: | [_getutxent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getutxent.html) | +| :x: | [_getutxid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getutxid.html) | +| :x: | [_getutxline_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getutxline.html) | +| :x: | [_getwchar_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getwchar.html) | +| :x: | [_getwc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/getwc.html) | +| :x: | [_globfree_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/globfree.html) | +| :x: | [_glob_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/glob.html) | +| :x: | [_gmtime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime.html) | +| :x: | [_gmtime_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime_r.html) | +| :x: | [_grantpt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/grantpt.html) | +| :x: | [_hcreate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/hcreate.html) | +| :x: | [_hdestroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/hdestroy.html) | +| :x: | [_hsearch_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/hsearch.html) | +| :x: | [_htonl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/htonl.html) | +| :x: | [_htons_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/htons.html) | +| :x: | [_hypotf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/hypotf.html) | +| :x: | [_hypot_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/hypot.html) | +| :x: | [_hypotl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/hypotl.html) | +| :x: | [_iconv_close_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iconv_close.html) | +| :x: | [_iconv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iconv.html) | +| :x: | [_iconv_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iconv_open.html) | +| :x: | [_if_freenameindex_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_freenameindex.html) | +| :x: | [_if_indextoname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_indextoname.html) | +| :x: | [_if_nameindex_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_nameindex.html) | +| :x: | [_if_nametoindex_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_nametoindex.html) | +| :x: | [_ilogbf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ilogbf.html) | +| :x: | [_ilogb_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ilogb.html) | +| :x: | [_ilogbl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ilogbl.html) | +| :x: | [_imaxabs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/imaxabs.html) | +| :x: | [_imaxdiv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/imaxdiv.html) | +| :x: | [_inet_addr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_addr.html) | +| :x: | [_inet_ntoa_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_ntoa.html) | +| :x: | [_inet_ntop_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html) | +| :x: | [_inet_pton_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_pton.html) | +| :x: | [_initstate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/initstate.html) | +| :x: | [_insque_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/insque.html) | +| :x: | [_ioctl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ioctl.html) | +| :x: | [_isalnum_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isalnum.html) | +| :x: | [_isalnum_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isalnum_l.html) | +| :x: | [_isalpha_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isalpha.html) | +| :x: | [_isalpha_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isalpha_l.html) | +| :x: | [_isascii_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isascii.html) | +| :x: | [_isastream_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isastream.html) | +| :x: | [_isatty_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isatty.html) | +| :x: | [_isblank_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isblank.html) | +| :x: | [_isblank_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isblank_l.html) | +| :x: | [_iscntrl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iscntrl.html) | +| :x: | [_iscntrl_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iscntrl_l.html) | +| :x: | [_isdigit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isdigit.html) | +| :x: | [_isdigit_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isdigit_l.html) | +| :x: | [_isfinite_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isfinite.html) | +| :x: | [_isgraph_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isgraph.html) | +| :x: | [_isgraph_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isgraph_l.html) | +| :x: | [_isgreaterequal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isgreaterequal.html) | +| :x: | [_isgreater_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isgreater.html) | +| :x: | [_isinf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isinf.html) | +| :x: | [_islessequal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/islessequal.html) | +| :x: | [_islessgreater_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/islessgreater.html) | +| :x: | [_isless_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isless.html) | +| :x: | [_islower_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/islower.html) | +| :x: | [_islower_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/islower_l.html) | +| :x: | [_isnan_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isnan.html) | +| :x: | [_isnormal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isnormal.html) | +| :x: | [_isprint_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isprint.html) | +| :x: | [_isprint_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isprint_l.html) | +| :x: | [_ispunct_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ispunct.html) | +| :x: | [_ispunct_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ispunct_l.html) | +| :x: | [_isspace_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isspace.html) | +| :x: | [_isspace_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isspace_l.html) | +| :x: | [_isunordered_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isunordered.html) | +| :x: | [_isupper_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isupper.html) | +| :x: | [_isupper_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isupper_l.html) | +| :x: | [_iswalnum_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswalnum.html) | +| :x: | [_iswalnum_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswalnum_l.html) | +| :x: | [_iswalpha_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswalpha.html) | +| :x: | [_iswalpha_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswalpha_l.html) | +| :x: | [_iswblank_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswblank.html) | +| :x: | [_iswblank_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswblank_l.html) | +| :x: | [_iswcntrl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswcntrl.html) | +| :x: | [_iswcntrl_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswcntrl_l.html) | +| :x: | [_iswctype_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswctype.html) | +| :x: | [_iswctype_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswctype_l.html) | +| :x: | [_iswdigit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswdigit.html) | +| :x: | [_iswdigit_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswdigit_l.html) | +| :x: | [_iswgraph_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswgraph.html) | +| :x: | [_iswgraph_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswgraph_l.html) | +| :x: | [_iswlower_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswlower.html) | +| :x: | [_iswlower_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswlower_l.html) | +| :x: | [_iswprint_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswprint.html) | +| :x: | [_iswprint_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswprint_l.html) | +| :x: | [_iswpunct_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswpunct.html) | +| :x: | [_iswpunct_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswpunct_l.html) | +| :x: | [_iswspace_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswspace.html) | +| :x: | [_iswspace_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswspace_l.html) | +| :x: | [_iswupper_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswupper.html) | +| :x: | [_iswupper_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswupper_l.html) | +| :x: | [_iswxdigit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswxdigit.html) | +| :x: | [_iswxdigit_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/iswxdigit_l.html) | +| :x: | [_isxdigit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isxdigit.html) | +| :x: | [_isxdigit_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/isxdigit_l.html) | +| :x: | [_j0_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/j0.html) | +| :x: | [_j1_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/j1.html) | +| :x: | [_jn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/jn.html) | +| :x: | [_jrand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/jrand48.html) | +| :x: | [_kill_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/kill.html) | +| :x: | [_killpg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/killpg.html) | +| :x: | [_l64a_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/l64a.html) | +| :x: | [_labs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/labs.html) | +| :x: | [_lchown_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html) | +| :x: | [_lcong48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lcong48.html) | +| :x: | [_ldexpf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ldexpf.html) | +| :x: | [_ldexp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ldexp.html) | +| :x: | [_ldexpl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ldexpl.html) | +| :heavy_check_mark: | [_ldiv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ldiv.html) | +| :x: | [_lfind_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lfind.html) | +| :x: | [_lgammaf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lgammaf.html) | +| :x: | [_lgamma_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lgamma.html) | +| :x: | [_lgammal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lgammal.html) | +| :x: | [_linkat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/linkat.html) | +| :x: | [_link_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html) | +| :x: | [_lio_listio_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lio_listio.html) | +| :x: | [_listen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/listen.html) | +| :heavy_check_mark: | [_llabs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llabs.html) | +| :heavy_check_mark: | [_lldiv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lldiv.html) | +| :x: | [_llrintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llrintf.html) | +| :x: | [_llrint_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llrint.html) | +| :x: | [_llrintl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llrintl.html) | +| :x: | [_llroundf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llroundf.html) | +| :x: | [_llround_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llround.html) | +| :x: | [_llroundl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/llroundl.html) | +| :x: | [_localeconv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/localeconv.html) | +| :x: | [_localtime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.html) | +| :x: | [_localtime_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime_r.html) | +| :x: | [_lockf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lockf.html) | +| :x: | [_log10f_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log10f.html) | +| :x: | [_log10_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log10.html) | +| :x: | [_log10l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log10l.html) | +| :x: | [_log1pf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log1pf.html) | +| :x: | [_log1p_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log1p.html) | +| :x: | [_log1pl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log1pl.html) | +| :x: | [_log2f_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log2f.html) | +| :x: | [_log2_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log2.html) | +| :x: | [_log2l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log2l.html) | +| :x: | [_logbf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/logbf.html) | +| :x: | [_logb_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/logb.html) | +| :x: | [_logbl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/logbl.html) | +| :x: | [_logf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/logf.html) | +| :x: | [_log_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/log.html) | +| :x: | [_logl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/logl.html) | +| :x: | [_longjmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/longjmp.html) | +| :x: | [_lrand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lrand48.html) | +| :x: | [_lrintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lrintf.html) | +| :x: | [_lrint_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lrint.html) | +| :x: | [_lrintl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lrintl.html) | +| :x: | [_lroundf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lroundf.html) | +| :x: | [_lround_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lround.html) | +| :x: | [_lroundl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lroundl.html) | +| :x: | [_lsearch_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lsearch.html) | +| :x: | [_lseek_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html) | +| :x: | [_lstat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html) | +| :heavy_check_mark: | [_malloc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/malloc.html) | +| :x: | [_mblen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mblen.html) | +| :x: | [_mbrlen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbrlen.html) | +| :x: | [_mbrtowc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbrtowc.html) | +| :x: | [_mbsinit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbsinit.html) | +| :x: | [_mbsnrtowcs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbsnrtowcs.html) | +| :x: | [_mbsrtowcs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbsrtowcs.html) | +| :x: | [_mbstowcs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbstowcs.html) | +| :x: | [_mbtowc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mbtowc.html) | +| :heavy_check_mark: | [_memccpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/memccpy.html) | +| :heavy_check_mark: | [_memchr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/memchr.html) | +| :heavy_check_mark: | [_memcmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/memcmp.html) | +| :heavy_check_mark: | [_memcpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/memcpy.html) | +| :heavy_check_mark: | [_memmove_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/memmove.html) | +| :heavy_check_mark: | [_memset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/memset.html) | +| :x: | [_mkdirat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdirat.html) | +| :x: | [_mkdir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html) | +| :x: | [_mkdtemp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdtemp.html) | +| :x: | [_mkfifoat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkfifoat.html) | +| :x: | [_mkfifo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkfifo.html) | +| :x: | [_mknodat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mknodat.html) | +| :x: | [_mknod_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mknod.html) | +| :x: | [_mkstemp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkstemp.html) | +| :x: | [_mktime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mktime.html) | +| :x: | [_mlockall_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mlockall.html) | +| :x: | [_mlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mlock.html) | +| :x: | [_mmap_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html) | +| :x: | [_modff_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/modff.html) | +| :x: | [_modf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/modf.html) | +| :x: | [_modfl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/modfl.html) | +| :x: | [_mprotect_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mprotect.html) | +| :x: | [_mq_close_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_close.html) | +| :x: | [_mq_getattr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_getattr.html) | +| :x: | [_mq_notify_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_notify.html) | +| :x: | [_mq_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_open.html) | +| :x: | [_mq_receive_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_receive.html) | +| :x: | [_mq_send_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_send.html) | +| :x: | [_mq_setattr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_setattr.html) | +| :x: | [_mq_timedreceive_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_timedreceive.html) | +| :x: | [_mq_timedsend_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_timedsend.html) | +| :x: | [_mq_unlink_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mq_unlink.html) | +| :x: | [_mrand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/mrand48.html) | +| :x: | [_msgctl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/msgctl.html) | +| :x: | [_msgget_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/msgget.html) | +| :x: | [_msgrcv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/msgrcv.html) | +| :x: | [_msgsnd_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/msgsnd.html) | +| :x: | [_msync_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/msync.html) | +| :x: | [_munlockall_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/munlockall.html) | +| :x: | [_munlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/munlock.html) | +| :x: | [_munmap_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/munmap.html) | +| :x: | [_nanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanf.html) | +| :x: | [_nan_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nan.html) | +| :x: | [_nanl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanl.html) | +| :x: | [_nanosleep_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html) | +| :x: | [_nearbyintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nearbyintf.html) | +| :x: | [_nearbyint_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nearbyint.html) | +| :x: | [_nearbyintl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nearbyintl.html) | +| :x: | [_newlocale_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/newlocale.html) | +| :x: | [_nextafterf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nextafterf.html) | +| :x: | [_nextafter_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nextafter.html) | +| :x: | [_nextafterl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nextafterl.html) | +| :x: | [_nexttowardf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nexttowardf.html) | +| :x: | [_nexttoward_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nexttoward.html) | +| :x: | [_nexttowardl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nexttowardl.html) | +| :x: | [_nftw_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nftw.html) | +| :x: | [_nice_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nice.html) | +| :x: | [_nl_langinfo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nl_langinfo.html) | +| :x: | [_nl_langinfo_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nl_langinfo_l.html) | +| :x: | [_nrand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/nrand48.html) | +| :x: | [_ntohl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ntohl.html) | +| :x: | [_ntohs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ntohs.html) | +| :x: | [_openat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/openat.html) | +| :heavy_check_mark: | [_opendir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/opendir.html) | +| :x: | [_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) | +| :x: | [_openlog_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/openlog.html) | +| :x: | [_open_memstream_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html) | +| :x: | [_open_wmemstream_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/open_wmemstream.html) | +| :x: | [_optarg_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/optarg.html) | +| :x: | [_opterr_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/opterr.html) | +| :x: | [_optind_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/optind.html) | +| :x: | [_optopt_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/optopt.html) | +| :x: | [_pathconf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pathconf.html) | +| :x: | [_pause_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pause.html) | +| :x: | [_pclose_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pclose.html) | +| :x: | [_perror_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/perror.html) | +| :x: | [_pipe_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html) | +| :x: | [_poll_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html) | +| :x: | [_popen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/popen.html) | +| :x: | [_posix_fadvise_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_fadvise.html) | +| :x: | [_posix_fallocate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_fallocate.html) | +| :x: | [_posix_madvise_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_madvise.html) | +| :x: | [_posix_memalign_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html) | +| :x: | [_posix_mem_offset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_mem_offset.html) | +| :x: | [_posix_openpt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_openpt.html) | +| :x: | [_posix_spawnattr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_destroy.html) | +| :x: | [_posix_spawnattr_getflags_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getflags.html) | +| :x: | [_posix_spawnattr_getpgroup_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getpgroup.html) | +| :x: | [_posix_spawnattr_getschedparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getschedparam.html) | +| :x: | [_posix_spawnattr_getschedpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getschedpolicy.html) | +| :x: | [_posix_spawnattr_getsigdefault_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getsigdefault.html) | +| :x: | [_posix_spawnattr_getsigmask_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getsigmask.html) | +| :x: | [_posix_spawnattr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_init.html) | +| :x: | [_posix_spawnattr_setflags_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setflags.html) | +| :x: | [_posix_spawnattr_setpgroup_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setpgroup.html) | +| :x: | [_posix_spawnattr_setschedparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setschedparam.html) | +| :x: | [_posix_spawnattr_setschedpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setschedpolicy.html) | +| :x: | [_posix_spawnattr_setsigdefault_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setsigdefault.html) | +| :x: | [_posix_spawnattr_setsigmask_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_setsigmask.html) | +| :x: | [_posix_spawn_file_actions_addclose_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_addclose.html) | +| :x: | [_posix_spawn_file_actions_adddup2_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_adddup2.html) | +| :x: | [_posix_spawn_file_actions_addopen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_addopen.html) | +| :x: | [_posix_spawn_file_actions_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_destroy.html) | +| :x: | [_posix_spawn_file_actions_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_init.html) | +| :x: | [_posix_spawn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn.html) | +| :x: | [_posix_spawnp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnp.html) | +| :x: | [_posix_trace_attr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_destroy.html) | +| :x: | [_posix_trace_attr_getclockres_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getclockres.html) | +| :x: | [_posix_trace_attr_getcreatetime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getcreatetime.html) | +| :x: | [_posix_trace_attr_getgenversion_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getgenversion.html) | +| :x: | [_posix_trace_attr_getinherited_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getinherited.html) | +| :x: | [_posix_trace_attr_getlogfullpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getlogfullpolicy.html) | +| :x: | [_posix_trace_attr_getlogsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getlogsize.html) | +| :x: | [_posix_trace_attr_getmaxdatasize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getmaxdatasize.html) | +| :x: | [_posix_trace_attr_getmaxsystemeventsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getmaxsystemeventsize.html) | +| :x: | [_posix_trace_attr_getmaxusereventsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getmaxusereventsize.html) | +| :x: | [_posix_trace_attr_getname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getname.html) | +| :x: | [_posix_trace_attr_getstreamfullpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getstreamfullpolicy.html) | +| :x: | [_posix_trace_attr_getstreamsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_getstreamsize.html) | +| :x: | [_posix_trace_attr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_init.html) | +| :x: | [_posix_trace_attr_setinherited_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setinherited.html) | +| :x: | [_posix_trace_attr_setlogfullpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setlogfullpolicy.html) | +| :x: | [_posix_trace_attr_setlogsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setlogsize.html) | +| :x: | [_posix_trace_attr_setmaxdatasize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setmaxdatasize.html) | +| :x: | [_posix_trace_attr_setname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setname.html) | +| :x: | [_posix_trace_attr_setstreamfullpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setstreamfullpolicy.html) | +| :x: | [_posix_trace_attr_setstreamsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_attr_setstreamsize.html) | +| :x: | [_posix_trace_clear_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_clear.html) | +| :x: | [_posix_trace_close_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_close.html) | +| :x: | [_posix_trace_create_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_create.html) | +| :x: | [_posix_trace_create_withlog_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_create_withlog.html) | +| :x: | [_posix_trace_event_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_event.html) | +| :x: | [_posix_trace_eventid_equal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventid_equal.html) | +| :x: | [_posix_trace_eventid_get_name_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventid_get_name.html) | +| :x: | [_posix_trace_eventid_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventid_open.html) | +| :x: | [_posix_trace_eventset_add_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_add.html) | +| :x: | [_posix_trace_eventset_del_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_del.html) | +| :x: | [_posix_trace_eventset_empty_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_empty.html) | +| :x: | [_posix_trace_eventset_fill_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_fill.html) | +| :x: | [_posix_trace_eventset_ismember_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventset_ismember.html) | +| :x: | [_posix_trace_eventtypelist_getnext_id_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventtypelist_getnext_id.html) | +| :x: | [_posix_trace_eventtypelist_rewind_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_eventtypelist_rewind.html) | +| :x: | [_posix_trace_flush_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_flush.html) | +| :x: | [_posix_trace_get_attr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_get_attr.html) | +| :x: | [_posix_trace_get_filter_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_get_filter.html) | +| :x: | [_posix_trace_getnext_event_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_getnext_event.html) | +| :x: | [_posix_trace_get_status_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_get_status.html) | +| :x: | [_posix_trace_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_open.html) | +| :x: | [_posix_trace_rewind_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_rewind.html) | +| :x: | [_posix_trace_set_filter_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_set_filter.html) | +| :x: | [_posix_trace_shutdown_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_shutdown.html) | +| :x: | [_posix_trace_start_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_start.html) | +| :x: | [_posix_trace_stop_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_stop.html) | +| :x: | [_posix_trace_timedgetnext_event_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_timedgetnext_event.html) | +| :x: | [_posix_trace_trid_eventid_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_trid_eventid_open.html) | +| :x: | [_posix_trace_trygetnext_event_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_trace_trygetnext_event.html) | +| :x: | [_posix_typed_mem_get_info_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_typed_mem_get_info.html) | +| :x: | [_posix_typed_mem_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_typed_mem_open.html) | +| :x: | [_powf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/powf.html) | +| :x: | [_pow_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pow.html) | +| :x: | [_powl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/powl.html) | +| :x: | [_pread_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html) | +| :x: | [_printf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html) | +| :x: | [_pselect_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pselect.html) | +| :x: | [_psiginfo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/psiginfo.html) | +| :x: | [_psignal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/psignal.html) | +| :x: | [_pthread_atfork_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_atfork.html) | +| :x: | [_pthread_attr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_destroy.html) | +| :x: | [_pthread_attr_getdetachstate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getdetachstate.html) | +| :x: | [_pthread_attr_getguardsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getguardsize.html) | +| :x: | [_pthread_attr_getinheritsched_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getinheritsched.html) | +| :x: | [_pthread_attr_getschedparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getschedparam.html) | +| :x: | [_pthread_attr_getschedpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getschedpolicy.html) | +| :x: | [_pthread_attr_getscope_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getscope.html) | +| :x: | [_pthread_attr_getstack_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getstack.html) | +| :x: | [_pthread_attr_getstacksize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_getstacksize.html) | +| :x: | [_pthread_attr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_init.html) | +| :x: | [_pthread_attr_setdetachstate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setdetachstate.html) | +| :x: | [_pthread_attr_setguardsize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setguardsize.html) | +| :x: | [_pthread_attr_setinheritsched_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setinheritsched.html) | +| :x: | [_pthread_attr_setschedparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setschedparam.html) | +| :x: | [_pthread_attr_setschedpolicy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setschedpolicy.html) | +| :x: | [_pthread_attr_setscope_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setscope.html) | +| :x: | [_pthread_attr_setstack_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setstack.html) | +| :x: | [_pthread_attr_setstacksize_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_attr_setstacksize.html) | +| :x: | [_pthread_barrierattr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_destroy.html) | +| :x: | [_pthread_barrierattr_getpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_getpshared.html) | +| :x: | [_pthread_barrierattr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_init.html) | +| :x: | [_pthread_barrierattr_setpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrierattr_setpshared.html) | +| :x: | [_pthread_barrier_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) | +| :x: | [_pthread_barrier_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_init.html) | +| :x: | [_pthread_barrier_wait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_wait.html) | +| :x: | [_pthread_cancel_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cancel.html) | +| :x: | [_pthread_cleanup_pop_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cleanup_pop.html) | +| :x: | [_pthread_cleanup_push_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cleanup_push.html) | +| :x: | [_pthread_condattr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_destroy.html) | +| :x: | [_pthread_condattr_getclock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_getclock.html) | +| :x: | [_pthread_condattr_getpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_getpshared.html) | +| :x: | [_pthread_condattr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_init.html) | +| :x: | [_pthread_condattr_setclock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setclock.html) | +| :x: | [_pthread_condattr_setpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setpshared.html) | +| :x: | [_pthread_cond_broadcast_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_broadcast.html) | +| :x: | [_pthread_cond_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_destroy.html) | +| :x: | [_pthread_cond_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_init.html) | +| :x: | [_pthread_cond_signal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_signal.html) | +| :x: | [_pthread_cond_timedwait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_timedwait.html) | +| :x: | [_pthread_cond_wait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_wait.html) | +| :x: | [_pthread_create_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_create.html) | +| :x: | [_pthread_detach_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_detach.html) | +| :x: | [_pthread_equal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_equal.html) | +| :x: | [_pthread_exit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_exit.html) | +| :x: | [_pthread_getconcurrency_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_getconcurrency.html) | +| :x: | [_pthread_getcpuclockid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_getcpuclockid.html) | +| :x: | [_pthread_getschedparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_getschedparam.html) | +| :x: | [_pthread_getspecific_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_getspecific.html) | +| :x: | [_pthread_join_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html) | +| :x: | [_pthread_key_create_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_key_create.html) | +| :x: | [_pthread_key_delete_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_key_delete.html) | +| :x: | [_pthread_kill_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_kill.html) | +| :x: | [_pthread_mutexattr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_destroy.html) | +| :x: | [_pthread_mutexattr_getprioceiling_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprioceiling.html) | +| :x: | [_pthread_mutexattr_getprotocol_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html) | +| :x: | [_pthread_mutexattr_getpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getpshared.html) | +| :x: | [_pthread_mutexattr_getrobust_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getrobust.html) | +| :x: | [_pthread_mutexattr_gettype_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_gettype.html) | +| :x: | [_pthread_mutexattr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_init.html) | +| :x: | [_pthread_mutexattr_setprioceiling_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setprioceiling.html) | +| :x: | [_pthread_mutexattr_setprotocol_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setprotocol.html) | +| :x: | [_pthread_mutexattr_setpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html) | +| :x: | [_pthread_mutexattr_setrobust_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setrobust.html) | +| :x: | [_pthread_mutexattr_settype_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_settype.html) | +| :x: | [_pthread_mutex_consistent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_consistent.html) | +| :x: | [_pthread_mutex_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_destroy.html) | +| :x: | [_pthread_mutex_getprioceiling_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_getprioceiling.html) | +| :x: | [_pthread_mutex_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_init.html) | +| :x: | [_pthread_mutex_lock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html) | +| :x: | [_pthread_mutex_setprioceiling_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_setprioceiling.html) | +| :x: | [_pthread_mutex_timedlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_timedlock.html) | +| :x: | [_pthread_mutex_trylock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_trylock.html) | +| :x: | [_pthread_mutex_unlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_unlock.html) | +| :x: | [_pthread_once_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_once.html) | +| :x: | [_pthread_rwlockattr_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_destroy.html) | +| :x: | [_pthread_rwlockattr_getpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_getpshared.html) | +| :x: | [_pthread_rwlockattr_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_init.html) | +| :x: | [_pthread_rwlockattr_setpshared_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlockattr_setpshared.html) | +| :x: | [_pthread_rwlock_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_destroy.html) | +| :x: | [_pthread_rwlock_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_init.html) | +| :x: | [_pthread_rwlock_rdlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_rdlock.html) | +| :x: | [_pthread_rwlock_timedrdlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_timedrdlock.html) | +| :x: | [_pthread_rwlock_timedwrlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_timedwrlock.html) | +| :x: | [_pthread_rwlock_tryrdlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_tryrdlock.html) | +| :x: | [_pthread_rwlock_trywrlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_trywrlock.html) | +| :x: | [_pthread_rwlock_unlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_unlock.html) | +| :x: | [_pthread_rwlock_wrlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_wrlock.html) | +| :x: | [_pthread_self_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_self.html) | +| :x: | [_pthread_setcancelstate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_setcancelstate.html) | +| :x: | [_pthread_setcanceltype_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_setcanceltype.html) | +| :x: | [_pthread_setconcurrency_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_setconcurrency.html) | +| :x: | [_pthread_setschedparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_setschedparam.html) | +| :x: | [_pthread_setschedprio_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_setschedprio.html) | +| :x: | [_pthread_setspecific_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_setspecific.html) | +| :x: | [_pthread_sigmask_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_sigmask.html) | +| :x: | [_pthread_spin_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_destroy.html) | +| :x: | [_pthread_spin_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_init.html) | +| :x: | [_pthread_spin_lock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_lock.html) | +| :x: | [_pthread_spin_trylock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_trylock.html) | +| :x: | [_pthread_spin_unlock_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_spin_unlock.html) | +| :x: | [_pthread_testcancel_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_testcancel.html) | +| :x: | [_ptsname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ptsname.html) | +| :x: | [_putchar_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putchar.html) | +| :x: | [_putchar_unlocked_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putchar_unlocked.html) | +| :x: | [_putc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putc.html) | +| :x: | [_putc_unlocked_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putc_unlocked.html) | +| :x: | [_putenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putenv.html) | +| :x: | [_putmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putmsg.html) | +| :x: | [_putpmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putpmsg.html) | +| :x: | [_puts_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/puts.html) | +| :x: | [_pututxline_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pututxline.html) | +| :x: | [_putwchar_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putwchar.html) | +| :x: | [_putwc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/putwc.html) | +| :x: | [_pwrite_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html) | +| :x: | [_qsort_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/qsort.html) | +| :x: | [_raise_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/raise.html) | +| :x: | [_rand_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rand.html) | +| :x: | [_random_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/random.html) | +| :x: | [_rand_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rand_r.html) | +| :heavy_check_mark: | [_readdir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html) | +| :x: | [_readdir_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir_r.html) | +| :x: | [_read_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html) | +| :x: | [_readlinkat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlinkat.html) | +| :x: | [_readlink_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html) | +| :x: | [_readv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/readv.html) | +| :heavy_check_mark: | [_realloc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html) | +| :x: | [_realpath_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/realpath.html) | +| :x: | [_recvfrom_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html) | +| :x: | [_recv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/recv.html) | +| :x: | [_recvmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html) | +| :x: | [_regcomp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/regcomp.html) | +| :x: | [_regerror_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/regerror.html) | +| :x: | [_regexec_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/regexec.html) | +| :x: | [_regfree_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/regfree.html) | +| :x: | [_remainderf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remainderf.html) | +| :x: | [_remainder_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remainder.html) | +| :x: | [_remainderl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remainderl.html) | +| :x: | [_remove_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remove.html) | +| :x: | [_remque_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remque.html) | +| :x: | [_remquof_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remquof.html) | +| :x: | [_remquo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remquo.html) | +| :x: | [_remquol_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/remquol.html) | +| :x: | [_renameat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/renameat.html) | +| :x: | [_rename_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html) | +| :heavy_check_mark: | [_rewinddir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rewinddir.html) | +| :x: | [_rewind_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rewind.html) | +| :x: | [_rintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rintf.html) | +| :x: | [_rint_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rint.html) | +| :x: | [_rintl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rintl.html) | +| :x: | [_rmdir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html) | +| :x: | [_roundf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/roundf.html) | +| :x: | [_round_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/round.html) | +| :x: | [_roundl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/roundl.html) | +| :x: | [_scalblnf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scalblnf.html) | +| :x: | [_scalbln_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scalbln.html) | +| :x: | [_scalblnl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scalblnl.html) | +| :x: | [_scalbnf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scalbnf.html) | +| :x: | [_scalbn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scalbn.html) | +| :x: | [_scalbnl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scalbnl.html) | +| :x: | [_scandir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scandir.html) | +| :x: | [_scanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html) | +| :x: | [_sched_getparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_getparam.html) | +| :x: | [_sched_get_priority_max_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_get_priority_max.html) | +| :x: | [_sched_get_priority_min_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_get_priority_min.html) | +| :x: | [_sched_getscheduler_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_getscheduler.html) | +| :x: | [_sched_rr_get_interval_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_rr_get_interval.html) | +| :x: | [_sched_setparam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setparam.html) | +| :x: | [_sched_setscheduler_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html) | +| :x: | [_sched_yield_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_yield.html) | +| :x: | [_seed48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/seed48.html) | +| :heavy_check_mark: | [_seekdir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/seekdir.html) | +| :x: | [_select_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html) | +| :x: | [_sem_close_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_close.html) | +| :x: | [_semctl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/semctl.html) | +| :x: | [_sem_destroy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_destroy.html) | +| :x: | [_semget_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/semget.html) | +| :x: | [_sem_getvalue_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_getvalue.html) | +| :x: | [_sem_init_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_init.html) | +| :x: | [_sem_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_open.html) | +| :x: | [_semop_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/semop.html) | +| :x: | [_sem_post_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_post.html) | +| :x: | [_sem_timedwait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_timedwait.html) | +| :x: | [_sem_trywait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_trywait.html) | +| :x: | [_sem_unlink_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_unlink.html) | +| :x: | [_sem_wait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_wait.html) | +| :x: | [_send_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html) | +| :x: | [_sendmsg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendmsg.html) | +| :x: | [_sendto_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sendto.html) | +| :x: | [_setbuf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setbuf.html) | +| :x: | [_setegid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setegid.html) | +| :x: | [_setenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setenv.html) | +| :x: | [_seteuid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/seteuid.html) | +| :x: | [_setgid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setgid.html) | +| :x: | [_setgrent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setgrent.html) | +| :x: | [_sethostent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sethostent.html) | +| :x: | [_setitimer_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setitimer.html) | +| :x: | [_setjmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setjmp.html) | +| :x: | [_setkey_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setkey.html) | +| :x: | [_setlocale_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setlocale.html) | +| :x: | [_setlogmask_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setlogmask.html) | +| :x: | [_setnetent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setnetent.html) | +| :x: | [_setpgid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpgid.html) | +| :x: | [_setpgrp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpgrp.html) | +| :x: | [_setpriority_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpriority.html) | +| :x: | [_setprotoent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setprotoent.html) | +| :x: | [_setpwent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpwent.html) | +| :x: | [_setregid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setregid.html) | +| :x: | [_setreuid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setreuid.html) | +| :x: | [_setrlimit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setrlimit.html) | +| :x: | [_setservent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setservent.html) | +| :x: | [_setsid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsid.html) | +| :x: | [_setsockopt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html) | +| :x: | [_setstate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setstate.html) | +| :x: | [_setuid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setuid.html) | +| :x: | [_setutxent_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setutxent.html) | +| :x: | [_setvbuf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/setvbuf.html) | +| :x: | [_shmat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmat.html) | +| :x: | [_shmctl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmctl.html) | +| :x: | [_shmdt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmdt.html) | +| :x: | [_shmget_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmget.html) | +| :x: | [_shm_open_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_open.html) | +| :x: | [_shm_unlink_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_unlink.html) | +| :x: | [_shutdown_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/shutdown.html) | +| :x: | [_sigaction_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html) | +| :x: | [_sigaddset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaddset.html) | +| :x: | [_sigaltstack_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaltstack.html) | +| :x: | [_sigdelset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigdelset.html) | +| :x: | [_sigemptyset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigemptyset.html) | +| :x: | [_sigfillset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigfillset.html) | +| :x: | [_sighold_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sighold.html) | +| :x: | [_sigignore_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigignore.html) | +| :x: | [_siginterrupt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/siginterrupt.html) | +| :x: | [_sigismember_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigismember.html) | +| :x: | [_siglongjmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/siglongjmp.html) | +| :x: | [_signal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html) | +| :x: | [_signbit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/signbit.html) | +| :x: | [_signgam_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/signgam.html) | +| :x: | [_sigpause_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigpause.html) | +| :x: | [_sigpending_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigpending.html) | +| :x: | [_sigprocmask_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html) | +| :x: | [_sigqueue_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigqueue.html) | +| :x: | [_sigrelse_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigrelse.html) | +| :x: | [_sigset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigset.html) | +| :x: | [_sigsetjmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigsetjmp.html) | +| :x: | [_sigsuspend_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigsuspend.html) | +| :x: | [_sigtimedwait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigtimedwait.html) | +| :x: | [_sigwait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwait.html) | +| :x: | [_sigwaitinfo_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwaitinfo.html) | +| :x: | [_sinf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sinf.html) | +| :x: | [_sinhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sinhf.html) | +| :x: | [_sinh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sinh.html) | +| :x: | [_sinhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sinhl.html) | +| :x: | [_sin_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sin.html) | +| :x: | [_sinl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sinl.html) | +| :x: | [_sleep_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html) | +| :x: | [_snprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/snprintf.html) | +| :x: | [_sockatmark_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sockatmark.html) | +| :x: | [_socket_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/socket.html) | +| :x: | [_socketpair_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/socketpair.html) | +| :x: | [_sprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sprintf.html) | +| :x: | [_sqrtf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sqrtf.html) | +| :x: | [_sqrt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sqrt.html) | +| :x: | [_sqrtl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sqrtl.html) | +| :x: | [_srand48_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/srand48.html) | +| :x: | [_srand_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/srand.html) | +| :x: | [_srandom_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/srandom.html) | +| :x: | [_sscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sscanf.html) | +| :x: | [_stat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html) | +| :x: | [_statvfs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/statvfs.html) | +| :x: | [_stderr_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/stderr.html) | +| :x: | [_stdin_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdin.html) | +| :x: | [_stdout_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdout.html) | +| :x: | [_stpcpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/stpcpy.html) | +| :x: | [_stpncpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/stpncpy.html) | +| :x: | [_strcasecmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html) | +| :x: | [_strcasecmp_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp_l.html) | +| :heavy_check_mark: | [_strcat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcat.html) | +| :heavy_check_mark: | [_strchr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strchr.html) | +| :heavy_check_mark: | [_strcmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcmp.html) | +| :heavy_check_mark: | [_strcoll_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcoll.html) | +| :x: | [_strcoll_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcoll_l.html) | +| :heavy_check_mark: | [_strcpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcpy.html) | +| :heavy_check_mark: | [_strcspn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcspn.html) | +| :x: | [_strdup_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strdup.html) | +| :x: | [_strerror_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html) | +| :x: | [_strerror_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror_l.html) | +| :x: | [_strerror_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror_r.html) | +| :x: | [_strfmon_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strfmon.html) | +| :x: | [_strfmon_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strfmon_l.html) | +| :x: | [_strftime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html) | +| :x: | [_strftime_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime_l.html) | +| :heavy_check_mark: | [_strlen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strlen.html) | +| :x: | [_strncasecmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strncasecmp.html) | +| :x: | [_strncasecmp_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strncasecmp_l.html) | +| :heavy_check_mark: | [_strncat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strncat.html) | +| :heavy_check_mark: | [_strncmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strncmp.html) | +| :heavy_check_mark: | [_strncpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strncpy.html) | +| :x: | [_strndup_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strndup.html) | +| :x: | [_strnlen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strnlen.html) | +| :heavy_check_mark: | [_strpbrk_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strpbrk.html) | +| :x: | [_strptime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html) | +| :heavy_check_mark: | [_strrchr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strrchr.html) | +| :x: | [_strsignal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strsignal.html) | +| :heavy_check_mark: | [_strspn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strspn.html) | +| :heavy_check_mark: | [_strstr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strstr.html) | +| :x: | [_strtod_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtod.html) | +| :x: | [_strtof_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtof.html) | +| :x: | [_strtoimax_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtoimax.html) | +| :heavy_check_mark: | [_strtok_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html) | +| :x: | [_strtok_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html) | +| :x: | [_strtold_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtold.html) | +| :x: | [_strtol_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtol.html) | +| :x: | [_strtoll_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtoll.html) | +| :x: | [_strtoul_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtoul.html) | +| :x: | [_strtoull_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtoull.html) | +| :x: | [_strtoumax_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtoumax.html) | +| :x: | [_strxfrm_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strxfrm.html) | +| :x: | [_strxfrm_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/strxfrm_l.html) | +| :x: | [_swab_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/swab.html) | +| :x: | [_swprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/swprintf.html) | +| :x: | [_swscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/swscanf.html) | +| :x: | [_symlinkat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlinkat.html) | +| :x: | [_symlink_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html) | +| :x: | [_sync_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sync.html) | +| :x: | [_sysconf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html) | +| :x: | [_syslog_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/syslog.html) | +| :x: | [_system_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/system.html) | +| :x: | [_tanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tanf.html) | +| :x: | [_tanhf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tanhf.html) | +| :x: | [_tanh_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tanh.html) | +| :x: | [_tanhl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tanhl.html) | +| :x: | [_tan_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tan.html) | +| :x: | [_tanl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tanl.html) | +| :x: | [_tcdrain_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcdrain.html) | +| :x: | [_tcflow_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcflow.html) | +| :x: | [_tcflush_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcflush.html) | +| :x: | [_tcgetattr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetattr.html) | +| :x: | [_tcgetpgrp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetpgrp.html) | +| :x: | [_tcgetsid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetsid.html) | +| :x: | [_tcsendbreak_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsendbreak.html) | +| :x: | [_tcsetattr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsetattr.html) | +| :x: | [_tcsetpgrp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsetpgrp.html) | +| :x: | [_tdelete_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tdelete.html) | +| :heavy_check_mark: | [_telldir_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/telldir.html) | +| :x: | [_tempnam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tempnam.html) | +| :x: | [_tfind_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tfind.html) | +| :x: | [_tgammaf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tgammaf.html) | +| :x: | [_tgamma_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tgamma.html) | +| :x: | [_tgammal_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tgammal.html) | +| :heavy_check_mark: | [_time_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html) | +| :x: | [_timer_create_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_create.html) | +| :x: | [_timer_delete_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_delete.html) | +| :x: | [_timer_getoverrun_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_getoverrun.html) | +| :x: | [_timer_gettime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_gettime.html) | +| :x: | [_timer_settime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/timer_settime.html) | +| :x: | [_times_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/times.html) | +| :x: | [_timezone_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/timezone.html) | +| :x: | [_tmpfile_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tmpfile.html) | +| :x: | [_tmpnam_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tmpnam.html) | +| :x: | [_toascii_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/toascii.html) | +| :x: | [_tolower_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tolower.html) | +| :x: | [_tolower_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tolower_l.html) | +| :x: | [_toupper_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/toupper.html) | +| :x: | [_toupper_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/toupper_l.html) | +| :x: | [_towctrans_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/towctrans.html) | +| :x: | [_towctrans_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/towctrans_l.html) | +| :x: | [_towlower_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/towlower.html) | +| :x: | [_towlower_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/towlower_l.html) | +| :x: | [_towupper_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/towupper.html) | +| :x: | [_towupper_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/towupper_l.html) | +| :x: | [_truncate_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html) | +| :x: | [_truncf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncf.html) | +| :x: | [_trunc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/trunc.html) | +| :x: | [_truncl_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncl.html) | +| :x: | [_tsearch_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tsearch.html) | +| :x: | [_ttyname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ttyname.html) | +| :x: | [_ttyname_r_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ttyname_r.html) | +| :x: | [_twalk_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/twalk.html) | +| :x: | [_tzname_](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tzname.html) | +| :x: | [_tzset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/tzset.html) | +| :x: | [_ulimit_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ulimit.html) | +| :x: | [_umask_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/umask.html) | +| :x: | [_uname_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/uname.html) | +| :x: | [_ungetc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetc.html) | +| :x: | [_ungetwc_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetwc.html) | +| :x: | [_unlinkat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlinkat.html) | +| :x: | [_unlink_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html) | +| :x: | [_unlockpt_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlockpt.html) | +| :x: | [_unsetenv_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/unsetenv.html) | +| :x: | [_uselocale_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/uselocale.html) | +| :x: | [_utime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/utime.html) | +| :x: | [_utimensat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/utimensat.html) | +| :x: | [_utimes_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/utimes.html) | +| :x: | [_va_arg_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/va_arg.html) | +| :x: | [_va_copy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/va_copy.html) | +| :x: | [_va_end_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/va_end.html) | +| :x: | [_va_start_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/va_start.html) | +| :x: | [_vdprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vdprintf.html) | +| :x: | [_vfprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vfprintf.html) | +| :x: | [_vfscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vfscanf.html) | +| :x: | [_vfwprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vfwprintf.html) | +| :x: | [_vfwscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vfwscanf.html) | +| :x: | [_vprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vprintf.html) | +| :x: | [_vscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vscanf.html) | +| :x: | [_vsnprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vsnprintf.html) | +| :x: | [_vsprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vsprintf.html) | +| :x: | [_vsscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vsscanf.html) | +| :x: | [_vswprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vswprintf.html) | +| :x: | [_vswscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vswscanf.html) | +| :x: | [_vwprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vwprintf.html) | +| :x: | [_vwscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/vwscanf.html) | +| :x: | [_wait_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html) | +| :x: | [_waitid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/waitid.html) | +| :x: | [_waitpid_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html) | +| :x: | [_wcpcpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcpcpy.html) | +| :x: | [_wcpncpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcpncpy.html) | +| :x: | [_wcrtomb_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcrtomb.html) | +| :x: | [_wcscasecmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscasecmp.html) | +| :x: | [_wcscasecmp_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscasecmp_l.html) | +| :x: | [_wcscat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscat.html) | +| :x: | [_wcschr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcschr.html) | +| :x: | [_wcscmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscmp.html) | +| :x: | [_wcscoll_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscoll.html) | +| :x: | [_wcscoll_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscoll_l.html) | +| :x: | [_wcscpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscpy.html) | +| :x: | [_wcscspn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcscspn.html) | +| :x: | [_wcsdup_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsdup.html) | +| :x: | [_wcsftime_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsftime.html) | +| :x: | [_wcslen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcslen.html) | +| :x: | [_wcsncasecmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsncasecmp.html) | +| :x: | [_wcsncasecmp_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsncasecmp_l.html) | +| :x: | [_wcsncat_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsncat.html) | +| :x: | [_wcsncmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsncmp.html) | +| :x: | [_wcsncpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsncpy.html) | +| :x: | [_wcsnlen_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsnlen.html) | +| :x: | [_wcsnrtombs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsnrtombs.html) | +| :x: | [_wcspbrk_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcspbrk.html) | +| :x: | [_wcsrchr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsrchr.html) | +| :x: | [_wcsrtombs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsrtombs.html) | +| :x: | [_wcsspn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsspn.html) | +| :x: | [_wcsstr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsstr.html) | +| :x: | [_wcstod_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstod.html) | +| :x: | [_wcstof_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstof.html) | +| :x: | [_wcstoimax_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstoimax.html) | +| :x: | [_wcstok_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstok.html) | +| :x: | [_wcstold_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstold.html) | +| :x: | [_wcstol_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstol.html) | +| :x: | [_wcstoll_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstoll.html) | +| :x: | [_wcstombs_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstombs.html) | +| :x: | [_wcstoul_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstoul.html) | +| :x: | [_wcstoull_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstoull.html) | +| :x: | [_wcstoumax_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcstoumax.html) | +| :x: | [_wcswidth_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcswidth.html) | +| :x: | [_wcsxfrm_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsxfrm.html) | +| :x: | [_wcsxfrm_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsxfrm_l.html) | +| :x: | [_wctob_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wctob.html) | +| :x: | [_wctomb_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wctomb.html) | +| :x: | [_wctrans_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wctrans.html) | +| :x: | [_wctrans_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wctrans_l.html) | +| :x: | [_wctype_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wctype.html) | +| :x: | [_wctype_l_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wctype_l.html) | +| :x: | [_wcwidth_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcwidth.html) | +| :x: | [_wmemchr_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wmemchr.html) | +| :x: | [_wmemcmp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wmemcmp.html) | +| :x: | [_wmemcpy_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wmemcpy.html) | +| :x: | [_wmemmove_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wmemmove.html) | +| :x: | [_wmemset_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wmemset.html) | +| :x: | [_wordexp_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wordexp.html) | +| :x: | [_wordfree_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wordfree.html) | +| :x: | [_wprintf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wprintf.html) | +| :x: | [_write_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html) | +| :x: | [_writev_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/writev.html) | +| :x: | [_wscanf_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/wscanf.html) | +| :x: | [_y0_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/y0.html) | +| :x: | [_y1_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/y1.html) | +| :x: | [_yn_()](https://pubs.opengroup.org/onlinepubs/9699919799/functions/yn.html) diff --git a/contrib/kolibri-libc/bin/clink b/contrib/kolibri-libc/bin/clink new file mode 100644 index 0000000000000000000000000000000000000000..89393a4e622b25475115612e7192bbbd37d00682 GIT binary patch literal 23292 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%0AIHfx*Qd5lw(QrA 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 S{^&nBUDk^R$Jwjk<9`4Zlb+cC literal 0 HcmV?d00001 diff --git a/contrib/kolibri-libc/bin/fasm b/contrib/kolibri-libc/bin/fasm new file mode 100644 index 0000000000000000000000000000000000000000..7d610fedd7c32785bb43deb2b6d8ede5ba8c7ccb GIT binary patch literal 106884 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 EKP47{cmMzZ literal 0 HcmV?d00001 diff --git a/contrib/kolibri-libc/bin/kos32-tcc b/contrib/kolibri-libc/bin/kos32-tcc new file mode 100644 index 0000000000000000000000000000000000000000..26789dc65b7bb98a48bb4ee0fa32b7cf923f46d8 GIT binary patch literal 105944 zcmZ6y2T)VZ7dC#=J4qlwAe00`?;WItDhMK=AP7k42%!iGpi&YNYCt1)Y^bQHs6iA& z6lqedpr}DWQSlW`MD#_(7c?LK=Kr7h=G&P)&$)Y^J$H9!_S}1S_m=ns`hq|p2=Mv;`y%`?%tbgBSCBtDx0<KwT~d%2-*b5HH7{5>?SZwyBiE?N2u)Zz5}=~)s!tA`x&2~0tqA!d4t-u?KFSM z@_^ahs_sTtZwOfac9U$I#01}ZKp&hcyS?-=>J`L4A ziTpdRKsiAhwc2*MY_(gPR!8e^N506vELyO(#X}O!;F+8P^V}?RYXE?P<#LB9fCPc8 z4GIHzJ5M8fFX(ls@b@H}RX=5k=a#MSpZ_V;B|t#BfCWW%RCCo8Vy!j|a!uaTg`@*i zK*=+*LVh{meK!E~<{i?!4Z7Ucy~F=kAQcupi!=65+T>!r54v# z)fsIpexHTfs;Zp#~4QtFNjg{1J3;g9+wl5x+AJse<1nmZYmE)=Y8)7GFW2bZ3 ziRf5PZc^gaWELW|W$I5mK+H+V-T@>PY-3}xb2QnVcS`OKC1+(PWvXQ+WMm_BQghrp zvn;Y>w|OKuIeF(M#AWKSlZqgn!z>nqlbM(f1Y<8zNLKbp zNn+;$2`^qvC0emK8A%z(tIthEy=)7Q!>rcN%!;MO{Tyif!rqppovfLZoM?P9Q{36E zo|%${$ji;V8|%^XrEM4SOBN>}IUAY)yD=rqV6ohsT9Xr;W3GK^#@BLoXH=#G8M#@x zM|bCW@!&g`K5+Yoi`S7mym8 zlwyODZ}cK7Scw_iqx_e5rN5a=D2R(qCYx;AnRGrQE6=*;)KSYSVOI5vS1(2+36J7z zV%yBOPI^tWoh_gyYg-qP$M0wS41g!3hoq+KvP$>{(Kb-~^MU@JUa{6m`&`G(9Z**0 zHW*vw%$o_yz8oD|+8_{90lJ+a1yaXr2|&R`g5 zkqOCzV4w&X00#XD7$*UCAo%L^0Sh$_-nRpRl43puoCa@D-L}nTEw<;x5>qKxdmHM5 z3SNhw(L&NbrGqD4_kmAvOz{M)J>pXvU%qsVf<&x9k6RB>4X`AQAu1nBH?>`r)-K+G zt8!>lG&6M-sM!VFRmrau9sbK{XcGVB-0U9u%NdbO&nm21=a+yJi6W06B!MjQfU8jr zEmvitBg1c1ih?7UsjJ|z>S$HMR~`N3tUCJ3`RhnCQ8XfvoqTx;u4amSf-p4w%eJ(2 z+2JMo7t!C1u!fy@AK7n%Kv;iw>hjb^*x?cODNEQV zV-AA|r$NNLnp@wRL4@-l!o{X=_me?{s{_LA38Dyh{Db>~_Y%T0z2beYJHm^sjqqM; z`7Q7y!e=dFVKthrCORNr4dp-?76gF((Ln4Ux%^+e*78Qa3^|JipoP4?fA>HDA%8|* z*3AYlyHe%y5q>{1st=I2LSbi+_%Dkb{244P75&K*FvSO)2slANk_dm1OxB?OMXDj) z@-G@Xnlk>PrJrr^Uv!LcVg5x%s(1EZ^eYJD{>9+RO`^XTaX7l+FEX1F#eXsNCae1| zW)HDP{$hcoaQZKDX9e>tLBNU1r5ZU1-_~j09Iq1{?x-%uH_HzxD?Gp(%kkIC`mQ16_%-rXW)l9k9KT9@yH1Ypm*ZEdrd#Cr zhpS8-IX+FkN<4%gljC=;GRx%nNjZL%Dz28}XI69cenbowd$?yeDJ1F-^>Sx9^^C&Yxw{<7%o!1 zo12jl67D1mr-E-U2sP;Wtw~?|l0_gCNE^oC{V3^t)0@ty_D-rTg*gqeHHD=T`OC{E z4=IIJeYi#nIYAiit7Yp0$(EbjM6m0CyNSG=$I;v9WeqhNs_N^R)$Un-)cr;d21!Pj z*d$@yeCSg)8hqxCy=+SUG*}q3GQ57zo58Oh(|+2|sv&E+otACK&E^4)p~>_=ECrh* z8Mgux2oOmtvx3Z9H&Rs`(Hkw!L$UFH;|u{zhWtDV%H8i@&M!hz*<{%E+}vCgTM@&? zV%cyU2Qkcb{rv%u!dd{w^$7`YzA}sTcNRM`Fk4`;c_#zo97z_%IG9t(5Z9$w|4XIA z&vE^Y1LX=O$oIOvhnHumQV2qC<2C#C!E(wmW8<134Yp}#taCCtr*j9zDv-svc^|Ce=x52q{0RblPmPyz)(Ick6* zx%ey?Gj7dYUM9PMIVki13L-T|3QuFtBbgh+&K^z6seX#daoCRj&eSZIi?U|I! zb{lG%hQbyH?N19|zqlq?62AHGtnx%M)1TbA8w{%o#$x6Y5SELt$FqZ>bpYE$C1LWT zvnpE0ib0B}9DOu^M2ZiwkvPoTFSt}4>9DBM;-UGQ?s9)@y2#@#HfK#IY;qU+D8YS1 zG1q{VTb6(&)V@JB5ENL4WG|dJwkCs8{XH!i5idh9M{>_qH6|>Iuu>48Nxw8!PjN1@ zXh{%BEN*A4SkE|%eWryz({<$GE(djV@^qa9p1}$*ogF~K;xe3Gf58jFG5IFqsERi) zw90X*Gl}lKI6s}5-*M}QoO*M!F<3uVZYza9Q$-+{DNVZQy?k<3n#$Ip*~K_)6GQC* zKsG4>gm(R1w`KUXjv)K+97#m``XcY`#b9YEcn*xw&;olFP~JRY}5 z*rkACsG`>7CfuEf@{uW#H5bXRF`4ujCpGTBn z2Zztjec9CWb~I`Jmh+a*8LoId3r<`}|8T*!QG%Q+s+o2w zxJ|3gZm^D%)zS-67K(}27F?(6bzCt29-%=0E5ClB1p>PMu9EPqo|0GxAvuJ1wUM7* z-d3V!p4O}?ywPGtSd-=qopw0jgwH3))){9Fgp#git zsU#P0hlftmd7RN6t z0z^H2uSQ3^-#*9N&OoNdfMpH09{{NS_~;K@(+?$Rz51ie8E{#+)a>nbSk?UHxaGwT z>@1}gdne2U8TMj?>1#tk^R2$Vz)XSOIv*)~!1I;6XC!751@o?N6))TKm&<2`;PgvH z7d#NK*KE7WEyp=Mg$gpYUL*)x%iGg`1!f@CtechI5iN#xej#RoXY~|b58gh4p*&IE z(XRuVHou`;gIh)y@rM-NBJ%fiAkBD3_)BZQD%IBCiL&bw3doKQY9{jOnlCMC)|W0Z zmd&<}!?&KF7hp3;`>Fm9+(JJG7C{pt{B9{3_zlM*ca5tnkj#~Ut9wo9B4>2!&~9=4 zP8}s)_hQ!;V#f<#XYQ7{^TNAY#ojoUKkS^*ZBaB-@#<10| zL*@Xk-a}zX*Tu!v%`HKihvUob@O!ZC@!WMZ?zTgf(hchxkK4Cj^5(1|ppl{1T8?Jh zWZkbM=z^3VRc^mE|7lj?=$18Y`Vdz@;C~)oTzut{Un^Z}?E%v_!)}y;(BLkLG)EME zlq238wpkk1v9AqWaid86CDMrD4*B|m@MfFT{zX=MM8`8~%A3!xZ5;Ayw)z=K5j9eH zu1hwstuJI(x1dt_6!N4}XZ2L(*la1jl%~81$7a4%-LWKRJKX}P>(UJ+ZzdOND@~yQ zpm`?b^;dKKc_6Uu2e5-+p*~((RER)6x;^haWG_9>NBfGZ2)M(pJkWf9FjQDMf{Id! zK9Y;O9VfgObX%%o>~)hgho?Mpv=;4hJl2Y>aOqT4q^631 zDK+Pq`~EZCuG4UKn(A39_DWRD{M;AZr=p1WSumNJi0K{fC@4D$!>dHTii3aB4>uzS z?HQ(SySNcCS>*J9S_YIX_v;^-ZQ+j^4Y_fnH-OkSA6_F@rZ|og(&Lo{UZO>_p_Jmk zE)Bh?jKmL<-QEZ<@wsNXW)mT^`R=T z9n$fmSN2is?4b;ECRXOGyFoe6e_$z_ zvn}_qx-sW!XH2ckU22Q5;9#p_#Acy!F!wAny4mw7)7_#X6z=8kDElsu30j^#RkNsv z9=FriXCWaJ3q1-9;-{S*N;r-zd+V;?DdRu@i+v)Dm`(Aw8;y@VPzlN+`)znfE`d_| zO*cIKJzIjFqV%BT(fBgO96j5cjtfYPaLRzwRTz@f>p7(8WF2TKQ|=5z~U~1^rYzFxCpeH=bA2((+--Irx}fiCyE7qY}+|?_=vy zFT{&A=M$@Cao$=1d%XI92*59TtA%&(oW}bD8apC~a4gJ#2AYo)!R~?Rr3duuwj25t z_U<98Iv7?ZaF)dak}hcDG^l={l-@EevgJkP&QU+ukxOhYEZerEVH*iAGbMA)*~k}a z_(1@@PVvqV3g{Cda~OtyvS;G7)x{lpG}sp+8F)*LF;>aLB)o;mt!@iJiPeG=i{v4d zowzh@%`0)6nU=`fim4B_V4e)olzdye8@0V>ZyuZWh!Ca1*ArC|oMfU5P#1BtbbEV3 zR&`>UcDV?d*upKU#_ix_4WKEzK%#cy`PM~`(?Im=%+=L3h*m)K{J|NYCxjsIo$j5`F%R>!&+viUAJS19K$8?+pFA~7Z+B3a zR<>zTyfcEk0aj#R%k(%cMPB#aBgcy%yQEe$I$mn^dTlc$2q;R?4J3lctXc6lhS*S4W=wVWRFDH?k+Uu2Pq!e zWuX_;tN)e;Uzk}S&6ftFgvXxbjDsLgI=8W8-*Ig*GJj}J?{*ng7cm5r$=v1{c&u6L zew?!*&|S*dAadI8NNu}tlu!f)8GQ{O?oG9}^qrE@R=w}7!C9t<smAY;!G&vU}HTf5SkKZ zBK2)Oe33z76m;~bIg@g5A;|=`o$cSFH)REGa;YGEy*0u{#~zt zY~70(@S_3VMx1;9I6ff^jeNBX+tzFDdUa);G?_?<-fQacp70ZyXCIF`9FYOqWn*8SNol%G?>Ul<{ruF?4cEJ`EjyVt2J#sp zaqS5?N)wOr93zUQqz#binE+f_EXDAOP44vM2-oy_U;fOlXjf$xK|%P!_61^_XOpJM z1>=iGMC|Z*=Ge?AL|1YzY_>NIXoJz{l;4mMH@*TDK@je%m^~Gwj`VPuW7~(8+bG+D z-rGXo^wqE5w6n48j%B0ackuA zW`j(IK8x{wdRnZLuXob~ZiHm?U8L+vS}`2C)!`cMH(WXM9GL>O07W<@j?z3^Gnp+r ziTH~+V%r>-2^YkpRo%<3c? zQ-_9ouR`Y|I2VrBQ}%EQaza;_)erOM(+u@3q0Z_{Z2#+o_!wIP^G#$|tQgcWFY~ce z|CK8@=VO2S^?0O}^cXL^2^#_lh!OFaUC=%Gb~iDObUZ;(3VN{i zzk5bAasLp&XsNn_GnFuETHd2!trQ4!-e^7G%5`pJ6og+yA=J5Z?rV`XfJTCq(WiI1 zd0*r7hK#7~CsIkpSMPjO)ZVPp=qf%Fez&($O&w#C7Yv^JJt=Ww|;s z+fWno2^r}*YH7qumq^2`kLX&wVJrW8cz1p;I?edzZlR|AoUh z7+%j<9q-V8_3sG+d!SA!rr(^5_(U=3Zm=KHLr&)-J8e^XK!%HUo`-+4#Kk{#2KW}bMsBR!5Z*t0 ziG>kf;H#vNu5fg^u?bB+opFBJx?Di~?=^lp08~74T({}?J$n@m6)Y(QoBHrxskW!{ zdnHZFHsU7iqncmSxV_d(V-)J|nP3phh&ti4)rSK3M5Nu~ z*ZZdJzDA2Z%J%j_m^rqp4Xnk-47pBoyTl7(Xnt8YU~KoiVi#0NeIab@o7NFa#c8^| zPG~WgdP99o7%l~gyiV*TNWb(}MKF6N?NWZs9==DmH!2E~LvoONj3FGw^Gzdaw$*W^ zZKh(f={xhl8d-pQ1ikxrj9CZ z>w~Byh|T6@#i0BRHN>8IETOGdw9>NEOh?xBu-sDcWT%&I)|167R$0HxVd1VjbXRTJm)(Hwh9Ixx1s~l3tiApi1Fn!} zm|!1Q6QPrNj7k&;9z~p|3&Q8fmT-Qrmqa}b1+T9U4T775l?w?z_xYIRt%5NnT(}r~z z7#&}By}AAU4eft^u2INaV#iBE9zJCRr)}Vkof2#WIbS20PAt--+6){Rjp*rdE6rC^ z)k|sgx6dw{3^!yToqI(ixuHL}O=CZg_=VT+1x;i8Jfm*b$F1!etJtXMuhQ%HOQGau z(OA*HOXz+66|P;ruP1)Zp?xKvw9Pa<@fA2#p+;47gG&fhS1^`oQ(^3%d(sK)QRWcWylX8iL%Ik+G%xlj*340o$TKG zP}swYV2w_vJhlpfo!!pU1-iVyVF}59d(}VvIOjhqBq>_A&GSFF8pN9M7({e3IiFr z^ZImx4{N@4aXG;g(p+PPB%TLhWH<0duSe)Jn^IJawuHyU2OA6|9n&0e2Qb1vDg{;r z-1&zXOtvlvv(o&Ti^%~o$ygT3*(@%k(6#x9t8+Z&D>InCmcCRrWJyurGVSk}fG2l9 zj8i!5Q#OL@T~twz@xt9P^Q8dJ%q2~Wk6uS*zPg@KY1cfrI)osPWcbIM(oR^fmz7t% z{`6T7d4~p~<>iS@RG`7CwIOHwI@YUy^o|skt(W9Rp2A-j35nvn$SI>svzK7N4vLP9 zxqqhSl2lEdZ>Hw7f41SyZKO-1?3vdoAN;;qaU7%GYzpdht&d;G(>#Fa?ADiRB8l=F zx)YW=chB?Z=gVLT?rg2qD4_n?MEHXZ7ajEmZ#yIKm<_V4ywmvofJ;v@JGhkozS45_ z8`?Xvwwjex-s7R3S{4$z#?8RWGN$0?Jct{dZ+(uzJVe!&sGS(adZ(5qXMhslX^(Wg z(Qed+RPh@vXd*$m#`pjd#IFqb4+Lt{t=#S`it#XAS@*OzE>=(s@4l)O=$884+RCz^ z?dY0K-rFevV0Te%gE-aTnpJA+fi;2kQutAeb$Rf`V_Ub?=XI|>7Z^kLGiw$|o`u2W z0jsiyCgyLstOaoT0wUDf|6K3b?c^uxepm+CR8_lY2#Wp-snYiO9TDoSC)&puv1}+m zQ?g~{u*NkbnN*)Z;D0xEMp^U{gg}hXC_kBkV*QSGT=CX>JFc_|RBTFi$q^6;Csf&S zk5%y|y=S&#?uZs{`y8(UZ(&gPIQ4P{(|B$d?{n^uw}M1V9Gzqv&-4B)*E7YY+BC&M zAEbfna9yhzFL-_a8Drl1b&-3t?90TuW90MxSsMogVKsuR=W1WGWW zgqh=+vNn?ciC(iAb(XO1bb6v+Dj}w>*Pwv^L@-J3Wrw~a~PSA!zN}toQW9Nh5 z@s1(wJB3BawUvP-9QVgG4t(fTbMX|%3X<(ogd~#BFodlFq&L0Z>E>m_2aC_)dJ13+ zGSnjUes}fmC&=H-v$NnpyE|IRDxmXLK;0D2u9Pp(73$AU51((- z*%`hZ5Fv9_cy8Yqp<&ryt$VN6PK-eGcs&oHwyqz!mjf&!2{O=#joMeg9>zR9pkCpG znC6}Fl39#Rn6i+;l1t8H$Tmy$Fbtya+|0PHgH$O4KCMn-wzyxkyaui6&0?iwKo+Iv zMOlLggf!q;5peS$X1N53ee}%bQ64%2mxziRdFB#@3B5Zv=Qf2>q_~R?Qj0ZLw+2)Z zIq!|?WOmK2lzo0faVihzpUaGL&d#gQ@v?--=TGh_<2+E^5}L?b(HTSmF*g&45HP$O z=i$V4GSbQ+LBD%lSSY<3fQrDbfLHK8%Ja8r9B>K5?>|=7`Az*MRHFfQ1;f`?NncdC zoq+`z6KtrjJ}Kb4%#m6YATQ&M>qqxIa(6c*KHxWj0P!K*vM%NZbj4oNzh(FFBbP^<7;K_O*FJD^^zxlE24A?$lg{f$#v6bY zh3)ppFf<1GsAnH}InoJVsOaZTHkm)@qH)&oseqc$4lP!sCeGt~@*-mOOq&ysO}r3{ zUeAjg$yNh{t%dZY)^Qsy^}1J%rur^;ifL6H|2pQdJtbf<_o-vYQ;h8p((TsjK7S6W z>L35z10D-|P7mvB>9as`|#5CTIx2Al5|jMV}^D}b;Sn6|`D)+C|Gm8INO)u;tRQ_$3(P8b)Q?e`GVAfz)-PovKjJqkToq1z@chPHOp6ENn81Z^M;~Ohz`$bBqwSB zQuDZ?;@N+l;o;^@C#p7dw9F+07dM%+tzk(|=H_~{shDgw8Wy>0>U=OWtWKGL ze~zEKUTcZ=Er@HL)CQ)Wg{&M#AVH{)&!}CKqd_P8m_rzSfWk# zTAPghn-wsO2`^5D!&{godO!GZ_HuVzh_T%bQQ9#eF>(3$HuL(ByU_x{mw{3%YBY9r z@~~!v$KrK}z7Fj4-p*YX#lfpP)9ctfto6lomx@DMg+kri*Z%oeSR~~JD%0wZxw8Gw zKK|qraK!vcj2ER_tGV%o35T>vTkZbV1D$3ZHM0h4&F_(Dt>LFm#cOh}EW*wn3Tqtn z2N_-SI9-+7^uE!@{l#njVa-PT)l7rwWPE1#yd5D6@}jID?=o!aDSN7Ik_&sSKdCWP z3vQc?ecdw^Gs5sc#$esBG8qG}TmEMFvpdyLW4sr?=f6J)^YJUb9DD8G<^KQ`HJy|x zpONw7*&9m96EWjuu#UC)8Ueis2Y`U{f{Ub0$F=IOBE2++gTzwCzoWB7;X|DI?w6I7~n zhxGdleG4#M$ashm9TBeoa<%Qj@AkVaME_8&E#_xZLQmDRTBuf4Uv3-gjn@&-5b>3H zcmEpax|*Vb5sJ^l7h(5fx}t<(@ThZeo9m5_#4Ol#F%x$CvL_1zDN2BeRba0a3o0b0 zq*wbZ5FNS>g$JCXt{o39xo!9}#zQcd2{Hw95cwce&o6U(+ok2HVH``CA9ib=IF-b3 zzYh9LlFCrwdqrOc4J8tu_QnHjd%O^{tTOw%YM|;yDx!gp5NTly)yfvK8DNq8f) zUNu!bTSLE{Ts%Ckq%~sov{b4>x$&ZUD@*mtFU;5W-w%ZN<`M0l&)SL1hy#g<@u#ld zsl{Yts`7?j7%J{oDbEa&^~oGu(>d6vz0x?0n%cFGZDE@uqI=BM)FPq{LuhYRMK@xk z_~m7oGt+>L!)9_w5=49ryyDfNr_7P-*A$hOfiLt_zh0|T^0Sla$RgzO)1vt@z|Zs7^%8OMUJAi@8E>L1;J5x>BK)J){3!ze?4+i*TZNL^S*P66fT}lvI@bzM{M!Rnm&~na%4r2`%iYS?tk* zaQ9VXk&n<1yW$34ridNN@szzJdC&yqxX@>|a;suc1KMLN-Pu#~RCw6zY8>%rjxbF` zKP6BN`|-wRt7r`s`gGYZ&g`N&C!s=f*_CU_bR{*~zXNUTJAHqzY|l`jg1u>6{RIEl~XLtO`- zk&|3aligs)l=O`kUE^yc=@V-!iIsbnr;Ddi{pm`13eY^iM2G&7tqXU&6GbZ$zZ#}HFr0bY# zBf`1|#3LJy!#s^^a@JSI^*lY5(}eSaIuLL(Q#OY1gmBV?_T;YcZZZ8Mn*i%AKG0#n zMn8?FpFn6ox=izUq@#r;oY?L&2HMSh6d&VRpxmlp97Avu*YOYd$QUhibEl6wnX?bT zOzzGe%(-XA+2zlN`LyVN8VKk{We0mHs+`J3o9sVE0%#|%bQOXW%ePTRkb6=U=g|q> zJM~n}w|0lUcn5xKPGr}pP8cqZnwMqNUo~H&KeQx{)-&KFs+rg6Ig8&8{TG{%==GRv zt`L-oh}gb*sECT(S6EjL)ppis-)9wOz6Ax&^xVbbDluZp45U7D-awf02BiFITb z&X(X_bHOFvHjo0S11vk%aok)6h}=pqf?20!y$UBg^i$VIbSpG;@XkrRhs$#G3nNu? z1e&LERtoc&N_r-djXC?HhlrO<)=GHm%_2|dTo!`@$R^}Lq1dGRrrC)Dk)Bt84%&W9 z2YANyqWKJ3WPDbyLuA5uz18u|2}5I!{rAcF)?xIH$w=zz8-n^7!6xOUW+!U?UPEUK zj7KOK#H&NZ>~!M*t%sR$l<1Sdw2C7o=N|TUUy7sd{1|p*f{O@sB#fh zsb=%%(^g(J@aq{`4b{}Jm6F@RLG*jOA+Tr|Ic8aP*ZsA%ry7 z2gi)mhhEZg4`+csg_&cSDusvQ)j~a_fi8CgI!-&^bQD`{r$o}LQ&9M>>u2B+gX(Ro zpNDP7H5;A9APqsrMU+HAvAbdWwhZiT^tjRM;$uc5mww#iSyrLox0PGCUjJ|kY`|LT z*t3iRACH0hU>fX6YEO0g>pjGTYqNpg&kt|p=)|q9N*`=YzjogWm7sC6TIe5#FM;ye zC|*(XeS;z-4V2ZtCft-``+zLFAThRgq5k1aL{r{s(ZHF9qcB4Pu^LF~{G##Wx-nd% zE#w+X_e%k@;_`Rtz<5L2|uaMLyqEpT|I+UgHP>=3rDy7!F(2a;@O?1=49^(3EDq-`GJO`;}uQ1pL z*riR?cNDRp^p2z-ikty>=KWCtn*BhvAFos$oAK*(Sj9!xIFyrd#B+lvnH2S)v?2mp zsn9g*aVyU98%td_2xPzlPN(8DL&VMzRvGhZ88=EFO!JB}j=C&#dy6gaw&P@VeVGgM zR`3dtm}Y!+A(NDWj9$1vV^VHvZju@pMwJ*^F9A;K_(6W>4+8f_#qSEyOcOwUsOc0AR3H zlLo{|SSaCn?LO|!;qZE-1Ub+u$#Py#t+PTxgQ1?+4shNe%|aLMm@Q!85OT+Z<^Y); z1G@W$uF9isnkKg6!O(tK`ryu{hxQ}+L&3&=fk=&4u%qjnHJU&3*sZ=?q0k4Rb6u%X zp~w;jC3>*+PE!mHy2jO&CAO4>JeqjLoll%dH8?>k3TCNixM$WR2(}6g+1Z~iaam;k zrZqKBE*+=W+wlU}4AvQiYw3kjqfwy(CJG*Gx~5NpXyI#Ja6%QTfx#+_=2sUz^Tc!P zn`E*eZt!dwQvxCHqhiApj}mdsI*Bh{xvJfZyE}#+773MOPYHvS$^WedBpwZJxxYWD z<>sm~z{ouP?e8q>U@i~66>j_9^X;udZJ5oMn7_%{UM^3`xloqI^pfHnLi*JS*R3mm zLqBt&90dQe61GNPxEK9ZT)+=T9oSypZ*-|%Gs{PWh6uQ$-T?IT=7sb#+lMQ)ynw^h zgQdxPE2q^exP*vfK0OXcz7o1B?a=fid-s={sbOD>*7m?$UeJ+>ymxDI;0!_C!)AMQ zeQI=Nwx}|IOm^-nOI0v_$JG?*-DSHrur1@p%ZKgsh1-K36t(zSw{2Hx`S!f7s)p$c zUr;1Qg?hCr>jd>0bw;ID#GkKc+dq+??0Fq$cI>>y8_c2ywh@c^lj`HKMwbbyguT$T zCtteVm<9^Y@jc|@XLrOWR7ls84S^3{dfv7x#nJ|-00(Oj*4c-1s&-Ts84z3gjyXL% zk*%k1pP$3Piz;R}_bGZyM;n0;a*5?4*PoMFe!BZF=~2psl8E^>Xm z(&WJ=*KVW|s%9Qo5ojz$$jBM1X+1mg!5P)CnUF&Yr_4fKRD3w8;*>L~J7Rk*d$~&+ zjCs9(4>m=Zfz~jJuYG|u2Q;#sjak0W(Stsu>5KO!Ne9e9^^epb;^x$5aLim|B@yL6(S$&TYv;cc z!6)OMtV{Hm%6}Bd0(Z6G2E7Y|3gBKL&;0bepNU1?FqcU&vLx$cdbV~v`vXcZk8nRL z)S`ohYG1=n9Ld={EfQb9{$0zW?5oP-2gI=T&9&=iLk9L@cXx+LG}$92BSbVp)Z`-} zeY+T;uJ$WPWtrhKy}KjtW$Z(gd-qp`t{r&$n^MGj53a6V^Lt6?#cr87IQeVdSrLp& zaH5vz-S6-5^U_*UHEXD$(p<8SjU*f;lDClD@=qwla@24Ce5tkOa&5OwQJ&3){sFsu zd^G^ed8yzi-!a?{Ot6D$oTl)5C(xH^Vpj9QDpD*hYGaL57qgn=jN4 z8JBnWry!6DDz<_y<#2=R))yZjHmg~g8h+U?@mD&%rDOz~*rIF{cB$uv^*dx|<1Qzr zwAr5vy*{X}x}Lfv@_E6*Qk3%AXY800rz>I52ErkRcs_kurkNQ5@^2zNnsD6rh-{#Q zs3_uR*zMeKpsRzn7wpIcY}YjcL9{1KcY@U3?5>d|IH;S^e)%&IX%Mi?b0Lul21eGA z-!S?jovrk`)CCqS~QrZM@Vbk)P zxDZm6Le)BIt%!k~7=OJiiq_JEVVKr~qJ)-rr2yuuAAkudYRIA@MfsuLKi~LSv>;6wj``R~9)i(bu0l9JN3YU0W%ox&f|hyv>fuk7l7Z4}Pig3vjd z=FO#7PdDvUIy#Mw&%@ppEX!R@RWSb=e$oG=u}H5o1d)SIC$w~h^F7E6Dz-GQrpa9htrY0^h8P>g zR6~jLZ~hU{(VNHAO=7bcSd(d)V$EPR(`9?RNc5@y*)S-S2z=^oSi@5qc)w;|gH~%JrSUX%qjghL<1EB9Nsj>ePX7%0QD`B3 z<8P^Qb}QuN`ir{MjdqVK%j1AoBePb{!GZj#jo#GVq*p%3LJ;JX^}otwivBX6SFdf7 zwFE}Mc%SoaVZ|y|mM_JkjcI(Z-hrXG}mJ}Di5VeHj9us2m`rwn=R zwg-dRbyOMXNZ)iaQWjY9bgj-U*@iKmjg*$5;yF6r%hm~-QsH!|a$N}G&6?r;jPMPg zl9bO(+t6QJ|5kHRt^gT;ww|jaIR8SU9+!svaG~bS7Msw5r|dUmV6o2Xc{tts$BTkN zrXR7euMi{km}DsqLOQ)3M#174MJx9z9wGi&L9HMaSMXv(Ma9HEF2w3+v)klFo=;ps z-{mbN*u8t=CE+;gVYU||2%d?W*v6R|PqjTYY+-ySM$f699&nMVRRR2Vnj zr_h|`7v-p3$vpAMO>LXgDBA#~Y;>Q!>$if{wx{hG6KxQGmXGe9W_n7|7&i5(F72C4 z8vxQS{^UmLK40-)BJh=em|F1{0v5>A;y~Xr)roE&+pt{nwJ!=Uk`-Wdj_W&W-kSql zHRn8MAreXIoAj@aD%s`Rzh{E4vBDs`ESb|47OoQ@va0Gu~~RV3SmdW-J0X_z(~P<}0cRn#&yAvJn> z8HSSTDUbSs|14d9o^M>wBc4He!GT!9C~!|!+FXeq#Cj|4_JeZ?SHqM~IXn0ZuNo`Z z^|*G}a)5ff%V?uYe~s)3WI;9QfWUO0lHowp*?DKZ+g_;|A7e2eH7JVrf^A7KAcRHp zfHn=Ia4q-iYmzJ!~=w6Rq-7u|uw}}`?Zea2Dy6_HHnDjj&F6bL{Mg%<<0ZXI2;nn|b zC)0RqH5`gX+!?@ffP54B5qp_H?9>H~)SD_OXgPvT$c13=mj5!4wY5u?siNbA1<%rM z#D4_bKZi#~$V$oBCD6i$V?a$3NKMrvJp-a?V-6 zJ9qbk;tyP-Tec)%HW^kSg+f@=^@uR7b73I^LAX{Z?Q`;BY%+R6?9hw01jt@!Lzt$@ zX&%%ZOt#F-3MMHUHVYbTOZ@Qx=X!y9k zmPgM3iK$mY>UZd+sVxT!aUtu6XCkw!(l&nZnSE@kNbL;anhLbHgEb9cKSzeg=(Na;rKGV05WWmNRXxO|PdaFlO=u8?o{5k$l_5I2ju?IM?%5EmrK@>losw+IS zM1}U`m|Fh*Cz|ZZIQio)bwg~y#M`pHLD@39m!y`H!`@R)|))TYSf==Rl<9J1P)8Ul%2wmro|Y$29|y_)tE5EPo9{P8|jEeDHh zK70Nc8n^+~tG{pxS_eKT4*T`+qRP$Ea(9EP7jp6hZNp2jx&R&Ym#ww|$~vgMGJeHH zf#>6gs%H@zD$0861SZA!)7l<4O5t!jjtWJEn9la6d$N^k4v*aN=?;!-w^Xrw{B^7+ zdojL6&NlHG`_lbWLK~?fdd4((pZYES#~QTFRPmVJ5%5~c_LdQh8|d1lnRd=M{(l}* zQckg_%lhd3xb2jHgBDGxSYIrg50ZsNv9Zz_EiLS+Gogsv6OZd!79oyr|xG zI8Q%zccq*XN)yj-F!kT;e@!D?ZDqRx6};}ZX!ey=RCIaiHxSr(Q}0ez;WI?Vxbs+L*#mWOJs zijwDt?We}NkU-|a$Y?YM9F?Fn!@slj^IEM)kyO!0Iq=;yr7QFUk zjLGF=zTg|Wzrd{pjJ6AYJfA9XI;XptFoA$}Q)t0Kl1KY=@yMmMLovO0u8R5 zNsv*_%(cdUGr1~AE$%$jw1t$(&tp3#TJ4T|p8=S3Y-i2yRo--@Msde-WS}LYRO6W-dFg7s)vIH3Hbb0NVJ2?}kAvK_v7j zvoH_t(9{-=7j*UA{)33Z=o{cbl#TV+PFW$5O4aImb9D1iSx$p3YuXq*Fab(1V|Fy0 zG@tr>d{pQzgfnz|e1BAtdsiiB9sYgC5udMLrtW!5QZ z#16gU0za`R7>_x^OeT8Ei5-9%K5%cMcfa^dbg0E@Jv6* z=FzTzF{+_bpC3O)(69G337q+HdIna@Hmn2n6AF}URy8#lDG8aa_ORSJD}wl(r7UdOymL8^5@ws`+LHk}4lpy+ z%uMqFyAsE_sNISn@_wBI^%p0?_Nsv86Q}-UPAro<=0>BjV?~75+9^o2+~s&9INzXq zvliB+h^5@`?<%NA#j00qp3_^PE`djk0i(d}{sj~SI541tv%oOC71A`IQJ61pGEwf* z4(JBRan%dNRc2r)<}(;XH+B}E*}>zQ>wq;D4@776ZSLujjF7McpJ@w_qI!qiB=4oF za+Nx0mE}xN`=S3L2%c*6&O&;%)u$I7NYJ7k^sgoax`aUhetpE{vBcN?36!N$Mv-MW@Q}z_eq7|si`dDP1J55bP$_Wb{lC_ zmEV6Zy58cW?h&+b{OHD$vyjDtM$&d|r6Hiw&m)o_joIG4o>pveOVY+}!uAZ*kfM6dtZ#_pq>h27G5()A7EqH~Kz?OcV`uzt9{KX=YO8HAC*- zgLwu(@lxLGWMAcC>hQ)LhCyRkGfOjMrNJW6P}X?q2Jrl8Hb=_H?_gmlIC|v=m1LOda!g|32I* zwzXE!ct%ba3dL1ZhgvI`R`Ey;2$F#pGv-iZGb^F`rl*LlQ`~905>cx#d zv-+mNKU_^8g`YCD{cDWbm*5NY2^GALlL{dMk`tzG68jZH;r=qQ+^N2Q$rtEtY;U&|Go=F)x zthdxg$0k%B5d^*IirA@>at{wF`zRWEH1Nt)d+Jv9(ZK&*SXk@QhU@?PTNy`vY8-7D zZm)|If0;fyTlxAVDO&kkYfF!&l@B8av947o)Tj!6HoJ)Q3_S|TeSN~;-~Z&$|GpB> z@b{md@qn0j9|1Sn6otef^SBnaN(C(s+kDO{EN}LAQ8LnwACCF$I}@Ym>rL(J7uf_i zwf6A?hUX_8V{Fy#n;Dqcq!vpk_+IJaiG61;&<*O%lm}4_Dj15(LNA4@|Zn$1=SI{8Q zP;54*Z|DiVHc{N6Pw4~x8GfwR7(A}9jo&n}3U9YyFo{wVLXETEofVrwZK`b@lL=Vu zH^#k?79DMucJMheOrs6IU-Sj5Cx3Uk2qVr9KhHvX9XaW|)aDl!KbKUxIe-6k#%gG2 z=rMcf%+fzWFLhPZGx-6{j9NHC$+j2tNrFz!%HKgb#8W5m#`nFmh~#M&h}H-4OcxB+F1qzeM#SPueTSUk$>yw8d@Tw{sn(u!vXN;fA70lS ztJ8zK)_T4CWP`jHmts14HMnx21upC;-X7}CGY=|1S&lR#ESs_4HEQk=b)s>y|K zibt8M;keAU9jn4QYs1Wk!DlQ#L@Q+_!@VwX`9`T%RzC}Ikq#F9hK&+0|6uW1GCS*8 zoNs^S-r@r)q!&8>HkM z-Us}*)C>5Z1FYxcLpge?bSOsAd$mbax(e}i8hx8qoX4~RAsmaGOW);d@%Z$1m!kJs9V*-Gg=ROGup zXD^~-Rl_p(D3yusgqAy~bGaQef9B8V+@GiuA&pfx2w{DtW3H+ibHnZ%VMYon-ROxV zSz1Ex{P3Tj^hD9U-l7~i3w3s87xQH0CwwkTjuCS=wX1fIZdgJJ1nMoO^yns=-A`sU zEEg0oi06hgXo6Hd)V+AgLEP~>vJgqgjLqc-6)mIz9xPtGY3p@9p0}ulCP}B z#P9fy`*MDg{mHS@f6+mg00v*iJEpMp3v;?xJ~T4Qxw7UuFfx2m@tkN)xV*+%FL=nA zN~Jng&^23~P^js;Sa2`?l6B+KejWAqCFl(9TapSGFS`8|Md4nCtt20A_hC&V1!D2D z#*Nx%A3iVO8BeniwxJ!28wJ(=h$bO)McAb~y>H%eu?O%^%z5T(9U9LG)}Us7+57Ze zR0Uq}&B&U11Xrok46?6`v_84pF5iLZ_;2#^Osla<6Q}leF8T!Cp(9gqcG1iokIzM$ zoLwPb_`CIaTKP?CPtmv?{!GtrE#(k z%5I{4dgHgpHRj*+>s#StdHyvf{*^h-I<|^7wHXh-WiVaQrifJh&2|#B}GH0naHqlwy&bV#;2fMLfi_yOeYaIQ{ZaNuoKe>74LD30Dv9oi#by2>b55rFd`WdJ1!q<9uOze&|zH)dKDo{_)z{}&A6NYphb{59Zu8==J70vn^QESdDI^US>?tB)p~esFm&6} zM3GTgBo=CjG_iNR#`oC^>KRg*U4XiPpy-lLW%!4yjXGV-V$m#5qcY!MYX7Oiitm4Z z{n>=s^h@WIx8l#64qt1L^6&4NRLE7`L7E_^>JW`J*B;e~Z?1A`zOXnv6#dQZ{O5qh z&mnmi_T+zTRhtJgF6)G2<%aFB({J?jf%5qZnXF`iJ-@)GlxkzGYilRSNcac6$;RMdRo zCiJ(swwoaMT!{w;bqFUl3xq2;ZS8M}Is1_>{d=Pb>M*{}l|(Z;qb0t|8X6hCk?&QP zteR`39 z1bu5kLRPN7zS-3EeZ~uK!@}!#)(0KLXDixYv{cgZR5RFL)y`K>@Tp@+P`;KI1Qi|qS4Yx^>>!rBA^l|ZqdIrL#exv^hum_X zJfQs$QiAR(86X(}6>&p#SrB;1rR$FNXEb?OiP%ko4!53oG(D&1wLcF%vuyew%0}l5 zK8ZNPTLx9xyIsXP<-uzA8_@#3b&X+b`so3I_VFx0=d~%;R>w+n&xqUZSD=wU({R4V z4F8*Xp|MJ(rjy}3i+w^NXi2fHqz|Lk226a@xZ#K8Wj(^C>d~}YBnB<28T>d`W1(=) z{QaQFPK;voEua@FkXs13uWZ-fXZZ8hQb4v%#yfVyo9E#76%#vqs4*WK zj<@yVahs8IHaT<9N5|0fGfHMh*)CUl)At!<#R1zVt0ZJrbY-WGw`da}pC(LnS9kAH zy$|-k6~RFv?S>Agg}*!-yLLSl+*3(!!~B5el8Cpo%dNpec= zzv#TiyxinD^r>l1Ls{87LoE~vWxS#|^!fDDspWLI*URqmFDRSS@xc}j`^{G_6V045 zF`1eEPv1Y_@q4h};=jfK-!A71*3fA{kT<3gPLFMeIekxMv{QBTj-3ElPs6ezwPm!ZaBW{LJ=WrSWw zsNIdxlJMp^16^{Vf`P*zp#bAtg`;2f%v-xF;-nC6r(DLRg#EGaX^F1>I$|)`cYT?t z9|?AOSWFddpnNVWVwV|8xx{V|4msk3i*|`)KNz0J_zUz*hx=r#{(pdX(+K0107kJf z{!QeD;^@WeZAN;XqSi6dJV3Ij1{p>ji2yCaUD;X%i&s|3YoKdHv+s*eFRg3|c3^oB zWlaMl#dOnc2ZN)sIjF6+^zbv&mD+W4KaG*n0>w9_)yKZO5>3(&YJ6Wox!xODn8`NB z>>1m6jWN+^+MRQ=Wd)#ZtBaQ8dz;Ll8jb}zP$We=%P36+i8^O8qtoe#l#f7i#*j7_ zx4@7E$RNdKjcGMm&zVGcs@Ld&Bs?10*>4O^JpOU81Xlr-!44Os=i8953->cU@pbUH z>&^S;As-XoZ4P^0^EFlZ9Q*`1b#Y8T`dgf+duku{b%NRQ2mGhv1o!WdH=e&GgT?_l z(vu@IQ#o&92@VpEkd7i>Q%PJjXRUjXRs^@O|E78V##YN@O&Dss1g^S#{mN2BU>lxq zZn1dsj&V_s#^58q+KOp9T5Pn_M9kcpoHiM!n6#dZPJGKZ!QJ^| zin@lfs52XJe){w&H>ktBbQj%ro7G>ZlP@mL7~1zweRw*#M{hF6Hj7qs^TAEQsA&J! zM>jhsQ#+p@hTT+K*gbnqc^JV*=JBC|I|6=)i(=A;w+d75MVaI;Kk)~DO!@KPB#nv2 zvwB2DBlgu1&4Ivrg5Sz}toX|zfw%4Pr@cM@F&sgmcqRuWae7VH>p9|-??P{6|2=@GhX#ikfP71sYV1=`l?U}`Xc249*y*eIYslPhiX%ty~C$j@|nOg6F`7a2KPlv@yi-QRz3(-qJS=zur=koe0&X&$rq zHi2)b9KUk7#AKKX>2LY5mJ@4J6!)tv#2$)3DH5nA?sl@mZ2JBrA z8NVWdOyFh(TKXdGKL~UzPlzltCD8(O~y%u}kZCf}TeUE1gSiC}Tq@LLqULtoCs?7_{4Tw#;-R zf^R|rGe@|xJ2{@UXBhB%sbfir`Ky_>QUeY4|$sYcc13g?x)! z!1gXgd>z%)8ihi)%17Mwb2Z7>CZ-92yI5ol)~2=n$=H4`&ke0%0A2rSg@~sO27~?X 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%0D8#q-=5UQi8PI>= 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 Qxv4ZpV%u@ej%Y3Z2cowN`2YX_ literal 0 HcmV?d00001 diff --git a/contrib/kolibri-libc/bin/kpack b/contrib/kolibri-libc/bin/kpack new file mode 100644 index 0000000000000000000000000000000000000000..ed88722ffdf1c32b7dbc30d86317a85a7245c307 GIT binary patch literal 25532 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 JL1oePzX2stpd$bP literal 0 HcmV?d00001 diff --git a/contrib/kolibri-libc/linuxtools/kgcc b/contrib/kolibri-libc/linuxtools/kgcc new file mode 100644 index 0000000000..2c8f726d05 --- /dev/null +++ b/contrib/kolibri-libc/linuxtools/kgcc @@ -0,0 +1,24 @@ +#!/bin/bash + +# Copyright maxcodehack, 2021 +# gcc options for build for KolibriOS + +# We start w/o param? +if [ -z "$*" ] +then + echo -e "\033[1;31mfatal error: \033[0mno input files" + exit 1 +fi + +# KLIBC variable exists? +if [ -z "$KLIBC" ] +then + echo -e "\033[1;31mfatal error: \033[0mKLIBC variable not set" + exit 1 +fi + +# GCC Flags for KolibriOS +FLAGS="-c -m32 -nostdinc -fno-common -fno-builtin -fno-leading-underscore -fno-pie -fno-stack-protector -fno-stack-check -mpreferred-stack-boundary=2" + +# And, execute gcc: +gcc $FLAGS -I $KLIBC/source/include $* diff --git a/contrib/kolibri-libc/linuxtools/kld b/contrib/kolibri-libc/linuxtools/kld new file mode 100644 index 0000000000..ceb30dde60 --- /dev/null +++ b/contrib/kolibri-libc/linuxtools/kld @@ -0,0 +1,24 @@ +#!/bin/bash + +# Copyright maxcodehack, 2021 +# ld options for build for KolibriOS + +# We start w/o param? +if [ -z "$*" ] +then + echo "kld: no input files" + exit 1 +fi + +# KLIBC variable exists? +if [ -z "$KLIBC" ] +then + echo "kld: KLIBC variable not set" + exit 1 +fi + +# LD Flags for KolibriOS +FLAGS="-m elf_i386 -nostdlib" + +# And, execute ld: +ld $FLAGS -L $KLIBC/bin/lib -T $KLIBC/tests/static.lds $KLIBC/bin/lib/crt0.o $* diff --git a/contrib/kolibri-libc/source/Makefile b/contrib/kolibri-libc/source/Makefile new file mode 100644 index 0000000000..21b42d51ac --- /dev/null +++ b/contrib/kolibri-libc/source/Makefile @@ -0,0 +1,55 @@ +AR = ar -rcs +CLINK = ../bin/clink +KPACK = ../bin/kpack + +INCLUDE = include +LIB_DIR = ../bin/lib + +LIBC.A = $(LIB_DIR)/libc.a +LIBC.OBJ = $(LIB_DIR)/libc.obj + +CFLAGS = -I$(INCLUDE) -m32 -nostdinc -nostdlib -DGNUC -Os -fno-common -fno-builtin -fno-leading-underscore -fno-pie +DIRS := string stdlib stdio sys math ctype exports setjmp + +cfiles := $(foreach dir,$(DIRS),$(patsubst %.c, %.o, $(wildcard $(dir)/*.c))) +asmfiles := $(foreach dir,$(DIRS),$(patsubst %.s, %.o, $(wildcard $(dir)/*.s))) +.PHONY: clean all + +ifdef windir +cfiles := $(subst /,\,$(cfiles)) +asmfiles := $(subst /,\,$(asmfiles)) +LIB_DIR := $(subst /,\,$(LIB_DIR)) +LIBNAME := $(subst /,\,$(LIBNAME)) +RM = del /F /Q +MKDIR_P = md +else +RM = rm -rf +MKDIR_P = mkdir -p +endif + +all: $(cfiles) $(asmfiles) $(LIB_DIR) $(LIBC.A) + fasm crt/crt0.asm $(LIB_DIR)/crt0.o + +$(LIBC.A): $(cfiles) $(asmfiles) + $(AR) $(LIBC.A) $^ + +$(LIB_DIR): + $(MKDIR_P) $(LIB_DIR) + +$(asmfiles): + $(CC) -E -x c -nostdinc -Imath $*.s > $*.sx + $(AS) --32 $*.sx -o $*.o + $(RM) $*.sx + +clean: + $(RM) $(cfiles) $(asmfiles) + $(RM) $(LIBNAME) + +shared: $(cfiles) $(asmfiles) + $(CLINK) $^ + $(KPACK) a.out.obj + mv a.out.obj $(LIBC.OBJ) + +test: + make -C ../test -f Makefile.tcc + kex ../test/test diff --git a/contrib/kolibri-libc/source/Makefile.shared b/contrib/kolibri-libc/source/Makefile.shared new file mode 100644 index 0000000000..e558733c2e --- /dev/null +++ b/contrib/kolibri-libc/source/Makefile.shared @@ -0,0 +1,3 @@ +all: + $(MAKE) clean + env CC=kos32-gcc CPP=kos32-cpp AS=kos32-as $(MAKE) shared \ No newline at end of file diff --git a/contrib/kolibri-libc/source/crt/crt0.asm b/contrib/kolibri-libc/source/crt/crt0.asm new file mode 100644 index 0000000000..90a41bd54a --- /dev/null +++ b/contrib/kolibri-libc/source/crt/crt0.asm @@ -0,0 +1,220 @@ +format ELF +section '.text' executable +public start +public start as '_start' +;extrn mf_init +extrn main +;include 'debug2.inc' +include 'inc/proc32.inc' +include 'inc/macros.inc' +include 'inc/dll.inc' +__DEBUG__=0 + +;start_: +virtual at 0 + db 'MENUET01' ; 1. Magic number (8 bytes) + dd 0x01 ; 2. Version of executable file + dd start ; 3. Start address +imgsz dd 0x0 ; 4. Size of image + dd 0x100000 ; 5. Size of needed memory + dd 0x100000 ; 6. Pointer to stack +hparams dd 0x0 ; 7. Pointer to program arguments +hpath dd 0x0 ; 8. Pointer to program path +end virtual + +start: +;DEBUGF 'Start programm\n' + ;init heap of memory + mov eax,68 + mov ebx,11 + int 0x40 + + mov [argc], 0 + mov eax, [hparams] + test eax, eax + jz .without_path + mov eax, path + cmp word ptr eax, 32fh ; '/#3' UTF8 + jne .without_path + mov word ptr eax, 12fh ; '/#1' fix to CP866 +.without_path: + mov esi, eax + call push_param +; retrieving parameters + mov esi, params + xor edx, edx ; dl - èä¸ò ïàðàìåòð(1) èëè ðàçäåëèòåëè(0) + ; dh - ñèìâîë ñ êîòîðîãî íà÷àëñÿ ïàðàìåòð (1 êàâû÷êè, 0 îñòàëüíîå) + mov ecx, 1 ; cl = 1 + ; ch = 0 ïðîñòî íîëü +.parse: + lodsb + test al, al + jz .run + test dl, dl + jnz .findendparam + ;{åñëè áûë ðàçäåëèòåëü + cmp al, ' ' + jz .parse ;çàãðóæåí ïðîáåë, ãðóçèì ñëåäóþùèé ñèìâîë + mov dl, cl ;íà÷èíàåòñÿ ïàðàìåòð + cmp al, '"' + jz @f ;çàãðóæåíû êàâû÷êè + mov dh, ch ;ïàðàìåòð áåç êàâû÷åê + dec esi + call push_param + inc esi + jmp .parse + + @@: + mov dh, cl ;ïàðàìåòð â êàâû÷åêàõ + call push_param ;åñëè íå ïðîáåë çíà÷èò íà÷èíàåòñÿ êàêîé òî ïàðàìåòð + jmp .parse ;åñëè áûë ðàçäåëèòåëü} + +.findendparam: + test dh, dh + jz @f ; áåç êàâû÷åê + cmp al, '"' + jz .clear + jmp .parse + @@: + cmp al, ' ' + jnz .parse + +.clear: + lea ebx, [esi - 1] + mov [ebx], ch + mov dl, ch + jmp .parse + +.run: + call load_imports + push argv + push [argc] + call main +.exit: + xor eax,eax + dec eax + int 0x40 + dd -1 +.crash: + jmp .exit +;============================ +push_param: +;============================ +;parameters +; esi - pointer +;description +; procedure increase argc +; and add pointer to array argv +; procedure changes ebx + mov ebx, [argc] + cmp ebx, max_parameters + jae .dont_add + mov [argv+4*ebx], esi + inc [argc] +.dont_add: + ret +;============================== + +;============================== +load_imports: +;============================== +;parameters +; none +;description +; imports must be located at end of image (but before BSS sections) +; the address of end of imports (next byte after imports) is located in imgsz +; look at each import from that address up to illegal import +; legal import is such that: +; first pointer points to procedure name +; and is smaller than imgsz +; second pointer points lo library name, starting with 0x55, 0xAA +; and is smaller than imgsz +; each library should be initialized as appropriate, once +; so as library is initialized, its name will be replaced 0x00 + mov ebx, [imgsz] ; byte after imports +.handle_next_import: + sub ebx, 4 ; ebx = pointer to pointer to library name + mov esi, dword[ebx] ; esi = pointer to library name + push ebx + push esi + call load_library ; eax = pointer to library exports + pop esi + pop ebx + test eax, eax + jz .done + sub ebx, 4 ; ebx = pointer to pointer to symbol name + push ebx + stdcall dll.GetProcAddress, eax, dword[ebx] + pop ebx + test eax, eax + jz .fail + mov dword[ebx], eax + jmp .handle_next_import +.done: + ret +.fail: + ret +;============================== + +;============================== +load_library: +;============================== +;parameters +; ebx: library name address +;description +; each library should be initialized as appropriate, once +; so as library is initialized, its name will be replaced 0x00 +; and 4 next bytes will be set to address of library + ; first two bytes of library name must be 0x55, 0xAA (is like a magic) + cld ; move esi further, not back + cmp esi, [imgsz] + ja .fail + lodsb ; al = first byte of library name + cmp al, 0x55 + jne .fail + lodsb ; al = second byte of library name + cmp al, 0xAA + jne .fail + lodsb ; al = third byte of library name (0x00 if the library is already loaded) + test al, al + jnz .load + lodsd ; if we here, then third byte is 0x00 => address of library is in next 4 bytes + ; now eax contains address of library + ret +.load: + dec esi ; we checked on 0 before, let's go back + mov eax, 68 + mov ebx, 19 + mov ecx, esi + int 0x40 ; eax = address of exports + mov byte[esi], 0 ; library is loaded, let's place 0 in first byte of name + mov [esi + 1], eax ; now next 4 bytes of library name are replaced by address of library + ; call lib_init + stdcall dll.GetProcAddress, eax, lib_init_str ; eax = address of lib_init + test eax, eax + jz .ret + stdcall dll.Init, eax +.ret: + mov eax, [esi + 1] ; put address of library into eax + ret +.fail: + mov eax, 0 + ret +;============================== + +lib_init_str db 'lib_init', 0 + +public argc as '__argc' +public params as '__argv' +public path as '__path' + +section '.bss' +buf_len = 0x400 +max_parameters=0x20 +argc rd 1 +argv rd max_parameters +path rb buf_len +params rb buf_len + +;section '.data' +;include_debug_strings ; ALWAYS present in data section diff --git a/contrib/kolibri-libc/source/crt/inc/config.inc b/contrib/kolibri-libc/source/crt/inc/config.inc new file mode 100644 index 0000000000..dc70bf9760 --- /dev/null +++ b/contrib/kolibri-libc/source/crt/inc/config.inc @@ -0,0 +1 @@ +__CPU_type fix p5 diff --git a/contrib/kolibri-libc/source/crt/inc/dll.inc b/contrib/kolibri-libc/source/crt/inc/dll.inc new file mode 100644 index 0000000000..151c374e7b --- /dev/null +++ b/contrib/kolibri-libc/source/crt/inc/dll.inc @@ -0,0 +1,158 @@ +;----------------------------------------------------------------------------- +; load one or more DLL file in COFF format and try to import functions by our list +; if first function in import list begins with 'lib_', call it as DLL initialization +; return eax = 1 as fail, if anyone of .obj file not found in /sys/lib +; return 0 if all fine, but 0 not garantees in succesfull import - see dll.Link comment +; dirties all registers! eax, ebx, ecx, edx, esi, edi +proc dll.Load, import_table:dword + mov esi, [import_table] + .next_lib: + mov edx, [esi] + or edx, edx + jz .exit + push esi + mov esi, [esi + 4] + mov edi, s_libdir.fname + @@: + lodsb + stosb + or al, al + jnz @b + mcall 68, 19, s_libdir + or eax, eax + jz .fail + stdcall dll.Link, eax, edx + push eax + mov eax, [eax] + cmp dword[eax], 'lib_' + pop eax + jnz @f + stdcall dll.Init, [eax + 4] + @@: + pop esi + add esi, 8 + jmp .next_lib + .exit: + xor eax, eax + ret + .fail: + add esp, 4 + xor eax, eax + inc eax + ret +endp +;----------------------------------------------------------------------------- +; scans dll export table for a functions we want to import +; break scan on first unresolved import +; no return value +proc dll.Link, exp:dword, imp:dword + push eax + mov esi, [imp] + test esi, esi + jz .done + .next: + lodsd + test eax, eax + jz .done + stdcall dll.GetProcAddress, [exp], eax + or eax, eax + jz @f + mov [esi - 4], eax + jmp .next + @@: + mov dword[esp], 0 + .done: + pop eax + ret +endp +;----------------------------------------------------------------------------- +; calls lib_init with predefined parameters +; no return value +proc dll.Init, dllentry:dword + pushad + mov eax, mem.Alloc + mov ebx, mem.Free + mov ecx, mem.ReAlloc + mov edx, dll.Load + stdcall [dllentry] + popad + ret +endp +;----------------------------------------------------------------------------- +; scans export table for a sz_name function +; returns in eax function address or 0 if not found +proc dll.GetProcAddress, exp:dword, sz_name:dword + mov edx, [exp] + xor eax, eax + .next: + or edx, edx + jz .end + cmp dword[edx], 0 + jz .end + stdcall strcmp, [edx], [sz_name] + test eax, eax + jz .ok + add edx, 8 + jmp .next + .ok: + mov eax, [edx + 4] + .end: + cmp eax, -1 + jnz @f + xor eax, eax + @@: + ret +endp +;----------------------------------------------------------------------------- +; compares strings +; returns eax = 0 if equal, -1 otherwise +proc strcmp, str1:dword, str2:dword + push esi edi + mov esi, [str1] + mov edi, [str2] + xor eax, eax + @@: + lodsb + scasb + jne .fail + or al, al + jnz @b + jmp .ok + .fail: + or eax, -1 + .ok: + pop edi esi + ret +endp +;----------------------------------------------------------------------------- +if defined dll.Load +s_libdir: + db '/sys/lib/' + .fname rb 32 +end if +;----------------------------------------------------------------------------- +proc mem.Alloc, size + push ebx ecx + mov ecx, [size] + mcall 68, 12 + pop ecx ebx + ret +endp +;----------------------------------------------------------------------------- +proc mem.ReAlloc, mptr, size + push ebx ecx edx + mov ecx, [size] + mov edx, [mptr] + mcall 68, 20 + pop edx ecx ebx + ret +endp +;----------------------------------------------------------------------------- +proc mem.Free, mptr + push ebx ecx + mov ecx,[mptr] + mcall 68, 13 + pop ecx ebx + ret +endp +;----------------------------------------------------------------------------- diff --git a/contrib/kolibri-libc/source/crt/inc/macros.inc b/contrib/kolibri-libc/source/crt/inc/macros.inc new file mode 100644 index 0000000000..feb72aebe7 --- /dev/null +++ b/contrib/kolibri-libc/source/crt/inc/macros.inc @@ -0,0 +1,597 @@ +@^ fix macro comment { +^@ fix } + +; -------------------------- +macro library [lname,fname] +{ + forward + dd __#lname#_library_table__,__#lname#_library_name__ + common + dd 0 + forward + align 4 + __#lname#_library_name__ db fname,0 +} + +macro import lname,[name,sname] +{ + common + align 4 + __#lname#_library_table__: + forward + if used name + name dd __#name#_import_name__ + end if + common + dd 0 + forward + if used name + align 4 + __#name#_import_name__ db sname,0 + end if +} + +macro export [name,sname] +{ + forward + dd __#name#_export_name__,name + common + dd 0 + forward + align 4 + __#name#_export_name__ db sname,0 +} +; ------------------------- + +macro m2m dest,src { + push src + pop dest +} + + +macro iglobal { + IGlobals equ IGlobals, + macro __IGlobalBlock { } + +macro uglobal { + UGlobals equ UGlobals, + macro __UGlobalBlock { } + +endg fix } ; Use endg for ending iglobal and uglobal blocks. + + +macro IncludeIGlobals{ + macro IGlobals dummy,[n] \{ __IGlobalBlock + purge __IGlobalBlock \} + match I, IGlobals \{ I \} } + +macro IncludeUGlobals{ + macro UGlobals dummy,[n] \{ + \common + \local begin, size + begin = $ + virtual at $ + \forward + __UGlobalBlock + purge __UGlobalBlock + \common + size = $ - begin + end virtual + rb size + \} + match U, UGlobals \{ U \} } + +uglobal +endg + +iglobal +endg + + +; new application structure +macro meos_app_start + { + use32 + org 0x0 + + db 'MENUET01' + dd 0x01 + dd __start + dd __end + dd __memory + dd __stack + + if used __params & ~defined __params + dd __params + else + dd 0x0 + end if + + dd 0x0 + } +MEOS_APP_START fix meos_app_start +KOS_APP_START fix meos_app_start + +macro code + { + __start: + } +CODE fix code + +macro data + { + __data: + IncludeIGlobals + } +DATA fix data + +macro udata + { + if used __params & ~defined __params + __params: + db 0 + __end: + rb 255 + else + __end: + end if + __udata: + IncludeUGlobals + } +UDATA fix udata + +macro meos_app_end + { + align 32 + rb 2048 + __stack: + __memory: + } +MEOS_APP_END fix meos_app_end +KOS_APP_END fix meos_app_end + + +; macro for defining multiline text data +struc mstr [sstring] + { + forward + local ssize + virtual at 0 + db sstring + ssize = $ + end virtual + dd ssize + db sstring + common + dd -1 + } + +; macro for defining multiline text data +struc mls [sstring] + { + forward + local ssize + virtual at 0 + db sstring ; mod + ssize = $ + end virtual + db ssize + db sstring + common + db -1 ; mod + } + + + +; strings +macro sz name,[data] { ; [mike.dld] + common + if used name + name db data + .size = $-name + end if +} + +macro szZ name,[data] { ; same as sz, but for zero terminated string [dunkaist] + common + if used name + name db data,0 + .size = $-name-1 + end if +} +sz0 fix szZ + +macro lsz name,[lng,data] { ; [mike.dld] + common + if used name + label name + forward + if lang eq lng + db data + end if + common + .size = $-name + end if +} + +macro szc name,elsz,[data] { ; [mike.dld] + common + local s,m + m = 0 + if used name + label name + forward + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + common + .size = $-name + .maxl = m + end if +} + +macro lszc name,elsz,[lng,data] { ; [mike.dld] + common + local s,m,c + m = 0 + c = 0 + if used name + label name + forward + if lang eq lng + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + c = c+1 + end if + common + .size = $-name + .maxl = m + .count = c + end if +} + + +; easy system call macro +macro mpack dest, hsrc, lsrc +{ + if (hsrc eqtype 0) & (lsrc eqtype 0) + mov dest, (hsrc) shl 16 + lsrc + else + if (hsrc eqtype 0) & (~lsrc eqtype 0) + mov dest, (hsrc) shl 16 + add dest, lsrc + else + mov dest, hsrc + shl dest, 16 + add dest, lsrc + end if + end if +} + +macro __mov reg,a,b { ; mike.dld + if (~a eq)&(~b eq) + mpack reg,a,b + else if (~a eq)&(b eq) + mov reg,a + end if +} + + +include 'config.inc' +;__CPU_type equ p5 +SYSENTER_VAR equ 0 + +macro mcall a,b,c,d,e,f,g { ; [mike.dld], [Ghost] + local ..ret_point + __mov eax,a + __mov ebx,b + __mov ecx,c + __mov edx,d + __mov esi,e + __mov edi,f + __mov ebp,g + + if __CPU_type eq p5 + int 0x40 + else + if __CPU_type eq p6 + push ebp + mov ebp, esp + push ..ret_point ; it may be 2 or 5 byte + sysenter + ..ret_point: + pop edx + pop ecx + + else + if __CPU_type eq k6 + push ecx + syscall + pop ecx + else + display 'ERROR : unknown CPU type (set to p5)', 10, 13 + __CPU_type equ p5 + int 0x40 + end if + end if + end if +} + + +; ------------------------- +macro __header a,[b] { + common + use32 + org 0 + db 'MENUET',a + forward + if b eq + dd 0 + else + dd b + end if +} + +macro __section name { + align 16 + label name +} + +macro __func name { + if ~used name + display 'FUNC NOT USED: ',`name,13,10 + else + align 4 + name: + ;diff16 `name,0,name +} + +macro endf { end if } + +macro diff16 title,l1,l2 + { + local s,d + s = l2-l1 + display title,': 0x' + repeat 8 + d = '0' + s shr ((8-%) shl 2) and $0F + if d > '9' + d = d + 'A'-'9'-1 + end if + display d + end repeat + display 13,10 + } + +macro diff10 title,l1,l2 + { + local s,d,z,m + s = l2-l1 + z = 0 + m = 1000000000 + display title,': ' + repeat 10 + d = '0' + s / m + s = s - (s/m)*m + m = m / 10 + if d <> '0' + z = 1 + end if + if z <> 0 + display d + end if + end repeat + display 13,10 + } + + +macro movi arg1,arg2 +{ +if (arg1 in ) & ((arg2 eqtype 0) | (arg2 eqtype '0')) + if (arg2) = 0 + xor arg1,arg1 + else if (arg2) = 1 + xor arg1,arg1 + inc arg1 + else if (arg2) = -1 + or arg1,-1 + else if (arg2) >= -128 & (arg2) <= 127 + push arg2 + pop arg1 + else + mov arg1,arg2 + end if +else + mov arg1,arg2 +end if +} + + +macro RGB [a] { + common + match (r=,g=,b),a \{ + \dd ((r) shl 16) or ((g) shl 8) or (b) + \} +} + + +struc POINT _t,_dx,_dy { + .x _t _dx + .y _t _dy +} + +; structure definition helper +include 'struct.inc' + +struct RECT + left dd ? + top dd ? + right dd ? + bottom dd ? +ends + +struct BOX + left dd ? + top dd ? + width dd ? + height dd ? +ends + +; structures used in KolibriOS +struct process_information + cpu_usage dd ? ; +0 + window_stack_position dw ? ; +4 + window_stack_value dw ? ; +6 + dw ? ; +8 + process_name rb 12 ; +10 + memory_start dd ? ; +22 + used_memory dd ? ; +26 + PID dd ? ; +30 + box BOX ; +34 + slot_state dw ? ; +50 + dw ? ; +52 + client_box BOX ; +54 + wnd_state db ? ; +70 + rb (1024-71) +ends + +struct system_colors + frame dd ? ;nonset1 + grab dd ? ;nonset2 + work_dark dd ? + work_light dd ? + grab_text dd ? ;window_title + work dd ? + work_button dd ? + work_button_text dd ? + work_text dd ? + work_graph dd ? +ends + +struct FILEDATE + Second db ? + Minute db ? + Hour db ? + db ? + Day db ? + Month db ? + Year dw ? +ends + +struct FILEINFO + Attributes dd ? + IsUnicode db ? + db 3 dup(?) + DateCreate FILEDATE + DateAccess FILEDATE + DateModify FILEDATE + Size dq ? +ends + +cmove fix cmovz + +macro cmovz reg1, reg2 { + + local ..jumpaddr + +if __CPU_type eq p5 ; CMOVcc isnt supported on the P5 + jnz ..jumpaddr + mov reg1, reg2 + ..jumpaddr: +else + cmovz reg1, reg2 +end if + +} + +cmovne fix cmovnz + +macro cmovnz reg1, reg2 { + + local ..jumpaddr + +if __CPU_type eq p5 ; CMOVcc isnt supported on the P5 + jz ..jumpaddr + mov reg1, reg2 + ..jumpaddr: +else + cmovnz reg1, reg2 +end if + +} + +macro cmovg reg1, reg2 { + + local ..jumpaddr + +if __CPU_type eq p5 ; CMOVcc isnt supported on the P5 + jle ..jumpaddr + mov reg1, reg2 + ..jumpaddr: +else + cmovg reg1, reg2 +end if +} + +macro cmovl reg1, reg2 { + + local ..jumpaddr + +if __CPU_type eq p5 ; CMOVcc isnt supported on the P5 + jge ..jumpaddr + mov reg1, reg2 + ..jumpaddr: +else + cmovl reg1, reg2 +end if +} + +; replaces /programs/cmp.inc +irp cond, e, ne, g, ng, l, nl, ge, le { + macro cmp#cond a, b, c\{ + cmp a, b + j#cond c + \} +} + +; constants + +; events +EV_IDLE = 0 +EV_TIMER = 0 +EV_REDRAW = 1 +EV_KEY = 2 +EV_BUTTON = 3 +EV_EXIT = 4 +EV_BACKGROUND = 5 +EV_MOUSE = 6 +EV_IPC = 7 +EV_STACK = 8 + +; event mask bits for function 40 +EVM_REDRAW = 1b +EVM_KEY = 10b +EVM_BUTTON = 100b +EVM_EXIT = 1000b +EVM_BACKGROUND = 10000b +EVM_MOUSE = 100000b +EVM_IPC = 1000000b +EVM_STACK = 10000000b +EVM_DEBUG = 100000000b +EVM_STACK2 = 1000000000b + +EVM_MOUSE_FILTER = 0x80000000 +EVM_CURSOR_FILTER = 0x40000000 diff --git a/contrib/kolibri-libc/source/crt/inc/proc32.inc b/contrib/kolibri-libc/source/crt/inc/proc32.inc new file mode 100644 index 0000000000..762826cbbb --- /dev/null +++ b/contrib/kolibri-libc/source/crt/inc/proc32.inc @@ -0,0 +1,301 @@ + +; Macroinstructions for defining and calling procedures + +macro stdcall proc,[arg] ; directly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call proc } + +macro invoke proc,[arg] ; indirectly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call [proc] } + +macro ccall proc,[arg] ; directly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call proc + if size@ccall + add esp,size@ccall + end if } + +macro cinvoke proc,[arg] ; indirectly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call [proc] + if size@ccall + add esp,size@ccall + end if } + +macro proc [args] ; define procedure + { common + match name params, args> + \{ define@proc name, \{ prologue name,flag,parmbytes,localbytes,reglist \} + virtual at parmbase@proc + match =,args, params \{ defargs@proc args \} + match =args@proc args, args@proc params \{ defargs@proc args \} + parmbytes = $-(parmbase@proc) + end virtual + name # % = parmbytes/4 + all@vars equ + current = 0 + macro locals + \{ virtual at localbase@proc+current + macro label def \\{ match . type,def> \\\{ deflocal@proc .,label, \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \} + macro finish@proc + \{ localbytes = current + match close:reglist, close@proc: \\{ close name,flag,parmbytes,localbytes,reglist \\} + end if \} } + +macro defargs@proc [arg] + { common + if ~ arg eq + forward + local ..arg,current@arg + match argname:type, arg + \{ current@arg equ argname + label ..arg type + argname equ ..arg + if qqword eq type + dd ?,?,?,?,?,?,?,? + else if dqword eq type + dd ?,?,?,? + else if tbyte eq type + dd ?,?,? + else if qword eq type | pword eq type + dd ?,? + else + dd ? + end if \} + match =current@arg,current@arg + \{ current@arg equ arg + arg equ ..arg + ..arg dd ? \} + common + args@proc equ current@arg + forward + restore current@arg + common + end if } + +macro deflocal@proc name,def,[val] { name def val } + +macro deflocal@proc name,def,[val] + { common + match vars, all@vars \{ all@vars equ all@vars, \} + all@vars equ all@vars name + forward + local ..var,..tmp + ..var def val + match =?, val \{ ..tmp equ \} + match any =?, val \{ ..tmp equ \} + match any (=?), val \{ ..tmp equ \} + match =label, def \{ ..tmp equ \} + match tmp : value, ..tmp : val + \{ tmp: end virtual + initlocal@proc ..var,def value + virtual at tmp\} + common + match first rest, ..var, \{ name equ first \} } + +struc label type { label . type } + +macro initlocal@proc name,def + { virtual at name + def + size@initlocal = $ - name + end virtual + position@initlocal = 0 + while size@initlocal > position@initlocal + virtual at name + def + if size@initlocal - position@initlocal < 2 + current@initlocal = 1 + load byte@initlocal byte from name+position@initlocal + else if size@initlocal - position@initlocal < 4 + current@initlocal = 2 + load word@initlocal word from name+position@initlocal + else + current@initlocal = 4 + load dword@initlocal dword from name+position@initlocal + end if + end virtual + if current@initlocal = 1 + mov byte [name+position@initlocal],byte@initlocal + else if current@initlocal = 2 + mov word [name+position@initlocal],word@initlocal + else + mov dword [name+position@initlocal],dword@initlocal + end if + position@initlocal = position@initlocal + current@initlocal + end while } + +macro endp + { purge ret,locals,endl + finish@proc + purge finish@proc + restore regs@proc + match all,args@proc \{ restore all \} + restore args@proc + match all,all@vars \{ restore all \} } + +macro local [var] + { common + locals + forward done@local equ + match varname[count]:vartype, var + \{ match =BYTE, vartype \\{ varname rb count + restore done@local \\} + match =WORD, vartype \\{ varname rw count + restore done@local \\} + match =DWORD, vartype \\{ varname rd count + restore done@local \\} + match =PWORD, vartype \\{ varname rp count + restore done@local \\} + match =QWORD, vartype \\{ varname rq count + restore done@local \\} + match =TBYTE, vartype \\{ varname rt count + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + rq count*2 + restore done@local \\} + match =QQWORD, vartype \\{ label varname qqword + rq count*4 + restore done@local \\} + match =XWORD, vartype \\{ label varname xword + rq count*2 + restore done@local \\} + match =YWORD, vartype \\{ label varname yword + rq count*4 + restore done@local \\} + match , done@local \\{ virtual + varname vartype + end virtual + rb count*sizeof.\#vartype + restore done@local \\} \} + match :varname:vartype, done@local:var + \{ match =BYTE, vartype \\{ varname db ? + restore done@local \\} + match =WORD, vartype \\{ varname dw ? + restore done@local \\} + match =DWORD, vartype \\{ varname dd ? + restore done@local \\} + match =PWORD, vartype \\{ varname dp ? + restore done@local \\} + match =QWORD, vartype \\{ varname dq ? + restore done@local \\} + match =TBYTE, vartype \\{ varname dt ? + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + dq ?,? + restore done@local \\} + match =QQWORD, vartype \\{ label varname qqword + dq ?,?,?,? + restore done@local \\} + match =XWORD, vartype \\{ label varname xword + dq ?,? + restore done@local \\} + match =YWORD, vartype \\{ label varname yword + dq ?,?,?,? + restore done@local \\} + match , done@local \\{ varname vartype + restore done@local \\} \} + match ,done@local + \{ var + restore done@local \} + common + endl } diff --git a/contrib/kolibri-libc/source/crt/inc/struct.inc b/contrib/kolibri-libc/source/crt/inc/struct.inc new file mode 100644 index 0000000000..789dd17976 --- /dev/null +++ b/contrib/kolibri-libc/source/crt/inc/struct.inc @@ -0,0 +1,240 @@ + +; Macroinstructions for defining data structures + +macro struct name + { virtual at 0 + fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common define field@struct .,db, + fields@struct equ fields@struct,field@struct \} + struc dw [val] \{ \common define field@struct .,dw, + fields@struct equ fields@struct,field@struct \} + struc du [val] \{ \common define field@struct .,du, + fields@struct equ fields@struct,field@struct \} + struc dd [val] \{ \common define field@struct .,dd, + fields@struct equ fields@struct,field@struct \} + struc dp [val] \{ \common define field@struct .,dp, + fields@struct equ fields@struct,field@struct \} + struc dq [val] \{ \common define field@struct .,dq, + fields@struct equ fields@struct,field@struct \} + struc dt [val] \{ \common define field@struct .,dt, + fields@struct equ fields@struct,field@struct \} + struc rb count \{ define field@struct .,db,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rw count \{ define field@struct .,dw,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rd count \{ define field@struct .,dd,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rp count \{ define field@struct .,dp,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rq count \{ define field@struct .,dq,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rt count \{ define field@struct .,dt,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro db [val] \{ \common \local anonymous + define field@struct anonymous,db, + fields@struct equ fields@struct,field@struct \} + macro dw [val] \{ \common \local anonymous + define field@struct anonymous,dw, + fields@struct equ fields@struct,field@struct \} + macro du [val] \{ \common \local anonymous + define field@struct anonymous,du, + fields@struct equ fields@struct,field@struct \} + macro dd [val] \{ \common \local anonymous + define field@struct anonymous,dd, + fields@struct equ fields@struct,field@struct \} + macro dp [val] \{ \common \local anonymous + define field@struct anonymous,dp, + fields@struct equ fields@struct,field@struct \} + macro dq [val] \{ \common \local anonymous + define field@struct anonymous,dq, + fields@struct equ fields@struct,field@struct \} + macro dt [val] \{ \common \local anonymous + define field@struct anonymous,dt, + fields@struct equ fields@struct,field@struct \} + macro rb count \{ \local anonymous + define field@struct anonymous,db,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rw count \{ \local anonymous + define field@struct anonymous,dw,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rd count \{ \local anonymous + define field@struct anonymous,dd,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rp count \{ \local anonymous + define field@struct anonymous,dp,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rq count \{ \local anonymous + define field@struct anonymous,dq,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rt count \{ \local anonymous + define field@struct anonymous,dt,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} } + +macro ends + { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt + restruc rb,rw,rd,rp,rq,rt + purge db,dw,du,dd,dp,dq,dt + purge rb,rw,rd,rp,rq,rt + purge union,struct + match name tail,fields@struct, \\{ if $ + display 'Error: definition of ',\\`name,' contains illegal instructions.',0Dh,0Ah + err + end if \\} + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + define fields@\\#name fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + virtual + db `name + load initial@struct byte from 0 + if initial@struct = '.' + display 'Error: name of structure should not begin with a dot.',0Dh,0Ah + err + end if + end virtual + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + label name#.#type + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ \\local \\..base + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label \\..base + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common label . at \\..base \\\} + \\} + macro name value \\{ + match any, fields@struct \\\{ \\\local anonymous + fields@struct equ fields@struct,anonymous,name, \\\} + match , fields@struct \\\{ + forward + match , value \\\\{ type def \\\\} + match any, value \\\\{ \\\\local ..field + ..field = $ + type value + if ~ field eq . + rb sizeof.#name#field - ($-..field) + end if \\\\} + common \\\} \\} \} } + +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,parent,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at parent#.#name + forward + if ~ field eq . + virtual at parent#.#name + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ - parent#.#name + rb sizeof.#parent#field - ($ - parent#.#name) + end if + else + virtual at parent#.#name + label parent#.#type + type def + end virtual + label name#.#type at parent#.#name + if sizeof.#type > $ - parent#.#name + rb sizeof.#type - ($ - parent#.#name) + end if + end if + common + sizeof.#name = $ - parent#.#name + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} + macro name [value] \{ \common \local ..anonymous + ..anonymous name value \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at parent#.#name + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + label parent#.#type + rb sizeof.#type + end if + common + sizeof.#name = $ - parent#.#name + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} + macro name value \{ \local ..anonymous + ..anonymous name \} } diff --git a/contrib/kolibri-libc/source/ctype/is.c b/contrib/kolibri-libc/source/ctype/is.c new file mode 100644 index 0000000000..fc160bec22 --- /dev/null +++ b/contrib/kolibri-libc/source/ctype/is.c @@ -0,0 +1,21 @@ +#include + +unsigned short __is[129] = { + 0, /* EOF */ + 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, + 0x004, 0x104, 0x104, 0x104, 0x104, 0x104, 0x004, 0x004, + 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, + 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, + 0x140, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, + 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, + 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, + 0x459, 0x459, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, + 0x0D0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253, + 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, + 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, + 0x253, 0x253, 0x253, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x0D0, + 0x0D0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073, + 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, + 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, + 0x073, 0x073, 0x073, 0x0D0, 0x0D0, 0x0D0, 0x0D0, 0x004 + }; diff --git a/contrib/kolibri-libc/source/exports/exports.c b/contrib/kolibri-libc/source/exports/exports.c new file mode 100644 index 0000000000..c8740d0e54 --- /dev/null +++ b/contrib/kolibri-libc/source/exports/exports.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include + +ksys_coff_etable_t EXPORTS[] = { + {"abs", abs}, + {"acos", acos}, + {"acosh", acosh}, + {"asin", asin}, + {"asinh", asinh}, + {"atan", atan}, + {"atan2", atan2}, + {"atanh", atanh}, + {"atoi", atoi}, + {"atol", atol}, + {"atoll", atoll}, + {"calloc", calloc}, + {"ceil", ceil}, + {"clearerr", clearerr}, + {"closedir", closedir}, + {"cos", cos}, + {"cosh", cosh}, + {"debug_printf", debug_printf}, + {"difftime", difftime}, + {"div", div}, + {"exit", exit}, + {"exp", exp}, + {"fabs", fabs}, + {"fclose", fclose}, + {"feof", feof}, + {"ferror", ferror}, + {"fflush", fflush}, + {"fgetc", fgetc}, + {"fgetpos", fgetpos}, + {"fgets", fgets}, + {"floor", floor}, + {"fmod", fmod}, + {"fopen", fopen}, + {"fputc", fputc}, + {"fputs", fputs}, + {"fread", fread}, + {"free", free}, + {"freopen", freopen}, + {"frexp", frexp}, + {"fseek", fseek}, + {"fsetpos", fsetpos}, + {"ftell", ftell}, + {"fwrite", fwrite}, + {"getchar", getchar}, + {"gets", gets}, + {"hypot", hypot}, + {"labs", labs}, + {"ldexp", ldexp}, + {"ldiv", ldiv}, + {"llabs", llabs}, + {"lldiv", lldiv}, + {"localtime", localtime}, + {"log", log}, + {"malloc", malloc}, + {"memccpy", memccpy}, + {"memchr", memchr}, + {"memcmp", memcmp}, + {"memcpy", memcpy}, + {"memmove", memmove}, + {"memset", memset}, + {"mktime", mktime}, + {"modf", modf}, + {"modfl", modfl}, + {"opendir", opendir}, + {"perror", perror}, + {"pow", pow}, + {"pow10", pow10}, + {"pow2", pow2}, + {"printf", printf}, + {"puts", puts}, + {"readdir", readdir}, + {"realloc", realloc}, + {"remove", remove}, + {"rename", rename}, + {"rewind", rewind}, + {"rewinddir", rewinddir}, + {"seekdir", seekdir}, + {"setbuf", setbuf}, + {"setvbuf", setvbuf}, + {"sin", sin}, + {"sinh", sinh}, + {"snprintf", snprintf}, + {"sprintf", sprintf}, + {"sqrt", sqrt}, + {"strcat", strcat}, + {"strchr", strchr}, + {"strcmp", strcmp}, + {"strcoll", strcoll}, + {"strcpy", strcpy}, + {"strcspn", strcspn}, + {"strerror", strerror}, + {"strlen", strlen}, + {"strncat", strncat}, + {"strncmp", strncmp}, + {"strncpy", strncpy}, + {"strpbrk", strpbrk}, + {"strrchr", strrchr}, + {"strrev", strrev}, + {"strspn", strspn}, + {"strstr", strstr}, + {"strtok", strtok}, + {"strxfrm", strxfrm}, + {"tan", tan}, + {"tanh", tanh}, + {"telldir", telldir}, + {"time", time}, + {"tmpfile", tmpfile}, + {"tmpnam", tmpnam}, + {"vprintf", vprintf}, + {"vsnprintf", vsnprintf}, + 0 +}; diff --git a/contrib/kolibri-libc/source/include/ctype.h b/contrib/kolibri-libc/source/include/ctype.h new file mode 100644 index 0000000000..16447bd563 --- /dev/null +++ b/contrib/kolibri-libc/source/include/ctype.h @@ -0,0 +1,41 @@ +#ifndef _CTYPE_H_ +#define _CTYPE_H_ +/* +** All character classification functions except isascii(). +** Integer argument (c) must be in ASCII range (0-127) for +** dependable answers. +*/ + +#define __ALNUM 1 +#define __ALPHA 2 +#define __CNTRL 4 +#define __DIGIT 8 +#define __GRAPH 16 +#define __LOWER 32 +#define __PRINT 64 +#define __PUNCT 128 +#define __BLANK 256 +#define __UPPER 512 +#define __XDIGIT 1024 + +extern unsigned short __is[129]; + +#define isalnum(c)(__is[c+1] & __ALNUM ) /* 'a'-'z', 'A'-'Z', '0'-'9' */ +#define isalpha(c)(__is[c+1] & __ALPHA ) /* 'a'-'z', 'A'-'Z' */ +#define iscntrl(c)(__is[c+1] & __CNTRL ) /* 0-31, 127 */ +#define isdigit(c)(__is[c+1] & __DIGIT ) /* '0'-'9' */ +#define isgraph(c)(__is[c+1] & __GRAPH ) /* '!'-'~' */ +#define islower(c)(__is[c+1] & __LOWER ) /* 'a'-'z' */ +#define isprint(c)(__is[c+1] & __PRINT ) /* ' '-'~' */ +#define ispunct(c)(__is[c+1] & __PUNCT ) /* !alnum && !cntrl && !space */ +#define isspace(c)(__is[c+1] & __BLANK ) /* HT, LF, VT, FF, CR, ' ' */ +#define isupper(c)(__is[c+1] & __UPPER ) /* 'A'-'Z' */ +#define isxdigit(c)(__is[c+1] & __XDIGIT) /* '0'-'9', 'a'-'f', 'A'-'F' */ + +#define isascii(c) (!((c)&(~0x7f))) +#define toascii(c) ((c)&0x7f) + +extern unsigned char tolower(unsigned char c); +extern unsigned char toupper(unsigned char c); + +#endif \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/errno.h b/contrib/kolibri-libc/source/include/errno.h new file mode 100644 index 0000000000..4068dbc12b --- /dev/null +++ b/contrib/kolibri-libc/source/include/errno.h @@ -0,0 +1,144 @@ +#ifndef _ERRNO_H_ +#define _ERRNO_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern int _GLOBAL_VAR(errno); + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* Input/output error */ +#define ENXIO 6 /* Device not configured */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file descriptor */ +#define ECHILD 10 /* No child processes */ +#define EDEADLK 11 /* Resource deadlock avoided */ +/* 11 was EAGAIN */ +#define ENOMEM 12 /* Cannot allocate memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device / Resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* Operation not supported by device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Inappropriate ioctl for device */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ + +/* math software */ +#define EDOM 33 /* Numerical argument out of domain */ +#define ERANGE 34 /* Result too large */ + +/* non-blocking and interrupt i/o */ +#define EAGAIN 35 /* Resource temporarily unavailable */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EINPROGRESS 36 /* Operation now in progress */ +#define EALREADY 37 /* Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define ENOTSUP 45 /* Operation not supported */ +#define EOPNOTSUPP ENOTSUP /* Operation not supported on socket */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol family */ +#define EADDRINUSE 48 /* Address already in use */ +#define EADDRNOTAVAIL 49 /* Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define ENETDOWN 50 /* Network is down */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETRESET 52 /* Network dropped connection on reset */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EISCONN 56 /* Socket is already connected */ +#define ENOTCONN 57 /* Socket is not connected */ +#define ESHUTDOWN 58 /* Can't send after socket shutdown */ +#define ETOOMANYREFS 59 /* Too many references: can't splice */ +#define ETIMEDOUT 60 /* Operation timed out */ +#define ECONNREFUSED 61 /* Connection refused */ +#define ELOOP 62 /* Too many levels of symbolic links */ +#define ENAMETOOLONG 63 /* File name too long */ + +/* should be rearranged */ +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* No route to host */ +#define ENOTEMPTY 66 /* Directory not empty */ + +/* quotas & mush */ +#define EPROCLIM 67 /* Too many processes */ +#define EUSERS 68 /* Too many users */ +#define EDQUOT 69 /* Disc quota exceeded */ + +/* Network File System */ +#define ESTALE 70 /* Stale NFS file handle */ +#define EREMOTE 71 /* Too many levels of remote in path */ +#define EBADRPC 72 /* RPC struct is bad */ +#define ERPCMISMATCH 73 /* RPC version wrong */ +#define EPROGUNAVAIL 74 /* RPC prog. not avail */ +#define EPROGMISMATCH 75 /* Program version wrong */ +#define EPROCUNAVAIL 76 /* Bad procedure for program */ +#define ENOLCK 77 /* No locks available */ +#define ENOSYS 78 /* Function not implemented */ +#define EFTYPE 79 /* Inappropriate file type or format */ +#define EAUTH 80 /* Authentication error */ +#define ENEEDAUTH 81 /* Need authenticator */ + +/* Intelligent device errors */ +#define EPWROFF 82 /* Device power is off */ +#define EDEVERR 83 /* Device error, e.g. paper out */ +#define EOVERFLOW 84 /* Value too large to be stored in data type */ + +/* Program loading errors */ +#define EBADEXEC 85 /* Bad executable */ +#define EBADARCH 86 /* Bad CPU type in executable */ +#define ESHLIBVERS 87 /* Shared library version mismatch */ +#define EBADMACHO 88 /* Malformed Macho file */ +#define ECANCELED 89 /* Operation canceled */ +#define EIDRM 90 /* Identifier removed */ +#define ENOMSG 91 /* No message of desired type */ +#define EILSEQ 92 /* Illegal byte sequence */ +#define ENOATTR 93 /* Attribute not found */ +#define EBADMSG 94 /* Bad message */ +#define EMULTIHOP 95 /* Reserved */ +#define ENODATA 96 /* No message available on STREAM */ +#define ENOLINK 97 /* Reserved */ +#define ENOSR 98 /* No STREAM resources */ +#define ENOSTR 99 /* Not a STREAM */ +#define EPROTO 100 /* Protocol error */ +#define ETIME 101 /* STREAM ioctl timeout */ +#define ENOPOLICY 103 /* No such policy registered */ +#define ENOTRECOVERABLE 104 /* State not recoverable */ +#define EOWNERDEAD 105 /* Previous owner died */ +#define EQFULL 106 /* Interface output queue is full */ +#define ELAST 106 /* Must be equal largest errno */ + +#ifdef __cplusplus +} +#endif + +#endif // _ERRNO_H_ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/float.h b/contrib/kolibri-libc/source/include/float.h new file mode 100644 index 0000000000..a2b4ed26a0 --- /dev/null +++ b/contrib/kolibri-libc/source/include/float.h @@ -0,0 +1,65 @@ +#ifndef _FLOAT_H_ +#define _FLOAT_H_ + +#define FLT_RADIX 2 + +/* IEEE float */ +#define FLT_MANT_DIG 24 +#define FLT_DIG 6 +#define FLT_ROUNDS 1 +#define FLT_EPSILON 1.19209290e-07F +#define FLT_MIN_EXP (-125) +#define FLT_MIN 1.17549435e-38F +#define FLT_MIN_10_EXP (-37) +#define FLT_MAX_EXP 128 +#define FLT_MAX 3.40282347e+38F +#define FLT_MAX_10_EXP 38 + +/* IEEE double */ +#define DBL_MANT_DIG 53 +#define DBL_DIG 15 +#define DBL_EPSILON 2.2204460492503131e-16 +#define DBL_MIN_EXP (-1021) +#define DBL_MIN 2.2250738585072014e-308 +#define DBL_MIN_10_EXP (-307) +#define DBL_MAX_EXP 1024 +#define DBL_MAX 1.7976931348623157e+308 +#define DBL_MAX_10_EXP 308 + +/* horrible intel long double */ +#if defined __i386__ || defined __x86_64__ + +#define LDBL_MANT_DIG 64 +#define LDBL_DIG 18 +#define LDBL_EPSILON 1.08420217248550443401e-19L +#define LDBL_MIN_EXP (-16381) +#define LDBL_MIN 3.36210314311209350626e-4932L +#define LDBL_MIN_10_EXP (-4931) +#define LDBL_MAX_EXP 16384 +#define LDBL_MAX 1.18973149535723176502e+4932L +#define LDBL_MAX_10_EXP 4932 + +#else + +/* same as IEEE double */ +#define LDBL_MANT_DIG 53 +#define LDBL_DIG 15 +#define LDBL_EPSILON 2.2204460492503131e-16 +#define LDBL_MIN_EXP (-1021) +#define LDBL_MIN 2.2250738585072014e-308 +#define LDBL_MIN_10_EXP (-307) +#define LDBL_MAX_EXP 1024 +#define LDBL_MAX 1.7976931348623157e+308 +#define LDBL_MAX_10_EXP 308 + +#endif + +#ifndef NAN +# define NAN (__nan__) +#endif + +#ifndef INFINITY +# define INFINITY (__inf__) +#endif + +#endif /* _FLOAT_H_ */ diff --git a/contrib/kolibri-libc/source/include/ksys.h b/contrib/kolibri-libc/source/include/ksys.h new file mode 100644 index 0000000000..55d01e8873 --- /dev/null +++ b/contrib/kolibri-libc/source/include/ksys.h @@ -0,0 +1,918 @@ +#ifndef _KSYS_H_ +#define _KSYS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define asm_inline __asm__ __volatile__ +#define not_optimized __attribute__((optimize("O0"))) + +typedef struct { + unsigned char blue; + unsigned char green; + unsigned char red; +}rgb_t; + +#pragma pack(push,1) +typedef union{ + unsigned val; + struct{ + short x; + short y; + }; +}ksys_pos_t; + +typedef union ksys_oskey_t{ + unsigned val; + struct{ + unsigned char state; + unsigned char code; + unsigned char ctrl_key; + }; +}ksys_oskey_t; + +typedef struct{ + unsigned handle; + unsigned io_code; + unsigned *input; + int inp_size; + void *output; + int out_size; +}ksys_ioctl_t; + +typedef struct{ + void *data; + size_t size; +}ksys_ufile_t; + + +typedef struct{ + unsigned p00; + union{ + uint64_t p04; + struct { + unsigned p04dw; + unsigned p08dw; + }; + }; + unsigned p12; + union { + unsigned p16; + const char *new_name; + void *bdfe; + void *buf16; + const void *cbuf16; + }; + char p20; + const char *p21; +}ksys70_t; + + +typedef struct { + unsigned attributes; + unsigned name_cp; + char creation_time[4]; + char creation_date[4]; + char last_access_time[4]; + char last_access_date[4]; + char last_modification_time[4]; + char last_modification_date[4]; + unsigned long long size; + char name[0]; +}ksys_bdfe_t; + +typedef struct { + int cpu_usage; //+0 + int window_pos_info; //+4 + short int reserved1; //+8 + char name[12]; //+10 + int memstart; //+22 + int memused; //+26 + int pid; //+30 + int winx_start; //+34 + int winy_start; //+38 + int winx_size; //+42 + int winy_size; //+46 + short int slot_info; //+50 + short int reserved2; //+52 + int clientx; //+54 + int clienty; //+58 + int clientwidth; //+62 + int clientheight; //+66 + unsigned char window_state;//+70 + char reserved3[1024-71]; //+71 +}ksys_proc_table_t; + +typedef unsigned int ksys_color_t; + +typedef struct{ + ksys_color_t frame_area; + ksys_color_t grab_bar; + ksys_color_t grab_bar_button; + ksys_color_t grab_button_text; + ksys_color_t grab_text; + ksys_color_t work_area; + ksys_color_t work_button; + ksys_color_t work_button_text; + ksys_color_t work_text; + ksys_color_t work_graph; +}ksys_colors_table_t; + +typedef struct{ + unsigned pid; // PID of sending thread + unsigned datalen; // data bytes + char *data; // data begin +}ksys_ipc_msg; + +typedef struct{ + unsigned lock; // nonzero is locked + unsigned used; // used bytes in buffer + ksys_ipc_msg *data; // data begin +}ksys_ipc_buffer; + +typedef struct { + char* func_name; + void* func_ptr; +}ksys_coff_etable_t; + +#pragma pack(pop) + +enum KSYS_EVENTS { + KSYS_EVENT_NONE = 0, /* Event queue is empty */ + KSYS_EVENT_REDRAW = 1, /* Window and window elements should be redrawn */ + KSYS_EVENT_KEY = 2, /* A key on the keyboard was pressed */ + KSYS_EVENT_BUTTON = 3, /* A button was clicked with the mouse */ + KSYS_EVENT_DESKTOP = 5, /* Desktop redraw finished */ + KSYS_EVENT_MOUSE = 6, /* Mouse activity (movement, button press) was detected */ + KSYS_EVENT_IPC = 7, /* Interprocess communication notify */ + KSYS_EVENT_NETWORK = 8, /* Network event */ + KSYS_EVENT_DEBUG = 9, /* Debug subsystem event */ + KSYS_EVENT_IRQBEGIN = 16 /* 16..31 IRQ0..IRQ15 interrupt =IRQBEGIN+IRQn */ +}; + +enum KSYS_FILE_ENCODING{ + KSYS_FILE_CP866 =1, + KSYS_FILE_UTF16LE = 2, + KSYS_FILE_UTF8 = 3 +}; + +enum KSYS_CLIP_ENCODING{ + KSYS_CLIP_UTF8 = 0, + KSYS_CLIP_CP866 = 1, + KSYS_CLIP_CP1251 = 2 +}; + +enum KSYS_CLIP_TYPES{ + KSYS_CLIP_TEXT = 0, + KSYS_CLIP_IMAGE = 1, + KSYS_CLIP_RAW = 2 +}; + +static inline +int _ksys_strcmp(const char * s1, const char * s2 ) +{ + while ((*s1) && (*s1 == *s2)){ + ++s1; + ++s2; + } + + return ( *( unsigned char * )s1 - * ( unsigned char * )s2 ); +} + +// Functions for working with the graphical interface + +static inline +void _ksys_start_draw() +{ + asm_inline("int $0x40"::"a"(12),"b"(1)); +} + +static inline +void _ksys_end_draw() +{ + asm_inline("int $0x40" ::"a"(12),"b"(2)); +} + +static inline +void _ksys_create_window(int x, int y, int w, int h, const char *name, ksys_color_t workcolor, unsigned style) +{ + asm_inline( + "int $0x40" + ::"a"(0), + "b"((x << 16) | ((w-1) & 0xFFFF)), + "c"((y << 16) | ((h-1) & 0xFFFF)), + "d"((style << 24) | (workcolor & 0xFFFFFF)), + "D"(name), + "S"(0) : "memory" + ); +}; + +static inline +void _ksys_change_window(int new_x, int new_y, int new_w, int new_h) +{ + asm_inline( + "int $0x40" + ::"a"(67), "b"(new_x), "c"(new_y), "d"(new_w),"S"(new_h) + ); +} + +static inline +void _ksys_define_button(unsigned x, unsigned y, unsigned w, unsigned h, unsigned id, ksys_color_t color) +{ + asm_inline( + "int $0x40" + ::"a"(8), + "b"((x<<16)+w), + "c"((y<<16)+h), + "d"(id), + "S"(color) + ); +}; + +static inline +void _ksys_draw_line(int xs, int ys, int xe, int ye, ksys_color_t color) +{ + asm_inline( + "int $0x40" + ::"a"(38), "d"(color), + "b"((xs << 16) | xe), + "c"((ys << 16) | ye) + ); +} + +static inline +void _ksys_draw_bar(int x, int y, int w, int h, ksys_color_t color) +{ + asm_inline( + "int $0x40" + ::"a"(13), "d"(color), + "b"((x << 16) | w), + "c"((y << 16) | h) + ); +} + +static inline +void _ksys_draw_bitmap(void *bitmap, int x, int y, int w, int h) +{ + asm_inline( + "int $0x40" + ::"a"(7), "b"(bitmap), + "c"((w << 16) | h), + "d"((x << 16) | y) + ); +} + +static inline +void _ksys_draw_text(const char *text, int x, int y, int len, ksys_color_t color) +{ + asm_inline( + "int $0x40" + ::"a"(4),"d"(text), + "b"((x << 16) | y), + "S"(len),"c"(color) + :"memory" + ); +} + +static inline +void _ksys_draw_text_bg(const char *text, int x, int y, int len, ksys_color_t color, ksys_color_t bg) +{ + asm_inline( + "int $0x40" + ::"a"(4),"d"(text), + "b"((x << 16) | y), + "S"(len),"c"(color), "D"(bg) + :"memory" + ); +} + +static inline +void _ksys_draw_number(int number, int x, int y, int len, ksys_color_t color){ + unsigned fmt; + fmt = len << 16 | 0x80000000; // no leading zeros + width + asm_inline( + "int $0x40" + ::"a"(47), "b"(fmt), "c"(number), "d"((x << 16) | y), "S"(color) + ); +} + +static inline +void _ksys_draw_number_bg(unsigned number, int x, int y, int len, ksys_color_t color, ksys_color_t bg){ + unsigned fmt; + fmt = len << 16 | 0x80000000; // no leading zeros + width + asm_inline( + "int $0x40" + ::"a"(47), "b"(fmt), "c"(number), "d"((x << 16) | y), "S"(color), "D"(bg) + ); +} + +static inline +unsigned _ksys_get_skin_height() +{ + unsigned height; + asm_inline( + "int $0x40 \n\t" + :"=a"(height) + :"a"(48),"b"(4) + ); + return height; +} + +static inline +void _ksys_get_colors(ksys_colors_table_t *color_table) +{ + asm_inline( + "int $0x40" + ::"a"(48),"b"(3),"c"(color_table),"d"(40) + ); +} + + +/* Functions for working with a mouse and cursors. */ + +static inline +ksys_pos_t _ksys_get_mouse_pos(int origin) +{ + ksys_pos_t val; + asm_inline( + "int $0x40 \n\t" + "rol $16, %%eax" + :"=a"(val) + :"a"(37),"b"(origin) + ); + return val; +} + +static inline +unsigned _ksys_get_mouse_buttons() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(37),"b"(2) + ); + return val; +} + +static inline +unsigned _ksys_get_mouse_wheels() +{ + unsigned val; + asm_inline( + "int $0x40 \n\t" + :"=a"(val) + :"a"(37),"b"(7) + ); + return val; +} + +static inline +unsigned _ksys_load_cursor(void *path, unsigned flags) +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(37), "b"(4), "c"(path), "d"(flags) + ); + return val; +} + +static inline +unsigned _ksys_set_cursor(unsigned cursor) +{ + unsigned old; + asm_inline( + "int $0x40" + :"=a"(old) + :"a"(37), "b"(5), "c"(cursor) + ); + return old; +} + +static inline +int _ksys_destroy_cursor(unsigned cursor) +{ + int ret; + asm_inline( + "int $0x40" + :"=a"(ret) + :"a"(37), "b"(6), "c"(cursor) + :"memory" + ); + return ret; +} + +static inline +unsigned _ksys_get_mouse_eventstate() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(37),"b"(3) + ); + return val; +} + + +/* Functions for working with events and buttons. */ + +static inline +unsigned _ksys_set_event_mask(unsigned mask) +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(40), "b"(mask) + ); + return val; +} + +static inline +unsigned _ksys_wait_event(unsigned time) +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(23), "b"(time) + ); + return val; +} + +static inline +unsigned _ksys_check_event() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(11) + ); + return val; +} + +static inline +unsigned _ksys_get_event() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(10) + ); + return val; +} + +static inline +unsigned _ksys_get_button() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(17) + ); + return val>>8; +} + +static inline +ksys_oskey_t _ksys_get_key(void) +{ + ksys_oskey_t val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(2) + ); + return val; +} + +/* Functions for working with the clipboard */ + +static inline +int _ksys_clip_num() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(54), "b"(0) + ); + return val; +} + +static inline +char* _ksys_clip_get(int n) // returned buffer must be freed by _ksys_free() +{ + char* val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(54), "b"(1), "c"(n) + ); + return val; +} + +static inline +int _ksys_clip_set(int n, char *buffer) +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(54), "b"(2), "c"(n), "d"(buffer) + ); + return val; +} + +static inline +int _ksys_clip_pop() +{ + unsigned val; + asm_inline ( + "int $0x40" + :"=a"(val) + :"a"(54), "b"(3) + ); + return val; +} + +static inline +int _ksys_clip_unlock() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(54), "b"(4) + ); + return val; +} + + +/* Working with time */ + +static inline +unsigned _ksys_get_tick_count() +{ + unsigned val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(26),"b"(9) + ); + return val; +} + +static inline +uint64_t _ksys_get_ns_count() +{ + uint64_t val; + asm_inline( + "int $0x40" + :"=A"(val) + :"a"(26), "b"(10) + ); + return val; +} + +static inline +void _ksys_delay(unsigned time) +{ + asm_inline( + "int $0x40" + ::"a"(5), "b"(time) + :"memory" + ); +} + +static inline +unsigned _ksys_get_date() +{ + unsigned val; + asm_inline("int $0x40":"=a"(val):"a"(29)); + return val; +} + +static inline +unsigned _ksys_get_clock() +{ + unsigned val; + asm_inline("int $0x40":"=a"(val):"a"(3)); + return val; +} + + +/* Working with memory allocation */ + +static inline +void* _ksys_alloc(size_t size){ + void *val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(12),"c"(size) + ); + return val; +} + +static inline +int _ksys_free(void *mem) +{ + int val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(13),"c"(mem) + ); + return val; +} + +static inline +void* _ksys_realloc(void *mem, size_t size) +{ + void *val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(20),"c"(size),"d"(mem) + :"memory" + ); + return val; +} + +static inline +int* _ksys_unmap(void *base, size_t offset, size_t size) +{ + int *val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(26),"c"(base),"d"(offset),"S"(size) + ); + return val; +} + + +/* Loading the dynamic coff library */ + +static inline +ksys_coff_etable_t* not_optimized _ksys_cofflib_load(const char* path) +{ + ksys_coff_etable_t *table; + asm_inline( + "int $0x40" + :"=a"(table) + :"a"(68),"b"(19), "c"(path) + ); + return table; +} + +static inline +void* not_optimized _ksys_cofflib_getproc(ksys_coff_etable_t *table, const char* fun_name) +{ + unsigned i=0; + while (1){ + if (NULL == (table+i)->func_name){ + break; + }else{ + if (!_ksys_strcmp(fun_name, (table+i)->func_name)){ + return (table+i)->func_ptr; + } + } + i++; + } + return NULL; +} + + +/* Debug board functions */ + +static inline +void _ksys_debug_putc(char c) +{ + asm_inline("int $0x40"::"a"(63), "b"(1), "c"(c)); +} + +static inline +void _ksys_debug_puts(char *s) +{ + unsigned i=0; + while (*(s+i)){ + asm_inline ("int $0x40"::"a"(63), "b"(1), "c"(*(s+i))); + i++; + } +} + + +/* Working with threads and process */ + +static inline +int _ksys_start_thread(void* proc, char* stack_top) +{ + int val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(51), "b"(1), "c"(proc), "d"(stack_top) + ); + return val; +} + +static inline +void _ksys_focus_window(int slot){ + asm_inline( + "int $0x40" + ::"a"(18), "b"(3), "c"(slot) + ); +} + +static inline +int _ksys_get_thread_slot(int tid){ + int val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(18), "b"(21), "c"(tid) + ); + return val; +} + +static inline +int not_optimized _ksys_process_info(ksys_proc_table_t* table, int pid) +{ + int val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(9), "b"(table), "c"(pid) + ); + return val; +} + +static inline +void _ksys_exit() +{ + asm_inline("int $0x40"::"a"(-1)); +} + + +/* Working with files and directories */ + +static inline +void _ksys_setcwd(char* dir){ + asm_inline( + "int $0x40" + ::"a"(30), "b"(1), "c"(dir) + ); +} + +static inline +int _ksys_getcwd(char* buf, int bufsize){ + register int val; + asm_inline( + "int $0x40" + :"=a"(val):"a"(30), "b"(2), "c"(buf), "d"(bufsize) + ); + return val; +} + +static inline +ksys_ufile_t _ksys_load_file(const char *path) +{ + ksys_ufile_t uf; + asm_inline( + "int $0x40" + :"=a"(uf.data), "=d"(uf.size) + :"a"(68), "b"(27),"c"(path) + ); + return uf; +} + +static inline +ksys_ufile_t _ksys_load_file_enc(const char *path, unsigned file_encoding) +{ + ksys_ufile_t uf; + asm_inline( + "int $0x40" + :"=a"(uf.data), "=d"(uf.size) + :"a"(68), "b"(28),"c"(path), "d"(file_encoding) + ); + return uf; +} + +static inline +int not_optimized _ksys_work_files(const ksys70_t *k) +{ + int status; + asm_inline( + "int $0x40" + :"=a"(status) + :"a"(70), "b"(k) + ); + return status; +} + +static inline +int not_optimized _ksys_file_read_file(const char *name, unsigned long long offset, unsigned size, void *buf, unsigned *bytes_read) +{ + ksys70_t k; + k.p00 = 0; + k.p04 = offset; + k.p12 = size; + k.buf16 = buf; + k.p20 = 0; + k.p21 = name; + int status; + unsigned bytes_read_v; + asm_inline( + "int $0x40" + :"=a"(status), "=b"(bytes_read_v) + :"a"(70), "b"(&k) + ); + if (!status) { + *bytes_read = bytes_read_v; + } + return status; +} + +static inline +int not_optimized _ksys_file_write_file(const char *name, unsigned long long offset, unsigned size, const void *buf, unsigned *bytes_written) +{ + ksys70_t k; + k.p00 = 3; + k.p04 = offset; + k.p12 = size; + k.cbuf16 = buf; + k.p20 = 0; + k.p21 = name; + int status; + unsigned bytes_written_v; + asm_inline( + "int $0x40" + :"=a"(status), "=b"(bytes_written_v) + :"a"(70), "b"(&k) + ); + if (!status) { + *bytes_written = bytes_written_v; + } + return status; +} + +static inline +int not_optimized _ksys_file_get_info(const char *name, ksys_bdfe_t *bdfe) +{ + ksys70_t k; + k.p00 = 5; + k.bdfe = bdfe; + k.p20 = 0; + k.p21 = name; + return _ksys_work_files(&k); +} + +static inline +int not_optimized _ksys_file_delete(const char *name) +{ + ksys70_t k; + k.p00 = 8; + k.p20 = 0; + k.p21 = name; + return _ksys_work_files(&k); +} + +static inline +int not_optimized _ksys_file_rename(const char *name, const char *new_name) +{ + ksys70_t k; + k.p00 = 10; + k.new_name = new_name; + k.p20 = 0; + k.p21 = name; + return _ksys_work_files(&k); +} + + +static inline +int not_optimized _ksys_exec(char *app_name, char *args){ + ksys70_t file_op; + file_op.p00 = 7; + file_op.p04dw = 0; + file_op.p08dw = (unsigned)args; + file_op.p21 = app_name; + register int val; + asm_inline( + "int $0x40" + :"=a"(val) + :"a"(70), "b"(&file_op) + ); + return val; +} + +#endif // _KSYS_H_ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/limits.h b/contrib/kolibri-libc/source/include/limits.h new file mode 100644 index 0000000000..e08af576e7 --- /dev/null +++ b/contrib/kolibri-libc/source/include/limits.h @@ -0,0 +1,18 @@ +#ifndef _LIMITS_H_ +#define _LIMITS_H_ + + +#define INT_MAX 2147483647 +#define UINT_MAX (INT_MAX * 2U + 1) + + +#ifndef ARG_MAX +#define ARG_MAX 4096 +#endif + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + + +#endif /* _LIMITS_H_ */ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/math.h b/contrib/kolibri-libc/source/include/math.h new file mode 100644 index 0000000000..b1749dc50b --- /dev/null +++ b/contrib/kolibri-libc/source/include/math.h @@ -0,0 +1,171 @@ +/* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */ +/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +#ifndef _MATH_H_ +#define _MATH_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern double _FUNC(acos)(double _x); +extern double _FUNC(asin)(double _x); +extern double _FUNC(atan)(double _x); +extern double _FUNC(atan2)(double _y, double _x); +extern double _FUNC(ceil)(double _x); +extern double _FUNC(cos)(double _x); +extern double _FUNC(cosh)(double _x); +extern double _FUNC(exp)(double _x); +extern double _FUNC(fabs)(double _x); +extern double _FUNC(floor)(double _x); +extern double _FUNC(fmod)(double _x, double _y); +extern double _FUNC(frexp)(double _x, int *_pexp); +extern double _FUNC(ldexp)(double _x, int _exp); +extern double _FUNC(log)(double _y); +extern double _FUNC(log10)(double _x); +extern double _FUNC(modf)(double _x, double *_pint); +extern double _FUNC(pow)(double _x, double _y); +extern double _FUNC(sin)(double _x); +extern double _FUNC(sinh)(double _x); +extern double _FUNC(sqrt)(double _x); +extern double _FUNC(tan)(double _x); +extern double _FUNC(tanh)(double _x); + +#define M_E 2.7182818284590452354 +#define M_LOG2E 1.4426950408889634074 +#define M_LOG10E 0.43429448190325182765 +#define M_LN2 0.69314718055994530942 +#define M_LN10 2.30258509299404568402 +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#define M_PI_4 0.78539816339744830962 +#define M_1_PI 0.31830988618379067154 +#define M_2_PI 0.63661977236758134308 +#define M_2_SQRTPI 1.12837916709551257390 +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT1_2 0.70710678118654752440 +#define PI M_PI +#define PI2 M_PI_2 + +extern double _FUNC(acosh)(double); +extern double _FUNC(asinh)(double); +extern double _FUNC(atanh)(double); +extern double _FUNC(cbrt)(double); +extern double _FUNC(exp10)(double _x); +extern double _FUNC(exp2)(double _x); +extern double _FUNC(expm1)(double); +extern double _FUNC(hypot)(double, double); +extern double _FUNC(log1p)(double); +extern double _FUNC(log2)(double _x); +extern long double _FUNC(modfl)(long double _x, long double *_pint); +extern double _FUNC(pow10)(double _x); +extern double _FUNC(pow2)(double _x); +extern double _FUNC(powi)(double, int); +extern void _FUNC(sincos)(double, double *, double *); + +/* These are in libm.a (Cygnus). You must link -lm to get these */ +/* See libm/math.h for comments */ + +#ifndef __cplusplus +struct exception { + int type; + const char *name; + double arg1; + double arg2; + double retval; + int err; +}; +#endif + +extern double _FUNC(erf)(double); +extern double _FUNC(erfc)(double); +extern double _FUNC(gamma)(double); +extern int _FUNC(isinf)(double); +extern int _FUNC(isnan)(double); +extern int _FUNC(finite)(double); +extern double _FUNC(j0)(double); +extern double _FUNC(j1)(double); +extern double _FUNC(jn)(int, double); +extern double _FUNC(lgamma)(double); +extern double _FUNC(nan)(const char*); +extern double _FUNC(y0)(double); +extern double _FUNC(y1)(double); +extern double _FUNC(yn)(int, double); +extern double _FUNC(logb)(double); +extern double _FUNC(nextafter)(double, double); +extern double _FUNC(remainder)(double, double); +extern double _FUNC(scalb)(double, double); +#ifndef __cplusplus +extern int _FUNC(matherr)(struct exception *); +#endif +extern double _FUNC(significand)(double); +extern double _FUNC(copysign)(double, double); +extern int _FUNC(ilogb)(double); +extern double _FUNC(rint)(double); +extern double _FUNC(scalbn)(double, int); +extern double _FUNC(drem)(double, double); +extern double _FUNC(gamma_r)(double, int *); +extern double _FUNC(lgamma_r)(double, int *); +extern float _FUNC(acosf)(float); +extern float _FUNC(asinf)(float); +extern float _FUNC(atanf)(float); +extern float _FUNC(atan2f)(float, float); +extern float _FUNC(cosf)(float); +extern float _FUNC(sinf)(float); +extern float _FUNC(tanf)(float); +extern float _FUNC(coshf)(float); +extern float _FUNC(sinhf)(float); +extern float _FUNC(tanhf)(float); +extern float _FUNC(expf)(float); +extern float _FUNC(frexpf)(float, int *); +extern float _FUNC(ldexpf)(float, int); +extern float _FUNC(logf)(float); +extern float _FUNC(log10f)(float); +extern float _FUNC(modff)(float, float *); +extern float _FUNC(powf)(float, float); +extern float _FUNC(sqrtf)(float); +extern float _FUNC(ceilf)(float); +extern float _FUNC(fabsf)(float); +extern float _FUNC(floorf)(float); +extern float _FUNC(fmodf)(float, float); +extern float _FUNC(erff)(float); +extern float _FUNC(erfcf)(float); +extern float _FUNC(gammaf)(float); +extern float _FUNC(hypotf)(float, float); +extern int _FUNC(isinff)(float); +extern int _FUNC(isnanf)(float); +extern int _FUNC(finitef)(float); +extern float _FUNC(j0f)(float); +extern float _FUNC(j1f)(float); +extern float _FUNC(jnf)(int, float); +extern float _FUNC(lgammaf)(float); +extern float _FUNC(nanf)(const char*); +extern float _FUNC(y0f)(float); +extern float _FUNC(y1f)(float); +extern float _FUNC(ynf)(int, float); +extern float _FUNC(acoshf)(float); +extern float _FUNC(asinhf)(float); +extern float _FUNC(atanhf)(float); +extern float _FUNC(cbrtf)(float); +extern float _FUNC(logbf)(float); +extern float _FUNC(nextafterf)(float, float); +extern float _FUNC(remainderf)(float, float); +extern float _FUNC(scalbf)(float, float); +extern float _FUNC(significandf)(float); +extern float _FUNC(copysignf)(float, float); +extern int _FUNC(ilogbf)(float); +extern float _FUNC(rintf)(float); +extern float _FUNC(scalbnf)(float, int); +extern float _FUNC(dremf)(float, float); +extern float _FUNC(expm1f)(float); +extern float _FUNC(log1pf)(float); +extern float _FUNC(gammaf_r)(float, int *); +extern float _FUNC(lgammaf_r)(float, int *); + +#ifdef __cplusplus +} +#endif + +#endif /* _MATH_H_ */ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/setjmp.h b/contrib/kolibri-libc/source/include/setjmp.h new file mode 100644 index 0000000000..aa1993680e --- /dev/null +++ b/contrib/kolibri-libc/source/include/setjmp.h @@ -0,0 +1,17 @@ +#ifndef _SETJMP_H_ +#define _SETJMP_H_ + +#include + +typedef unsigned long __jmp_buf[6]; + +typedef struct __jmp_buf_tag { + __jmp_buf __jb; + unsigned long __fl; + unsigned long __ss[128/sizeof(long)]; +} jmp_buf[1]; + +extern int _FUNC(setjmp)(jmp_buf env); +extern void _FUNC(longjmp)(jmp_buf env, int val); + +#endif // _SETJMP_H_ diff --git a/contrib/kolibri-libc/source/include/stdarg.h b/contrib/kolibri-libc/source/include/stdarg.h new file mode 100644 index 0000000000..bd0928d891 --- /dev/null +++ b/contrib/kolibri-libc/source/include/stdarg.h @@ -0,0 +1,77 @@ +#ifndef _STDARG_H_ +#define _STDARG_H_ + +#include + +#ifdef __x86_64__ +#ifndef _WIN64 + +//This should be in sync with the declaration on our lib/libtcc1.c +/* GCC compatible definition of va_list. */ +typedef struct { + unsigned int gp_offset; + unsigned int fp_offset; + union { + unsigned int overflow_offset; + char *overflow_arg_area; + }; + char *reg_save_area; +} __va_list_struct; + +typedef __va_list_struct va_list[1]; + +extern void _FUNC(__va_start)(__va_list_struct *ap, void *fp); +extern void* _FUNC(__va_arg)(__va_list_struct *ap, int arg_type, int size, int align); + +#define va_start(ap, last) __va_start(ap, __builtin_frame_address(0)) +#define va_arg(ap, type) \ + (*(type *)(__va_arg(ap, __builtin_va_arg_types(type), sizeof(type), __alignof__(type)))) +#define va_copy(dest, src) (*(dest) = *(src)) +#define va_end(ap) + +#else /* _WIN64 */ +typedef char *va_list; +#define va_start(ap,last) __builtin_va_start(ap,last) +#define va_arg(ap,type) (ap += 8, sizeof(type)<=8 ? *(type*)ap : **(type**)ap) +#define va_copy(dest, src) ((dest) = (src)) +#define va_end(ap) +#endif + +#elif __arm__ +typedef char *va_list; +#define _tcc_alignof(type) ((int)&((struct {char c;type x;} *)0)->x) +#define _tcc_align(addr,type) (((unsigned)addr + _tcc_alignof(type) - 1) \ + & ~(_tcc_alignof(type) - 1)) +#define va_start(ap,last) ap = ((char *)&(last)) + ((sizeof(last)+3)&~3) +#define va_arg(ap,type) (ap = (void *) ((_tcc_align(ap,type)+sizeof(type)+3) \ + &~3), *(type *)(ap - ((sizeof(type)+3)&~3))) +#define va_copy(dest, src) (dest) = (src) +#define va_end(ap) + +#elif defined(__aarch64__) +typedef struct { + void *__stack; + void *__gr_top; + void *__vr_top; + int __gr_offs; + int __vr_offs; +} va_list; +#define va_start(ap, last) __va_start(ap, last) +#define va_arg(ap, type) __va_arg(ap, type) +#define va_end(ap) +#define va_copy(dest, src) ((dest) = (src)) + +#else /* __i386__ */ +typedef char *va_list; +/* only correct for i386 */ +#define va_start(ap,last) ap = ((char *)&(last)) + ((sizeof(last)+3)&~3) +#define va_arg(ap,type) (ap += (sizeof(type)+3)&~3, *(type *)(ap - ((sizeof(type)+3)&~3))) +#define va_copy(dest, src) (dest) = (src) +#define va_end(ap) +#endif + +/* fix a buggy dependency on GCC in libio.h */ +typedef va_list __gnuc_va_list; +#define _VA_LIST_DEFINED + +#endif /* _STDARG_H */ diff --git a/contrib/kolibri-libc/source/include/stdbool.h b/contrib/kolibri-libc/source/include/stdbool.h new file mode 100644 index 0000000000..0af22124ae --- /dev/null +++ b/contrib/kolibri-libc/source/include/stdbool.h @@ -0,0 +1,11 @@ +#ifndef _STDBOOL_H_ +#define _STDBOOL_H_ + +/* ISOC99 boolean */ + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_defined 1 + +#endif /* _STDBOOL_H */ diff --git a/contrib/kolibri-libc/source/include/stddef.h b/contrib/kolibri-libc/source/include/stddef.h new file mode 100644 index 0000000000..37054f62ee --- /dev/null +++ b/contrib/kolibri-libc/source/include/stddef.h @@ -0,0 +1,39 @@ +#ifndef _STDDEF_H_ +#define _STDDEF_H_ + +typedef __SIZE_TYPE__ size_t; +typedef __PTRDIFF_TYPE__ ssize_t; +typedef __WCHAR_TYPE__ wchar_t; +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __PTRDIFF_TYPE__ intptr_t; +typedef __SIZE_TYPE__ uintptr_t; + +#ifndef __int8_t_defined +#define __int8_t_defined +typedef signed char int8_t; +typedef signed short int int16_t; +typedef signed int int32_t; +typedef signed long long int int64_t; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long int uint64_t; +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; +#endif + +#ifndef NULL + #define NULL ((void*)0) +#endif + +#ifdef _DYNAMIC + #define _FUNC(func) (*func) + #define _GLOBAL_VAR(var) *var +#else + #define _FUNC(func) func + #define _GLOBAL_VAR(var) var +#endif + +#define offsetof(type, field) ((size_t)&((type *)0)->field) + +#endif /* _STDDEF_H_ */ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/stdint.h b/contrib/kolibri-libc/source/include/stdint.h new file mode 100644 index 0000000000..916e999f6f --- /dev/null +++ b/contrib/kolibri-libc/source/include/stdint.h @@ -0,0 +1,28 @@ +#ifndef _STDINT_H_ +#define _STDINT_H_ + +#include + +#define INT8_MIN (-128) +#define INT8_MAX (127) +#define UINT8_MAX (255) + +#define INT16_MIN (-32768) +#define INT16_MAX (32767) +#define UINT16_MAX (65535) + +#define INT32_MIN (-2147483647L-1) +#define INT32_MAX (2147483647L) +#define UINT32_MAX (4294967295UL) + +#if __have_long64 +#define INT64_MIN (-9223372036854775807L-1L) +#define INT64_MAX (9223372036854775807L) +#define UINT64_MAX (18446744073709551615U) +#elif __have_longlong64 +#define INT64_MIN (-9223372036854775807LL-1LL) +#define INT64_MAX (9223372036854775807LL) +#define UINT64_MAX (18446744073709551615ULL) +#endif + +#endif /* _STDINT_H_*/ diff --git a/contrib/kolibri-libc/source/include/stdio.h b/contrib/kolibri-libc/source/include/stdio.h new file mode 100644 index 0000000000..84df4863f3 --- /dev/null +++ b/contrib/kolibri-libc/source/include/stdio.h @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. +// Use this instead of bloated standard/newlib printf. +// These routines are thread safe and reentrant. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _STDIO_H_ +#define _STDIO_H_ + +#include +#include +#include + +extern int _FUNC(puts)(const char *str); +extern int _FUNC(printf)(const char* format, ...); +extern int _FUNC(sprintf)(char* buffer, const char* format, ...); +extern int _FUNC(snprintf)(char* buffer, size_t count, const char* format, ...); +extern int _FUNC(vsnprintf)(char* buffer, size_t count, const char* format, va_list va); +extern int _FUNC(vprintf)(const char* format, va_list va); + +extern void _FUNC(debug_printf)(const char* format, ...); + +typedef size_t fpos_t; + +#define _STDIO_F_R 1 << 0 // Read +#define _STDIO_F_W 1 << 1 // Write +#define _STDIO_F_A 1 << 2 // Append +#define _STDIO_F_X 1 << 3 // eXclusive +#define _STDIO_F_B 1 << 4 // Binary + +typedef struct FILE_s { + char *name; + fpos_t position; + int error; + int eof; + int kind; // 0 - undiefned, 1 - text, 2 - binary + int orientation; // 0 - undiefned, 1 - byte, 2 - wide + int mode; // flags _STDIO_F_* + int append_offset; // do not seek before this point ("a" mode) + int __ungetc_emu_buff; // Uses __ungetc_emu (temporary solution!) +} FILE; + +#define _IOFBF 0 +#define _IOLBF 1 +#define _IONBF 2 + +#define BUFSIZ 1024 + +#define EOF -1 + +#define FOPEN_MAX 0xffffffff + +#define FILENAME_MAX 255 + +#define L_tmpnam FILENAME_MAX + +#define SEEK_CUR 0 +#define SEEK_END 1 +#define SEEK_SET 2 + +#define TMP_MAX FOPEN_MAX + +#define stderr 0is7ye +#define stdin 8yfg8e +#define stdout 7hdgys + +extern int _FUNC(fgetc)(FILE *); +extern char* _FUNC(fgets)(char *restrict, int, FILE *restrict); +extern int _FUNC(fprintf)(FILE *restrict, const char *restrict, ...); +extern int _FUNC(fputc)(int, FILE *); +extern int _FUNC(fputs)(const char *restrict, FILE *restrict); +extern size_t _FUNC(fread)(void *restrict, size_t size, size_t count, FILE *restrict); +extern int _FUNC(fscanf)(FILE *restrict, const char *restrict, ...); +extern size_t _FUNC(fwrite)(const void *restrict, size_t size, size_t count, FILE *restrict); +extern int _FUNC(getc)(FILE *); +extern int _FUNC(getchar)(void); +extern int _FUNC(printf)(const char *restrict, ...); +extern int _FUNC(putc)(int, FILE *); +extern int _FUNC(putchar)(int); +extern int _FUNC(puts)(const char *); +extern int _FUNC(scanf)(const char *restrict, ...); +extern char* _FUNC(gets)(char *str); +//extern int _FUNC(ungetc)(int, FILE *); +extern int _FUNC(vfprintf)(FILE *restrict, const char *restrict, va_list); +extern int _FUNC(vfscanf)(FILE *restrict, const char *restrict, va_list); +extern int _FUNC(vprintf)(const char *restrict, va_list); +extern int _FUNC(vscanf)(const char *restrict, va_list); +extern int _FUNC(vsscanf)(const char *, const char*, va_list); + +extern int _FUNC(remove)(const char *); +extern int _FUNC(rename)(const char *, const char *); +extern FILE* _FUNC(tmpfile)(void); +extern char* _FUNC(tmpnam)(char *); + +extern int _FUNC(fclose)(FILE *); +extern int _FUNC(fflush)(FILE *); +extern FILE* _FUNC(fopen)(const char *restrict, const char *restrict); +extern FILE* _FUNC(freopen)(const char *restrict, const char *restrict, FILE *restrict); +extern void _FUNC(setbuf)(FILE *restrict, char *restrict); +extern int _FUNC(setvbuf)(FILE *restrict, char *restrict, int, size_t); + +extern int _FUNC(fgetpos)(FILE *restrict, fpos_t *restrict); +extern int _FUNC(fseek)(FILE *, long, int); +extern int _FUNC(fsetpos)(FILE *, const fpos_t *); +extern long _FUNC(ftell)(FILE *); +extern void _FUNC(rewind)(FILE *); + +extern void _FUNC(clearerr)(FILE *); +extern int _FUNC(feof)(FILE *); +extern int _FUNC(ferror)(FILE *); +extern void _FUNC(perror)(const char *); + +extern size_t _FUNC(fread)(void *restrict, size_t, size_t, FILE *restrict); + +extern int _FUNC(getchar)(void); + +#endif // _STDIO_H_ diff --git a/contrib/kolibri-libc/source/include/stdlib.h b/contrib/kolibri-libc/source/include/stdlib.h new file mode 100644 index 0000000000..e51039c1ff --- /dev/null +++ b/contrib/kolibri-libc/source/include/stdlib.h @@ -0,0 +1,38 @@ +#ifndef _STDLIB_H_ +#define _STDLIB_H_ + +#include + +#define RAND_MAX 65535 +#ifndef NULL +# define NULL ((void*)0) +#endif + +#define min(a, b) ((a)<(b) ? (a) : (b)) +#define max(a, b) ((a)>(b) ? (a) : (b)) + +extern int _FUNC(atoi)(const char *s); +extern long _FUNC(atol)(const char *); +extern long long _FUNC(atoll)(const char *); +//char* itoa)(int n, char* s); + +extern int _FUNC(abs)(int); +extern long _FUNC(labs)(long); +extern long long _FUNC(llabs)(long long); + +typedef struct { int quot, rem; } div_t; +typedef struct { long quot, rem; } ldiv_t; +typedef struct { long long quot, rem; } lldiv_t; + +extern div_t _FUNC(div)(int, int); +extern ldiv_t _FUNC(ldiv)(long, long); +extern lldiv_t _FUNC(lldiv)(long long, long long); + +extern void _FUNC(*malloc)(size_t size); +extern void* _FUNC(calloc)(size_t num, size_t size); +extern void* _FUNC(realloc)(void *ptr, size_t newsize); +extern void _FUNC(free)(void *ptr); + +extern void _FUNC(exit)(int status); + +#endif \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/string.h b/contrib/kolibri-libc/source/include/string.h new file mode 100644 index 0000000000..e351309c53 --- /dev/null +++ b/contrib/kolibri-libc/source/include/string.h @@ -0,0 +1,186 @@ +/* String handling + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _STRING_H_ +#define _STRING_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* String function conventions */ + +/* + In any of the following functions taking a size_t n to specify the length of + an array or size of a memory region, n may be 0, but the pointer arguments to + the call shall still be valid unless otherwise stated. +*/ + +/* Copying functions */ + +extern void* _FUNC(memccpy)(void *restrict dest, const void *restrict src, int c, size_t n); + +/* Copy a number of n characters from the memory area pointed to by s2 to the + area pointed to by s1. If the two areas overlap, behaviour is undefined. + Returns the value of s1. +*/ +extern void* _FUNC(memcpy)(void* s1, const void* s2, size_t n); + +/* Copy a number of n characters from the memory area pointed to by s2 to the + area pointed to by s1. The two areas may overlap. + Returns the value of s1. +*/ +extern void* _FUNC(memmove)(void* s1, const void* s2, size_t n); + +/* Copy the character array s2 (including terminating '\0' byte) into the + character array s1. + Returns the value of s1. +*/ +extern char* _FUNC(strcpy)(char* s1, const char* s2); + +/* Copy a maximum of n characters from the character array s2 into the character + array s1. If s2 is shorter than n characters, '\0' bytes will be appended to + the copy in s1 until n characters have been written. If s2 is longer than n + characters, NO terminating '\0' will be written to s1. If the arrays overlap, + behaviour is undefined. + Returns the value of s1. +*/ +extern char* _FUNC(strncpy)(char* s1, const char* s2, size_t n); + +/* Concatenation functions */ + +/* Append the contents of the character array s2 (including terminating '\0') to + the character array s1 (first character of s2 overwriting the '\0' of s1). If + the arrays overlap, behaviour is undefined. + Returns the value of s1. +*/ +extern char* _FUNC(strcat)(char* s1, const char* s2); + +/* Append a maximum of n characters from the character array s2 to the character + array s1 (first character of s2 overwriting the '\0' of s1). A terminating + '\0' is ALWAYS appended, even if the full n characters have already been + written. If the arrays overlap, behaviour is undefined. + Returns the value of s1. +*/ +extern char* _FUNC(strncat)(char* s1, const char* s2, size_t n); + +/* Comparison functions */ + +/* Compare the first n characters of the memory areas pointed to by s1 and s2. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. +*/ +extern int _FUNC(memcmp)(const void * s1, const void* s2, size_t n); + +/* Compare the character arrays s1 and s2. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. +*/ +extern int _FUNC(strcmp)(const char * s1, const char* s2); + +/* Compare the character arrays s1 and s2, interpreted as specified by the + LC_COLLATE category of the current locale. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. + TODO: Currently a dummy wrapper for strcmp() as PDCLib does not yet support + locales. +*/ +extern int _FUNC(strcoll)(const char* s1, const char* s2); + +/* Compare no more than the first n characters of the character arrays s1 and + s2. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. +*/ +extern int _FUNC(strncmp)(const char* s1, const char* s2, size_t n); + +/* Transform the character array s2 as appropriate for the LC_COLLATE setting of + the current locale. If length of resulting string is less than n, store it in + the character array pointed to by s1. Return the length of the resulting + string. +*/ +extern size_t _FUNC(strxfrm)(char* s1, const char* s2, size_t n); + +/* Search functions */ + +/* Search the first n characters in the memory area pointed to by s for the + character c (interpreted as unsigned char). + Returns a pointer to the first instance found, or NULL. +*/ +extern void* _FUNC(memchr)(const void* s, int c, size_t n); + +/* Search the character array s (including terminating '\0') for the character c + (interpreted as char). + Returns a pointer to the first instance found, or NULL. +*/ +extern char* _FUNC(strchr)(const char* s, int c); + +/* Determine the length of the initial substring of character array s1 which + consists only of characters not from the character array s2. + Returns the length of that substring. +*/ +extern size_t _FUNC(strcspn)(const char* s1, const char* s2); + +/* Search the character array s1 for any character from the character array s2. + Returns a pointer to the first occurrence, or NULL. +*/ +extern char* _FUNC(strpbrk)(const char* s1, const char* s2); + +/* Search the character array s (including terminating '\0') for the character c + (interpreted as char). + Returns a pointer to the last instance found, or NULL. +*/ +extern char* _FUNC(strrchr)(const char * s, int c ); + +/* Determine the length of the initial substring of character array s1 which + consists only of characters from the character array s2. + Returns the length of that substring. +*/ +extern size_t _FUNC(strspn)(const char * s1, const char * s2); + +/* Search the character array s1 for the substring in character array s2. + Returns a pointer to that sbstring, or NULL. If s2 is of length zero, + returns s1. +*/ +extern char* _FUNC(strstr)(const char * s1, const char * s2); + +/* In a series of subsequent calls, parse a C string into tokens. + On the first call to strtok(), the first argument is a pointer to the to-be- + parsed C string. On subsequent calls, the first argument is NULL unless you + want to start parsing a new string. s2 holds an array of separator characters + which can differ from call to call. Leading separators are skipped, the first + trailing separator overwritten with '\0'. + Returns a pointer to the next token. + WARNING: This function uses static storage, and as such is not reentrant. +*/ +extern char* _FUNC(strtok)(char* s1, const char* s2); + +/* Miscellaneous functions */ + +/* Write the character c (interpreted as unsigned char) to the first n + characters of the memory area pointed to by s. + Returns s. +*/ +extern void* _FUNC(memset)(void* s, int c, size_t n); + +/* Map an error number to a (locale-specific) error message string. Error + numbers are typically errno values, but any number is mapped to a message. + TODO: PDCLib does not yet support locales. +*/ +extern char* _FUNC(strerror)(int errnum); + +/* Returns the length of the string s (excluding terminating '\0').*/ +extern size_t _FUNC(strlen)(const char * s); + +/* The function reverses the sequence of characters in the string pointed to by str. */ +extern char* _FUNC(strrev)(char *str); + +/* The strdup function executes the function pointed to by the str argument. */ +extern char* _FUNC(strdup)(const char *str); + +#endif diff --git a/contrib/kolibri-libc/source/include/sys/dirent.h b/contrib/kolibri-libc/source/include/sys/dirent.h new file mode 100644 index 0000000000..584adbea1c --- /dev/null +++ b/contrib/kolibri-libc/source/include/sys/dirent.h @@ -0,0 +1,34 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#ifndef _DIRENT_H_ +#define _DIRENT_H_ + +#include +#include + +#define IS_FOLDER 16 +#define IS_FILE 0 + +typedef unsigned ino_t; + +struct dirent{ + ino_t d_ino; //File serial number. + char d_name[PATH_MAX]; // Name of entry. + unsigned d_type; +}; + +typedef struct{ + struct dirent* objs; + ino_t pos; + ino_t num_objs; +}DIR; + + +int _FUNC(closedir)(DIR *dir); +DIR* _FUNC(opendir)(const char *path); +struct dirent* _FUNC(readdir)(DIR *); +void _FUNC(rewinddir)(DIR *dir); +void _FUNC(seekdir)(DIR *dir, unsigned pos); +unsigned _FUNC(telldir)(DIR *dir); + +#endif // _DIRENT_H_ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/include/sys/socket.h b/contrib/kolibri-libc/source/include/sys/socket.h new file mode 100644 index 0000000000..9dceffd1d0 --- /dev/null +++ b/contrib/kolibri-libc/source/include/sys/socket.h @@ -0,0 +1,244 @@ +/* Copyright (C) 2019-2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#include +#include +#include + +// Socket Types +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 + +// IP protocols +#define IPPROTO_IP 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_TCP 6 +#define IPPROTO_UDP 17 +#define IPPROTO_RAW 255 + +// IP options +#define IP_TTL 2 + +// Address families +#define AF_UNSPEC 0 +#define AF_LOCAL 1 +#define AF_INET 2 // Default INET=IPv4 +#define AF_INET4 2 // IPv4 +#define AF_INET6 10 // IPv6 + +#define PF_UNSPEC AF_UNSPEC +#define PF_LOCAL AF_LOCAL +#define PF_INET4 AF_INET4 +#define PF_INET6 AF_INET6 + +// internal definition +#define AI_SUPPORTED 0x40F + +// for system function 76 +#define API_ETH (0<<16) +#define API_IPv4 (1<<16) +#define API_ICMP (2<<16) +#define API_UDP (3<<16) +#define API_TCP (4<<16) +#define API_ARP (5<<16) +#define API_PPPOE (6<<16) + +// Socket flags for user calls +#define MSG_NOFLAG 0 +#define MSG_PEEK 0x02 +#define MSG_DONTWAIT 0x40 + +// Socket levels +#define SOL_SOCKET 0xffff + +//Socket options +#define SO_BINDTODEVICE (1<<9) +#define SO_NONBLOCK (1<<31) + +#define PORT(X) (X<<8) + +#pragma pack(push,1) +struct sockaddr{ + unsigned short sin_family; + unsigned short sin_port; + unsigned int sin_addr; + unsigned long long sin_zero; +}; + +typedef struct{ + unsigned int level; + unsigned int optionname; + unsigned int optlenght; + unsigned char options; +}optstruct; +#pragma pack(pop) + +static inline +void _conv_socket_err(){ + switch(errno){ + case 1: errno = ENOBUFS; break; + case 2: errno = EINPROGRESS; break; + case 4: errno = EOPNOTSUPP; break; + case 6: errno = EWOULDBLOCK; break; + case 9: errno = ENOTCONN; break; + case 10: errno = EALREADY; break; + case 11: errno = EINVAL; break; + case 12: errno = EMSGSIZE; break; + case 18: errno = ENOMEM; break; + case 20: errno = EADDRINUSE; break; + case 61: errno = ECONNREFUSED; break; + case 52: errno = ECONNRESET; break; + case 56: errno = EISCONN; break; + case 60: errno = ETIMEDOUT; break; + case 54: errno = ECONNABORTED; break; + default: errno = 0; break; + } +} + +static inline +int socket(int domain, int type, int protocol) +{ + int socket; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(socket) + :"a"(75), "b"(0), "c"(domain), "d"(type), "S"(protocol) + ); + _conv_socket_err(); + return socket; +} + +static inline +int close(int socket) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(1), "c"(socket) + ); + _conv_socket_err(); + return status; +} + +static inline +int bind(int socket, const struct sockaddr *addres, int addres_len) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(2), "c"(socket), "d"(addres), "S"(addres_len) + ); + _conv_socket_err(); + return status; +} + +static inline +int listen(int socket, int backlog) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(3), "c"(socket), "d"(backlog) + ); + _conv_socket_err(); + return status; +} + +static inline +int connect(int socket, const struct sockaddr* address, int socket_len) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(4), "c"(socket), "d"(address), "S"(socket_len) + ); + _conv_socket_err(); + return status; +} + +static inline int +accept(int socket, const struct sockaddr *address, int address_len) +{ + int new_socket; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(new_socket) + :"a"(75), "b"(5), "c"(socket), "d"(address), "S"(address_len) + ); + _conv_socket_err(); + return new_socket; +} + +static inline +int send(int socket, const void *message, size_t msg_len, int flag) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(6), "c"(socket), "d"(message), "S"(msg_len), "D"(flag) + ); + _conv_socket_err(); + return status; +} + +static inline +int recv(int socket, void *buffer, size_t buff_len, int flag) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(7), "c"(socket), "d"(buffer), "S"(buff_len), "D"(flag) + ); + _conv_socket_err(); + return status; +} + +static inline +int setsockopt(int socket,const optstruct* opt) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(8), "c"(socket),"d"(opt) + ); + _conv_socket_err(); + return status; +} + +static inline +int getsockopt(int socket, optstruct* opt) +{ + int status; + asm_inline( + "int $0x40" + :"=b"(errno), "=a"(status) + :"a"(75), "b"(9), "c"(socket),"d"(opt) + ); + _conv_socket_err(); + return status; +} + +static inline +int socketpair(int *socket1, int *socket2) +{ + asm_inline( + "int $0x40" + :"=b"(*socket2), "=a"(*socket1) + :"a"(75), "b"(10) + ); + errno=*socket2; + _conv_socket_err(); + return *socket1; +} + +#endif //_SOCKET_H_ diff --git a/contrib/kolibri-libc/source/include/time.h b/contrib/kolibri-libc/source/include/time.h new file mode 100644 index 0000000000..d2b8b17536 --- /dev/null +++ b/contrib/kolibri-libc/source/include/time.h @@ -0,0 +1,30 @@ +#ifndef _TIME_H_ +#define _TIME_H_ + +#include + +typedef unsigned long int clock_t; +typedef unsigned long int time_t; +#define clock() _ksys_get_clock() +#define CLOCKS_PER_SEC 100 + +struct tm { + int tm_sec; /* seconds after the minute 0-61*/ + int tm_min; /* minutes after the hour 0-59 */ + int tm_hour; /* hours since midnight 0-23 */ + int tm_mday; /* day of the month 1-31 */ + int tm_mon; /* months since January 0-11 */ + int tm_year; /* years since 1900 */ + int tm_wday; /* days since Sunday 0-6 */ + int tm_yday; /* days since January 1 0-365 */ + int tm_isdst; /* Daylight Saving Time flag */ +}; + +extern time_t _FUNC(mktime)(struct tm * timeptr); +extern time_t _FUNC(time)(time_t* timer); +extern struct tm * _FUNC(localtime)(const time_t * timer); /* non-standard! ignore parameter and return just time now, not generate tm_isdst, tm_yday, tm_wday == -1 */ +extern double _FUNC(difftime)(time_t end, time_t beginning); + +extern struct tm buffertime; + +#endif \ No newline at end of file diff --git a/contrib/kolibri-libc/source/math/acos.s b/contrib/kolibri-libc/source/math/acos.s new file mode 100644 index 0000000000..80e6ffbe78 --- /dev/null +++ b/contrib/kolibri-libc/source/math/acos.s @@ -0,0 +1,22 @@ +#include "libc/asm.h" + + .text +LC0: + .double 0d1.00000000000000000000e+00 + +MK_C_SYM(acos) + fldl 4(%esp) + fld1 + fsubp %st(0),%st(1) + fsqrt + + fldl 4(%esp) + fld1 + faddp %st(0),%st(1) + fsqrt + + fpatan + + fld %st(0) + faddp + ret diff --git a/contrib/kolibri-libc/source/math/acosh.c b/contrib/kolibri-libc/source/math/acosh.c new file mode 100644 index 0000000000..6e13bbe6ec --- /dev/null +++ b/contrib/kolibri-libc/source/math/acosh.c @@ -0,0 +1,8 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double +acosh(double x) +{ + return log(x + sqrt(x*x - 1)); +} diff --git a/contrib/kolibri-libc/source/math/asin.s b/contrib/kolibri-libc/source/math/asin.s new file mode 100644 index 0000000000..2d40b73f7d --- /dev/null +++ b/contrib/kolibri-libc/source/math/asin.s @@ -0,0 +1,14 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(asin) + fldl 4(%esp) + fld %st(0) + fmulp + fld1 + fsubp + fsqrt + fldl 4(%esp) + fxch %st(1) + fpatan + ret + diff --git a/contrib/kolibri-libc/source/math/asinh.c b/contrib/kolibri-libc/source/math/asinh.c new file mode 100644 index 0000000000..e27e20da7e --- /dev/null +++ b/contrib/kolibri-libc/source/math/asinh.c @@ -0,0 +1,9 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double +asinh(double x) +{ + return x>0 ? log(x + sqrt(x*x + 1)) : -log(sqrt(x*x+1)-x); +} + diff --git a/contrib/kolibri-libc/source/math/atan.s b/contrib/kolibri-libc/source/math/atan.s new file mode 100644 index 0000000000..c75489b646 --- /dev/null +++ b/contrib/kolibri-libc/source/math/atan.s @@ -0,0 +1,8 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(atan) + fldl 4(%esp) + fld1 + fpatan + ret + diff --git a/contrib/kolibri-libc/source/math/atan2.s b/contrib/kolibri-libc/source/math/atan2.s new file mode 100644 index 0000000000..ffbbf10d74 --- /dev/null +++ b/contrib/kolibri-libc/source/math/atan2.s @@ -0,0 +1,35 @@ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" + +.data + .align 2 +nan: + .long 0xffffffff + .byte 0xff + .byte 0xff + .byte 0xff + .byte 0x7f + +.text +MK_C_SYM(atan2) + fldl 4(%esp) + fldl 12(%esp) + ftst + fnstsw %ax + sahf + jne doit + fxch %st(1) + ftst + fnstsw %ax + sahf + je isanan + fxch %st(1) +doit: + fpatan + ret +isanan: + movl $1,C_SYM(errno) + fstp %st(0) + fstp %st(0) + fldl nan + ret diff --git a/contrib/kolibri-libc/source/math/atanh.c b/contrib/kolibri-libc/source/math/atanh.c new file mode 100644 index 0000000000..8335dc78b3 --- /dev/null +++ b/contrib/kolibri-libc/source/math/atanh.c @@ -0,0 +1,8 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double +atanh(double x) +{ + return log((1+x)/(1-x)) / 2.0; +} diff --git a/contrib/kolibri-libc/source/math/ceil.s b/contrib/kolibri-libc/source/math/ceil.s new file mode 100644 index 0000000000..c8d02e1ef9 --- /dev/null +++ b/contrib/kolibri-libc/source/math/ceil.s @@ -0,0 +1,24 @@ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(ceil) + pushl %ebp + movl %esp,%ebp + subl $8,%esp + + fstcw -4(%ebp) + fwait + movw -4(%ebp),%ax + andw $0xf3ff,%ax + orw $0x0800,%ax + movw %ax,-2(%ebp) + fldcw -2(%ebp) + + fldl 8(%ebp) + frndint + + fldcw -4(%ebp) + + movl %ebp,%esp + popl %ebp + ret + diff --git a/contrib/kolibri-libc/source/math/cos.s b/contrib/kolibri-libc/source/math/cos.s new file mode 100644 index 0000000000..7749c73e05 --- /dev/null +++ b/contrib/kolibri-libc/source/math/cos.s @@ -0,0 +1,15 @@ +#include "libc/asm.h" +L0: + .quad 0xffffffffffffffff + +MK_C_SYM(cos) + fldl 4(%esp) + fcos + fstsw + sahf + jnp L1 + fstp %st(0) + fldl L0 +L1: + ret + diff --git a/contrib/kolibri-libc/source/math/cosh.c b/contrib/kolibri-libc/source/math/cosh.c new file mode 100644 index 0000000000..c2cca978ac --- /dev/null +++ b/contrib/kolibri-libc/source/math/cosh.c @@ -0,0 +1,8 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double cosh(double x) +{ + const double ebig = exp(fabs(x)); + return (ebig + 1.0/ebig) / 2.0; +} diff --git a/contrib/kolibri-libc/source/math/exp.s b/contrib/kolibri-libc/source/math/exp.s new file mode 100644 index 0000000000..da49f57369 --- /dev/null +++ b/contrib/kolibri-libc/source/math/exp.s @@ -0,0 +1,31 @@ +#include "libc/asm.h" + .data +LCW1: + .word 0 +LCW2: + .word 0 +LC0: + .double 0d1.0e+00 + + .text + +MK_C_SYM(exp) + fldl 4(%esp) + fldl2e + fmulp + fstcw LCW1 + fstcw LCW2 + fwait + andw $0xf3ff,LCW2 + orw $0x0400,LCW2 + fldcw LCW2 + fldl %st(0) + frndint + fldcw LCW1 + fxch %st(1) + fsub %st(1),%st + f2xm1 + faddl LC0 + fscale + fstp %st(1) + ret diff --git a/contrib/kolibri-libc/source/math/fabs.s b/contrib/kolibri-libc/source/math/fabs.s new file mode 100644 index 0000000000..a40b3179c0 --- /dev/null +++ b/contrib/kolibri-libc/source/math/fabs.s @@ -0,0 +1,6 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(fabs) + fldl 4(%esp) + fabs + ret diff --git a/contrib/kolibri-libc/source/math/floor.s b/contrib/kolibri-libc/source/math/floor.s new file mode 100644 index 0000000000..75f8c4b969 --- /dev/null +++ b/contrib/kolibri-libc/source/math/floor.s @@ -0,0 +1,24 @@ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(floor) + pushl %ebp + movl %esp,%ebp + subl $8,%esp + + fstcw -4(%ebp) + fwait + movw -4(%ebp),%ax + andw $0xf3ff,%ax + orw $0x0400,%ax + movw %ax,-2(%ebp) + fldcw -2(%ebp) + + fldl 8(%ebp) + frndint + + fldcw -4(%ebp) + + movl %ebp,%esp + popl %ebp + ret + diff --git a/contrib/kolibri-libc/source/math/fmod.s b/contrib/kolibri-libc/source/math/fmod.s new file mode 100644 index 0000000000..e74e4e009c --- /dev/null +++ b/contrib/kolibri-libc/source/math/fmod.s @@ -0,0 +1,29 @@ +#include "libc/asm.h" +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ + .data +LCW1: + .word 0 + .align 4 + + .text + +MK_C_SYM(fmod) + fldl 4(%esp) + fldl 12(%esp) + ftst + fnstsw %ax + fxch %st(1) + sahf + jnz next + fstpl %st(0) + jmp out +next: + fprem + fnstsw %ax + sahf + jpe next + fstpl %st(1) +out: + ret + + diff --git a/contrib/kolibri-libc/source/math/frexp.c b/contrib/kolibri-libc/source/math/frexp.c new file mode 100644 index 0000000000..913f16f06b --- /dev/null +++ b/contrib/kolibri-libc/source/math/frexp.c @@ -0,0 +1,26 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double +frexp(double x, int *exptr) +{ + union { + double d; + unsigned char c[8]; + } u; + + u.d = x; + /* + * The format of the number is: + * Sign, 12 exponent bits, 51 mantissa bits + * The exponent is 1023 biased and there is an implicit zero. + * We get the exponent from the upper bits and set the exponent + * to 0x3fe (1022). + */ + *exptr = (int)(((u.c[7] & 0x7f) << 4) | (u.c[6] >> 4)) - 1022; + u.c[7] &= 0x80; + u.c[7] |= 0x3f; + u.c[6] &= 0x0f; + u.c[6] |= 0xe0; + return u.d; +} diff --git a/contrib/kolibri-libc/source/math/hypot.c b/contrib/kolibri-libc/source/math/hypot.c new file mode 100644 index 0000000000..00b81691b4 --- /dev/null +++ b/contrib/kolibri-libc/source/math/hypot.c @@ -0,0 +1,100 @@ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +/* + * hypot() function for DJGPP. + * + * hypot() computes sqrt(x^2 + y^2). The problem with the obvious + * naive implementation is that it might fail for very large or + * very small arguments. For instance, for large x or y the result + * might overflow even if the value of the function should not, + * because squaring a large number might trigger an overflow. For + * very small numbers, their square might underflow and will be + * silently replaced by zero; this won't cause an exception, but might + * have an adverse effect on the accuracy of the result. + * + * This implementation tries to avoid the above pitfals, without + * inflicting too much of a performance hit. + * + */ + +/// #include +#include +#include + +/* Approximate square roots of DBL_MAX and DBL_MIN. Numbers + between these two shouldn't neither overflow nor underflow + when squared. */ +#define __SQRT_DBL_MAX 1.3e+154 +#define __SQRT_DBL_MIN 2.3e-162 + +double +hypot(double x, double y) +{ + double abig = fabs(x), asmall = fabs(y); + double ratio; + + /* Make abig = max(|x|, |y|), asmall = min(|x|, |y|). */ + if (abig < asmall) + { + double temp = abig; + + abig = asmall; + asmall = temp; + } + + /* Trivial case. */ + if (asmall == 0.) + return abig; + + /* Scale the numbers as much as possible by using its ratio. + For example, if both ABIG and ASMALL are VERY small, then + X^2 + Y^2 might be VERY inaccurate due to loss of + significant digits. Dividing ASMALL by ABIG scales them + to a certain degree, so that accuracy is better. */ + + if ((ratio = asmall / abig) > __SQRT_DBL_MIN && abig < __SQRT_DBL_MAX) + return abig * sqrt(1.0 + ratio*ratio); + else + { + /* Slower but safer algorithm due to Moler and Morrison. Never + produces any intermediate result greater than roughly the + larger of X and Y. Should converge to machine-precision + accuracy in 3 iterations. */ + + double r = ratio*ratio, t, s, p = abig, q = asmall; + + do { + t = 4. + r; + if (t == 4.) + break; + s = r / t; + p += 2. * s * p; + q *= s; + r = (q / p) * (q / p); + } while (1); + + return p; + } +} + +#ifdef TEST + +#include + +int +main(void) +{ + printf("hypot(3, 4) =\t\t\t %25.17e\n", hypot(3., 4.)); + printf("hypot(3*10^150, 4*10^150) =\t %25.17g\n", hypot(3.e+150, 4.e+150)); + printf("hypot(3*10^306, 4*10^306) =\t %25.17g\n", hypot(3.e+306, 4.e+306)); + printf("hypot(3*10^-320, 4*10^-320) =\t %25.17g\n", + hypot(3.e-320, 4.e-320)); + printf("hypot(0.7*DBL_MAX, 0.7*DBL_MAX) =%25.17g\n", + hypot(0.7*DBL_MAX, 0.7*DBL_MAX)); + printf("hypot(DBL_MAX, 1.0) =\t\t %25.17g\n", hypot(DBL_MAX, 1.0)); + printf("hypot(1.0, DBL_MAX) =\t\t %25.17g\n", hypot(1.0, DBL_MAX)); + printf("hypot(0.0, DBL_MAX) =\t\t %25.17g\n", hypot(0.0, DBL_MAX)); + + return 0; +} + +#endif diff --git a/contrib/kolibri-libc/source/math/ldexp.c b/contrib/kolibri-libc/source/math/ldexp.c new file mode 100644 index 0000000000..818cab7578 --- /dev/null +++ b/contrib/kolibri-libc/source/math/ldexp.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +#include + +double +ldexp(double v, int e) +{ + double two = 2.0; + + if (e < 0) + { + e = -e; /* This just might overflow on two-complement machines. */ + if (e < 0) return 0.0; + while (e > 0) + { + if (e & 1) v /= two; + two *= two; + e >>= 1; + } + } + else if (e > 0) + { + while (e > 0) + { + if (e & 1) v *= two; + two *= two; + e >>= 1; + } + } + return v; +} + diff --git a/contrib/kolibri-libc/source/math/libc/asm.h b/contrib/kolibri-libc/source/math/libc/asm.h new file mode 100644 index 0000000000..e86280bebb --- /dev/null +++ b/contrib/kolibri-libc/source/math/libc/asm.h @@ -0,0 +1,9 @@ +#ifndef __LIBC_ASM_H +#define __LIBC_ASM_H + +#define C_SYM(x) x +// #define C_SYM(x) _##x + +#define MK_C_SYM(x) .global C_SYM(x); C_SYM(x): + +#endif diff --git a/contrib/kolibri-libc/source/math/log.s b/contrib/kolibri-libc/source/math/log.s new file mode 100644 index 0000000000..7390fb8fd1 --- /dev/null +++ b/contrib/kolibri-libc/source/math/log.s @@ -0,0 +1,7 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(log) + fldln2 + fldl 4(%esp) + fyl2x + ret diff --git a/contrib/kolibri-libc/source/math/modf.s b/contrib/kolibri-libc/source/math/modf.s new file mode 100644 index 0000000000..af742a7f2b --- /dev/null +++ b/contrib/kolibri-libc/source/math/modf.s @@ -0,0 +1,33 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ + .text +#include "libc/asm.h" +MK_C_SYM(modf) + pushl %ebp + movl %esp,%ebp + subl $16,%esp + pushl %ebx + fnstcw -4(%ebp) + fwait + movw -4(%ebp),%ax + orw $0x0c3f,%ax + movw %ax,-8(%ebp) + fldcw -8(%ebp) + fwait + fldl 8(%ebp) + frndint + fstpl -16(%ebp) + fwait + movl -16(%ebp),%edx + movl -12(%ebp),%ecx + movl 16(%ebp),%ebx + movl %edx,(%ebx) + movl %ecx,4(%ebx) + fldl 8(%ebp) + fsubl -16(%ebp) + leal -20(%ebp),%esp + fclex + fldcw -4(%ebp) + fwait + popl %ebx + leave + ret diff --git a/contrib/kolibri-libc/source/math/modfl.s b/contrib/kolibri-libc/source/math/modfl.s new file mode 100644 index 0000000000..a4cca97a4c --- /dev/null +++ b/contrib/kolibri-libc/source/math/modfl.s @@ -0,0 +1,22 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(__modfl) +MK_C_SYM(modfl) + pushl %ebp + movl %esp,%ebp + subl $4,%esp + fldt 8(%ebp) + movl 20(%ebp),%eax + fnstcw -2(%ebp) + movw -2(%ebp),%dx + orb $0x0c,%dh + movw %dx,-4(%ebp) + fldcw -4(%ebp) + fld %st(0) + frndint + fldcw -2(%ebp) + fld %st(0) + fstpt (%eax) + fsubrp %st,%st(1) + leave + ret diff --git a/contrib/kolibri-libc/source/math/pow.s b/contrib/kolibri-libc/source/math/pow.s new file mode 100644 index 0000000000..f6a3e8bf64 --- /dev/null +++ b/contrib/kolibri-libc/source/math/pow.s @@ -0,0 +1,86 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" + .data +yint: + .word 0,0 +LCW1: + .word 0 +LCW2: + .word 0 + + .text +LC0: + .double 0d1.0e+00 + +frac: + fstcw LCW1 + fstcw LCW2 + fwait + andw $0xf3ff,LCW2 + orw $0x0400,LCW2 + fldcw LCW2 + fldl %st(0) + frndint + fldcw LCW1 + fxch %st(1) + fsub %st(1),%st + ret + +Lpow2: + call frac + f2xm1 + faddl LC0 + fscale + fstp %st(1) + ret + +MK_C_SYM(pow) + fldl 12(%esp) + fldl 4(%esp) + ftst + fnstsw %ax + sahf + jbe xltez + fyl2x + jmp Lpow2 +xltez: + jb xltz + fstp %st(0) + ftst + fnstsw %ax + sahf + ja ygtz + jb error + fstp %st(0) + fld1 + fchs +error: + fsqrt + ret +ygtz: + fstp %st(0) + fldz + ret +xltz: + fabs + fxch %st(1) + call frac + ftst + fnstsw %ax + fstp %st(0) + sahf + je yisint + fstp %st(0) + fchs + jmp error +yisint: + fistl yint + fxch %st(1) + fyl2x + call Lpow2 + andl $1,yint + jz yeven + fchs +yeven: + ret + diff --git a/contrib/kolibri-libc/source/math/pow10.s b/contrib/kolibri-libc/source/math/pow10.s new file mode 100644 index 0000000000..461336ebeb --- /dev/null +++ b/contrib/kolibri-libc/source/math/pow10.s @@ -0,0 +1,33 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" + .data +LCW1: + .word 0 +LCW2: + .word 0 +LC0: + .double 0d1.0e+00 + + .text + +MK_C_SYM(__pow10) +MK_C_SYM(pow10) + fldl 4(%esp) + fldl2t + fmulp + fstcw LCW1 + fstcw LCW2 + fwait + andw $0xf3ff,LCW2 + orw $0x0400,LCW2 + fldcw LCW2 + fldl %st(0) + frndint + fldcw LCW1 + fxch %st(1) + fsub %st(1),%st + f2xm1 + faddl LC0 + fscale + fstp %st(1) + ret diff --git a/contrib/kolibri-libc/source/math/pow2.s b/contrib/kolibri-libc/source/math/pow2.s new file mode 100644 index 0000000000..df86a345e5 --- /dev/null +++ b/contrib/kolibri-libc/source/math/pow2.s @@ -0,0 +1,31 @@ +/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" + .data +LCW1: + .word 0 +LCW2: + .word 0 +LC0: + .double 0d1.0e+00 + + .text + +MK_C_SYM(__pow2) +MK_C_SYM(pow2) + fldl 4(%esp) + fstcw LCW1 + fstcw LCW2 + fwait + andw $0xf3ff,LCW2 + orw $0x0400,LCW2 + fldcw LCW2 + fldl %st(0) + frndint + fldcw LCW1 + fxch %st(1) + fsub %st(1),%st + f2xm1 + faddl LC0 + fscale + fstp %st(1) + ret diff --git a/contrib/kolibri-libc/source/math/sin.s b/contrib/kolibri-libc/source/math/sin.s new file mode 100644 index 0000000000..d914133b05 --- /dev/null +++ b/contrib/kolibri-libc/source/math/sin.s @@ -0,0 +1,16 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +L0: + .quad 0xffffffffffffffff + +MK_C_SYM(sin) + fldl 4(%esp) + fsin + fstsw + sahf + jnp L1 + fstp %st(0) + fldl L0 +L1: + ret + diff --git a/contrib/kolibri-libc/source/math/sinh.c b/contrib/kolibri-libc/source/math/sinh.c new file mode 100644 index 0000000000..d00e2803e1 --- /dev/null +++ b/contrib/kolibri-libc/source/math/sinh.c @@ -0,0 +1,16 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double sinh(double x) +{ + if(x >= 0.0) + { + const double epos = exp(x); + return (epos - 1.0/epos) / 2.0; + } + else + { + const double eneg = exp(-x); + return (1.0/eneg - eneg) / 2.0; + } +} diff --git a/contrib/kolibri-libc/source/math/sqrt.s b/contrib/kolibri-libc/source/math/sqrt.s new file mode 100644 index 0000000000..42f5be7757 --- /dev/null +++ b/contrib/kolibri-libc/source/math/sqrt.s @@ -0,0 +1,6 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +MK_C_SYM(sqrt) + fldl 4(%esp) + fsqrt + ret diff --git a/contrib/kolibri-libc/source/math/tan.s b/contrib/kolibri-libc/source/math/tan.s new file mode 100644 index 0000000000..447463143b --- /dev/null +++ b/contrib/kolibri-libc/source/math/tan.s @@ -0,0 +1,16 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include "libc/asm.h" +L0: + .quad 0xffffffffffffffff + +MK_C_SYM(tan) + fldl 4(%esp) + fptan + fstsw + fstp %st(0) + sahf + jnp L1 +/* fstp %st(0) - if exception, there is nothing on the stack */ + fldl L0 +L1: + ret diff --git a/contrib/kolibri-libc/source/math/tanh.c b/contrib/kolibri-libc/source/math/tanh.c new file mode 100644 index 0000000000..c2eb966319 --- /dev/null +++ b/contrib/kolibri-libc/source/math/tanh.c @@ -0,0 +1,17 @@ +/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#include + +double tanh(double x) +{ + if (x > 50) + return 1; + else if (x < -50) + return -1; + else + { + const double ebig = exp(x); + const double esmall = 1.0/ebig; + return (ebig - esmall) / (ebig + esmall); + } +} + diff --git a/contrib/kolibri-libc/source/setjmp/longjmp.s b/contrib/kolibri-libc/source/setjmp/longjmp.s new file mode 100644 index 0000000000..f946d34c21 --- /dev/null +++ b/contrib/kolibri-libc/source/setjmp/longjmp.s @@ -0,0 +1,15 @@ +.global _longjmp +.global longjmp + +_longjmp: +longjmp: + mov 4(%esp),%edx + mov 8(%esp),%eax + cmp $1,%eax + adc $0, %al + mov (%edx),%ebx + mov 4(%edx),%esi + mov 8(%edx),%edi + mov 12(%edx),%ebp + mov 16(%edx),%esp + jmp *20(%edx) diff --git a/contrib/kolibri-libc/source/setjmp/setjmp.s b/contrib/kolibri-libc/source/setjmp/setjmp.s new file mode 100644 index 0000000000..d59c79c2ba --- /dev/null +++ b/contrib/kolibri-libc/source/setjmp/setjmp.s @@ -0,0 +1,20 @@ +.global ___setjmp +.global __setjmp +.global _setjmp +.global setjmp + +___setjmp: +__setjmp: +_setjmp: +setjmp: + mov 4(%esp), %eax + mov %ebx, (%eax) + mov %esi, 4(%eax) + mov %edi, 8(%eax) + mov %ebp, 12(%eax) + lea 4(%esp), %ecx + mov %ecx, 16(%eax) + mov (%esp), %ecx + mov %ecx, 20(%eax) + xor %eax, %eax + ret diff --git a/contrib/kolibri-libc/source/stdio/clearerr.c b/contrib/kolibri-libc/source/stdio/clearerr.c new file mode 100644 index 0000000000..b50b929362 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/clearerr.c @@ -0,0 +1,6 @@ +#include + +void clearerr(FILE *stream) { + stream->error = 0; + stream->eof = 0; +} diff --git a/contrib/kolibri-libc/source/stdio/conio.c b/contrib/kolibri-libc/source/stdio/conio.c new file mode 100644 index 0000000000..74af6ee943 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/conio.c @@ -0,0 +1,56 @@ +#include +#include "conio.h" + +static char* __con_caption = "Console application"; +static char* __con_dllname = "/sys/lib/console.obj"; + +int __con_is_load = 0; + +unsigned *__con_dll_ver; +void stdcall (*__con_init_hidden)(int wnd_width, int wnd_height,int scr_width, int scr_height, const char* title); +void stdcall (*__con_write_asciiz)(const char* str); +void stdcall (*__con_write_string)(const char* str, unsigned length); +int stdcall (*__con_getch)(void); +short stdcall (*__con_getch2)(void); +int stdcall (*__con_kbhit)(void); +char* stdcall (*__con_gets)(char* str, int n); +char* stdcall (*__con_gets2)(__con_gets2_callback callback, char* str, int n); +void stdcall (*__con_exit)(int status); + +static void __con_lib_link(ksys_coff_etable_t *exp) +{ + __con_dll_ver = _ksys_cofflib_getproc(exp, "con_dll_ver"); + __con_init_hidden = _ksys_cofflib_getproc(exp, "con_init"); + __con_write_asciiz = _ksys_cofflib_getproc(exp, "con_write_asciiz"); + __con_write_string = _ksys_cofflib_getproc(exp, "con_write_string"); + __con_getch = _ksys_cofflib_getproc(exp, "con_getch"); + __con_getch2 = _ksys_cofflib_getproc(exp, "con_getch2"); + __con_kbhit = _ksys_cofflib_getproc(exp, "con_kbhit"); + __con_gets = _ksys_cofflib_getproc(exp, "con_gets"); + __con_gets2 = _ksys_cofflib_getproc(exp, "con_gets2"); + __con_exit = _ksys_cofflib_getproc(exp, "con_exit"); +} + + +int __con_init(void) +{ + return __con_init_opt(-1, -1, -1, -1, __con_caption); +} + + +int __con_init_opt(int wnd_width, int wnd_height,int scr_width, int scr_height, const char* title) +{ + if(!__con_is_load){ + ksys_coff_etable_t *__con_lib; + __con_lib = _ksys_cofflib_load(__con_dllname); + if(__con_lib==NULL){ + _ksys_debug_puts("Error! Can't load console.obj lib\n"); + return 1; + } + __con_lib_link(__con_lib); + __con_init_hidden(wnd_width, wnd_height, scr_width, scr_height, title); + __con_is_load= 1; + return 0; + } + return 1; +} diff --git a/contrib/kolibri-libc/source/stdio/conio.h b/contrib/kolibri-libc/source/stdio/conio.h new file mode 100644 index 0000000000..b5a4cef206 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/conio.h @@ -0,0 +1,76 @@ +/* + +This is adapded thunk for console.obj sys library +Only for internal use in stdio.h + +Adapted for tcc by Siemargl, 2016 + +*/ +#ifndef _CONIO_H_ +#define _CONIO_H_ + +#define cdecl __attribute__ ((cdecl)) +#define stdcall __attribute__ ((stdcall)) + +extern void stdcall (*__con_write_asciiz)(const char* str); +/* Display ASCIIZ-string to the console at the current position, shifting +the current position. */ + +extern void stdcall (*__con_write_string)(const char* str, unsigned length); +/* Similar to __con_write_asciiz, but length of the string must be given as a +separate parameter */ + +extern int stdcall (*__con_getch)(void); +/* Get one character from the keyboard. + +For normal characters function returns ASCII-code. For extended +characters (eg, Fx, and arrows), first function call returns 0 +and second call returns the extended code (similar to the DOS-function +input). Starting from version 7, after closing the console window, +this function returns 0. */ + +extern short stdcall (*__con_getch2)(void); +/* Reads a character from the keyboard. Low byte contains the ASCII-code +(0 for extended characters), high byte - advanced code (like in BIOS +input functions). Starting from version 7, after closing the console +window, this function returns 0. */ + +extern int stdcall (*__con_kbhit)(void); +/* Returns 1 if a key was pressed, 0 otherwise. To read pressed keys use +__con_getch and __con_getch2. Starting from version 6, after closing +the console window, this function returns 1. */ + +extern char* stdcall (*__con_gets)(char* str, int n); +/* Reads a string from the keyboard. Reading is interrupted when got +"new line" character, or after reading the (n-1) characters (depending on +what comes first). In the first case the newline is also recorded in the +str. The acquired line is complemented by a null character. +Starting from version 6, the function returns a pointer to the entered +line if reading was successful, and NULL if the console window was closed. */ + +typedef int (stdcall * __con_gets2_callback)(int keycode, char** pstr, int* pn, + int* ppos); + +extern char* stdcall (*__con_gets2)(__con_gets2_callback callback, char* str, int n); +/* Con_gets completely analogous, except that when the user +press unrecognized key, it calls the specified callback-procedure +(which may, for example, handle up / down for history and tab to enter +autocompletion). You should pass to the procedure: key code and three pointers +- to the string, to the maximum length and to the current position. +function may change the contents of string and may change the string +itself (for example, to reallocate memory for increase the limit), +maximum length, and position of the line - pointers are passed for it. +Return value: 0 = line wasn't changed 1 = line changed, you should +remove old string and display new, 2 = line changed, it is necessary +to display it; 3 = immediately exit the function. +Starting from version 6, the function returns a pointer to the entered +line with the successful reading, and NULL if the console window was closed. */ + +extern int __con_is_load; +extern unsigned *__con_dll_ver; + +extern int __con_init(void); +extern int __con_init_opt(int wnd_width, int wnd_height, int scr_width, int scr_height, const char* title); +extern void stdcall (*__con_exit)(int status); + +#endif diff --git a/contrib/kolibri-libc/source/stdio/debug_printf.c b/contrib/kolibri-libc/source/stdio/debug_printf.c new file mode 100644 index 0000000000..0487ff8712 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/debug_printf.c @@ -0,0 +1,14 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include + +void debug_printf(const char *format,...) +{ + va_list ap; + char log_board[300]; + va_start (ap, format); + vsnprintf(log_board, 300, format, ap); + va_end(ap); + _ksys_debug_puts(log_board); +} diff --git a/contrib/kolibri-libc/source/stdio/fclose.c b/contrib/kolibri-libc/source/stdio/fclose.c new file mode 100644 index 0000000000..8f558f4778 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fclose.c @@ -0,0 +1,7 @@ +#include +#include + +int fclose(FILE *stream) { + free(stream); + return 0; +} diff --git a/contrib/kolibri-libc/source/stdio/feof.c b/contrib/kolibri-libc/source/stdio/feof.c new file mode 100644 index 0000000000..4b5cb4bde2 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/feof.c @@ -0,0 +1,5 @@ +#include + +int feof(FILE *stream) { + return stream->eof; +} diff --git a/contrib/kolibri-libc/source/stdio/ferror.c b/contrib/kolibri-libc/source/stdio/ferror.c new file mode 100644 index 0000000000..c87d1516a2 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/ferror.c @@ -0,0 +1,5 @@ +#include + +int ferror(FILE *stream) { + return stream->error; +} diff --git a/contrib/kolibri-libc/source/stdio/fflush.c b/contrib/kolibri-libc/source/stdio/fflush.c new file mode 100644 index 0000000000..d6ad8ab510 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fflush.c @@ -0,0 +1,5 @@ +#include + +int fflush(FILE *stream) { + return 0; +} diff --git a/contrib/kolibri-libc/source/stdio/fgetc.c b/contrib/kolibri-libc/source/stdio/fgetc.c new file mode 100644 index 0000000000..089da0807d --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fgetc.c @@ -0,0 +1,11 @@ +#include + +int fgetc(FILE* stream) +{ + int c, rc; + rc = fread(&c, sizeof(char), 1, stream); + if(rc<1){ + return EOF; + } + return c; +} diff --git a/contrib/kolibri-libc/source/stdio/fgetpos.c b/contrib/kolibri-libc/source/stdio/fgetpos.c new file mode 100644 index 0000000000..cce4f9a2d9 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fgetpos.c @@ -0,0 +1,6 @@ +#include + +int fgetpos(FILE *restrict stream, fpos_t *restrict pos) { + *pos = stream->position; + return 0; +} diff --git a/contrib/kolibri-libc/source/stdio/fgets.c b/contrib/kolibri-libc/source/stdio/fgets.c new file mode 100644 index 0000000000..300ae09f7d --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fgets.c @@ -0,0 +1,24 @@ +#include +#include "conio.h" +#include + +char *fgets(char *str, int n, FILE *stream) +{ + int i=0, sym_code; + + if(!stream || !str){ + errno = EINVAL; + return NULL; + } + + while (i +#include + +FILE *fopen(const char *restrict _name, const char *restrict _mode) { + FILE *out = malloc(sizeof(FILE)); + return freopen(_name, _mode, out); +} diff --git a/contrib/kolibri-libc/source/stdio/format_print.c b/contrib/kolibri-libc/source/stdio/format_print.c new file mode 100644 index 0000000000..dd56107781 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/format_print.c @@ -0,0 +1,816 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. These routines are thread +// safe and reentrant! +// Use this instead of the bloated standard/newlib printf cause these use +// malloc for printf (and may not be thread safe). +// +/////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include "format_print.h" + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE +#define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE +#define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_FLOAT +#define PRINTF_SUPPORT_FLOAT +#endif + +// support for exponential floating point notation (%e/%g) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL +#define PRINTF_SUPPORT_EXPONENTIAL +#endif + +// define the default floating point precision +// default: 6 digits +#ifndef PRINTF_DEFAULT_FLOAT_PRECISION +#define PRINTF_DEFAULT_FLOAT_PRECISION 6U +#endif + +// define the largest float suitable to print with %f +// default: 1e9 +#ifndef PRINTF_MAX_FLOAT +#define PRINTF_MAX_FLOAT 1e9 +#endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG +#define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T +#define PRINTF_SUPPORT_PTRDIFF_T +#endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + + +// import float.h for DBL_MAX +#if defined(PRINTF_SUPPORT_FLOAT) +#include +#endif + + +// internal buffer output +void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen) +{ + if (idx < maxlen) { + ((char*)buffer)[idx] = character; + } +} + + +// internal null output +void _out_null(char character, void* buffer, size_t idx, size_t maxlen) +{ + (void)character; (void)buffer; (void)idx; (void)maxlen; +} + + +// internal secure strlen +// \return The length of the string (excluding the terminating 0) limited by 'maxsize' +static inline unsigned int _strnlen_s(const char* str, size_t maxsize) +{ + const char* s; + for (s = str; *s && maxsize--; ++s); + return (unsigned int)(s - str); +} + + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) +{ + return (ch >= '0') && (ch <= '9'); +} + + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char** str) +{ + unsigned int i = 0U; + while (_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type out, char* buffer, size_t idx, size_t maxlen, const char* buf, size_t len, unsigned int width, unsigned int flags) +{ + const size_t start_idx = idx; + + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + for (size_t i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + while (len) { + out(buf[--len], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + + +// internal itoa format +static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, char* buf, size_t len, bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +{ + // pad leading zeros + if (!(flags & FLAGS_LEFT)) { + if (width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while ((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + // handle hash + if (flags & FLAGS_HASH) { + if (!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { + len--; + if (len && (base == 16U)) { + len--; + } + } + if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if (len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + if (len < PRINTF_NTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } + else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + + +// internal itoa for 'long' type +static size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} + + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long long value, bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + + +#if defined(PRINTF_SUPPORT_FLOAT) + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT +static size_t _etoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags); +#endif + + +// internal ftoa for fixed decimal floating point +static size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // powers of 10 + static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + + // test for special values + if (value != value) + return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); + if (value < -DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); + if (value > DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, flags); + + // test for very large values + // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad + if ((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); +#else + return 0U; +#endif + } + + // test for negative + bool negative = false; + if (value < 0) { + negative = true; + value = 0 - value; + } + + // set default precision, if not set explicitly + if (!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; + } + + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if (diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if (frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } + else if (diff < 0.5) { + } + else if ((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + if (prec == 0U) { + diff = value - (double)whole; + if ((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } + else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while (len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if (!(frac /= 10U)) { + break; + } + } + // add extra 0s + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if (len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while (len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if (!(whole /= 10)) { + break; + } + } + + // pad leading zeros + if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + if (len < PRINTF_FTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } + else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse +static size_t _etoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +{ + // check for NaN and special values + if ((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { + return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign + const bool negative = value < 0; + if (negative) { + value = -value; + } + + // default precision + if (!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + + // determine the decimal exponent + // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) + union { + uint64_t U; + double F; + } conv; + + conv.F = value; + int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 + conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) + // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 + int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); + // now we want to compute 10^expval but we want to be sure it won't overflow + exp2 = (int)(expval * 3.321928094887362 + 0.5); + const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; + const double z2 = z * z; + conv.U = (uint64_t)(exp2 + 1023) << 52U; + // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex + conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); + // correct for rounding errors + if (value < conv.F) { + expval--; + conv.F /= 10; + } + + // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters + unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; + + // in "%g" mode, "prec" is the number of *significant figures* not decimals + if (flags & FLAGS_ADAPT_EXP) { + // do we want to fall-back to "%f" mode? + if ((value >= 1e-4) && (value < 1e6)) { + if ((int)prec > expval) { + prec = (unsigned)((int)prec - expval - 1); + } + else { + prec = 0; + } + flags |= FLAGS_PRECISION; // make sure _ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; + } + else { + // we use one sigfig for the whole part + if ((prec > 0) && (flags & FLAGS_PRECISION)) { + --prec; + } + } + } + + // will everything fit? + unsigned int fwidth = width; + if (width > minwidth) { + // we didn't fall-back so subtract the characters required for the exponent + fwidth -= minwidth; + } else { + // not enough characters, so go back to default sizing + fwidth = 0U; + } + if ((flags & FLAGS_LEFT) && minwidth) { + // if we're padding on the right, DON'T pad the floating part + fwidth = 0U; + } + + // rescale the float value + if (expval) { + value /= conv.F; + } + + // output the floating part + const size_t start_idx = idx; + idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if (minwidth) { + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value + idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth-1, FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) out(' ', buffer, idx++, maxlen); + } + } + return idx; +} +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + + +// internal vsnprintf +int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va) +{ + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if (!buffer) { + // use null output function + out = _out_null; + } + + while (*format) + { + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } + else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch (*format) { + case '0': flags |= FLAGS_ZEROPAD; format++; n = 1U; break; + case '-': flags |= FLAGS_LEFT; format++; n = 1U; break; + case '+': flags |= FLAGS_PLUS; format++; n = 1U; break; + case ' ': flags |= FLAGS_SPACE; format++; n = 1U; break; + case '#': flags |= FLAGS_HASH; format++; n = 1U; break; + default : n = 0U; break; + } + } while (n); + + // evaluate width field + width = 0U; + if (_is_digit(*format)) { + width = _atoi(&format); + } + else if (*format == '*') { + const int w = va_arg(va, int); + if (w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int)-w; + } + else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if (*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if (_is_digit(*format)) { + precision = _atoi(&format); + } + else if (*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } + } + + // evaluate length field + switch (*format) { + case 'l' : + flags |= FLAGS_LONG; + format++; + if (*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h' : + flags |= FLAGS_SHORT; + format++; + if (*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't' : + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j' : + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z' : + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default : + break; + } + + // evaluate specifier + switch (*format) { + case 'd' : + case 'i' : + case 'u' : + case 'x' : + case 'X' : + case 'o' : + case 'b' : { + // set the base + unsigned int base; + if (*format == 'x' || *format == 'X') { + base = 16U; + } + else if (*format == 'o') { + base = 8U; + } + else if (*format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if (*format == 'X') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if ((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if (flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if ((*format == 'i') || (*format == 'd')) { + // signed + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + } + else { + const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + } + } + else { + // unsigned + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); + } + else { + const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); + } + } + format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f' : + case 'F' : + if (*format == 'F') flags |= FLAGS_UPPERCASE; + idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + case 'e': + case 'E': + case 'g': + case 'G': + if ((*format == 'g')||(*format == 'G')) flags |= FLAGS_ADAPT_EXP; + if ((*format == 'E')||(*format == 'G')) flags |= FLAGS_UPPERCASE; + idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + case 'c' : { + unsigned int l = 1U; + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's' : { + const char* p = va_arg(va, char*); + unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 'p' : { + width = sizeof(void*) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; +#if defined(PRINTF_SUPPORT_LONG_LONG) + const bool is_ll = sizeof(uintptr_t) == sizeof(long long); + if (is_ll) { + idx = _ntoa_long_long(out, buffer, idx, maxlen, (uintptr_t)va_arg(va, void*), false, 16U, precision, width, flags); + } + else { +#endif + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)((uintptr_t)va_arg(va, void*)), false, 16U, precision, width, flags); +#if defined(PRINTF_SUPPORT_LONG_LONG) + } +#endif + format++; + break; + } + + case '%' : + out('%', buffer, idx++, maxlen); + format++; + break; + + default : + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/format_print.h b/contrib/kolibri-libc/source/stdio/format_print.h new file mode 100644 index 0000000000..1f13c4c41c --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/format_print.h @@ -0,0 +1,12 @@ +#include +#include + +typedef struct { + void (*fct)(char character, void* arg); + void* arg; +} out_fct_wrap_type; + +typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen); +extern void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen); +extern void _out_null(char character, void* buffer, size_t idx, size_t maxlen); +extern int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va); diff --git a/contrib/kolibri-libc/source/stdio/format_scan.c b/contrib/kolibri-libc/source/stdio/format_scan.c new file mode 100644 index 0000000000..84b74fa339 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/format_scan.c @@ -0,0 +1,403 @@ +/* + function for format read from any source + +Siemargl formats as http://www.cplusplus.com/reference/cstdio/scanf/, no wchar though +http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap05.html is used too + +todo: +[characters], [^characters] +-%n nothing scanned, filled only if good result +-%d, i, u, o, x, p read similar - detect base by prefix 0 or 0x +-%a +-can overflow unsigned as signed +-radix point always '.', no LOCALEs +*/ + +#include +#include +#include +#include +#include "format_scan.h" + +static int __try_parse_real(long double *real, int ch, const void *src, void *save, virtual_getc vgetc, virtual_ungetc vungetc) +// returns 1 if OK, -1 == EOF, -2 parse broken +{ + int sign = 1, have_digits = 0; + long long div; + + if (ch == '+') + { + ch = vgetc(save, src); + if (ch == EOF) return EOF; + } else + if (ch == '-') + { + sign = -1; + ch = vgetc(save, src); + if (ch == EOF) return EOF; + }; + *real = 0.0; + for (;;) // mantissa before point + { + // test ch is valid + if (isdigit(ch)) + { + *real = *real * 10 + ch - '0'; + have_digits++; + ch = vgetc(save, src); + if (ch == EOF || isspace(ch)) break; // ok, just finish num + } else + if (ch == '.' || ch == 'E' || ch == 'e') + { + break; // ok + } + else + { + vungetc(save, ch, src); + break; + } + } + if (ch != '.' && ch != 'E' && ch != 'e') // ok, just integer part + { + *real *= sign; + if (have_digits) + return 1; + else + return -2; + } + + if(ch == '.') + { + ch = vgetc(save, src); + div = 10; // use as divisor + for (;;) // mantissa after point + { + // test ch is valid + if (isdigit(ch)) + { + *real += (double)(ch - '0') / div; + div *= 10; + have_digits++; + ch = vgetc(save, src); + if (ch == EOF || isspace(ch)) break; // ok, just finish num + } else + if (ch == 'E' || ch == 'e') + { + break; // ok + } + else + { + vungetc(save, ch, src); + break; + } + } + if (ch != 'E' && ch != 'e') // ok, real as XX.YY + { + *real *= sign; + if (have_digits) + return 1; + else + return -2; + } + } + + ch = vgetc(save, src); + *real *= sign; + // exponent + sign = 1; + if (ch == '+') + { + ch = vgetc(save, src); + if (ch == EOF) return EOF; + } else + if (ch == '-') + { + sign = -1; + ch = vgetc(save, src); + if (ch == EOF) return EOF; + }; + div = 0; + for (;;) + { + // test ch is valid + if (isdigit(ch)) + { + div = div * 10 + ch - '0'; + ch = vgetc(save, src); + if (ch == EOF || isspace(ch)) break; // ok, just finish num + } + else + { + vungetc(save, ch, src); + break; + } + } + div *= sign; + *real *= pow(10, div); + + return 1; +} + +static int __try_parse_int(long long *digit, int ch, const void *src, void *save, virtual_getc vgetc, virtual_ungetc vungetc) +{ + int sign = 1, base = 10, have_digits = 0; + + if (ch == '+') + { + ch = vgetc(save, src); + if (ch == EOF) return EOF; + } else + if (ch == '-') + { + sign = -1; + ch = vgetc(save, src); + if (ch == EOF) return EOF; + }; + + if (ch == '0') // octal or hex, read next + { + base = 8; + ch = vgetc(save, src); + if (ch == EOF || isspace(ch)) + have_digits++; + else + if (ch == 'x' || ch == 'X') + { + base = 16; + ch = vgetc(save, src); + if (ch == EOF) return EOF; + } + } + *digit = 0; + for (;;) + { + // test ch is valid + if ((isdigit(ch) && base == 10) || + (isdigit(ch) && base == 8 && ch < '8') || + (isxdigit(ch) && base == 16)) + { + if (base == 16) + { + if (ch <= '9') ch-= '0'; + else + if (ch <= 'F') ch = 10 + ch - 'A'; + else + ch = 10 + ch - 'a'; + } + else + ch -= '0'; + *digit = *digit * base + ch; + have_digits++; + ch = vgetc(save, src); + if (ch == EOF || isspace(ch)) break; // ok, just finish num + } + else if (ch == EOF || isspace(ch)) + break; + else + { + vungetc(save, ch, src); + break; + } + } + *digit *= sign; + if (have_digits) + return 1; + else + return -2; +} + + + +int _format_scan(const void *src, const char *fmt, va_list argp, virtual_getc vgetc, virtual_ungetc vungetc) +{ + int i; + int length; + int fmt1, fmt2; // width, precision + size_t pos, posc; + const char *fmtc; // first point to %, fmtc points to specifier + int ch; + int format_flag; + int flag_long; // 2 = long double or long long int or wchar + int *point_to_n = NULL, nread = 0; + int flags; // parsed flags + int save = 0; + char *arg_str; + int *arg_int; + long *arg_long; + long long *arg_longlong; + float *arg_float; + double *arg_double; + long double *arg_longdouble; + long long digit; + long double real; + + + pos = 0; + while(*fmt) + { + while (*fmt && isspace(*fmt)) fmt++; // skip paces in format str + + if (*fmt != '%') // usual char + { + ch = vgetc(&save, src); + if (ch != *fmt++) // char not match format + { + vungetc(&save, ch, src); + break; + } + pos++; + continue; + } + + if (*(fmt + 1) == '%') // %% + { + ch = vgetc(&save, src); + if (ch != '%') // char not match format + { + vungetc(&save, ch, src); + break; + } + pos++; + fmt += 2; + continue; + } + //checking to containg format in the string + fmtc = fmt; + posc = pos; + + flags = 0; + format_flag = 0; + flag_long = 0; // 2 = long double or long long int or wchar + + while(*fmtc != '\0' && !format_flag) // searching end of format + { + fmtc++; posc++; + switch( *fmtc ) + { + case 'a': + format_flag = 1; + flags |= flag_unsigned; + break; + case 'c': case 'd': case 'i': case 'e': case 'f': case 'g': case 's': case 'n': + format_flag = 1; + break; + case 'l': + flag_long = flag_long ? 2 : 1; // ll.eq.L + break; + case 'L': + flag_long = 2; + break; + case 'o': case 'u': case 'x': case 'p': + format_flag = 1; + flags |= flag_unsigned; + break; + case '*': case '.': // just skip + break; + default: + if(isdigit(*fmtc)) break; + goto exit_me; // non format char found - user error + } + } + + if (format_flag == 0) + { + goto exit_me; // format char not found - user error + } + + fmt1 = 0; + fmt2 = 0; + if (posc - pos > 1) // try to read width, precision + { + fmt++; + for(i = pos + 1; i < posc; i++) + { + switch(*fmt) + { + case '0': + if(fmt1 == 0 && (flags & flag_point) == 0) flags |= flag_lead_zeros; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if ((flags & flag_point) == 0) + fmt1 = fmt1 * 10 + (*fmt -'0'); + else + fmt2 = fmt2 * 10 + (*fmt -'0'); + break; + case '*': // ignoring + break; + case '.': + flags |= flag_point; + break; + case 'l': case 'L': // valid chars - skip + break; + default: // must be error + goto exit_me; // format char not found - user error + } + fmt++; + } + } + + // do real work - format arguments values + // skip input spaces + do { + ch = vgetc(&save, src); + if (ch == EOF) goto exit_me; + } while (isspace(ch)); + + switch(*fmtc) + { + case 'n': + point_to_n = va_arg(argp, int*); + vungetc(&save, ch, src); + break; + case 'c': // read width chars, ever spaces + arg_str = va_arg(argp, char*); + if (fmt1 == 0) length = 1; + else length = fmt1; + for (i = 0; i < length;) + { + *arg_str++ = ch; i++; + ch = vgetc(&save, src); + if (ch == EOF) break; + } + if (i < length) goto exit_me; // not enough chars + break; + case 's': + arg_str = va_arg(argp, char*); + if (fmt1 == 0) length = 4095; // max string scan 4096 + else length = fmt1; + for (i = 0; i < length; i++) + { + *arg_str++ = ch; + ch = vgetc(&save, src); + if (ch == EOF || isspace(ch)) break; // ok, just finish string + } + *arg_str++ = '\0'; + break; + case 'd': case 'i': case 'u': + case 'o': case 'p': case 'x': + i = __try_parse_int(&digit, ch, src, &save, vgetc, vungetc); + if (i < 0) goto exit_me; + + if (flag_long == 0) { arg_int = va_arg(argp, int*); *arg_int = (int)digit; } else + if (flag_long == 1) { arg_long = va_arg(argp, long*); *arg_long = (long)digit; } else + if (flag_long == 2) { arg_longlong = va_arg(argp, long long*); *arg_longlong = digit; } + break; + case 'a': case 'A': case 'f': case 'F': + case 'e': case 'E': + case 'g': case 'G': + i = __try_parse_real(&real, ch, src, &save, vgetc, vungetc); + if (i < 0) goto exit_me; + + if (flag_long == 0) { arg_float = va_arg(argp, float*); *arg_float = (float)real; } else + if (flag_long == 1) { arg_double = va_arg(argp, double*); *arg_double = (double)real; } else + if (flag_long == 2) { arg_longdouble = va_arg(argp, long double*); *arg_longdouble = real; } + break; + } + + fmt = fmtc + 1; + nread++; + } +exit_me: + if (point_to_n) *point_to_n = nread; + return nread; +} diff --git a/contrib/kolibri-libc/source/stdio/format_scan.h b/contrib/kolibri-libc/source/stdio/format_scan.h new file mode 100644 index 0000000000..b362d20b15 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/format_scan.h @@ -0,0 +1,20 @@ +#include + +typedef int (*virtual_getc)(void *sp, const void *obj); +typedef void (*virtual_ungetc)(void *sp, int c, const void *obj); + +enum flags_t +{ + flag_unsigned = 0x02, + flag_register = 0x04, + flag_plus = 0x08, + flag_left_just = 0x10, + flag_lead_zeros = 0x20, + flag_space_plus = 0x40, + flag_hash_sign = 0x80, + flag_point = 0x100 +}; + +extern char *__scanf_buffer; + +int _format_scan(const void *src, const char *fmt, va_list argp, virtual_getc vgetc, virtual_ungetc vungetc); \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/fputc.c b/contrib/kolibri-libc/source/stdio/fputc.c new file mode 100644 index 0000000000..5362e56579 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fputc.c @@ -0,0 +1,9 @@ +#include + +int fputc(int sym, FILE *stream) +{ + if(!fwrite(&sym, sizeof(char), 1, stream)){ + return EOF; + } + return sym; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/fputs.c b/contrib/kolibri-libc/source/stdio/fputs.c new file mode 100644 index 0000000000..5ae7f14e00 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fputs.c @@ -0,0 +1,10 @@ +#include +#include + +int fputs(const char *str, FILE *stream){ + int s_code; + for(int i=0; i + +size_t fread(void *restrict ptr, size_t size, size_t nmemb, FILE *restrict stream) { + unsigned bytes_read = 0; + unsigned bytes_count = size * nmemb; + _ksys_file_read_file(stream->name, stream->position, bytes_count, ptr, &bytes_read); + stream->position += bytes_read; + ksys_bdfe_t info; + // TODO: Handle _ksys_file_get_info error somehow + if (!_ksys_file_get_info(stream->name, &info)) { + if (stream->position >= info.size) { + stream->eof = 1; + } + } + return bytes_read / size; +} diff --git a/contrib/kolibri-libc/source/stdio/freopen.c b/contrib/kolibri-libc/source/stdio/freopen.c new file mode 100644 index 0000000000..f914d92096 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/freopen.c @@ -0,0 +1,36 @@ +#include +#include +#include + +FILE *freopen(const char *restrict _name, const char *restrict _mode, FILE *restrict out) { + ksys_bdfe_t info; + if (_ksys_file_get_info(_name, &info)) { + return NULL; + } + + if (!out) { + return NULL; + } + + out->name = strdup(_name); + out->position = 0; + out->error = 0; + out->eof = 0; + out->kind = 0; + out->orientation = 0; + out->mode = 0; + + if (strchr(_mode, 'b')) { out->mode |= _STDIO_F_B; } + if (strchr(_mode, 'x')) { out->mode |= _STDIO_F_X; } + if (strchr(_mode, 'a')) { out->mode |= _STDIO_F_A; } + if (strchr(_mode, 'r')) { out->mode |= _STDIO_F_R; } + if (strchr(_mode, 'w')) { out->mode |= _STDIO_F_W; } + if (strchr(_mode, '+')) { out->mode |= _STDIO_F_R | _STDIO_F_W; } + + if (out->mode & _STDIO_F_A) { + out->position = info.size; + out->append_offset = info.size; + } + + return out; +} diff --git a/contrib/kolibri-libc/source/stdio/fscanf.c b/contrib/kolibri-libc/source/stdio/fscanf.c new file mode 100644 index 0000000000..2cc5d332dc --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fscanf.c @@ -0,0 +1,13 @@ +#include + +int fscanf(FILE* stream, const char* format, ...) +{ + va_list arg; + int n; + va_start(arg, format); + n = vfscanf(stream, format, arg); + va_end(arg); + return n; +} + + diff --git a/contrib/kolibri-libc/source/stdio/fseek.c b/contrib/kolibri-libc/source/stdio/fseek.c new file mode 100644 index 0000000000..592043310b --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fseek.c @@ -0,0 +1,17 @@ +#include +#include + +int fseek(FILE *stream, long int offset, int whence) { + if (whence == SEEK_SET) { + stream->position = offset; + } else if (whence == SEEK_CUR) { + stream->position += offset; + } else if (whence == SEEK_END) { + ksys_bdfe_t info; + if (_ksys_file_get_info(stream->name, &info)) { + return -1; + } + stream->position = info.size + offset; + } + stream->eof = 0; +} diff --git a/contrib/kolibri-libc/source/stdio/fsetpos.c b/contrib/kolibri-libc/source/stdio/fsetpos.c new file mode 100644 index 0000000000..0247dc8b03 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fsetpos.c @@ -0,0 +1,7 @@ +#include + +int fsetpos(FILE *stream, const fpos_t *pos) { + stream->position = *pos; + stream->eof = 0; + return 0; +} diff --git a/contrib/kolibri-libc/source/stdio/ftell.c b/contrib/kolibri-libc/source/stdio/ftell.c new file mode 100644 index 0000000000..ba5c8ce6ab --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/ftell.c @@ -0,0 +1,5 @@ +#include + +long int ftell(FILE *stream) { + return stream->position; +} diff --git a/contrib/kolibri-libc/source/stdio/fwrite.c b/contrib/kolibri-libc/source/stdio/fwrite.c new file mode 100644 index 0000000000..db44b0fdc4 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/fwrite.c @@ -0,0 +1,16 @@ +#include + +size_t fwrite(const void * restrict ptr,size_t size, size_t nmemb,FILE * restrict stream) { + unsigned bytes_written = 0; + unsigned bytes_count = size * nmemb; + _ksys_file_write_file(stream->name, stream->position, bytes_count, ptr, &bytes_written); + stream->position += bytes_written; + ksys_bdfe_t info; + // TODO: Handle _ksys_file_get_info error somehow + if (!_ksys_file_get_info(stream->name, &info)) { + if (stream->position >= info.size) { + stream->eof = 1; + } + } + return bytes_written / size; +} diff --git a/contrib/kolibri-libc/source/stdio/getchar.c b/contrib/kolibri-libc/source/stdio/getchar.c new file mode 100644 index 0000000000..829ee18807 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/getchar.c @@ -0,0 +1,10 @@ +#include +#include "conio.h" + +int getchar(void) { + int c = __con_getch(); + if (c == 0) { + c = EOF; + } + return c; +} diff --git a/contrib/kolibri-libc/source/stdio/gets.c b/contrib/kolibri-libc/source/stdio/gets.c new file mode 100644 index 0000000000..f6f4025a00 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/gets.c @@ -0,0 +1,15 @@ +#include +#include +#include "conio.h" +#include + +char *gets(char* str) +{ + __con_init(); + if(__con_gets(str, 4096)==NULL){ + errno = EIO; + return NULL; + } + str[strlen(str)-1]='\0'; + return str; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/perror.c b/contrib/kolibri-libc/source/stdio/perror.c new file mode 100644 index 0000000000..f4b32c0b66 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/perror.c @@ -0,0 +1,5 @@ +#include + +void perror(const char *s) { + printf("%s: It's some error, maybe...", s); +} diff --git a/contrib/kolibri-libc/source/stdio/printf.c b/contrib/kolibri-libc/source/stdio/printf.c new file mode 100644 index 0000000000..f0a6f616e4 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/printf.c @@ -0,0 +1,13 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include + +#include "format_print.h" + +int printf(const char *format, ...) +{ + va_list arg; + va_start(arg, format); + return vprintf(format, arg); +} diff --git a/contrib/kolibri-libc/source/stdio/puts.c b/contrib/kolibri-libc/source/stdio/puts.c new file mode 100644 index 0000000000..b6af23e0ab --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/puts.c @@ -0,0 +1,13 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include +#include "conio.h" + +int puts(const char *str) +{ + __con_init(); + __con_write_asciiz(str); + __con_write_asciiz("\n"); + return strlen(str); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/remove.c b/contrib/kolibri-libc/source/stdio/remove.c new file mode 100644 index 0000000000..f89f43b21a --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/remove.c @@ -0,0 +1,6 @@ +#include +#include + +int remove(const char *name) { + return _ksys_file_delete(name); +} diff --git a/contrib/kolibri-libc/source/stdio/rename.c b/contrib/kolibri-libc/source/stdio/rename.c new file mode 100644 index 0000000000..c8d02f1285 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/rename.c @@ -0,0 +1,6 @@ +#include +#include + +int rename(const char *name, const char *new_name) { + return _ksys_file_rename(name, new_name); +} diff --git a/contrib/kolibri-libc/source/stdio/rewind.c b/contrib/kolibri-libc/source/stdio/rewind.c new file mode 100644 index 0000000000..5b2a663dd6 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/rewind.c @@ -0,0 +1,5 @@ +#include + +void rewind(FILE *stream) { + stream->position = 0; +} diff --git a/contrib/kolibri-libc/source/stdio/scanf.c b/contrib/kolibri-libc/source/stdio/scanf.c new file mode 100644 index 0000000000..1f0e46c7ea --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/scanf.c @@ -0,0 +1,20 @@ +#include "format_scan.h" +#include + +int scanf ( const char * format, ...) +{ + va_list arg; + int n; + va_start(arg, format); + + if(__scanf_buffer == NULL) __scanf_buffer = malloc(4096); + if(__scanf_buffer == NULL) return -3; + + *__scanf_buffer = 0; + n = vscanf(format, arg); + + va_end(arg); + return n; +} + + diff --git a/contrib/kolibri-libc/source/stdio/setbuf.c b/contrib/kolibri-libc/source/stdio/setbuf.c new file mode 100644 index 0000000000..9a027de5b1 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/setbuf.c @@ -0,0 +1,5 @@ +#include + +void setbuf(FILE *restrict stream, char *restrict buf) { + return; +} diff --git a/contrib/kolibri-libc/source/stdio/setvbuf.c b/contrib/kolibri-libc/source/stdio/setvbuf.c new file mode 100644 index 0000000000..038826faa6 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/setvbuf.c @@ -0,0 +1,5 @@ +#include + +int setvbuf(FILE *restrict stream, char *restrict buf, int mode, size_t size) { + return 0; +} diff --git a/contrib/kolibri-libc/source/stdio/snprintf.c b/contrib/kolibri-libc/source/stdio/snprintf.c new file mode 100644 index 0000000000..ef0db0f201 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/snprintf.c @@ -0,0 +1,12 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include "format_print.h" + +int snprintf(char* buffer, size_t count, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/sprintf.c b/contrib/kolibri-libc/source/stdio/sprintf.c new file mode 100644 index 0000000000..fa50d2b699 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/sprintf.c @@ -0,0 +1,12 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include "format_print.h" + +int sprintf(char* buffer, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, (size_t)-1, format, va); + va_end(va); + return ret; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/sscanf.c b/contrib/kolibri-libc/source/stdio/sscanf.c new file mode 100644 index 0000000000..2268f978ab --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/sscanf.c @@ -0,0 +1,12 @@ +#include + +int sscanf(const char * s, const char * format, ...) +{ + va_list arg; + int n; + va_start(arg, format); + n = vsscanf(s, format, arg); + va_end(arg); + return n; +} + diff --git a/contrib/kolibri-libc/source/stdio/tmpfile.c b/contrib/kolibri-libc/source/stdio/tmpfile.c new file mode 100644 index 0000000000..9d3e3fd9a1 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/tmpfile.c @@ -0,0 +1,11 @@ +#include + +FILE *tmpfile(void) { + char name[FILENAME_MAX + 1]; + + if (!tmpnam(name)) { + return NULL; + } + + return fopen(name, "wb+"); +} diff --git a/contrib/kolibri-libc/source/stdio/tmpnam.c b/contrib/kolibri-libc/source/stdio/tmpnam.c new file mode 100644 index 0000000000..a6831d6867 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/tmpnam.c @@ -0,0 +1,16 @@ +#include +#include +#include + +static char buf[FILENAME_MAX + 1]; +static int static_index = 0; + +char *tmpnam(char *name) { + ksys_proc_table_t table; + _ksys_process_info(&table, -1); + + char *out = name ? name : buf; + // PID is also unique for each thread + sprintf(out, "/tmp0/1/%x_%x.tmp", table.pid, static_index++); + return out; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/vfscanf.c b/contrib/kolibri-libc/source/stdio/vfscanf.c new file mode 100644 index 0000000000..dd2fe560b6 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/vfscanf.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include "format_scan.h" +#include + +// non standard realization - support for virtually change ONLY ONE char + +static int __ungetc_emu(int c, FILE* stream) +{ + unsigned res; + if(stream){ + errno = EINVAL; + return EOF; + } + if ((stream->mode & 3) != _STDIO_F_R && (stream->mode & _STDIO_F_A) == 0){ + errno = EACCES; + return EOF; + } + ksys_bdfe_t *file_info = malloc(sizeof(ksys_bdfe_t)); + if(file_info==NULL){ + errno = ENOMEM; + return EOF; + } + if(!_ksys_file_get_info(stream->name, file_info)){ + errno = ENFILE; + return EOF; + } + if (stream->position > file_info->size || stream->position == 0 || c == EOF || stream->__ungetc_emu_buff != EOF){ + errno = EOF; + return EOF; + } + + stream->__ungetc_emu_buff = c; + stream->position --; + return c; +} + +static int __virtual_getc_file(void *sp, const void *obj) +{ + FILE *f = (FILE *)obj; + int ch = fgetc(f); + return ch; +} + +static void __virtual_ungetc_file(void *sp, int c, const void *obj) +{ + FILE *f = (FILE *)obj; + if (f) __ungetc_emu(c, f); +} + +int vfscanf(FILE * stream, const char * format, va_list arg) +{ + return _format_scan(stream, format, arg, &__virtual_getc_file, &__virtual_ungetc_file); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/vprintf.c b/contrib/kolibri-libc/source/stdio/vprintf.c new file mode 100644 index 0000000000..80e8415443 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/vprintf.c @@ -0,0 +1,18 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include + +#include "conio.h" +#include "format_print.h" + +int vprintf ( const char * format, va_list arg ) +{ + int len = 0; + char s[4096]; + + __con_init(); + len = vsnprintf(s, 4096, format, arg); + __con_write_string(s, len); + return(len); +} diff --git a/contrib/kolibri-libc/source/stdio/vscanf.c b/contrib/kolibri-libc/source/stdio/vscanf.c new file mode 100644 index 0000000000..c3b0a703ec --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/vscanf.c @@ -0,0 +1,44 @@ +#include "format_scan.h" +#include + +char *__scanf_buffer=NULL; + +static int __virtual_getc_con(void *sp, const void *obj) +// get next chat from string obj, save point is ptr to string char ptr +{ + int ch; + const char**spc= (const char**)sp; + if (!spc) return EOF; // error + if (!*spc) *spc = __scanf_buffer; // first call, init savepoint + + while (!**spc) // need to read more + { + if(!gets(__scanf_buffer)) return EOF; + *spc = __scanf_buffer; + strcat(__scanf_buffer,"\n"); // imitate delimiter + } + if (**spc == 26 || **spc == 3) // ^C ^Z end of scan, clear buffer + { + *spc = __scanf_buffer; + *__scanf_buffer = 0; + return EOF; // ^C ^Z + } + + ch = **spc; (*spc)++ ; + return ch; +} + +static void __virtual_ungetc_con(void *sp, int c, const void *obj) +// if can, one step back savepoint in s +{ + const char**spc= (const char**)sp; + + if (spc && *spc > __scanf_buffer) (*spc)--; +//printf("Ungetc '%c'[%d];", c, c); +} + + +int vscanf(const char * format, va_list arg) +{ + return _format_scan(NULL, format, arg, &__virtual_getc_con, &__virtual_ungetc_con); +} diff --git a/contrib/kolibri-libc/source/stdio/vsnprintf.c b/contrib/kolibri-libc/source/stdio/vsnprintf.c new file mode 100644 index 0000000000..2758036af5 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/vsnprintf.c @@ -0,0 +1,6 @@ +#include "format_print.h" + +int vsnprintf(char* buffer, size_t count, const char* format, va_list va) +{ + return _vsnprintf(_out_buffer, buffer, count, format, va); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdio/vsscanf.c b/contrib/kolibri-libc/source/stdio/vsscanf.c new file mode 100644 index 0000000000..a39b35d595 --- /dev/null +++ b/contrib/kolibri-libc/source/stdio/vsscanf.c @@ -0,0 +1,32 @@ +#include "format_scan.h" + +static int __virtual_getc_str(void *sp, const void *obj) +// get next chat from string obj, save point is ptr to string char ptr +{ + int ch; + const char *s = (const char *)obj; + const char**spc= (const char**)sp; + if (!s || !spc) return EOF; // error + + if (!*spc) *spc = s; // first call, init savepoint + + if (!**spc) return EOF; // EOS + + ch = **spc; (*spc)++ ; + + return ch; +} + +void __virtual_ungetc_str(void *sp, int c, const void *obj) +// if can, one step back savepoint in s +{ + const char *s = (const char *)obj; + const char**spc= (const char**)sp; + + if (s && spc && *spc > s) (*spc)--; +} + +int vsscanf(const char * s, const char * format, va_list arg) +{ + return _format_scan(s, format, arg, &__virtual_getc_str, &__virtual_ungetc_str); +}; \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/___chkstk_ms.c b/contrib/kolibri-libc/source/stdlib/___chkstk_ms.c new file mode 100644 index 0000000000..c446841ab4 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/___chkstk_ms.c @@ -0,0 +1 @@ +void ___chkstk_ms() {} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/abs.c b/contrib/kolibri-libc/source/stdlib/abs.c new file mode 100644 index 0000000000..0e7cebef28 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/abs.c @@ -0,0 +1,6 @@ +#include + +int abs(int a) +{ + return a>0 ? a : -a; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/atoi.c b/contrib/kolibri-libc/source/stdlib/atoi.c new file mode 100644 index 0000000000..5252fc8a20 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/atoi.c @@ -0,0 +1,21 @@ +#include +#include + +/* +** atoi(s) - convert s to integer. +*/ +int atoi(const char *s) +{ + int sign, n; + while(isspace(*s)) ++s; + sign = 1; + + switch(*s) { + case '-': sign = -1; + case '+': ++s; + } + + n = 0; + while(isdigit(*s)) n = 10 * n + *s++ - '0'; + return (sign * n); +} diff --git a/contrib/kolibri-libc/source/stdlib/atol.c b/contrib/kolibri-libc/source/stdlib/atol.c new file mode 100644 index 0000000000..fc6251e6a9 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/atol.c @@ -0,0 +1,17 @@ +#include +#include + +long atol(const char *s) +{ + long n=0; + int neg=0; + while (isspace(*s)) s++; + switch (*s) { + case '-': neg=1; + case '+': s++; + } + /* Compute n as a negative number to avoid overflow on LONG_MIN */ + while (isdigit(*s)) + n = 10*n - (*s++ - '0'); + return neg ? n : -n; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/atoll.c b/contrib/kolibri-libc/source/stdlib/atoll.c new file mode 100644 index 0000000000..f8060d7546 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/atoll.c @@ -0,0 +1,17 @@ +#include +#include + +long long atoll(const char *s) +{ + long long n=0; + int neg=0; + while (isspace(*s)) s++; + switch (*s) { + case '-': neg=1; + case '+': s++; + } + /* Compute n as a negative number to avoid overflow on LLONG_MIN */ + while (isdigit(*s)) + n = 10*n - (*s++ - '0'); + return neg ? n : -n; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/calloc.c b/contrib/kolibri-libc/source/stdlib/calloc.c new file mode 100644 index 0000000000..ad25ea534a --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/calloc.c @@ -0,0 +1,6 @@ +#include +#include + +void *calloc(size_t num, size_t size) { + return _ksys_alloc(num*size); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/difftime.c b/contrib/kolibri-libc/source/stdlib/difftime.c new file mode 100644 index 0000000000..44c7323c28 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/difftime.c @@ -0,0 +1,6 @@ +#include + +double difftime (time_t end, time_t beginning) +{ + return end - beginning; +} diff --git a/contrib/kolibri-libc/source/stdlib/div.c b/contrib/kolibri-libc/source/stdlib/div.c new file mode 100644 index 0000000000..99bce10157 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/div.c @@ -0,0 +1,6 @@ +#include + +div_t div(int num, int den) +{ + return (div_t){ num/den, num%den }; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/exit.c b/contrib/kolibri-libc/source/stdlib/exit.c new file mode 100644 index 0000000000..9cd49f33a3 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/exit.c @@ -0,0 +1,12 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include "../stdio/conio.h" +#include + +void exit(int status) +{ + if(__con_is_load){ + __con_exit(status); + } + _ksys_exit(); +} diff --git a/contrib/kolibri-libc/source/stdlib/free.c b/contrib/kolibri-libc/source/stdlib/free.c new file mode 100644 index 0000000000..027b9b71cc --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/free.c @@ -0,0 +1,6 @@ +#include +#include + +void free(void *ptr) { + _ksys_free(ptr); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/itoa.c b/contrib/kolibri-libc/source/stdlib/itoa.c new file mode 100644 index 0000000000..711ee31552 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/itoa.c @@ -0,0 +1,20 @@ +#include +/* +char* itoa(int n, char* s) +{ + int sign; + char *ptr; + ptr = s; + + if(n == (int)0x80000000) + return strcpy(s, "-2147483648"); // overflowed -n + + if ((sign = n) < 0) n = -n; + do { + *ptr++ = n % 10 + '0'; + } while ((n = n / 10) > 0); + if (sign < 0) *ptr++ = '-'; + *ptr = '\0'; + return strrev(s); +} +*/ \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/labs.c b/contrib/kolibri-libc/source/stdlib/labs.c new file mode 100644 index 0000000000..2aca5fc182 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/labs.c @@ -0,0 +1,6 @@ +#include + +long labs(long a) +{ + return a>0 ? a : -a; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/ldiv.c b/contrib/kolibri-libc/source/stdlib/ldiv.c new file mode 100644 index 0000000000..e19a084ea2 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/ldiv.c @@ -0,0 +1,6 @@ +#include + +ldiv_t ldiv(long num, long den) +{ + return (ldiv_t){ num/den, num%den }; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/libtcc1.c b/contrib/kolibri-libc/source/stdlib/libtcc1.c new file mode 100644 index 0000000000..576f6ca9c4 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/libtcc1.c @@ -0,0 +1,763 @@ +/* TCC runtime library. + Parts of this code are (c) 2002 Fabrice Bellard + + Copyright (C) 1987, 1988, 1992, 1994, 1995 Free Software Foundation, Inc. + +This file is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) + +This file is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + +//#include +#define TCC_TARGET_I386 + +#define W_TYPE_SIZE 32 +#define BITS_PER_UNIT 8 + +typedef int Wtype; +typedef unsigned int UWtype; +typedef unsigned int USItype; +typedef long long DWtype; +typedef unsigned long long UDWtype; + +struct DWstruct { + Wtype low, high; +}; + +typedef union +{ + struct DWstruct s; + DWtype ll; +} DWunion; + +typedef long double XFtype; +#define WORD_SIZE (sizeof (Wtype) * BITS_PER_UNIT) +#define HIGH_WORD_COEFF (((UDWtype) 1) << WORD_SIZE) + +/* the following deal with IEEE single-precision numbers */ +#define EXCESS 126 +#define SIGNBIT 0x80000000 +#define HIDDEN (1 << 23) +#define SIGN(fp) ((fp) & SIGNBIT) +#define EXP(fp) (((fp) >> 23) & 0xFF) +#define MANT(fp) (((fp) & 0x7FFFFF) | HIDDEN) +#define PACK(s,e,m) ((s) | ((e) << 23) | (m)) + +/* the following deal with IEEE double-precision numbers */ +#define EXCESSD 1022 +#define HIDDEND (1 << 20) +#define EXPD(fp) (((fp.l.upper) >> 20) & 0x7FF) +#define SIGND(fp) ((fp.l.upper) & SIGNBIT) +#define MANTD(fp) (((((fp.l.upper) & 0xFFFFF) | HIDDEND) << 10) | \ + (fp.l.lower >> 22)) +#define HIDDEND_LL ((long long)1 << 52) +#define MANTD_LL(fp) ((fp.ll & (HIDDEND_LL-1)) | HIDDEND_LL) +#define PACKD_LL(s,e,m) (((long long)((s)+((e)<<20))<<32)|(m)) + +/* the following deal with x86 long double-precision numbers */ +#define EXCESSLD 16382 +#define EXPLD(fp) (fp.l.upper & 0x7fff) +#define SIGNLD(fp) ((fp.l.upper) & 0x8000) + +/* only for x86 */ +union ldouble_long { + long double ld; + struct { + unsigned long long lower; + unsigned short upper; + } l; +}; + +union double_long { + double d; +#if 1 + struct { + unsigned int lower; + int upper; + } l; +#else + struct { + int upper; + unsigned int lower; + } l; +#endif + long long ll; +}; + +union float_long { + float f; + unsigned int l; +}; + +/* XXX: we don't support several builtin supports for now */ +#if !defined(TCC_TARGET_X86_64) && !defined(TCC_TARGET_ARM) + +/* XXX: use gcc/tcc intrinsic ? */ +#if defined(TCC_TARGET_I386) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subl %5,%1\n\tsbbl %3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mull %3" \ + : "=a" ((USItype) (w0)), \ + "=d" ((USItype) (w1)) \ + : "%0" ((USItype) (u)), \ + "rm" ((USItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, dv) \ + __asm__ ("divl %4" \ + : "=a" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "rm" ((USItype) (dv))) +#define count_leading_zeros(count, x) \ + do { \ + USItype __cbtmp; \ + __asm__ ("bsrl %1,%0" \ + : "=r" (__cbtmp) : "rm" ((USItype) (x))); \ + (count) = __cbtmp ^ 31; \ + } while (0) +#else +#error unsupported CPU type +#endif + +/* most of this code is taken from libgcc2.c from gcc */ +UDWtype __udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp) +{ + DWunion ww; + DWunion nn, dd; + DWunion rr; + UWtype d0, d1, n0, n1, n2; + UWtype q0, q1; + UWtype b, bm; + + nn.ll = n; + dd.ll = d; + + d0 = dd.s.low; + d1 = dd.s.high; + n0 = nn.s.low; + n1 = nn.s.high; + +#if !defined(UDIV_NEEDS_NORMALIZATION) + if (d1 == 0) + { + if (d0 > n1) + { + /* 0q = nn / 0D */ + + udiv_qrnnd (q0, n0, n1, n0, d0); + q1 = 0; + + /* Remainder in n0. */ + } + else + { + /* qq = NN / 0d */ + + if (d0 == 0) + d0 = 1 / d0; /* Divide intentionally by zero. */ + + udiv_qrnnd (q1, n1, 0, n1, d0); + udiv_qrnnd (q0, n0, n1, n0, d0); + + /* Remainder in n0. */ + } + + if (rp != 0) + { + rr.s.low = n0; + rr.s.high = 0; + *rp = rr.ll; + } + } + +#else /* UDIV_NEEDS_NORMALIZATION */ + + if (d1 == 0) + { + if (d0 > n1) + { + /* 0q = nn / 0D */ + + count_leading_zeros (bm, d0); + + if (bm != 0) + { + /* Normalize, i.e. make the most significant bit of the + denominator set. */ + + d0 = d0 << bm; + n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm)); + n0 = n0 << bm; + } + + udiv_qrnnd (q0, n0, n1, n0, d0); + q1 = 0; + + /* Remainder in n0 >> bm. */ + } + else + { + /* qq = NN / 0d */ + + if (d0 == 0) + d0 = 1 / d0; /* Divide intentionally by zero. */ + + count_leading_zeros (bm, d0); + + if (bm == 0) + { + /* From (n1 >= d0) /\ (the most significant bit of d0 is set), + conclude (the most significant bit of n1 is set) /\ (the + leading quotient digit q1 = 1). + + This special case is necessary, not an optimization. + (Shifts counts of W_TYPE_SIZE are undefined.) */ + + n1 -= d0; + q1 = 1; + } + else + { + /* Normalize. */ + + b = W_TYPE_SIZE - bm; + + d0 = d0 << bm; + n2 = n1 >> b; + n1 = (n1 << bm) | (n0 >> b); + n0 = n0 << bm; + + udiv_qrnnd (q1, n1, n2, n1, d0); + } + + /* n1 != d0... */ + + udiv_qrnnd (q0, n0, n1, n0, d0); + + /* Remainder in n0 >> bm. */ + } + + if (rp != 0) + { + rr.s.low = n0 >> bm; + rr.s.high = 0; + *rp = rr.ll; + } + } +#endif /* UDIV_NEEDS_NORMALIZATION */ + + else + { + if (d1 > n1) + { + /* 00 = nn / DD */ + + q0 = 0; + q1 = 0; + + /* Remainder in n1n0. */ + if (rp != 0) + { + rr.s.low = n0; + rr.s.high = n1; + *rp = rr.ll; + } + } + else + { + /* 0q = NN / dd */ + + count_leading_zeros (bm, d1); + if (bm == 0) + { + /* From (n1 >= d1) /\ (the most significant bit of d1 is set), + conclude (the most significant bit of n1 is set) /\ (the + quotient digit q0 = 0 or 1). + + This special case is necessary, not an optimization. */ + + /* The condition on the next line takes advantage of that + n1 >= d1 (true due to program flow). */ + if (n1 > d1 || n0 >= d0) + { + q0 = 1; + sub_ddmmss (n1, n0, n1, n0, d1, d0); + } + else + q0 = 0; + + q1 = 0; + + if (rp != 0) + { + rr.s.low = n0; + rr.s.high = n1; + *rp = rr.ll; + } + } + else + { + UWtype m1, m0; + /* Normalize. */ + + b = W_TYPE_SIZE - bm; + + d1 = (d1 << bm) | (d0 >> b); + d0 = d0 << bm; + n2 = n1 >> b; + n1 = (n1 << bm) | (n0 >> b); + n0 = n0 << bm; + + udiv_qrnnd (q0, n1, n2, n1, d1); + umul_ppmm (m1, m0, q0, d0); + + if (m1 > n1 || (m1 == n1 && m0 > n0)) + { + q0--; + sub_ddmmss (m1, m0, m1, m0, d1, d0); + } + + q1 = 0; + + /* Remainder in (n1n0 - m1m0) >> bm. */ + if (rp != 0) + { + sub_ddmmss (n1, n0, n1, n0, m1, m0); + rr.s.low = (n1 << b) | (n0 >> bm); + rr.s.high = n1 >> bm; + *rp = rr.ll; + } + } + } + } + + ww.s.low = q0; + ww.s.high = q1; + return ww.ll; +} + +#define __negdi2(a) (-(a)) + +long long __divdi3(long long u, long long v) +{ + int c = 0; + DWunion uu, vv; + DWtype w; + + uu.ll = u; + vv.ll = v; + + if (uu.s.high < 0) { + c = ~c; + uu.ll = __negdi2 (uu.ll); + } + if (vv.s.high < 0) { + c = ~c; + vv.ll = __negdi2 (vv.ll); + } + w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0); + if (c) + w = __negdi2 (w); + return w; +} + +// https://github.com/KaMeHb-UA/UE4m/blob/1d9ad5bfead06520570c7f24dad062f9f8717c1a/\ +Engine/Extras/ThirdPartyNotUE/emsdk/emscripten/incoming/system/lib/compiler-rt/lib/\ +builtins/divmoddi4.c +long long __divmoddi4(long long a, long long b, long long* rem) +{ + long long d = __divdi3(a, b); + *rem = a - (d * b); + return d; +} + +long long __moddi3(long long u, long long v) +{ + int c = 0; + DWunion uu, vv; + DWtype w; + + uu.ll = u; + vv.ll = v; + + if (uu.s.high < 0) { + c = ~c; + uu.ll = __negdi2 (uu.ll); + } + if (vv.s.high < 0) + vv.ll = __negdi2 (vv.ll); + + __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) &w); + if (c) + w = __negdi2 (w); + return w; +} + +unsigned long long __udivdi3(unsigned long long u, unsigned long long v) +{ + return __udivmoddi4 (u, v, (UDWtype *) 0); +} + +unsigned long long __umoddi3(unsigned long long u, unsigned long long v) +{ + UDWtype w; + + __udivmoddi4 (u, v, &w); + return w; +} + +/* XXX: fix tcc's code generator to do this instead */ +long long __ashrdi3(long long a, int b) +{ +#ifdef __TINYC__ + DWunion u; + u.ll = a; + if (b >= 32) { + u.s.low = u.s.high >> (b - 32); + u.s.high = u.s.high >> 31; + } else if (b != 0) { + u.s.low = ((unsigned)u.s.low >> b) | (u.s.high << (32 - b)); + u.s.high = u.s.high >> b; + } + return u.ll; +#else + return a >> b; +#endif +} + +/* XXX: fix tcc's code generator to do this instead */ +unsigned long long __lshrdi3(unsigned long long a, int b) +{ +#ifdef __TINYC__ + DWunion u; + u.ll = a; + if (b >= 32) { + u.s.low = (unsigned)u.s.high >> (b - 32); + u.s.high = 0; + } else if (b != 0) { + u.s.low = ((unsigned)u.s.low >> b) | (u.s.high << (32 - b)); + u.s.high = (unsigned)u.s.high >> b; + } + return u.ll; +#else + return a >> b; +#endif +} + +/* XXX: fix tcc's code generator to do this instead */ +long long __ashldi3(long long a, int b) +{ +#ifdef __TINYC__ + DWunion u; + u.ll = a; + if (b >= 32) { + u.s.high = (unsigned)u.s.low << (b - 32); + u.s.low = 0; + } else if (b != 0) { + u.s.high = ((unsigned)u.s.high << b) | ((unsigned)u.s.low >> (32 - b)); + u.s.low = (unsigned)u.s.low << b; + } + return u.ll; +#else + return a << b; +#endif +} + +#ifndef COMMIT_4ad186c5ef61_IS_FIXED +long long __tcc_cvt_ftol(long double x) +{ + unsigned c0, c1; + long long ret; + __asm__ __volatile__ ("fnstcw %0" : "=m" (c0)); + c1 = c0 | 0x0C00; + __asm__ __volatile__ ("fldcw %0" : : "m" (c1)); + __asm__ __volatile__ ("fistpll %0" : "=m" (ret)); + __asm__ __volatile__ ("fldcw %0" : : "m" (c0)); + return ret; +} +#endif + +#endif /* !__x86_64__ */ + +/* XXX: fix tcc's code generator to do this instead */ +float __floatundisf(unsigned long long a) +{ + DWunion uu; + XFtype r; + + uu.ll = a; + if (uu.s.high >= 0) { + return (float)uu.ll; + } else { + r = (XFtype)uu.ll; + r += 18446744073709551616.0; + return (float)r; + } +} + +double __floatundidf(unsigned long long a) +{ + DWunion uu; + XFtype r; + + uu.ll = a; + if (uu.s.high >= 0) { + return (double)uu.ll; + } else { + r = (XFtype)uu.ll; + r += 18446744073709551616.0; + return (double)r; + } +} + +long double __floatundixf(unsigned long long a) +{ + DWunion uu; + XFtype r; + + uu.ll = a; + if (uu.s.high >= 0) { + return (long double)uu.ll; + } else { + r = (XFtype)uu.ll; + r += 18446744073709551616.0; + return (long double)r; + } +} + +unsigned long long __fixunssfdi (float a1) +{ + register union float_long fl1; + register int exp; + register unsigned long l; + + fl1.f = a1; + + if (fl1.l == 0) + return (0); + + exp = EXP (fl1.l) - EXCESS - 24; + + l = MANT(fl1.l); + if (exp >= 41) + return (unsigned long long)-1; + else if (exp >= 0) + return (unsigned long long)l << exp; + else if (exp >= -23) + return l >> -exp; + else + return 0; +} + +unsigned long long __fixunsdfdi (double a1) +{ + register union double_long dl1; + register int exp; + register unsigned long long l; + + dl1.d = a1; + + if (dl1.ll == 0) + return (0); + + exp = EXPD (dl1) - EXCESSD - 53; + + l = MANTD_LL(dl1); + + if (exp >= 12) + return (unsigned long long)-1; + else if (exp >= 0) + return l << exp; + else if (exp >= -52) + return l >> -exp; + else + return 0; +} + +unsigned long long __fixunsxfdi (long double a1) +{ + register union ldouble_long dl1; + register int exp; + register unsigned long long l; + + dl1.ld = a1; + + if (dl1.l.lower == 0 && dl1.l.upper == 0) + return (0); + + exp = EXPLD (dl1) - EXCESSLD - 64; + + l = dl1.l.lower; + + if (exp > 0) + return (unsigned long long)-1; + else if (exp >= -63) + return l >> -exp; + else + return 0; +} + +long long __fixsfdi (float a1) +{ + long long ret; int s; + ret = __fixunssfdi((s = a1 >= 0) ? a1 : -a1); + return s ? ret : -ret; +} + +long long __fixdfdi (double a1) +{ + long long ret; int s; + ret = __fixunsdfdi((s = a1 >= 0) ? a1 : -a1); + return s ? ret : -ret; +} + +long long __fixxfdi (long double a1) +{ + long long ret; int s; + ret = __fixunsxfdi((s = a1 >= 0) ? a1 : -a1); + return s ? ret : -ret; +} + +#if defined(TCC_TARGET_X86_64) && !defined(_WIN64) + +#ifndef __TINYC__ +#include +#include +#include +#else +/* Avoid including stdlib.h because it is not easily available when + cross compiling */ +#include /* size_t definition is needed for a x86_64-tcc to parse memset() */ +extern void *malloc(unsigned long long); +extern void *memset(void *s, int c, size_t n); +extern void free(void*); +extern void abort(void); +#endif + +enum __va_arg_type { + __va_gen_reg, __va_float_reg, __va_stack +}; + +//This should be in sync with the declaration on our include/stdarg.h +/* GCC compatible definition of va_list. */ +typedef struct { + unsigned int gp_offset; + unsigned int fp_offset; + union { + unsigned int overflow_offset; + char *overflow_arg_area; + }; + char *reg_save_area; +} __va_list_struct; + +#undef __va_start +#undef __va_arg +#undef __va_copy +#undef __va_end + +void __va_start(__va_list_struct *ap, void *fp) +{ + memset(ap, 0, sizeof(__va_list_struct)); + *ap = *(__va_list_struct *)((char *)fp - 16); + ap->overflow_arg_area = (char *)fp + ap->overflow_offset; + ap->reg_save_area = (char *)fp - 176 - 16; +} + +void *__va_arg(__va_list_struct *ap, + enum __va_arg_type arg_type, + int size, int align) +{ + size = (size + 7) & ~7; + align = (align + 7) & ~7; + switch (arg_type) { + case __va_gen_reg: + if (ap->gp_offset + size <= 48) { + ap->gp_offset += size; + return ap->reg_save_area + ap->gp_offset - size; + } + goto use_overflow_area; + + case __va_float_reg: + if (ap->fp_offset < 128 + 48) { + ap->fp_offset += 16; + return ap->reg_save_area + ap->fp_offset - 16; + } + size = 8; + goto use_overflow_area; + + case __va_stack: + use_overflow_area: + ap->overflow_arg_area += size; + ap->overflow_arg_area = (char*)((intptr_t)(ap->overflow_arg_area + align - 1) & -(intptr_t)align); + return ap->overflow_arg_area - size; + + default: +#ifndef __TINYC__ + fprintf(stderr, "unknown ABI type for __va_arg\n"); +#endif + abort(); + } +} + +#endif /* __x86_64__ */ + +/* Flushing for tccrun */ +#if defined(TCC_TARGET_X86_64) || defined(TCC_TARGET_I386) + +void __clear_cache(void *beginning, void *end) +{ +} + +#elif defined(TCC_TARGET_ARM) + +#define _GNU_SOURCE +#include +#include +#include + +void __clear_cache(void *beginning, void *end) +{ +/* __ARM_NR_cacheflush is kernel private and should not be used in user space. + * However, there is no ARM asm parser in tcc so we use it for now */ +#if 1 + syscall(__ARM_NR_cacheflush, beginning, end, 0); +#else + __asm__ ("push {r7}\n\t" + "mov r7, #0xf0002\n\t" + "mov r2, #0\n\t" + "swi 0\n\t" + "pop {r7}\n\t" + "ret"); +#endif +} + +#else +#warning __clear_cache not defined for this architecture, avoid using tcc -run +#endif diff --git a/contrib/kolibri-libc/source/stdlib/llabs.c b/contrib/kolibri-libc/source/stdlib/llabs.c new file mode 100644 index 0000000000..87a10037f2 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/llabs.c @@ -0,0 +1,6 @@ +#include + +long long llabs(long long a) +{ + return a>0 ? a : -a; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/lldiv.c b/contrib/kolibri-libc/source/stdlib/lldiv.c new file mode 100644 index 0000000000..7d589145c5 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/lldiv.c @@ -0,0 +1,6 @@ +#include + +lldiv_t lldiv(long long num, long long den) +{ + return (lldiv_t){ num/den, num%den }; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/localtime.c b/contrib/kolibri-libc/source/stdlib/localtime.c new file mode 100644 index 0000000000..ac59d9639c --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/localtime.c @@ -0,0 +1,32 @@ +#include +#include + +struct tm buffertime; + +struct tm * localtime (const time_t * timer) +/* non-standard! ignore parameter and return just time now */ +{ + int kos_date, kos_time; + kos_date = _ksys_get_date(); + kos_time = _ksys_get_clock(); + + int bcd_day = (kos_date >> 16); + int bcd_mon = ((kos_date & 0xFF00) >> 8); + int bcd_year = (kos_date & 0xFF); + buffertime.tm_mday = ((bcd_day & 0xF0)>>4)*10 + (bcd_day & 0x0F); + buffertime.tm_mon = ((bcd_mon & 0xF0)>>4)*10 + (bcd_mon & 0x0F) - 1; + buffertime.tm_year = ((bcd_year & 0xF0)>>4)*10 + (bcd_year & 0x0F) + 100; + + buffertime.tm_wday = buffertime.tm_yday = buffertime.tm_isdst = -1; /* temporary */ + + int bcd_sec = (kos_time >> 16); + int bcd_min = ((kos_time & 0xFF00) >> 8); + int bcd_hour = (kos_time & 0xFF); + + buffertime.tm_sec = ((bcd_sec & 0xF0)>>4)*10 + (bcd_sec & 0x0F); + buffertime.tm_min = ((bcd_min & 0xF0)>>4)*10 + (bcd_min & 0x0F); + buffertime.tm_hour = ((bcd_hour & 0xF0)>>4)*10 + (bcd_hour & 0x0F); + + return &buffertime; +} + diff --git a/contrib/kolibri-libc/source/stdlib/malloc.c b/contrib/kolibri-libc/source/stdlib/malloc.c new file mode 100644 index 0000000000..c0c912f8dc --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/malloc.c @@ -0,0 +1,6 @@ +#include +#include + +void *malloc(size_t size) { + return _ksys_alloc(size); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/mktime.c b/contrib/kolibri-libc/source/stdlib/mktime.c new file mode 100644 index 0000000000..a41c5c4f20 --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/mktime.c @@ -0,0 +1,23 @@ +#include + +time_t mktime (struct tm * timeptr) +{ + int utcdiff = -3; + const int mon_days [] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + unsigned long int tyears, tdays, leaps, utc_hrs; + int i; + + tyears = timeptr->tm_year - 70 ;// tm->tm_year is from 1900. + leaps = (tyears + 2) / 4; // no of next two lines until year 2100. + i = (timeptr->tm_year - 100) / 100; + leaps -= ( (i/4)*3 + i%4 ); + tdays = 0; + for (i=0; i < timeptr->tm_mon; i++) tdays += mon_days[i]; + + tdays += timeptr->tm_mday-1; // days of month passed. + tdays = tdays + (tyears * 365) + leaps; + + utc_hrs = timeptr->tm_hour + utcdiff; // for your time zone. + return (tdays * 86400) + (utc_hrs * 3600) + (timeptr->tm_min * 60) + timeptr->tm_sec; +} + diff --git a/contrib/kolibri-libc/source/stdlib/realloc.c b/contrib/kolibri-libc/source/stdlib/realloc.c new file mode 100644 index 0000000000..196d80a47b --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/realloc.c @@ -0,0 +1,6 @@ +#include +#include + +void *realloc(void *ptr, size_t newsize) { + return _ksys_realloc(ptr, newsize); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/stdlib/time.c b/contrib/kolibri-libc/source/stdlib/time.c new file mode 100644 index 0000000000..6d7833fe2e --- /dev/null +++ b/contrib/kolibri-libc/source/stdlib/time.c @@ -0,0 +1,9 @@ +#include +#include + +time_t time (time_t* timer) +{ + time_t t = mktime(localtime(0)); + if (timer) *timer = t; + return t; +} diff --git a/contrib/kolibri-libc/source/string/memccpy.c b/contrib/kolibri-libc/source/string/memccpy.c new file mode 100644 index 0000000000..884cb76ccf --- /dev/null +++ b/contrib/kolibri-libc/source/string/memccpy.c @@ -0,0 +1,14 @@ +#include + +void *memccpy(void *restrict dest, const void *restrict src, int c, size_t n) +{ + unsigned char *d = dest; + const unsigned char *s = src; + + c = (unsigned char)c; + for (; n && (*d=*s)!=c; n--, s++, d++); + +tail: + if (n) return d+1; + return 0; +} diff --git a/contrib/kolibri-libc/source/string/memchr.c b/contrib/kolibri-libc/source/string/memchr.c new file mode 100644 index 0000000000..348db6bece --- /dev/null +++ b/contrib/kolibri-libc/source/string/memchr.c @@ -0,0 +1,24 @@ +/* memchr( const void *, int, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +void * memchr( const void * s, int c, size_t n ) +{ + const unsigned char * p = ( const unsigned char * ) s; + + while ( n-- ) + { + if ( *p == ( unsigned char ) c ) + { + return ( void * ) p; + } + + ++p; + } + + return NULL; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/memcmp.c b/contrib/kolibri-libc/source/string/memcmp.c new file mode 100644 index 0000000000..de156091b1 --- /dev/null +++ b/contrib/kolibri-libc/source/string/memcmp.c @@ -0,0 +1,26 @@ +/* memcmp( const void *, const void *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +int memcmp( const void * s1, const void * s2, size_t n ) +{ + const unsigned char * p1 = ( const unsigned char * ) s1; + const unsigned char * p2 = ( const unsigned char * ) s2; + + while ( n-- ) + { + if ( *p1 != *p2 ) + { + return *p1 - *p2; + } + + ++p1; + ++p2; + } + + return 0; +} diff --git a/contrib/kolibri-libc/source/string/memcpy.c b/contrib/kolibri-libc/source/string/memcpy.c new file mode 100644 index 0000000000..0d707df047 --- /dev/null +++ b/contrib/kolibri-libc/source/string/memcpy.c @@ -0,0 +1,20 @@ +/* memcpy( void *, const void *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +void * memcpy( void * s1, const void * s2, size_t n ) +{ + char * dest = ( char * ) s1; + const char * src = ( const char * ) s2; + + while ( n-- ) + { + *dest++ = *src++; + } + + return s1; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/memmove.c b/contrib/kolibri-libc/source/string/memmove.c new file mode 100644 index 0000000000..e4dc719288 --- /dev/null +++ b/contrib/kolibri-libc/source/string/memmove.c @@ -0,0 +1,33 @@ +/* memmove( void *, const void *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +void * memmove( void * s1, const void * s2, size_t n ) +{ + char * dest = ( char * ) s1; + const char * src = ( const char * ) s2; + + if ( dest <= src ) + { + while ( n-- ) + { + *dest++ = *src++; + } + } + else + { + src += n; + dest += n; + + while ( n-- ) + { + *--dest = *--src; + } + } + + return s1; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/memset.c b/contrib/kolibri-libc/source/string/memset.c new file mode 100644 index 0000000000..225f349d87 --- /dev/null +++ b/contrib/kolibri-libc/source/string/memset.c @@ -0,0 +1,20 @@ +/* memset( void *, int, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +void * memset( void * s, int c, size_t n ) +{ + unsigned char * p = ( unsigned char * ) s; + + while ( n-- ) + { + *p++ = ( unsigned char ) c; + } + + return s; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strcat.c b/contrib/kolibri-libc/source/string/strcat.c new file mode 100644 index 0000000000..bd90c10c33 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strcat.c @@ -0,0 +1,27 @@ +/* strcat( char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strcat( char * s1, const char * s2 ) +{ + char * rc = s1; + + if ( *s1 ) + { + while ( *++s1 ) + { + /* EMPTY */ + } + } + + while ( ( *s1++ = *s2++ ) ) + { + /* EMPTY */ + } + + return rc; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strchr.c b/contrib/kolibri-libc/source/string/strchr.c new file mode 100644 index 0000000000..98bc094a93 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strchr.c @@ -0,0 +1,20 @@ +/* strchr( const char *, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strchr( const char * s, int c ) +{ + do + { + if ( *s == ( char ) c ) + { + return ( char * ) s; + } + } while ( *s++ ); + + return NULL; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strcmp.c b/contrib/kolibri-libc/source/string/strcmp.c new file mode 100644 index 0000000000..ddb3d4daf7 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strcmp.c @@ -0,0 +1,13 @@ +/* strcmp( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +int strcmp(const char * s1, const char * s2) +{ + return _ksys_strcmp(s1, s2); +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strcoll.c b/contrib/kolibri-libc/source/string/strcoll.c new file mode 100644 index 0000000000..1ea0837f01 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strcoll.c @@ -0,0 +1,13 @@ +/* strcoll( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +int strcoll( const char * s1, const char * s2 ) +{ + /* FIXME: This should access _PDCLIB_lc_collate. */ + return strcmp( s1, s2 ); +} diff --git a/contrib/kolibri-libc/source/string/strcpy.c b/contrib/kolibri-libc/source/string/strcpy.c new file mode 100644 index 0000000000..ce9176b85e --- /dev/null +++ b/contrib/kolibri-libc/source/string/strcpy.c @@ -0,0 +1,19 @@ +/* strcpy( char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strcpy( char * s1, const char * s2 ) +{ + char * rc = s1; + + while ( ( *s1++ = *s2++ ) ) + { + /* EMPTY */ + } + + return rc; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strcspn.c b/contrib/kolibri-libc/source/string/strcspn.c new file mode 100644 index 0000000000..074d800560 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strcspn.c @@ -0,0 +1,30 @@ +/* strcspn( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +size_t strcspn( const char * s1, const char * s2 ) +{ + size_t len = 0; + const char * p; + + while ( s1[len] ) + { + p = s2; + + while ( *p ) + { + if ( s1[len] == *p++ ) + { + return len; + } + } + + ++len; + } + + return len; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strdup.c b/contrib/kolibri-libc/source/string/strdup.c new file mode 100644 index 0000000000..73e3ac9efc --- /dev/null +++ b/contrib/kolibri-libc/source/string/strdup.c @@ -0,0 +1,10 @@ +#include +#include + +char* strdup(const char *str) +{ + char *buf = malloc(strlen(str) + 1); + buf[strlen(str)] = '\0'; + strcpy(buf, str); + return buf; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strerror.c b/contrib/kolibri-libc/source/string/strerror.c new file mode 100644 index 0000000000..43e174668f --- /dev/null +++ b/contrib/kolibri-libc/source/string/strerror.c @@ -0,0 +1,82 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include + +int errno; + +char* strerror(int err) +{ + char *msg; + switch(err){ + case 0: msg = "No errors"; break; + case EPERM: msg = "Operation not permitted"; break; + case ENOENT: msg = "No such file or directory"; break; + case ESRCH: msg = "No such process"; break; + case EINTR: msg = "Interrupted system call"; break; + case EIO: msg = "Input/output error"; break; + case ENXIO: msg = "Device not configured"; break; + case E2BIG: msg = "Argument list too long"; break; + case ENOEXEC: msg = "Exec format error"; break; + case EBADF: msg = "Bad file descriptor"; break; + case ECHILD: msg = "No child processes"; break; + case EDEADLK: msg = "Resource deadlock avoided"; break; + case ENOMEM: msg = "Cannot allocate memory"; break; + case EACCES: msg = "Permission denied"; break; + case EFAULT: msg = "Bad address"; break; + case ENOTBLK: msg = "Block device required"; break; + case EBUSY: msg = "Device / Resource busy"; break; + case EEXIST: msg = "File exists"; break; + case EXDEV: msg = "Cross-device link"; break; + case ENODEV: msg = "Operation not supported by device"; break; + case ENOTDIR: msg = "Not a directory"; break; + case EISDIR: msg = "Is a directory"; break; + case EINVAL: msg = "Invalid argument"; break; + case ENFILE: msg = "Too many open files in system"; break; + case EMFILE: msg = "Too many open files"; break; + case ENOTTY: msg = "Inappropriate ioctl for device"; break; + case ETXTBSY: msg = "Text file busy"; break; + case EFBIG: msg = "File too large"; break; + case ENOSPC: msg = "No space left on device"; break; + case ESPIPE: msg = "Illegal seek"; break; + case EROFS: msg = "Read-only file system"; break; + case EMLINK: msg = "Too many links"; break; + case EPIPE: msg = "Broken pipe"; break; + + // math software + case EDOM: msg = "Numerical argument out of domain"; break; + case ERANGE: msg = "Result too large"; break; + + // should be rearranged + case EHOSTDOWN: msg = "Host is down"; break; + case EHOSTUNREACH: msg = "No route to host"; break; + case ENOTEMPTY: msg = "Directory not empty"; break; + + // quotas & mush + case EPROCLIM: msg = "Too many processes"; break; + case EUSERS: msg = "Too many users"; break; + case EDQUOT: msg = "Disc quota exceeded"; break; + + // Intelligent device errors + case EPWROFF: msg = "Device power is off"; break; + case EDEVERR: msg = "Device error, e.g. paper out"; break; + case EOVERFLOW: msg = "Value too large to be stored in data type"; break; + + // Socket errors + case ENOBUFS: msg = "Broken buffer"; break; + case EINPROGRESS: msg = "Operation now in progress"; break; + case EOPNOTSUPP: msg = "Operation not supported on transport endpoint"; break; + case EWOULDBLOCK: msg = "Operation would block"; break; + case ENOTCONN: msg = "Transport endpoint is not connected"; break; + case EALREADY: msg = "Operation already in progress"; break; + case EMSGSIZE: msg = "Message too long"; break; + case EADDRINUSE: msg = "Address already in use"; break; + case ECONNREFUSED: msg = "Connection refused"; break; + case ECONNRESET: msg = "Connection reset by peer"; break; + case EISCONN: msg = "Transport endpoint is already connected"; break; + case ETIMEDOUT: msg = "Connection timed out"; break; + case ECONNABORTED: msg = "Software caused connection abort"; break; + default: msg = "Unknown error"; break; + } + return msg; +} diff --git a/contrib/kolibri-libc/source/string/strlen.c b/contrib/kolibri-libc/source/string/strlen.c new file mode 100644 index 0000000000..fc3a1b6baa --- /dev/null +++ b/contrib/kolibri-libc/source/string/strlen.c @@ -0,0 +1,19 @@ +/* strlen( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +size_t strlen( const char * s ) +{ + size_t rc = 0; + + while ( s[rc] ) + { + ++rc; + } + + return rc; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strncat.c b/contrib/kolibri-libc/source/string/strncat.c new file mode 100644 index 0000000000..5ec655e561 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strncat.c @@ -0,0 +1,29 @@ +/* strncat( char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strncat( char * s1, const char * s2, size_t n ) +{ + char * rc = s1; + + while ( *s1 ) + { + ++s1; + } + + while ( n && ( *s1++ = *s2++ ) ) + { + --n; + } + + if ( n == 0 ) + { + *s1 = '\0'; + } + + return rc; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strncmp.c b/contrib/kolibri-libc/source/string/strncmp.c new file mode 100644 index 0000000000..72b54b4184 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strncmp.c @@ -0,0 +1,26 @@ +/* strncmp( const char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +int strncmp( const char * s1, const char * s2, size_t n ) +{ + while ( n && *s1 && ( *s1 == *s2 ) ) + { + ++s1; + ++s2; + --n; + } + + if ( n == 0 ) + { + return 0; + } + else + { + return ( *( unsigned char * )s1 - * ( unsigned char * )s2 ); + } +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strncpy.c b/contrib/kolibri-libc/source/string/strncpy.c new file mode 100644 index 0000000000..91e05621cd --- /dev/null +++ b/contrib/kolibri-libc/source/string/strncpy.c @@ -0,0 +1,29 @@ +/* strncpy( char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strncpy( char * s1, const char * s2, size_t n ) +{ + char * rc = s1; + + while ( n && ( *s1++ = *s2++ ) ) + { + /* Cannot do "n--" in the conditional as size_t is unsigned and we have + to check it again for >0 in the next loop below, so we must not risk + underflow. + */ + --n; + } + + /* Checking against 1 as we missed the last --n in the loop above. */ + while ( n-- > 1 ) + { + *s1++ = '\0'; + } + + return rc; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strpbrk.c b/contrib/kolibri-libc/source/string/strpbrk.c new file mode 100644 index 0000000000..c58f87433e --- /dev/null +++ b/contrib/kolibri-libc/source/string/strpbrk.c @@ -0,0 +1,30 @@ +/* strpbrk( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strpbrk( const char * s1, const char * s2 ) +{ + const char * p1 = s1; + const char * p2; + + while ( *p1 ) + { + p2 = s2; + + while ( *p2 ) + { + if ( *p1 == *p2++ ) + { + return ( char * ) p1; + } + } + + ++p1; + } + + return NULL; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strrchr.c b/contrib/kolibri-libc/source/string/strrchr.c new file mode 100644 index 0000000000..4a36793424 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strrchr.c @@ -0,0 +1,27 @@ +/* strrchr( const char *, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strrchr( const char * s, int c ) +{ + size_t i = 0; + + while ( s[i++] ) + { + /* EMPTY */ + } + + do + { + if ( s[--i] == ( char ) c ) + { + return ( char * ) s + i; + } + } while ( i ); + + return NULL; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strrev.c b/contrib/kolibri-libc/source/string/strrev.c new file mode 100644 index 0000000000..e96d5e2d8a --- /dev/null +++ b/contrib/kolibri-libc/source/string/strrev.c @@ -0,0 +1,15 @@ +#include + +char* strrev(char *p) +{ + char *q = p, *res = p, z; + while(q && *q) ++q; /* find eos */ + for(--q; p < q; ++p, --q) + { + z = *p; + *p = *q; + *q = z; + } + return res; +} + \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strspn.c b/contrib/kolibri-libc/source/string/strspn.c new file mode 100644 index 0000000000..96ce6d67b8 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strspn.c @@ -0,0 +1,37 @@ +/* strspn( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +size_t strspn( const char * s1, const char * s2 ) +{ + size_t len = 0; + const char * p; + + while ( s1[ len ] ) + { + p = s2; + + while ( *p ) + { + if ( s1[len] == *p ) + { + break; + } + + ++p; + } + + if ( ! *p ) + { + return len; + } + + ++len; + } + + return len; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strstr.c b/contrib/kolibri-libc/source/string/strstr.c new file mode 100644 index 0000000000..d1f28b1ff9 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strstr.c @@ -0,0 +1,34 @@ +/* strstr( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char * strstr( const char * s1, const char * s2 ) +{ + const char * p1 = s1; + const char * p2; + + while ( *s1 ) + { + p2 = s2; + + while ( *p2 && ( *p1 == *p2 ) ) + { + ++p1; + ++p2; + } + + if ( ! *p2 ) + { + return ( char * ) s1; + } + + ++s1; + p1 = s1; + } + + return NULL; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/string/strtok.c b/contrib/kolibri-libc/source/string/strtok.c new file mode 100644 index 0000000000..1f756940e9 --- /dev/null +++ b/contrib/kolibri-libc/source/string/strtok.c @@ -0,0 +1,30 @@ +/* strtok( char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +char* strtok(char* s, const char* delim) +{ + static char* savep; + char* res; + + if(s) + savep = NULL; + else + s = savep; + + if (*s == '\0') + return NULL; + s += strspn(s, delim); + if (*s == '\0') + return NULL; + res = s; + s += strcspn(s, delim); + savep = s + 1; + *s = '\0'; + return res; +} + diff --git a/contrib/kolibri-libc/source/string/strxfrm.c b/contrib/kolibri-libc/source/string/strxfrm.c new file mode 100644 index 0000000000..f24afd534d --- /dev/null +++ b/contrib/kolibri-libc/source/string/strxfrm.c @@ -0,0 +1,26 @@ +/* strxfrm( char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +size_t strxfrm( char * s1, const char * s2, size_t n ) +{ + size_t len = strlen( s2 ); + + if ( len < n ) + { + /* Cannot use strncpy() here as the filling of s1 with '\0' is not part + of the spec. + */ + /* FIXME: This should access _PDCLIB_lc_collate. */ + while ( n-- && ( *s1++ = ( unsigned char )*s2++ ) ) + { + /* EMPTY */ + } + } + + return len; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/sys/closedir.c b/contrib/kolibri-libc/source/sys/closedir.c new file mode 100644 index 0000000000..9dcca25f44 --- /dev/null +++ b/contrib/kolibri-libc/source/sys/closedir.c @@ -0,0 +1,14 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include + +int closedir(DIR *dir){ + if(dir == NULL){ + return -1; + }else{ + free(dir->objs); + free(dir); + return 0; + } +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/sys/opendir.c b/contrib/kolibri-libc/source/sys/opendir.c new file mode 100644 index 0000000000..d39565a8d2 --- /dev/null +++ b/contrib/kolibri-libc/source/sys/opendir.c @@ -0,0 +1,53 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include +#include +#include +#include + +#define CHECK_DIR_ERR() if(_ksys_work_files(&inf)){ \ + free((void*)inf.p16); \ + errno = ENOTDIR; \ + return NULL; \ + } + +DIR* opendir(const char* path) +{ + DIR* list = malloc(sizeof(DIR)); + if(list==NULL){ + errno = ENOMEM; + return NULL; + } + + list->pos=0; + unsigned num_of_file=0; + ksys70_t inf; + + inf.p00 = 1; + inf.p04 = 0; + inf.p12 = 2; + inf.p16 = (unsigned) malloc(32+inf.p12*560); + inf.p20 = 0; + inf.p21 = (char*)path; + + CHECK_DIR_ERR(); + + num_of_file = *(unsigned*)(inf.p16+8); + inf.p12 = num_of_file; + free((void*)inf.p16); + inf.p16 = (unsigned) malloc(32+inf.p12*560); + list->objs = (struct dirent*)malloc(num_of_file*sizeof(struct dirent)); + + CHECK_DIR_ERR(); + + for(int i=0; iobjs[i].d_ino = i; + list->objs[i].d_type = *(unsigned*)(inf.p16+32+(264+40)*i); + strcpy(list->objs[i].d_name,(char*)(inf.p16+32+40+(264+40)*i)); + } + list->num_objs = num_of_file; + return list; +} + + diff --git a/contrib/kolibri-libc/source/sys/readdir.c b/contrib/kolibri-libc/source/sys/readdir.c new file mode 100644 index 0000000000..e5e68dbcdd --- /dev/null +++ b/contrib/kolibri-libc/source/sys/readdir.c @@ -0,0 +1,14 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include +#include + +struct dirent* readdir(DIR *dir) +{ + if(dir->num_objs>dir->pos){ + dir->pos++; + return &dir->objs[dir->pos-1]; + }else{ + return NULL; + } +} diff --git a/contrib/kolibri-libc/source/sys/rewinddir.c b/contrib/kolibri-libc/source/sys/rewinddir.c new file mode 100644 index 0000000000..3fc549857b --- /dev/null +++ b/contrib/kolibri-libc/source/sys/rewinddir.c @@ -0,0 +1,9 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include + +void rewinddir(DIR *dir){ + if(dir!=NULL){ + dir->pos=0; + } +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/sys/seekdir.c b/contrib/kolibri-libc/source/sys/seekdir.c new file mode 100644 index 0000000000..cb6c8e9463 --- /dev/null +++ b/contrib/kolibri-libc/source/sys/seekdir.c @@ -0,0 +1,12 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include + +void seekdir(DIR *dir, unsigned pos) +{ + if(dir==NULL || pos>dir->num_objs){ + return; + } + dir->pos=pos; + return; +} \ No newline at end of file diff --git a/contrib/kolibri-libc/source/sys/telldir.c b/contrib/kolibri-libc/source/sys/telldir.c new file mode 100644 index 0000000000..e3647a47c5 --- /dev/null +++ b/contrib/kolibri-libc/source/sys/telldir.c @@ -0,0 +1,12 @@ +/* Copyright (C) 2021 Logaev Maxim (turbocat2001), GPLv2 */ + +#include + +unsigned telldir(DIR *dir) +{ + if(dir!=NULL){ + return dir->pos; + }else{ + return 0; + } +} \ No newline at end of file diff --git a/contrib/kolibri-libc/tests/Makefile.gcc b/contrib/kolibri-libc/tests/Makefile.gcc new file mode 100644 index 0000000000..539595106c --- /dev/null +++ b/contrib/kolibri-libc/tests/Makefile.gcc @@ -0,0 +1,16 @@ +CC = ../linuxtools/kgcc +LD = ../linuxtools/kld + +SRC = $(NAME).c + +.PHONY: all + +all: $(NAME) + +$(NAME): $(SRC) + $(CC) -s -Os $(SRC) + $(LD) $(NAME).o -o $(NAME) -lc + ../bin/kpack --nologo $(NAME) + +clean: + rm $(NAME).o $(NAME) diff --git a/contrib/kolibri-libc/tests/Makefile.tcc b/contrib/kolibri-libc/tests/Makefile.tcc new file mode 100644 index 0000000000..442d4cf110 --- /dev/null +++ b/contrib/kolibri-libc/tests/Makefile.tcc @@ -0,0 +1,16 @@ +KTCC= ../bin/kos32-tcc +KPACK= kpack + +SRC=$(NAME).c +CFLAGS = -I ../source/include -stack=1048576 # set stack size 1Mb + +.PHONY: all + +all: $(NAME) + +$(NAME): $(SRC) + $(KTCC) $(CFLAGS) $(SRC) -o $(NAME) -lc + $(KPACK) $(NAME) + +clean: + rm $(NAME).o $(NAME) diff --git a/contrib/kolibri-libc/tests/argtest.c b/contrib/kolibri-libc/tests/argtest.c new file mode 100644 index 0000000000..60e51e2245 --- /dev/null +++ b/contrib/kolibri-libc/tests/argtest.c @@ -0,0 +1,21 @@ +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + #ifdef _DYNAMIC + ksys_coff_etable_t *libc=_ksys_cofflib_load("/sys/lib/libc.obj"); + debug_printf = _ksys_cofflib_getproc(libc, "debug_printf"); + #endif + char test_stack[1000000]; + debug_printf("argc = %d\n", argc); + debug_printf("Argument array:\n"); + + for(int i = 0; i < argc; i++) { + debug_printf("argv[%d] = %s\n", i, argv[i]); + } + debug_printf("Done!\n"); + return 0; +} diff --git a/contrib/kolibri-libc/tests/mathtest.c b/contrib/kolibri-libc/tests/mathtest.c new file mode 100644 index 0000000000..c14e917e02 --- /dev/null +++ b/contrib/kolibri-libc/tests/mathtest.c @@ -0,0 +1,24 @@ +#include +#include + +int fun_sum(int *num, int len) +{ + int sum=0; + for(int i=0; i +#include +#include + +int main(int argc, char** argv) +{ + DIR *dir; + struct dirent *entry; + dir = opendir("/sys"); + if (!dir) { + _ksys_debug_puts("diropen error!\n"); + return 0; + }; + while ((entry = readdir(dir)) != NULL) { + _ksys_debug_puts(entry->d_name); + _ksys_debug_putc('\n'); + }; + _ksys_debug_puts(itoa(telldir(dir))); + closedir(dir); +}