├── .gitignore ├── Makefile ├── README.md ├── Vagrantfile ├── include ├── crystal │ ├── arpa │ │ └── inet.yml │ ├── dirent.yml │ ├── dlfcn.yml │ ├── errno.yml │ ├── fcntl.yml │ ├── iconv.yml │ ├── netdb.yml │ ├── netinet │ │ ├── in.yml │ │ └── tcp.yml │ ├── pthread.yml │ ├── signal.yml │ ├── stddef.yml │ ├── stdint.yml │ ├── stdio.yml │ ├── stdlib.yml │ ├── string.yml │ ├── sys │ │ ├── mman.yml │ │ ├── select.yml │ │ ├── socket.yml │ │ ├── stat.yml │ │ ├── syscall.yml │ │ ├── time.yml │ │ ├── times.yml │ │ ├── types.yml │ │ ├── un.yml │ │ └── wait.yml │ ├── termios.yml │ ├── time.yml │ └── unistd.yml └── posix │ ├── arpa │ └── inet.yml │ ├── cpio.yml │ ├── dirent.yml │ ├── dlfcn.yml │ ├── errno.yml │ ├── fcntl.yml │ ├── fenv.yml │ ├── float.yml │ ├── fnmatch.yml │ ├── ftw.yml │ ├── glob.yml │ ├── grp.yml │ ├── iconv.yml │ ├── langinfo.yml │ ├── libgen.yml │ ├── limits.yml │ ├── locale.yml │ ├── math.yml │ ├── monetary.yml │ ├── net │ └── if.yml │ ├── netdb.yml │ ├── netinet │ ├── in.yml │ └── tcp.yml │ ├── nl_types.yml │ ├── poll.yml │ ├── pthread.yml │ ├── pwd.yml │ ├── regex.yml │ ├── sched.yml │ ├── search.yml │ ├── semaphore.yml │ ├── setjmp.yml │ ├── signal.yml │ ├── spawn.yml │ ├── stddef.yml │ ├── stdint.yml │ ├── stdio.yml │ ├── stdlib.yml │ ├── string.yml │ ├── strings.yml │ ├── sys │ ├── ipc.yml │ ├── mman.yml │ ├── resource.yml │ ├── select.yml │ ├── sem.yml │ ├── shm.yml │ ├── socket.yml │ ├── stat.yml │ ├── statvfs.yml │ ├── syscall.yml │ ├── time.yml │ ├── times.yml │ ├── types.yml │ ├── uio.yml │ ├── un.yml │ ├── utsname.yml │ └── wait.yml │ ├── syslog.yml │ ├── termios.yml │ ├── time.yml │ ├── ulimit.yml │ ├── unistd.yml │ └── utmpx.yml ├── shard.lock ├── shard.yml └── src ├── base.cr ├── definition.cr ├── main.cr ├── resolver.cr └── transformer.cr /.gitignore: -------------------------------------------------------------------------------- 1 | /.crystal 2 | /.shards 3 | /lib 4 | /doc 5 | /targets 6 | /.vagrant 7 | /.vscode 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | MAIN = bin/main 2 | CRYSTAL_BIN ?= crystal 3 | TMP = /tmp/crystal-posix-test 4 | TEST = rm -f $(TMP); $(CRYSTAL_BIN) build --prelude=empty -o $(TMP) src/base.cr 5 | 6 | TARGET := $(subst -, ,$(shell \ 7 | llvm-config-3.9 --host-target 2>/dev/null || \ 8 | llvm-config-3.8 --host-target 2>/dev/null || \ 9 | llvm-config-3.6 --host-target 2>/dev/null || \ 10 | llvm-config-3.5 --host-target 2>/dev/null || \ 11 | llvm-config39 --host-target 2>/dev/null || \ 12 | llvm-config38 --host-target 2>/dev/null || \ 13 | llvm-config36 --host-target 2>/dev/null || \ 14 | llvm-config35 --host-target 2>/dev/null || \ 15 | llvm-config --host-target 2>/dev/null )) 16 | ARCH ?= $(word 1,$(TARGET)) 17 | SYS ?= $(word 3,$(TARGET)) 18 | ABI ?= $(word 4,$(TARGET)) 19 | 20 | .PHONY: clean test 21 | 22 | all: bin/main 23 | $(MAIN) --arch=$(ARCH) --sys=$(SYS) --abi=$(ABI) 24 | 25 | crystal: bin/main 26 | $(MAIN) --arch=$(ARCH) --sys=$(SYS) --abi=$(ABI) --source=$(PWD)/include/crystal 27 | 28 | clean: 29 | rm -f bin/main 30 | 31 | bin/main: src/*.cr 32 | @mkdir -p bin 33 | $(CRYSTAL_BIN) build -d -o bin/main src/main.cr 34 | 35 | gnu32: bin/main 36 | C_INCLUDE_PATH=/usr/include:/usr/lib/llvm-3.8/lib/clang/3.8.0/include \ 37 | $(MAIN) --arch=$(ARCH) --sys=$(SYS) --abi=$(ABI) --source=$(PWD)/include/crystal 38 | 39 | arm32: 40 | C_INCLUDE_PATH=c_include/linux/arm:c_include/linux/arm/linux:c_include/linux/arm/arm-linux-gnueabihf \ 41 | $(MAIN) --arch=arm --sys=linux --abi=gnueabihf --source=include/crystal 42 | 43 | arm64: 44 | C_INCLUDE_PATH=c_include/linux/arm64:c_include/linux/arm64/linux:c_include/linux/arm64/aarch64-linux-gnu \ 45 | $(MAIN) --arch=aarch64 --sys=linux --abi=gnu --source=include/crystal 46 | 47 | test: 48 | for target in targets/*; do\ 49 | echo $$target;\ 50 | for file in `find $$target -iname "*.cr"`; do\ 51 | $(TEST) $$file;\ 52 | done;\ 53 | done 54 | 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # C bindings for Crystal 2 | 3 | Follows the IEEE Std 1003.1, 2013 Edition (The Open Group Base Specifications 4 | Issue 7) as much as libc implementations do, along with some common additions 5 | that are required by Crystal. 6 | 7 | Bindings are automatically generated with CrystalLib from C headers. 8 | 9 | 10 | ## Targets 11 | 12 | Crystal only supports the `x86` and `x86_64` targets for now, but we should be 13 | capable to generate bindings for whatever POSIX C implementation. Each target 14 | will be checked when headers have been verified to be compliant. 15 | 16 | - Android 17 | - [ ] `arm` 18 | - [ ] `arm64` 19 | - [ ] `mips` 20 | - [ ] `mips64` 21 | - [ ] `mips` 22 | - [ ] `mips64` 23 | - [ ] `x86` 24 | - [ ] `x86_64` 25 | 26 | - FreeBSD 27 | - [ ] `x86` 28 | - [x] `x86_64` 29 | 30 | - iOS 31 | - [ ] `arm` 32 | - [ ] `arm64` 33 | 34 | - Linux 35 | - [x] gnu (`x86`, `x86_64`) 36 | - [x] musl (`x86`, `x86_64`) 37 | 38 | - Mac OSX 39 | - [x] darwin (`x86_64`) 40 | 41 | - Windows 42 | - [ ] cygwin 43 | 44 | ## Headers 45 | 46 | - [ ] `aio.h` 47 | - [x] `arpa/inet.h` 48 | - [ ] `assert.h` 49 | - [ ] `complex.h` 50 | - [x] `cpio.h` 51 | - [ ] `ctype.h` 52 | - [x] `dirent.h` 53 | - [x] `dlfcn.h` 54 | - [x] `errno.h` 55 | - [x] `fcntl.h` 56 | - [x] `fenv.h` 57 | - [x] `float.h` 58 | - [ ] `fmtmsg.h` 59 | - [x] `fnmatch.h` 60 | - [x] `ftw.h` 61 | - [x] `glob.h` 62 | - [x] `grp.h` 63 | - [x] `iconv.h` 64 | - [ ] `inttypes.h` 65 | - [ ] `iso646.h` 66 | - [x] `langinfo.h` 67 | - [x] `libgen.h` 68 | - [x] `limits.h` 69 | - [x] `locale.h` 70 | - [x] `math.h` 71 | - [x] `monetary.h` 72 | - [ ] `mqueue.h` 73 | - [ ] `ndbm.h` 74 | - [x] `net/if.h` 75 | - [x] `netdb.h` 76 | - [x] `netinet/in.h` 77 | - [x] `netinet/tcp.h` 78 | - [x] `nl_types.h` 79 | - [x] `poll.h` 80 | - [x] `pthread.h` 81 | - [x] `pwd.h` 82 | - [x] `regex.h` 83 | - [x] `sched.h` 84 | - [x] `search.h` 85 | - [x] `semaphore.h` 86 | - [x] `setjmp.h` 87 | - [x] `signal.h` 88 | - [x] `spawn.h` 89 | - [ ] `stdarg.h` 90 | - [ ] `stdbool.h` 91 | - [x] `stddef.h` 92 | - [x] `stdint.h` 93 | - [x] `stdio.h` 94 | - [x] `stdlib.h` 95 | - [x] `string.h` 96 | - [x] `strings.h` 97 | - [ ] `stropts.h` 98 | - [x] `sys/ipc.h` 99 | - [x] `sys/mman.h` 100 | - [ ] `sys/msg.h` 101 | - [x] `sys/resource.h` 102 | - [x] `sys/select.h` 103 | - [x] `sys/sem.h` 104 | - [x] `sys/shm.h` 105 | - [x] `sys/socket.h` 106 | - [x] `sys/stat.h` 107 | - [ ] `sys/statvfs.h` 108 | - [x] `sys/time.h` 109 | - [x] `sys/times.h` 110 | - [x] `sys/types.h` 111 | - [x] `sys/uio.h` 112 | - [x] `sys/un.h` 113 | - [x] `sys/utsname.h` 114 | - [x] `sys/wait.h` 115 | - [x] `syslog.h` 116 | - [ ] `tar.h` 117 | - [x] `termios.h` 118 | - [ ] `tgmath.h` 119 | - [x] `time.h` 120 | - [ ] `trace.h` 121 | - [x] `ulimit.h` 122 | - [x] `unistd.h` 123 | - [x] `utmpx.h` 124 | - [ ] `wchar.h` 125 | - [ ] `wctype.h` 126 | - [ ] `wordexp.h` 127 | 128 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | UBUNTU_PROVISION = <<-SH 2 | echo "deb http://llvm.org/apt/precise/ llvm-toolchain-precise-3.6 main" > /etc/apt/sources.list.d/llvm.list 3 | wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - 4 | apt-add-repository ppa:ubuntu-toolchain-r/test 5 | curl -s http://dist.crystal-lang.org/apt/setup.sh | bash 6 | 7 | apt-get install -y build-essential git clang-3.6 llvm-3.6-dev crystal 8 | apt-get install -y libgmp3-dev zlib1g-dev libedit-dev libxml2-dev libssl-dev libyaml-dev libreadline-dev 9 | apt-get clean 10 | 11 | echo 'export LIBRARY_PATH="/opt/crystal/embedded/lib"' > /etc/profile.d/crystal.sh 12 | echo 'export CC=clang-3.6 CXX=clang-3.6++' >> /etc/profile.d/crystal.sh 13 | SH 14 | 15 | ALPINE_PROVISION = <<-SH 16 | apk add openssl 17 | wget "https://dl.dropboxusercontent.com/u/53345358/alpine/julien%40portalier.com-56dab02e.rsa.pub" -O /etc/apk/keys/julien@portalier.com-56dab02e.rsa.pub 18 | echo "https://dl.dropboxusercontent.com/u/53345358/alpine/testing" >> /etc/apk/repositories 19 | apk update 20 | apk add git build-base llvm-dev clang crystal shards 21 | apk add bash libevent-dev pcre-dev ncurses-dev zlib-dev gc-dev libxml2-dev openssl-dev readline-dev gmp-dev yaml-dev 22 | SH 23 | 24 | #FREEBSD_PROVISION = <<-SH 25 | # TODO: download crystal compiler + patched GC 26 | # pkg install -y git gmake pkgconf pcre libunwind clang36 libyaml gmp libevent2 27 | #SH 28 | 29 | Vagrant.configure(2) do |config| 30 | config.vm.define "gnu32" do |c| 31 | c.vm.box = "erickeller/precise-i386" 32 | c.vm.provision :shell, inline: UBUNTU_PROVISION 33 | end 34 | 35 | config.vm.define "gnu64" do |c| 36 | c.vm.box = "fgrehm/precise64-lxc" 37 | c.vm.provision :shell, inline: UBUNTU_PROVISION 38 | end 39 | 40 | config.vm.define "musl32" do |c| 41 | c.ssh.shell = "ash" 42 | c.vm.box = "ysbaddaden/alpine32" 43 | c.vm.provision :shell, inline: ALPINE_PROVISION 44 | end 45 | 46 | config.vm.define "musl64" do |c| 47 | c.ssh.shell = "ash" 48 | c.vm.box = "ysbaddaden/alpine64" 49 | c.vm.provision :shell, inline: ALPINE_PROVISION 50 | end 51 | 52 | #config.vm.define "freebsd64" do |c| 53 | # c.ssh.shell = "csh" 54 | # c.vm.box = "freebsd/FreeBSD-10.2-RELEASE" 55 | # c.vm.provision :shell, inline: FREEBSD_PROVISION 56 | #end 57 | 58 | #config.vm.provider "virtualbox" do |vb| 59 | # vb.memory = 4096 60 | # vb.cpus = 2 61 | #end 62 | end 63 | -------------------------------------------------------------------------------- /include/crystal/arpa/inet.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - arpa/inet 3 | 4 | requires: 5 | - netinet/in 6 | - stdint 7 | 8 | functions: 9 | #- htonl 10 | - htons 11 | #- ntohl 12 | - ntohs 13 | 14 | #- inet_addr 15 | #- inet_ntoa 16 | - inet_ntop 17 | - inet_pton 18 | -------------------------------------------------------------------------------- /include/crystal/dirent.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - dirent 3 | 4 | requires: 5 | - sys/types 6 | 7 | types: 8 | - DIR = Void 9 | 10 | structs: 11 | - dirent 12 | 13 | functions: 14 | #- alphasort 15 | - closedir 16 | #- dirfd 17 | #- fdopendir 18 | - opendir 19 | - readdir 20 | #- readdir_r 21 | - rewinddir 22 | #- scandir 23 | #- seekdir 24 | #- telldir 25 | -------------------------------------------------------------------------------- /include/crystal/dlfcn.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - dlfcn 3 | 4 | libraries: 5 | darwin: 6 | - dl 7 | gnu: 8 | - dl 9 | android: 10 | - dl 11 | 12 | constants: 13 | - RTLD_LAZY 14 | - RTLD_NOW 15 | - RTLD_GLOBAL 16 | - RTLD_LOCAL 17 | 18 | - RTLD_DEFAULT 19 | - RTLD_NEXT 20 | 21 | structs: 22 | # not posix 23 | - Dl_info 24 | 25 | functions: 26 | - dlclose 27 | - dlerror 28 | - dlopen 29 | - dlsym 30 | 31 | # not posix 32 | - dladdr 33 | -------------------------------------------------------------------------------- /include/crystal/errno.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - errno 3 | 4 | constants: 5 | - E2BIG 6 | - EACCES 7 | - EADDRINUSE 8 | - EADDRNOTAVAIL 9 | - EAFNOSUPPORT 10 | - EAGAIN 11 | - EALREADY 12 | - EBADF 13 | - EBADMSG 14 | - EBUSY 15 | - ECANCELED 16 | - ECHILD 17 | - ECONNABORTED 18 | - ECONNREFUSED 19 | - ECONNRESET 20 | - EDEADLK 21 | - EDESTADDRREQ 22 | - EDOM 23 | - EDQUOT 24 | - EEXIST 25 | - EFAULT 26 | - EFBIG 27 | - EHOSTUNREACH 28 | - EIDRM 29 | - EILSEQ 30 | - EINPROGRESS 31 | - EINTR 32 | - EINVAL 33 | - EIO 34 | - EISCONN 35 | - EISDIR 36 | - ELOOP 37 | - EMFILE 38 | - EMLINK 39 | - EMSGSIZE 40 | - EMULTIHOP 41 | - ENAMETOOLONG 42 | - ENETDOWN 43 | - ENETRESET 44 | - ENETUNREACH 45 | - ENFILE 46 | - ENOBUFS 47 | - ENODEV 48 | - ENOENT 49 | - ENOEXEC 50 | - ENOLCK 51 | - ENOLINK 52 | - ENOMEM 53 | - ENOMSG 54 | - ENOPROTOOPT 55 | - ENOSPC 56 | - ENOSYS 57 | - ENOTCONN 58 | - ENOTDIR 59 | - ENOTEMPTY 60 | - ENOTRECOVERABLE 61 | - ENOTSOCK 62 | - ENOTSUP 63 | - ENOTTY 64 | - ENXIO 65 | - EOPNOTSUPP 66 | - EOVERFLOW 67 | - EOWNERDEAD 68 | - EPERM 69 | - EPIPE 70 | - EPROTO 71 | - EPROTONOSUPPORT 72 | - EPROTOTYPE 73 | - ERANGE 74 | - EROFS 75 | - ESPIPE 76 | - ESRCH 77 | - ESTALE 78 | - ETIMEDOUT 79 | - ETXTBSY 80 | - EWOULDBLOCK 81 | - EXDEV 82 | 83 | # obsolete (but may happen) 84 | - ENODATA 85 | - ENOSR 86 | - ENOSTR 87 | - ETIME 88 | -------------------------------------------------------------------------------- /include/crystal/fcntl.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - fcntl 3 | 4 | requires: 5 | - sys/types 6 | - sys/stat 7 | - unistd 8 | 9 | constants: 10 | #- F_DUPFD 11 | #- F_DUPFD_CLOEXEC 12 | - F_GETFD 13 | - F_SETFD 14 | - F_GETFL 15 | - F_SETFL 16 | #- F_GETLK 17 | #- F_SETLK 18 | #- F_SETLKW 19 | #- F_GETOWN 20 | #- F_SETOWN 21 | 22 | - FD_CLOEXEC 23 | #- F_RDLCK 24 | #- F_UNLCK 25 | #- F_WRLCK 26 | 27 | - O_CLOEXEC 28 | - O_CREAT 29 | #- O_DIRECTORY 30 | #- O_EXCL 31 | #- O_NOCTTY 32 | - O_NOFOLLOW 33 | - O_TRUNC 34 | 35 | #- O_TTY_INIT 36 | 37 | - O_APPEND 38 | #- O_DSYNC 39 | - O_NONBLOCK 40 | - O_SYNC 41 | #- O_RSYNC 42 | 43 | #- O_PATH # musl-libc 44 | #- O_EXEC 45 | - O_RDONLY 46 | - O_RDWR 47 | #- O_SEARCH 48 | - O_WRONLY 49 | 50 | #- O_ACCMODE 51 | 52 | #- AT_FDCWD 53 | #- AT_EACCESS 54 | #- AT_SYMLINK_NOFOLLOW 55 | #- AT_SYMLINK_FOLLOW 56 | #- AT_REMOVEDIR 57 | 58 | #- POSIX_FADV_DONTNEED 59 | #- POSIX_FADV_NOREUSE 60 | #- POSIX_FADV_NORMAL 61 | #- POSIX_FADV_RANDOM 62 | #- POSIX_FADV_SEQUENTIAL 63 | #- POSIX_FADV_WILLNEED 64 | 65 | structs: 66 | - flock 67 | 68 | functions: 69 | #- creat 70 | - fcntl 71 | - open 72 | #- openat 73 | #- posix_fadvise 74 | #- posix_fallocate 75 | -------------------------------------------------------------------------------- /include/crystal/iconv.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - iconv 3 | 4 | libraries: 5 | darwin: 6 | - iconv 7 | openbsd: 8 | - iconv 9 | 10 | requires: 11 | - stddef 12 | 13 | structs: 14 | - iconv_t 15 | 16 | functions: 17 | - iconv 18 | - iconv_close 19 | - iconv_open 20 | -------------------------------------------------------------------------------- /include/crystal/netdb.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - netdb 3 | 4 | requires: 5 | - netinet/in 6 | - sys/socket 7 | - stdint 8 | 9 | constants: 10 | - AI_PASSIVE 11 | - AI_CANONNAME 12 | - AI_NUMERICHOST 13 | - AI_NUMERICSERV 14 | - AI_V4MAPPED 15 | - AI_ALL 16 | - AI_ADDRCONFIG 17 | 18 | #- NI_NOFQDN 19 | #- NI_NUMERICHOST 20 | #- NI_NAMEREQD 21 | #- NI_NUMERICSERV 22 | #- NI_DGRAM 23 | #- NI_NUMERICSCOPE 24 | 25 | - EAI_AGAIN 26 | - EAI_BADFLAGS 27 | - EAI_FAIL 28 | - EAI_FAMILY 29 | - EAI_MEMORY 30 | - EAI_NONAME 31 | - EAI_SERVICE 32 | - EAI_SOCKTYPE 33 | - EAI_SYSTEM 34 | - EAI_OVERFLOW 35 | 36 | ## not posix 37 | #- NI_MAXHOST 38 | #- NI_MAXSERV 39 | 40 | structs: 41 | #- hostent 42 | #- netent 43 | #- protoent 44 | #- servent 45 | - addrinfo 46 | 47 | functions: 48 | #- endhostent 49 | #- endnetent 50 | #- endprotoent 51 | #- endservent 52 | - freeaddrinfo 53 | - gai_strerror 54 | - getaddrinfo 55 | #- gethostent 56 | - getnameinfo 57 | #- getnetbyaddr 58 | #- getnetbyname 59 | #- getnetent 60 | #- getprotobyname 61 | #- getprotobynumber 62 | #- getprotoent 63 | #- getservbyname 64 | #- getservbyport 65 | #- getservent 66 | #- sethostent 67 | #- setnetent 68 | #- setprotoent 69 | #- setservent 70 | -------------------------------------------------------------------------------- /include/crystal/netinet/in.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - netinet/in 3 | 4 | requires: 5 | - sys/socket 6 | - stdint 7 | 8 | constants: 9 | - IPPROTO_IP 10 | #- IPPROTO_IPV6 11 | - IPPROTO_ICMP 12 | - IPPROTO_RAW 13 | - IPPROTO_TCP 14 | - IPPROTO_UDP 15 | 16 | #- INADDR_ANY 17 | #- INADDR_BROADCAST 18 | #- INADDR_NONE 19 | #- INADDR_LOOPBACK 20 | 21 | #- INET_ADDRSTRLEN 22 | #- INET6_ADDRSTRLEN 23 | 24 | #- IPV6_JOIN_GROUP 25 | #- IPV6_LEAVE_GROUP 26 | #- IPV6_MULTICAST_HOPS 27 | #- IPV6_MULTICAST_IF 28 | #- IPV6_MULTICAST_LOOP 29 | #- IPV6_UNICAST_HOPS 30 | #- IPV6_V6ONLY 31 | 32 | #- IPV6_ADD_MEMBERSHIP # cygwin 33 | #- IPV6_DROP_MEMBERSHIP # cygwin 34 | 35 | #macros: 36 | # - IN6_IS_ADDR_UNSPECIFIED 37 | # - IN6_IS_ADDR_LOOPBACK 38 | # - IN6_IS_ADDR_MULTICAST 39 | # - IN6_IS_ADDR_LINKLOCAL 40 | # - IN6_IS_ADDR_SITELOCAL 41 | # - IN6_IS_ADDR_V4MAPPED 42 | # - IN6_IS_ADDR_V4COMPAT 43 | # - IN6_IS_ADDR_MC_NODELOCAL 44 | # - IN6_IS_ADDR_MC_LINKLOCAL 45 | # - IN6_IS_ADDR_MC_SITELOCAL 46 | # - IN6_IS_ADDR_MC_ORGLOCAL 47 | # - IN6_IS_ADDR_MC_GLOBAL 48 | 49 | types: 50 | - in_port_t 51 | - in_addr_t 52 | 53 | structs: 54 | - in_addr 55 | - in6_addr 56 | - sockaddr_in 57 | - sockaddr_in6 58 | #- ipv6_mreq 59 | -------------------------------------------------------------------------------- /include/crystal/netinet/tcp.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - netinet/tcp 3 | 4 | constants: 5 | - TCP_NODELAY 6 | 7 | # not posix 8 | - TCP_KEEPIDLE 9 | - TCP_KEEPINTVL 10 | - TCP_KEEPCNT 11 | 12 | # darwin 13 | - TCP_KEEPALIVE 14 | -------------------------------------------------------------------------------- /include/crystal/pthread.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - pthread 3 | 4 | libraries: 5 | freebsd: 6 | - pthread 7 | openbsd: 8 | - pthread 9 | 10 | requires: 11 | - sys/types 12 | #- sched 13 | 14 | #constants: 15 | # - PTHREAD_BARRIER_SERIAL_THREAD 16 | # - PTHREAD_CANCEL_ASYNCHRONOUS 17 | # - PTHREAD_CANCEL_ENABLE 18 | # - PTHREAD_CANCEL_DEFERRED 19 | # - PTHREAD_CANCEL_DISABLE 20 | # - PTHREAD_CANCELED 21 | # - PTHREAD_CREATE_DETACHED 22 | # - PTHREAD_CREATE_JOINABLE 23 | # - PTHREAD_EXPLICIT_SCHED 24 | # - PTHREAD_INHERIT_SCHED 25 | # - PTHREAD_MUTEX_DEFAULT 26 | # - PTHREAD_MUTEX_ERRORCHECK 27 | # - PTHREAD_MUTEX_NORMAL 28 | # - PTHREAD_MUTEX_RECURSIVE 29 | # - PTHREAD_MUTEX_ROBUST 30 | # - PTHREAD_MUTEX_STALLED 31 | # - PTHREAD_PRIO_INHERIT 32 | # - PTHREAD_PRIO_NONE 33 | # - PTHREAD_PRIO_PROTECT 34 | # - PTHREAD_PROCESS_SHARED 35 | # - PTHREAD_PROCESS_PRIVATE 36 | # - PTHREAD_SCOPE_PROCESS 37 | # - PTHREAD_SCOPE_SYSTEM 38 | # 39 | # # FIXME: not parsed correctly 40 | # #- PTHREAD_COND_INITIALIZER 41 | # #- PTHREAD_MUTEX_INITIALIZER 42 | # #- PTHREAD_RWLOCK_INITIALIZER 43 | # 44 | # # FIXME: resolves to {PTHREAD_MUTEX_INITIALIZER,0} on freebsd/cygwin 45 | # #- PTHREAD_ONCE_INIT 46 | # 47 | # # freebsd 48 | # - PTHREAD_DETACHED 49 | 50 | #aliases: 51 | # pthread_once: pthread_once_t # freebsd 52 | 53 | functions: 54 | #- pthread_atfork 55 | #- pthread_attr_destroy 56 | #- pthread_attr_getdetachstate 57 | #- pthread_attr_getguardsize 58 | #- pthread_attr_getinheritsched 59 | #- pthread_attr_getschedparam 60 | #- pthread_attr_getschedpolicy 61 | #- pthread_attr_getscope 62 | #- pthread_attr_getstack 63 | #- pthread_attr_getstacksize 64 | #- pthread_attr_init 65 | #- pthread_attr_setdetachstate 66 | #- pthread_attr_setguardsize 67 | #- pthread_attr_setinheritsched 68 | #- pthread_attr_setschedparam 69 | #- pthread_attr_setschedpolicy 70 | #- pthread_attr_setscope 71 | #- pthread_attr_setstack 72 | #- pthread_attr_setstacksize 73 | #- pthread_barrier_destroy 74 | #- pthread_barrier_init 75 | #- pthread_barrier_wait 76 | #- pthread_barrierattr_destroy 77 | #- pthread_barrierattr_getpshared 78 | #- pthread_barrierattr_init 79 | #- pthread_barrierattr_setpshared 80 | #- pthread_cancel 81 | #- pthread_cleanup_pop 82 | #- pthread_cleanup_push 83 | - pthread_cond_broadcast 84 | - pthread_cond_destroy 85 | - pthread_cond_init 86 | - pthread_cond_signal 87 | #- pthread_cond_timedwait 88 | - pthread_cond_wait 89 | #- pthread_condattr_destroy 90 | #- pthread_condattr_getclock 91 | #- pthread_condattr_getpshared 92 | #- pthread_condattr_init 93 | #- pthread_condattr_setclock 94 | #- pthread_condattr_setpshared 95 | - pthread_create 96 | - pthread_detach 97 | - pthread_equal 98 | #- pthread_exit 99 | #- pthread_getconcurrency 100 | #- pthread_getcpuclockid 101 | #- pthread_getschedparam 102 | #- pthread_getspecific 103 | - pthread_join 104 | #- pthread_key_create 105 | #- pthread_key_delete 106 | - pthread_main_np 107 | #- pthread_mutex_consistent 108 | - pthread_mutex_destroy 109 | #- pthread_mutex_getprioceiling 110 | - pthread_mutex_init 111 | - pthread_mutex_lock 112 | #- pthread_mutex_setprioceiling 113 | #- pthread_mutex_timedlock 114 | - pthread_mutex_trylock 115 | - pthread_mutex_unlock 116 | #- pthread_mutexattr_destroy 117 | #- pthread_mutexattr_getprioceiling 118 | #- pthread_mutexattr_getprotocol 119 | #- pthread_mutexattr_getpshared 120 | #- pthread_mutexattr_getrobust 121 | #- pthread_mutexattr_gettype 122 | #- pthread_mutexattr_init 123 | #- pthread_mutexattr_setprioceiling 124 | #- pthread_mutexattr_setprotocol 125 | #- pthread_mutexattr_setpshared 126 | #- pthread_mutexattr_setrobust 127 | #- pthread_mutexattr_settype 128 | #- pthread_once 129 | #- pthread_rwlock_destroy 130 | #- pthread_rwlock_init 131 | #- pthread_rwlock_rdlock 132 | #- pthread_rwlock_timedrdlock 133 | #- pthread_rwlock_timedwrlock 134 | #- pthread_rwlock_tryrdlock 135 | #- pthread_rwlock_trywrlock 136 | #- pthread_rwlock_unlock 137 | #- pthread_rwlock_wrlock 138 | #- pthread_rwlockattr_destroy 139 | #- pthread_rwlockattr_getpshared 140 | #- pthread_rwlockattr_init 141 | #- pthread_rwlockattr_setpshared 142 | - pthread_self 143 | #- pthread_setcancelstate 144 | #- pthread_setcanceltype 145 | #- pthread_setconcurrency 146 | #- pthread_setschedparam 147 | #- pthread_setschedprio 148 | #- pthread_setspecific 149 | #- pthread_spin_destroy 150 | #- pthread_spin_init 151 | #- pthread_spin_lock 152 | #- pthread_spin_trylock 153 | #- pthread_spin_unlock 154 | #- pthread_testcancel 155 | -------------------------------------------------------------------------------- /include/crystal/signal.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - signal 3 | 4 | requires: 5 | - sys/types 6 | - time 7 | 8 | types: 9 | #- sig_atomic_t 10 | #- sigset_t 11 | #- mcontext_t 12 | - sighandler_t # android 13 | 14 | #structs: 15 | # - sigaction 16 | # - sigevent 17 | # - siginfo_t 18 | # - sigval 19 | # - stack_t 20 | # - ucontext_t 21 | 22 | #aliases: 23 | # sigaltstack: stack_t 24 | # siginfo: siginfo_t # gnu/i686, android 25 | 26 | constants: 27 | # FIXME: can't generate crystal code 28 | #- SIG_DFL 29 | #- SIG_ERR 30 | #- SIG_IGN 31 | 32 | #- SIGEV_NONE 33 | #- SIGEV_SIGNAL 34 | #- SIGEV_THREAD 35 | 36 | - SIGHUP 37 | - SIGINT 38 | - SIGQUIT 39 | - SIGILL 40 | - SIGTRAP 41 | - SIGIOT 42 | - SIGABRT 43 | - SIGFPE 44 | - SIGKILL 45 | - SIGBUS 46 | - SIGSEGV 47 | - SIGSYS 48 | - SIGPIPE 49 | - SIGALRM 50 | - SIGTERM 51 | - SIGURG 52 | - SIGSTOP 53 | - SIGTSTP 54 | - SIGCONT 55 | - SIGCHLD 56 | - SIGCLD 57 | - SIGTTIN 58 | - SIGTTOU 59 | - SIGIO 60 | - SIGXCPU 61 | - SIGXFSZ 62 | - SIGVTALRM 63 | - SIGUSR1 64 | - SIGUSR2 65 | 66 | - SIGEMT # darwin 67 | - SIGINFO # darwin 68 | - SIGWINCH # darwin, gnu, musl 69 | - SIGPWR # gnu, musl 70 | - SIGSTKFLT # gnu, musl 71 | - SIGUNUSED # gnu, musl 72 | 73 | #- SIG_BLOCK 74 | #- SIG_UNBLOCK 75 | #- SIG_SETMASK 76 | #- SA_NOCLDSTOP 77 | #- SA_ONSTACK 78 | #- SA_RESETHAND 79 | #- SA_RESTART 80 | #- SA_SIGINFO 81 | #- SA_NOCLDWAIT 82 | #- SA_NODEFER 83 | #- SS_ONSTACK 84 | #- SS_DISABLE 85 | #- MINSIGSTKSZ 86 | #- SIGSTKSZ 87 | 88 | functions: 89 | - kill 90 | #- killpg 91 | #- psiginfo 92 | #- psignal 93 | #- pthread_kill 94 | #- pthread_sigmask 95 | #- raise 96 | #- sigaction 97 | #- sigaddset 98 | #- sigaltstack 99 | #- sigdelset 100 | #- sigemptyset 101 | #- sigfillset 102 | #- sigismember 103 | - signal 104 | #- sigpause 105 | #- sigpending 106 | #- sigprocmask 107 | #- sigqueue 108 | #- sigsuspend 109 | #- sigtimedwait 110 | #- sigwait 111 | #- sigwaitinfo 112 | -------------------------------------------------------------------------------- /include/crystal/stddef.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stddef 3 | 4 | #constants: 5 | # - NULL 6 | 7 | types: 8 | #- ptrdiff_t 9 | #- wchar_t 10 | - size_t 11 | -------------------------------------------------------------------------------- /include/crystal/stdint.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stdint 3 | 4 | types: 5 | - int8_t 6 | - int16_t 7 | - int32_t 8 | - int64_t 9 | - uint8_t 10 | - uint16_t 11 | - uint32_t 12 | - uint64_t 13 | 14 | #- int_least8_t 15 | #- int_least16_t 16 | #- int_least32_t 17 | #- int_least64_t 18 | #- uint_least8_t 19 | #- uint_least16_t 20 | #- uint_least32_t 21 | #- uint_least64_t 22 | 23 | #- int_fast8_t 24 | #- int_fast16_t 25 | #- int_fast32_t 26 | #- int_fast64_t 27 | #- uint_fast8_t 28 | #- uint_fast16_t 29 | #- uint_fast32_t 30 | #- uint_fast64_t 31 | 32 | #- intptr_t 33 | #- uintptr_t 34 | #- intmax_t 35 | #- uintmax_t 36 | 37 | #constants: 38 | # - INT8_MIN 39 | # - INT16_MIN 40 | # - INT32_MIN 41 | # - INT64_MIN 42 | # 43 | # - INT8_MAX 44 | # - INT16_MAX 45 | # - INT32_MAX 46 | # - INT64_MAX 47 | # 48 | # - UINT8_MAX 49 | # - UINT16_MAX 50 | # - UINT32_MAX 51 | # - UINT64_MAX 52 | # 53 | # - INT_LEAST8_MIN 54 | # - INT_LEAST16_MIN 55 | # - INT_LEAST32_MIN 56 | # - INT_LEAST64_MIN 57 | # 58 | # - INT_LEAST8_MAX 59 | # - INT_LEAST16_MAX 60 | # - INT_LEAST32_MAX 61 | # - INT_LEAST64_MAX 62 | # 63 | # - UINT_LEAST8_MAX 64 | # - UINT_LEAST16_MAX 65 | # - UINT_LEAST32_MAX 66 | # - UINT_LEAST64_MAX 67 | # 68 | # - INT_FAST8_MIN 69 | # - INT_FAST16_MIN 70 | # - INT_FAST32_MIN 71 | # - INT_FAST64_MIN 72 | # 73 | # - INT_FAST8_MAX 74 | # - INT_FAST16_MAX 75 | # - INT_FAST32_MAX 76 | # - INT_FAST64_MAX 77 | # 78 | # - UINT_FAST8_MAX 79 | # - UINT_FAST16_MAX 80 | # - UINT_FAST32_MAX 81 | # - UINT_FAST64_MAX 82 | # 83 | # - INTPTR_MIN 84 | # - INTPTR_MAX 85 | # - UINTPTR_MAX 86 | # 87 | # - INTMAX_MIN 88 | # - INTMAX_MAX 89 | # - UINTMAX_MAX 90 | # 91 | # - PTRDIFF_MIN 92 | # - PTRDIFF_MAX 93 | # 94 | # - SIG_ATOMIC_MIN 95 | # - SIG_ATOMIC_MAX 96 | # 97 | # - SIZE_MAX 98 | # 99 | # #- WCHAR_MIN 100 | # #- WCHAR_MAX 101 | # 102 | # #- WINT_MIN 103 | # #- WINT_MAX 104 | -------------------------------------------------------------------------------- /include/crystal/stdio.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stdio 3 | 4 | requires: 5 | - sys/types 6 | - stddef 7 | #- stdarg 8 | 9 | constants: 10 | #- BUFSIZ 11 | #- L_ctermid 12 | 13 | #- _IOFBF 14 | #- _IOLBF 15 | #- _IONBF 16 | 17 | #- SEEK_CUR 18 | #- SEEK_END 19 | #- SEEK_SET 20 | 21 | #- FILENAME_MAX 22 | #- FOPEN_MAX 23 | #- EOF 24 | 25 | #types: 26 | # - FILE = Void 27 | # - fpos_t 28 | 29 | functions: 30 | #- clearerr 31 | #- ctermid 32 | #- dprintf 33 | #- fclose 34 | #- fdopen 35 | #- feof 36 | #- ferror 37 | #- fflush 38 | #- fgetc 39 | #- fgetpos 40 | #- fgets 41 | #- fileno 42 | #- flockfile 43 | #- fmemopen 44 | #- fopen 45 | #- fprintf 46 | #- fputc 47 | #- fputs 48 | #- fread 49 | #- freopen 50 | #- fscanf 51 | #- fseek 52 | #- fseeko 53 | #- fsetpos 54 | #- ftell 55 | #- ftello 56 | #- ftrylockfile 57 | #- funlockfile 58 | #- fwrite 59 | #- getc 60 | #- getc_unlocked 61 | #- getchar 62 | #- getchar_unlocked 63 | #- getdelim 64 | #- getline 65 | #- open_memstream 66 | #- pclose 67 | #- perror 68 | #- popen 69 | - printf 70 | #- putc 71 | #- putc_unlocked 72 | #- putchar 73 | #- putchar_unlocked 74 | #- puts 75 | #- remove 76 | - rename 77 | #- renameat 78 | #- rewind 79 | #- scanf 80 | #- setbuf 81 | #- setvbuf 82 | - snprintf 83 | #- sprintf 84 | #- sscanf 85 | #- tmpfile 86 | #- ungetc 87 | 88 | # FIXME: undefined constant VaList 89 | #- vdprintf 90 | #- vfprintf 91 | #- vfscanf 92 | #- vprintf 93 | #- vscanf 94 | #- vsnprintf 95 | #- vsprintf 96 | #- vsscanf 97 | 98 | #variables: 99 | # - stderr 100 | # - stdin 101 | # - stdout 102 | -------------------------------------------------------------------------------- /include/crystal/stdlib.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stdlib 3 | 4 | requires: 5 | - stddef 6 | - sys/wait 7 | #- limits 8 | #- math 9 | 10 | maps: 11 | __compar_fn_t: "Void* -> Int" # gnu 12 | 13 | types: 14 | - div_t 15 | #- ldiv_t 16 | #- lldiv_t 17 | 18 | #macros: 19 | # - MB_CUR_MAX = MB_CUR_MAX 20 | # - WIFEXITED 21 | # - WEXITSTATUS 22 | # - WIFSIGNALED 23 | # - WIFSTOPPED 24 | # - WSTOPSIG 25 | # - WTERMSIG 26 | 27 | constants: 28 | #- EXIT_FAILURE 29 | #- EXIT_SUCCESS 30 | #- RAND_MAX 31 | 32 | functions: 33 | #- "_Exit : NoReturn" 34 | #- a64l 35 | #- abort 36 | #- abs 37 | #- atexit 38 | - atof 39 | #- atoi 40 | #- atol 41 | #- atoll 42 | #- bsearch 43 | #- calloc 44 | - div 45 | #- drand48 46 | #- erand48 47 | - "exit : NoReturn" 48 | - free 49 | - getenv 50 | #- getsubopt 51 | #- grantpt 52 | #- initstate 53 | #- jrand48 54 | #- l64a 55 | #- labs 56 | #- lcong48 57 | #- ldiv 58 | #- llabs 59 | #- lldiv 60 | #- lrand48 61 | - malloc 62 | #- mblen 63 | #- mbstowcs 64 | #- mbtowc 65 | #- mkdtemp 66 | - mkstemp 67 | #- mrand48 68 | #- nrand48 69 | #- posix_memalign 70 | #- posix_openpt 71 | #- ptsname 72 | - putenv 73 | #- qsort 74 | #- rand 75 | #- random 76 | - realloc 77 | - realpath 78 | #- seed48 79 | - setenv 80 | #- setkey 81 | #- setstate 82 | #- srand 83 | #- srand48 84 | #- srandom 85 | - strtod 86 | - strtof 87 | - strtol 88 | # NOTE: crystal doesn't support "long double" 89 | #- strtold 90 | #- strtoll 91 | #- strtoul 92 | #- strtoull 93 | #- system 94 | #- unlockpt 95 | - unsetenv 96 | #- wcstombs 97 | #- wctomb 98 | -------------------------------------------------------------------------------- /include/crystal/string.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - string 3 | 4 | requires: 5 | - stddef 6 | #- locale 7 | 8 | functions: 9 | #- memccpy 10 | - memchr 11 | - memcmp 12 | #- memcpy 13 | #- memmove 14 | #- memset 15 | #- stpcpy 16 | #- stpncpy 17 | #- strcat 18 | #- strchr 19 | - strcmp 20 | ##- strcoll 21 | ##- strcoll_l 22 | #- strcpy 23 | #- strcspn 24 | #- strdup 25 | - strerror 26 | ##- strerror_l 27 | #- strerror_r 28 | - strlen 29 | #- strncat 30 | #- strncmp 31 | #- strncpy 32 | #- strndup 33 | #- strnlen 34 | #- strpbrk 35 | #- strrchr 36 | #- strsignal 37 | #- strspn 38 | #- strstr 39 | #- strtok 40 | #- strtok_r 41 | #- strxfrm 42 | ##- strxfrm_l 43 | -------------------------------------------------------------------------------- /include/crystal/sys/mman.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/mman 3 | 4 | requires: 5 | - sys/types 6 | 7 | constants: 8 | - PROT_EXEC 9 | - PROT_NONE 10 | - PROT_READ 11 | - PROT_WRITE 12 | 13 | - MAP_FIXED 14 | - MAP_PRIVATE 15 | - MAP_SHARED 16 | 17 | # not posix 18 | - MAP_ANON 19 | - MAP_ANONYMOUS 20 | 21 | #- MS_ASYNC 22 | #- MS_INVALIDATE 23 | #- MS_SYNC 24 | 25 | #- MCL_CURRENT 26 | #- MCL_FUTURE 27 | 28 | - MAP_FAILED 29 | 30 | - POSIX_MADV_DONTNEED 31 | - POSIX_MADV_NORMAL 32 | - POSIX_MADV_RANDOM 33 | - POSIX_MADV_SEQUENTIAL 34 | - POSIX_MADV_WILLNEED 35 | 36 | #- POSIX_TYPED_MEM_ALLOCATE 37 | #- POSIX_TYPED_MEM_ALLOCATE_CONTIG 38 | #- POSIX_TYPED_MEM_MAP_ALLOCATABLE 39 | 40 | # not posix (darwin requires the POSIX_* constants) 41 | - MADV_DONTNEED 42 | - MADV_NORMAL 43 | - MADV_RANDOM 44 | - MADV_SEQUENTIAL 45 | - MADV_WILLNEED 46 | - MADV_HUGEPAGE 47 | - MADV_NOHUGEPAGE 48 | 49 | #structs: 50 | # - posix_typed_mem_info 51 | 52 | functions: 53 | #- mlock 54 | #- mlockall 55 | - mmap 56 | - mprotect 57 | #- msync 58 | #- munlock 59 | #- munlockall 60 | - munmap 61 | #- shm_open 62 | #- shm_unlink 63 | 64 | #- posix_madvise 65 | #- posix_mem_offset 66 | #- posix_typed_mem_get_info 67 | #- posix_typed_mem_open 68 | 69 | # not posix 70 | - madvise 71 | -------------------------------------------------------------------------------- /include/crystal/sys/select.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/select 3 | 4 | requires: 5 | - sys/types 6 | - sys/time 7 | - time 8 | - signal 9 | 10 | #macros: 11 | # - FD_CLR 12 | # - FD_ISSET 13 | # - FD_SET 14 | # - FD_ZERO 15 | 16 | #constants: 17 | # - FD_SETSIZE 18 | 19 | types: 20 | - fd_mask # freebsd 21 | 22 | structs: 23 | - fd_set 24 | 25 | functions: 26 | #- pselect 27 | - select 28 | -------------------------------------------------------------------------------- /include/crystal/sys/socket.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/socket 3 | 4 | requires: 5 | - sys/types 6 | #- sys/uio 7 | 8 | maps: 9 | __SOCKADDR_ARG: sockaddr* # gnu 10 | __CONST_SOCKADDR_ARG: sockaddr* # gnu 11 | 12 | #macros: 13 | # - CMSG_DATA(cmsg) 14 | # - CMSG_NXTHDR(mhdr,cmsg) 15 | # - CMSG_FIRSTHDR(mhdr) 16 | 17 | constants: 18 | #- SCM_RIGHTS 19 | 20 | - SOCK_DGRAM 21 | - SOCK_RAW 22 | - SOCK_SEQPACKET 23 | - SOCK_STREAM 24 | 25 | - SOL_SOCKET 26 | 27 | #- SO_ACCEPTCONN 28 | - SO_BROADCAST 29 | #- SO_DEBUG 30 | #- SO_DONTROUTE 31 | #- SO_ERROR 32 | - SO_KEEPALIVE 33 | - SO_LINGER 34 | #- SO_OOBINLINE 35 | - SO_RCVBUF 36 | #- SO_RCVLOWAT 37 | #- SO_RCVTIMEO 38 | - SO_REUSEADDR 39 | - SO_SNDBUF 40 | #- SO_SNDLOWAT 41 | #- SO_SNDTIMEO 42 | #- SO_TYPE 43 | 44 | #- SOMAXCONN 45 | 46 | #- MSG_CTRUNC 47 | #- MSG_DONTROUTE 48 | #- MSG_EOR 49 | #- MSG_OOB 50 | #- MSG_NOSIGNAL 51 | #- MSG_PEEK 52 | #- MSG_TRUNC 53 | #- MSG_WAITALL 54 | 55 | # not POSIX 56 | - PF_INET 57 | - PF_INET6 58 | - PF_UNIX 59 | - PF_UNSPEC 60 | - PF_LOCAL # glibc 61 | 62 | - AF_INET 63 | - AF_INET6 64 | - AF_UNIX 65 | - AF_UNSPEC 66 | - AF_LOCAL # cygwin 67 | 68 | - SHUT_RD 69 | - SHUT_RDWR 70 | - SHUT_WR 71 | 72 | # not posix 73 | - SOCK_CLOEXEC 74 | 75 | types: 76 | - socklen_t 77 | - sa_family_t 78 | 79 | structs: 80 | - sockaddr 81 | - sockaddr_storage 82 | #- msghdr 83 | #- cmsghdr 84 | - linger 85 | 86 | functions: 87 | - accept 88 | - bind 89 | - connect 90 | - getpeername 91 | - getsockname 92 | - getsockopt 93 | - listen 94 | - recv 95 | - recvfrom 96 | #- recvmsg 97 | - send 98 | #- sendmsg 99 | - sendto 100 | - setsockopt 101 | - shutdown 102 | #- sockatmark 103 | - socket 104 | - socketpair 105 | -------------------------------------------------------------------------------- /include/crystal/sys/stat.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/stat 3 | 4 | requires: 5 | - sys/types 6 | - time 7 | 8 | constants: 9 | - S_IFMT 10 | - S_IFBLK 11 | - S_IFCHR 12 | - S_IFIFO 13 | - S_IFREG 14 | - S_IFDIR 15 | - S_IFLNK 16 | - S_IFSOCK 17 | 18 | - S_IRUSR 19 | - S_IWUSR 20 | - S_IXUSR 21 | - S_IRWXU 22 | - S_IRGRP 23 | - S_IWGRP 24 | - S_IXGRP 25 | - S_IRWXG 26 | - S_IROTH 27 | - S_IWOTH 28 | - S_IXOTH 29 | - S_IRWXO 30 | 31 | - S_ISUID 32 | - S_ISGID 33 | - S_ISVTX 34 | 35 | #macros: 36 | # - S_ISBLK(m) 37 | # - S_ISCHR(m) 38 | # - S_ISDIR(m) 39 | # - S_ISFIFO(m) 40 | # - S_ISREG(m) 41 | # - S_ISLNK(m) 42 | # - S_ISSOCK(m) 43 | # - S_TYPEISMQ(buf) 44 | # - S_TYPEISSEM(buf) 45 | # - S_TYPEISSHM(buf) 46 | # - S_TYPEISTMO(buf) 47 | 48 | types: 49 | - fflags_t # freebsd 50 | 51 | structs: 52 | - stat 53 | 54 | functions: 55 | - chmod 56 | #- fchmod 57 | #- fchmodat 58 | - fstat 59 | #- fstatat 60 | #- futimens 61 | - lstat 62 | - mkdir 63 | #- mkdirat 64 | - mkfifo 65 | #- mkfifoat 66 | - mknod 67 | #- mknodat 68 | - stat 69 | - umask 70 | #- utimensat 71 | -------------------------------------------------------------------------------- /include/crystal/sys/syscall.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/syscall 3 | 4 | constants: 5 | - SYS_getrandom 6 | -------------------------------------------------------------------------------- /include/crystal/sys/time.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/time 3 | 4 | requires: 5 | - sys/types 6 | #- sys/select 7 | 8 | maps: 9 | __timezone_ptr_t: void* # gnu 10 | 11 | structs: 12 | - timeval 13 | 14 | # not posix 15 | - timezone 16 | 17 | functions: 18 | #- utimes 19 | 20 | # not posix 21 | - gettimeofday 22 | -------------------------------------------------------------------------------- /include/crystal/sys/times.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/times 3 | 4 | requires: 5 | - sys/types 6 | 7 | structs: 8 | - tms 9 | 10 | functions: 11 | - times 12 | -------------------------------------------------------------------------------- /include/crystal/sys/types.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/types 3 | - pthread # android 4 | 5 | requires: 6 | - stddef 7 | - stdint # android 8 | 9 | types: 10 | - blkcnt_t 11 | - blksize_t 12 | - clock_t 13 | - clockid_t 14 | - dev_t 15 | #- fsblkcnt_t 16 | #- fsfilcnt_t 17 | - gid_t 18 | - id_t 19 | - ino_t 20 | #- key_t 21 | - mode_t 22 | - nlink_t 23 | - off_t 24 | - pid_t 25 | 26 | - pthread_attr_t 27 | #- pthread_barrier_t 28 | #- pthread_barrierattr_t 29 | - pthread_cond_t 30 | - pthread_condattr_t 31 | #- pthread_key_t 32 | - pthread_mutex_t 33 | - pthread_mutexattr_t 34 | #- pthread_once_t 35 | #- pthread_rwlock_t 36 | #- pthread_rwlockattr_t 37 | #- pthread_spinlock_t 38 | - pthread_t 39 | 40 | - ssize_t 41 | - suseconds_t 42 | - time_t 43 | #- timer_t 44 | - uid_t 45 | 46 | # not posix 47 | - pthread_spin_t # netbsd 48 | - pthread_queue_struct_t # netbsd 49 | -------------------------------------------------------------------------------- /include/crystal/sys/un.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/un 3 | 4 | requires: 5 | - sys/socket 6 | 7 | structs: 8 | - sockaddr_un 9 | -------------------------------------------------------------------------------- /include/crystal/sys/wait.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/wait 3 | 4 | requires: 5 | - sys/types 6 | - signal 7 | 8 | maps: 9 | __wait_status_ptr_t: Int* # cygwin 10 | __WAIT_STATUS: Int* # gnu 11 | 12 | #macros: 13 | # - WEXITSTATUS 14 | # - WIFCONTINUED 15 | # - WIFEXITED 16 | # - WIFSIGNALED 17 | # - WIFSTOPPED 18 | # - WSTOPSIG 19 | # - WTERMSIG 20 | 21 | constants: 22 | #- WCONTINUED 23 | - WNOHANG 24 | #- WUNTRACED 25 | 26 | #- WEXITED 27 | #- WNOWAIT 28 | #- WSTOPPED 29 | 30 | #types: 31 | # - idtype_t 32 | 33 | functions: 34 | #- wait 35 | #- waitid 36 | - waitpid 37 | -------------------------------------------------------------------------------- /include/crystal/termios.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - termios 3 | 4 | requires: 5 | - sys/types 6 | 7 | constants: 8 | - VEOF 9 | - VEOL 10 | - VERASE 11 | - VINTR 12 | - VKILL 13 | - VMIN 14 | - VQUIT 15 | - VSTART 16 | - VSTOP 17 | - VSUSP 18 | 19 | - BRKINT 20 | - ICRNL 21 | - IGNBRK 22 | - IGNCR 23 | - IGNPAR 24 | - INLCR 25 | - INPCK 26 | - ISTRIP 27 | - IXANY 28 | - IXOFF 29 | - IXON 30 | - PARMRK 31 | 32 | - OPOST 33 | - ONLCR 34 | - OCRNL 35 | - ONOCR 36 | - ONLRET 37 | - OFDEL 38 | - OFILL 39 | 40 | - CRDLY 41 | - CR0 42 | - CR1 43 | - CR2 44 | - CR3 45 | 46 | - TABDLY 47 | - TAB0 48 | - TAB1 49 | - TAB2 50 | - TAB3 51 | 52 | - BSDLY 53 | - BS0 54 | - BS1 55 | 56 | - VTDLY 57 | - VT0 58 | - VT1 59 | - FFDLY 60 | - FF0 61 | - FF1 62 | 63 | - NLDLY 64 | - NL0 65 | - NL1 66 | 67 | - B0 68 | - B50 69 | - B75 70 | - B110 71 | - B134 72 | - B150 73 | - B200 74 | - B300 75 | - B600 76 | - B1200 77 | - B1800 78 | - B2400 79 | - B4800 80 | - B9600 81 | - B19200 82 | - B38400 83 | 84 | - CSIZE 85 | - CS5 86 | - CS6 87 | - CS7 88 | - CS8 89 | - CSTOPB 90 | - CREAD 91 | - PARENB 92 | - PARODD 93 | - HUPCL 94 | - CLOCAL 95 | 96 | - ECHO 97 | - ECHOE 98 | - ECHOK 99 | - ECHONL 100 | - ICANON 101 | - IEXTEN 102 | - ISIG 103 | - NOFLSH 104 | - TOSTOP 105 | 106 | - TCSANOW 107 | - TCSADRAIN 108 | - TCSAFLUSH 109 | 110 | - TCIFLUSH 111 | - TCIOFLUSH 112 | - TCOFLUSH 113 | 114 | - TCIOFF 115 | - TCION 116 | - TCOOFF 117 | - TCOON 118 | 119 | types: 120 | - cc_t 121 | - speed_t 122 | - tcflag_t 123 | 124 | structs: 125 | - termios 126 | 127 | functions: 128 | #- cfgetispeed 129 | #- cfgetospeed 130 | #- cfsetispeed 131 | #- cfsetospeed 132 | #- tcdrain 133 | #- tcflow 134 | #- tcflush 135 | - tcgetattr 136 | #- tcgetsid 137 | #- tcsendbreak 138 | - tcsetattr 139 | 140 | # not posix 141 | - cfmakeraw 142 | -------------------------------------------------------------------------------- /include/crystal/time.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - time 3 | 4 | requires: 5 | - sys/types 6 | #- locale 7 | #- signal # cygwin 8 | 9 | #maps: 10 | # sigevent: void # cygwin 11 | 12 | constants: 13 | #- CLOCKS_PER_SEC 14 | 15 | - CLOCK_MONOTONIC 16 | #- CLOCK_PROCESS_CPUTIME_ID 17 | - CLOCK_REALTIME 18 | #- CLOCK_THREAD_CPUTIME_ID 19 | 20 | #- TIMER_ABSTIME 21 | 22 | structs: 23 | - tm 24 | - timespec 25 | #- itimerspec 26 | 27 | functions: 28 | #- clock 29 | #- clock_getcpuclockid 30 | #- clock_getres 31 | - clock_gettime 32 | #- clock_nanosleep 33 | - clock_settime 34 | #- difftime 35 | #- getdate 36 | #- gmtime 37 | - gmtime_r 38 | #- localtime 39 | - localtime_r 40 | - mktime 41 | #- nanosleep 42 | #- strftime 43 | #- strftime_l 44 | #- strptime 45 | #- time 46 | #- timer_create 47 | #- timer_delete 48 | #- timer_getoverrun 49 | #- timer_gettime 50 | #- timer_settime 51 | - tzset 52 | 53 | # not posix 54 | - timegm 55 | 56 | variables: 57 | - daylight 58 | - timezone 59 | - tzname 60 | -------------------------------------------------------------------------------- /include/crystal/unistd.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - unistd 3 | 4 | requires: 5 | - sys/types 6 | - stdint 7 | 8 | constants: 9 | - F_OK 10 | - R_OK 11 | - W_OK 12 | - X_OK 13 | 14 | #- F_LOCK 15 | #- F_TEST 16 | #- F_TLOCK 17 | #- F_ULOCK 18 | 19 | #- _PC_2_SYMLINKS 20 | #- _PC_ALLOC_SIZE_MIN 21 | #- _PC_ASYNC_IO 22 | #- _PC_CHOWN_RESTRICTED 23 | #- _PC_FILESIZEBITS 24 | #- _PC_LINK_MAX 25 | #- _PC_MAX_CANON 26 | #- _PC_MAX_INPUT 27 | #- _PC_NAME_MAX 28 | #- _PC_NO_TRUNC 29 | #- _PC_PATH_MAX 30 | #- _PC_PIPE_BUF 31 | #- _PC_PRIO_IO 32 | #- _PC_REC_INCR_XFER_SIZE 33 | #- _PC_REC_MAX_XFER_SIZE 34 | #- _PC_REC_MIN_XFER_SIZE 35 | #- _PC_REC_XFER_ALIGN 36 | #- _PC_SYMLINK_MAX 37 | #- _PC_SYNC_IO 38 | #- _PC_TIMESTAMP_RESOLUTION 39 | #- _PC_VDISABLE 40 | 41 | #- _SC_2_C_BIND 42 | #- _SC_2_C_DEV 43 | #- _SC_2_CHAR_TERM 44 | #- _SC_2_FORT_DEV 45 | #- _SC_2_FORT_RUN 46 | #- _SC_2_LOCALEDEF 47 | #- _SC_2_PBS 48 | #- _SC_2_PBS_ACCOUNTING 49 | #- _SC_2_PBS_CHECKPOINT 50 | #- _SC_2_PBS_LOCATE 51 | #- _SC_2_PBS_MESSAGE 52 | #- _SC_2_PBS_TRACK 53 | #- _SC_2_SW_DEV 54 | #- _SC_2_UPE 55 | #- _SC_2_VERSION 56 | #- _SC_ADVISORY_INFO 57 | #- _SC_AIO_LISTIO_MAX 58 | #- _SC_AIO_MAX 59 | #- _SC_AIO_PRIO_DELTA_MAX 60 | #- _SC_ARG_MAX 61 | #- _SC_ASYNCHRONOUS_IO 62 | #- _SC_ATEXIT_MAX 63 | #- _SC_BARRIERS 64 | #- _SC_BC_BASE_MAX 65 | #- _SC_BC_DIM_MAX 66 | #- _SC_BC_SCALE_MAX 67 | #- _SC_BC_STRING_MAX 68 | #- _SC_CHILD_MAX 69 | - _SC_CLK_TCK 70 | #- _SC_CLOCK_SELECTION 71 | #- _SC_COLL_WEIGHTS_MAX 72 | #- _SC_CPUTIME 73 | #- _SC_DELAYTIMER_MAX 74 | #- _SC_EXPR_NEST_MAX 75 | #- _SC_FSYNC 76 | #- _SC_GETGR_R_SIZE_MAX 77 | #- _SC_GETPW_R_SIZE_MAX 78 | #- _SC_HOST_NAME_MAX 79 | #- _SC_IOV_MAX 80 | #- _SC_IPV6 81 | #- _SC_JOB_CONTROL 82 | #- _SC_LINE_MAX 83 | #- _SC_LOGIN_NAME_MAX 84 | #- _SC_MAPPED_FILES 85 | #- _SC_MEMLOCK 86 | #- _SC_MEMLOCK_RANGE 87 | #- _SC_MEMORY_PROTECTION 88 | #- _SC_MESSAGE_PASSING 89 | #- _SC_MONOTONIC_CLOCK 90 | #- _SC_MQ_OPEN_MAX 91 | #- _SC_MQ_PRIO_MAX 92 | #- _SC_NGROUPS_MAX 93 | #- _SC_OPEN_MAX 94 | #- _SC_PAGE_SIZE 95 | #- _SC_PAGESIZE 96 | #- _SC_PRIORITIZED_IO 97 | #- _SC_PRIORITY_SCHEDULING 98 | #- _SC_RAW_SOCKETS 99 | #- _SC_RE_DUP_MAX 100 | #- _SC_READER_WRITER_LOCKS 101 | #- _SC_REALTIME_SIGNALS 102 | #- _SC_REGEXP 103 | #- _SC_RTSIG_MAX 104 | #- _SC_SAVED_IDS 105 | #- _SC_SEM_NSEMS_MAX 106 | #- _SC_SEM_VALUE_MAX 107 | #- _SC_SEMAPHORES 108 | #- _SC_SHARED_MEMORY_OBJECTS 109 | #- _SC_SHELL 110 | #- _SC_SIGQUEUE_MAX 111 | #- _SC_SPAWN 112 | #- _SC_SPIN_LOCKS 113 | #- _SC_SPORADIC_SERVER 114 | #- _SC_SS_REPL_MAX 115 | #- _SC_STREAM_MAX 116 | #- _SC_SYMLOOP_MAX 117 | #- _SC_SYNCHRONIZED_IO 118 | #- _SC_THREAD_ATTR_STACKADDR 119 | #- _SC_THREAD_ATTR_STACKSIZE 120 | #- _SC_THREAD_CPUTIME 121 | #- _SC_THREAD_DESTRUCTOR_ITERATIONS 122 | #- _SC_THREAD_KEYS_MAX 123 | #- _SC_THREAD_PRIO_INHERIT 124 | #- _SC_THREAD_PRIO_PROTECT 125 | #- _SC_THREAD_PRIORITY_SCHEDULING 126 | #- _SC_THREAD_PROCESS_SHARED 127 | #- _SC_THREAD_ROBUST_PRIO_INHERIT 128 | #- _SC_THREAD_ROBUST_PRIO_PROTECT 129 | #- _SC_THREAD_SAFE_FUNCTIONS 130 | #- _SC_THREAD_SPORADIC_SERVER 131 | #- _SC_THREAD_STACK_MIN 132 | #- _SC_THREAD_THREADS_MAX 133 | #- _SC_THREADS 134 | #- _SC_TIMEOUTS 135 | #- _SC_TIMER_MAX 136 | #- _SC_TIMERS 137 | #- _SC_TRACE 138 | #- _SC_TRACE_EVENT_FILTER 139 | #- _SC_TRACE_EVENT_NAME_MAX 140 | #- _SC_TRACE_INHERIT 141 | #- _SC_TRACE_LOG 142 | #- _SC_TRACE_NAME_MAX 143 | #- _SC_TRACE_SYS_MAX 144 | #- _SC_TRACE_USER_EVENT_MAX 145 | #- _SC_TTY_NAME_MAX 146 | #- _SC_TYPED_MEMORY_OBJECTS 147 | #- _SC_TZNAME_MAX 148 | #- _SC_V7_ILP32_OFF32 149 | #- _SC_V7_ILP32_OFFBIG 150 | #- _SC_V7_LP64_OFF64 151 | #- _SC_V7_LPBIG_OFFBIG 152 | #- _SC_VERSION 153 | #- _SC_XOPEN_CRYPT 154 | #- _SC_XOPEN_ENH_I18N 155 | #- _SC_XOPEN_REALTIME 156 | #- _SC_XOPEN_REALTIME_THREADS 157 | #- _SC_XOPEN_SHM 158 | #- _SC_XOPEN_STREAMS 159 | #- _SC_XOPEN_UNIX 160 | #- _SC_XOPEN_UUCP 161 | #- _SC_XOPEN_VERSION 162 | 163 | #- STDERR_FILENO 164 | #- STDIN_FILENO 165 | #- STDOUT_FILENO 166 | 167 | functions: 168 | - access 169 | #- alarm 170 | - chdir 171 | - chown 172 | - close 173 | #- confstr 174 | #- crypt 175 | #- dup 176 | - dup2 177 | #- encrypt 178 | - "_exit : NoReturn" 179 | #- execl 180 | #- execle 181 | #- execlp 182 | #- execv 183 | #- execve 184 | - execvp 185 | #- faccessat 186 | #- fchdir 187 | #- fchown 188 | #- fchownat 189 | #- fdatasync 190 | #- fexecve 191 | - "@[ReturnsTwice]\nfork" 192 | #- fpathconf 193 | #- fsync 194 | - ftruncate 195 | - getcwd 196 | #- getegid 197 | #- geteuid 198 | #- getgid 199 | #- getgroups 200 | #- gethostid 201 | - gethostname 202 | #- getlogin 203 | #- getlogin_r 204 | #- getopt 205 | - getpgid 206 | #- getpgrp 207 | - getpid 208 | - getppid 209 | #- getsid 210 | #- getuid 211 | - isatty 212 | - lchown 213 | - link 214 | #- linkat 215 | - lockf 216 | - lseek 217 | #- nice 218 | #- pathconf 219 | #- pause 220 | - pipe 221 | #- pread 222 | #- pwrite 223 | - read 224 | #- readlink 225 | #- readlinkat 226 | - rmdir 227 | #- setegid 228 | #- seteuid 229 | #- setgid 230 | #- setpgid 231 | #- setregid 232 | #- setreuid 233 | #- setsid 234 | #- setuid 235 | #- sleep 236 | #- swab 237 | - symlink 238 | #- symlinkat 239 | #- sync 240 | - syscall 241 | - sysconf 242 | #- tcgetpgrp 243 | #- tcsetpgrp 244 | #- truncate 245 | #- ttyname 246 | #- ttyname_r 247 | - unlink 248 | #- unlinkat 249 | - write 250 | 251 | #variables: 252 | # - optarg 253 | # - opterr 254 | # - optind 255 | # - optopt 256 | # #- environ 257 | -------------------------------------------------------------------------------- /include/posix/arpa/inet.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - arpa/inet 3 | 4 | requires: 5 | - netinet/in 6 | - stdint 7 | 8 | functions: 9 | - htonl 10 | - htons 11 | - ntohl 12 | - ntohs 13 | 14 | - inet_addr 15 | - inet_ntoa 16 | - inet_ntop 17 | - inet_pton 18 | -------------------------------------------------------------------------------- /include/posix/cpio.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - cpio 3 | 4 | constants: 5 | - C_IRUSR 6 | - C_IWUSR 7 | - C_IXUSR 8 | - C_IRGRP 9 | - C_IWGRP 10 | - C_IXGRP 11 | - C_IROTH 12 | - C_IWOTH 13 | - C_IXOTH 14 | - C_ISUID 15 | - C_ISGID 16 | - C_ISVTX 17 | - C_ISDIR 18 | - C_ISFIFO 19 | - C_ISREG 20 | - C_ISBLK 21 | - C_ISCHR 22 | - C_ISCTG 23 | - C_ISLNK 24 | - C_ISSOCK 25 | 26 | - MAGIC 27 | -------------------------------------------------------------------------------- /include/posix/dirent.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - dirent 3 | 4 | requires: 5 | - sys/types 6 | 7 | types: 8 | - DIR = Void 9 | 10 | structs: 11 | - dirent 12 | 13 | functions: 14 | - alphasort 15 | - closedir 16 | - dirfd 17 | - fdopendir 18 | - opendir 19 | - readdir 20 | - readdir_r 21 | - rewinddir 22 | - scandir 23 | - seekdir 24 | - telldir 25 | -------------------------------------------------------------------------------- /include/posix/dlfcn.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - dlfcn 3 | 4 | libraries: 5 | darwin: 6 | - dl 7 | gnu: 8 | - dl 9 | 10 | constants: 11 | - RTLD_LAZY 12 | - RTLD_NOW 13 | - RTLD_GLOBAL 14 | - RTLD_LOCAL 15 | 16 | - RTLD_DEFAULT 17 | - RTLD_NEXT 18 | 19 | structs: 20 | # not posix 21 | - Dl_info 22 | 23 | functions: 24 | - dlclose 25 | - dlerror 26 | - dlopen 27 | - dlsym 28 | 29 | # not posix 30 | - dladdr 31 | -------------------------------------------------------------------------------- /include/posix/errno.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - errno 3 | 4 | constants: 5 | - E2BIG 6 | - EACCES 7 | - EADDRINUSE 8 | - EADDRNOTAVAIL 9 | - EAFNOSUPPORT 10 | - EAGAIN 11 | - EALREADY 12 | - EBADF 13 | - EBADMSG 14 | - EBUSY 15 | - ECANCELED 16 | - ECHILD 17 | - ECONNABORTED 18 | - ECONNREFUSED 19 | - ECONNRESET 20 | - EDEADLK 21 | - EDESTADDRREQ 22 | - EDOM 23 | - EDQUOT 24 | - EEXIST 25 | - EFAULT 26 | - EFBIG 27 | - EHOSTUNREACH 28 | - EIDRM 29 | - EILSEQ 30 | - EINPROGRESS 31 | - EINTR 32 | - EINVAL 33 | - EIO 34 | - EISCONN 35 | - EISDIR 36 | - ELOOP 37 | - EMFILE 38 | - EMLINK 39 | - EMSGSIZE 40 | - EMULTIHOP 41 | - ENAMETOOLONG 42 | - ENETDOWN 43 | - ENETRESET 44 | - ENETUNREACH 45 | - ENFILE 46 | - ENOBUFS 47 | - ENODEV 48 | - ENOENT 49 | - ENOEXEC 50 | - ENOLCK 51 | - ENOLINK 52 | - ENOMEM 53 | - ENOMSG 54 | - ENOPROTOOPT 55 | - ENOSPC 56 | - ENOSYS 57 | - ENOTCONN 58 | - ENOTDIR 59 | - ENOTEMPTY 60 | - ENOTRECOVERABLE 61 | - ENOTSOCK 62 | - ENOTSUP 63 | - ENOTTY 64 | - ENXIO 65 | - EOPNOTSUPP 66 | - EOVERFLOW 67 | - EOWNERDEAD 68 | - EPERM 69 | - EPIPE 70 | - EPROTO 71 | - EPROTONOSUPPORT 72 | - EPROTOTYPE 73 | - ERANGE 74 | - EROFS 75 | - ESPIPE 76 | - ESRCH 77 | - ESTALE 78 | - ETIMEDOUT 79 | - ETXTBSY 80 | - EWOULDBLOCK 81 | - EXDEV 82 | 83 | # obsolete (but may happen) 84 | - ENODATA 85 | - ENOSR 86 | - ENOSTR 87 | - ETIME 88 | -------------------------------------------------------------------------------- /include/posix/fcntl.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - fcntl 3 | 4 | requires: 5 | - sys/types 6 | - sys/stat 7 | - unistd 8 | 9 | constants: 10 | - F_DUPFD 11 | - F_DUPFD_CLOEXEC 12 | - F_GETFD 13 | - F_SETFD 14 | - F_GETFL 15 | - F_SETFL 16 | - F_GETLK 17 | - F_SETLK 18 | - F_SETLKW 19 | - F_GETOWN 20 | - F_SETOWN 21 | 22 | - FD_CLOEXEC 23 | - F_RDLCK 24 | - F_UNLCK 25 | - F_WRLCK 26 | 27 | - O_CLOEXEC 28 | - O_CREAT 29 | - O_DIRECTORY 30 | - O_EXCL 31 | - O_NOCTTY 32 | - O_NOFOLLOW 33 | - O_TRUNC 34 | 35 | - O_TTY_INIT 36 | 37 | - O_APPEND 38 | - O_DSYNC 39 | - O_NONBLOCK 40 | - O_SYNC 41 | - O_RSYNC 42 | 43 | - O_PATH # musl-libc 44 | - O_EXEC 45 | - O_RDONLY 46 | - O_RDWR 47 | - O_SEARCH 48 | - O_WRONLY 49 | 50 | - O_ACCMODE 51 | 52 | - AT_FDCWD 53 | - AT_EACCESS 54 | - AT_SYMLINK_NOFOLLOW 55 | - AT_SYMLINK_FOLLOW 56 | - AT_REMOVEDIR 57 | 58 | - POSIX_FADV_DONTNEED 59 | - POSIX_FADV_NOREUSE 60 | - POSIX_FADV_NORMAL 61 | - POSIX_FADV_RANDOM 62 | - POSIX_FADV_SEQUENTIAL 63 | - POSIX_FADV_WILLNEED 64 | 65 | structs: 66 | - flock 67 | 68 | functions: 69 | - creat 70 | - fcntl 71 | - open 72 | - openat 73 | - posix_fadvise 74 | - posix_fallocate 75 | -------------------------------------------------------------------------------- /include/posix/fenv.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - fenv 3 | 4 | libraries: 5 | freebsd: 6 | - m 7 | gnu: 8 | - m 9 | 10 | constants: 11 | - FE_DIVBYZERO 12 | - FE_INEXACT 13 | - FE_INVALID 14 | - FE_OVERFLOW 15 | - FE_UNDERFLOW 16 | 17 | - FE_DOWNWARD 18 | - FE_TONEAREST 19 | - FE_TOWARDZERO 20 | - FE_UPWARD 21 | 22 | - FE_DFL_ENV 23 | 24 | types: 25 | - fenv_t 26 | - fexcept_t 27 | 28 | functions: 29 | - feclearexcept 30 | - fegetenv 31 | - fegetexceptflag 32 | - fegetround 33 | - feholdexcept 34 | - feraiseexcept 35 | - fesetenv 36 | - fesetexceptflag 37 | - fesetround 38 | - fetestexcept 39 | - feupdateenv 40 | -------------------------------------------------------------------------------- /include/posix/float.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - float 3 | 4 | constants: 5 | - DECIMAL_DIG 6 | 7 | - FLT_EVAL_METHOD 8 | - FLT_RADIX 9 | - FLT_ROUNDS 10 | 11 | - FLT_DIG 12 | - FLT_MANT_DIG 13 | - FLT_MIN 14 | - FLT_MIN_10_EXP 15 | - FLT_MIN_EXP 16 | - FLT_MAX 17 | - FLT_MAX_EXP 18 | - FLT_EPSILON 19 | 20 | - DBL_DIG 21 | - DBL_MANT_DIG 22 | - DBL_MIN 23 | - DBL_MIN_EXP 24 | - DBL_MIN_10_EXP 25 | - DBL_MAX 26 | - DBL_MAX_EXP 27 | - DBL_EPSILON 28 | 29 | - LDBL_DIG 30 | - LDBL_MANT_DIG 31 | - LDBL_MIN 32 | - LDBL_MIN_10_EXP 33 | - LDBL_MIN_EXP 34 | - LDBL_MAX 35 | - LDBL_MAX_EXP 36 | - LDBL_EPSILON 37 | -------------------------------------------------------------------------------- /include/posix/fnmatch.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - fnmatch 3 | 4 | constants: 5 | - FNM_NOMATCH 6 | - FNM_PATHNAME 7 | - FNM_PERIOD 8 | - FNM_NOESCAPE 9 | 10 | functions: 11 | - fnmatch 12 | -------------------------------------------------------------------------------- /include/posix/ftw.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - ftw 3 | 4 | requires: 5 | - sys/stat 6 | 7 | maps: 8 | __ftw_func_t: Char*, Stat*, Int -> Int # gnu 9 | 10 | constants: 11 | - FTW_F 12 | - FTW_D 13 | - FTW_DNR 14 | - FTW_DP 15 | - FTW_NS 16 | - FTW_SL 17 | - FTW_SLN 18 | 19 | - FTW_PHYS 20 | - FTW_MOUNT 21 | - FTW_DEPTH 22 | - FTW_CHDIR 23 | 24 | types: 25 | - FTW 26 | 27 | functions: 28 | - ftw 29 | - nftw 30 | -------------------------------------------------------------------------------- /include/posix/glob.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - glob 3 | 4 | requires: 5 | - sys/types 6 | - sys/stat # cygwin 7 | 8 | constants: 9 | - GLOB_APPEND 10 | - GLOB_DOOFFS 11 | - GLOB_ERR 12 | - GLOB_MARK 13 | - GLOB_NOCHECK 14 | - GLOB_NOESCAPE 15 | - GLOB_NOSORT 16 | 17 | - GLOB_ABORTED 18 | - GLOB_NOMATCH 19 | - GLOB_NOSPACE 20 | 21 | structs: 22 | - glob_t 23 | 24 | functions: 25 | - glob 26 | - globfree 27 | -------------------------------------------------------------------------------- /include/posix/grp.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - grp 3 | 4 | requires: 5 | - sys/types 6 | 7 | structs: 8 | - group 9 | 10 | functions: 11 | - endgrent 12 | - getgrent 13 | - getgrgid 14 | - getgrgid_r 15 | - getgrnam 16 | - getgrnam_r 17 | - setgrent 18 | -------------------------------------------------------------------------------- /include/posix/iconv.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - iconv 3 | 4 | libraries: 5 | darwin: 6 | - iconv 7 | 8 | requires: 9 | - stddef 10 | 11 | structs: 12 | - iconv_t 13 | 14 | functions: 15 | - iconv 16 | - iconv_close 17 | - iconv_open 18 | -------------------------------------------------------------------------------- /include/posix/langinfo.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - langinfo 3 | 4 | requires: 5 | - locale 6 | - nl_types 7 | 8 | constants: 9 | - CODESET 10 | - D_T_FMT 11 | - D_FMT 12 | - T_FMT 13 | - T_FMT_AMPM 14 | - AM_STR 15 | - PM_STR 16 | - DAY_1 17 | - DAY_2 18 | - DAY_3 19 | - DAY_4 20 | - DAY_5 21 | - DAY_6 22 | - DAY_7 23 | - ABDAY_1 24 | - ABDAY_2 25 | - ABDAY_3 26 | - ABDAY_4 27 | - ABDAY_5 28 | - ABDAY_6 29 | - ABDAY_7 30 | - MON_1 31 | - MON_2 32 | - MON_3 33 | - MON_4 34 | - MON_5 35 | - MON_6 36 | - MON_7 37 | - MON_8 38 | - MON_9 39 | - MON_10 40 | - MON_11 41 | - MON_12 42 | - ABMON_1 43 | - ABMON_2 44 | - ABMON_3 45 | - ABMON_4 46 | - ABMON_5 47 | - ABMON_6 48 | - ABMON_7 49 | - ABMON_8 50 | - ABMON_9 51 | - ABMON_10 52 | - ABMON_11 53 | - ABMON_12 54 | - ERA 55 | - ERA_D_FMT 56 | - ERA_D_T_FMT 57 | - ERA_T_FMT 58 | - ALT_DIGITS 59 | - RADIXCHAR 60 | - THOUSEP 61 | 62 | # FIXME: gnu32: macros 63 | - YESEXPR 64 | - NOEXPR 65 | - CRNCYSTR 66 | 67 | functions: 68 | - nl_langinfo 69 | - nl_langinfo_l 70 | -------------------------------------------------------------------------------- /include/posix/libgen.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - libgen 3 | 4 | functions: 5 | - basename 6 | - dirname 7 | -------------------------------------------------------------------------------- /include/posix/limits.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - limits 3 | 4 | constants: 5 | - AIO_LISTIO_MAX 6 | - AIO_MAX 7 | - AIO_PRIO_DELTA_MAX 8 | - ARG_MAX 9 | - ATEXIT_MAX 10 | - CHILD_MAX 11 | - DELAYTIMER_MAX 12 | - HOST_NAME_MAX 13 | - IOV_MAX 14 | - LOGIN_NAME_MAX 15 | - MQ_OPEN_MAX 16 | - MQ_PRIO_MAX 17 | - OPEN_MAX 18 | - PAGESIZE 19 | - PAGE_SIZE 20 | - PTHREAD_DESTRUCTOR_ITERATIONS 21 | - PTHREAD_KEYS_MAX 22 | - PTHREAD_STACK_MIN 23 | - PTHREAD_THREADS_MAX 24 | - RE_DUP_MAX 25 | - RTSIG_MAX 26 | - SEM_NSEMS_MAX 27 | - SEM_VALUE_MAX 28 | - SIGQUEUE_MAX 29 | - SS_REPL_MAX 30 | - STREAM_MAX 31 | - SYMLOOP_MAX 32 | - TIMER_MAX 33 | - TTY_NAME_MAX 34 | - TZNAME_MAX 35 | 36 | - FILESIZEBITS 37 | - LINK_MAX 38 | - MAX_CANON 39 | - MAX_INPUT 40 | - NAME_MAX 41 | - PATH_MAX 42 | - PIPE_BUF 43 | - POSIX_ALLOC_SIZE_MIN 44 | - POSIX_REC_INCR_XFER_SIZE 45 | - POSIX_REC_MAX_XFER_SIZE 46 | - POSIX_REC_MIN_XFER_SIZE 47 | - POSIX_REC_XFER_ALIGN 48 | - SYMLINK_MAX 49 | 50 | - BC_BASE_MAX 51 | - BC_DIM_MAX 52 | - BC_SCALE_MAX 53 | - BC_STRING_MAX 54 | - CHARCLASS_NAME_MAX 55 | - COLL_WEIGHTS_MAX 56 | - EXPR_NEST_MAX 57 | - LINE_MAX 58 | - NGROUPS_MAX 59 | 60 | - _POSIX_CLOCKRES_MIN 61 | 62 | - _POSIX_AIO_LISTIO_MAX 63 | - _POSIX_AIO_MAX 64 | - _POSIX_ARG_MAX 65 | - _POSIX_CHILD_MAX 66 | - _POSIX_DELAYTIMER_MAX 67 | - _POSIX_HOST_NAME_MAX 68 | - _POSIX_LINK_MAX 69 | - _POSIX_LOGIN_NAME_MAX 70 | - _POSIX_MAX_CANON 71 | - _POSIX_MAX_INPUT 72 | - _POSIX_MQ_OPEN_MAX 73 | - _POSIX_MQ_PRIO_MAX 74 | - _POSIX_NAME_MAX 75 | - _POSIX_NGROUPS_MAX 76 | - _POSIX_OPEN_MAX 77 | - _POSIX_PATH_MAX 78 | - _POSIX_PIPE_BUF 79 | - _POSIX_RE_DUP_MAX 80 | - _POSIX_RTSIG_MAX 81 | - _POSIX_SEM_NSEMS_MAX 82 | - _POSIX_SEM_VALUE_MAX 83 | - _POSIX_SIGQUEUE_MAX 84 | - _POSIX_SSIZE_MAX 85 | - _POSIX_SS_REPL_MAX 86 | - _POSIX_STREAM_MAX 87 | - _POSIX_SYMLINK_MAX 88 | - _POSIX_SYMLOOP_MAX 89 | - _POSIX_THREAD_DESTRUCTOR_ITERATIONS 90 | - _POSIX_THREAD_KEYS_MAX 91 | - _POSIX_THREAD_THREADS_MAX 92 | - _POSIX_TIMER_MAX 93 | - _POSIX_TTY_NAME_MAX 94 | - _POSIX_TZNAME_MAX 95 | - _POSIX2_BC_BASE_MAX 96 | - _POSIX2_BC_DIM_MAX 97 | - _POSIX2_BC_SCALE_MAX 98 | - _POSIX2_BC_STRING_MAX 99 | - _POSIX2_CHARCLASS_NAME_MAX 100 | - _POSIX2_COLL_WEIGHTS_MAX 101 | - _POSIX2_EXPR_NEST_MAX 102 | - _POSIX2_LINE_MAX 103 | - _POSIX2_RE_DUP_MAX 104 | - _XOPEN_IOV_MAX 105 | - _XOPEN_NAME_MAX 106 | - _XOPEN_PATH_MAX 107 | 108 | # FIXME: glibc requires the compiler to provide these values 109 | - CHAR_BIT 110 | - CHAR_MAX 111 | - CHAR_MIN 112 | - INT_MAX 113 | - INT_MIN 114 | - LLONG_MAX 115 | - LLONG_MIN 116 | - LONG_BIT 117 | - LONG_MAX 118 | - LONG_MIN 119 | - MB_LEN_MAX 120 | - SCHAR_MAX 121 | - SCHAR_MIN 122 | - SHRT_MAX 123 | - SHRT_MIN 124 | - SSIZE_MAX 125 | - UCHAR_MAX 126 | - UINT_MAX 127 | - ULLONG_MAX 128 | - ULONG_MAX 129 | - USHRT_MAX 130 | - WORD_BIT 131 | 132 | - NL_ARGMAX 133 | - NL_LANGMAX 134 | - NL_MSGMAX 135 | - NL_SETMAX 136 | - NL_TEXTMAX 137 | - NZERO 138 | -------------------------------------------------------------------------------- /include/posix/locale.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - locale 3 | 4 | requires: 5 | - stddef 6 | 7 | constants: 8 | - LC_ALL 9 | - LC_COLLATE 10 | - LC_CTYPE 11 | - LC_MESSAGES 12 | - LC_MONETARY 13 | - LC_NUMERIC 14 | - LC_TIME 15 | - LC_COLLATE_MASK 16 | - LC_CTYPE_MASK 17 | - LC_MESSAGES_MASK 18 | - LC_MONETARY_MASK 19 | - LC_NUMERIC_MASK 20 | - LC_TIME_MASK 21 | 22 | # glibc 23 | - LC_PAPER 24 | - LC_NAME 25 | - LC_ADDRESS 26 | - LC_TELEPHONE 27 | - LC_MEASUREMENT 28 | - LC_IDENTIFICATION 29 | - LC_PAPER_MASK 30 | - LC_NAME_MASK 31 | - LC_ADDRESS_MASK 32 | - LC_TELEPHONE_MASK 33 | - LC_MEASUREMENT_MASK 34 | - LC_IDENTIFICATION_MASK 35 | 36 | # FIXME: can't parse continued lines (with backslashes) 37 | #- LC_ALL_MASK 38 | 39 | # FIXME: can't parse ((__locale_t)-1L) => LocaleT.new(-1) => no such method new for LibC::LocaleT::Class 40 | #- LC_GLOBAL_LOCALE 41 | 42 | types: 43 | - locale_t 44 | 45 | structs: 46 | - lconv 47 | 48 | functions: 49 | - duplocale 50 | - freelocale 51 | - localeconv 52 | - newlocale 53 | - setlocale 54 | - uselocale 55 | -------------------------------------------------------------------------------- /include/posix/math.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - math 3 | 4 | libraries: 5 | freebsd: 6 | - m 7 | gnu: 8 | - m 9 | 10 | requires: 11 | - stdint 12 | 13 | constants: 14 | - M_E 15 | - M_LOG2E 16 | - M_LOG10E 17 | - M_LN2 # FIXME: cygwin: private constant 18 | - M_LN10 19 | - M_PI 20 | - M_PI_2 21 | - M_PI_4 22 | - M_1_PI 23 | - M_2_PI 24 | - M_2_SQRTPI 25 | - M_SQRT2 26 | - M_SQRT1_2 27 | 28 | # FIXME: builtin macros 29 | #- HUGE_VAL 30 | #- HUGE_VALF 31 | #- HUGE_VALL 32 | #- INFINITY 33 | #- NAN 34 | 35 | - FP_INFINITE 36 | - FP_NAN 37 | - FP_NORMAL 38 | - FP_SUBNORMAL 39 | - FP_ZERO 40 | 41 | - FP_FAST_FMA 42 | - FP_FAST_FMAF 43 | - FP_FAST_FMAL 44 | 45 | # FIXME: freebsd: private constants 46 | # FIXME: musl: complex definition 47 | #- FP_ILOGB0 48 | #- FP_ILOGBNAN 49 | 50 | - MATH_ERRNO 51 | - MATH_ERREXCEPT 52 | 53 | #macros: 54 | # - fpclassify 55 | # - isfinite 56 | # - isgreater 57 | # - isgreaterequal 58 | # - isinf 59 | # - isless 60 | # - islessequal 61 | # - islessgreater 62 | # - isnan 63 | # - isnormal 64 | # - isunordered 65 | # - signbit 66 | # - math_errhandling 67 | 68 | types: 69 | - float_t 70 | - double_t 71 | 72 | # NOTE: crystal doesn't support "long double" 73 | functions: 74 | - acos 75 | - acosf 76 | - acosh 77 | - acoshf 78 | #- acoshl 79 | #- acosl 80 | - asin 81 | - asinf 82 | - asinh 83 | - asinhf 84 | #- asinhl 85 | #- asinl 86 | - atan 87 | - atan2 88 | - atan2f 89 | #- atan2l 90 | - atanf 91 | - atanh 92 | - atanhf 93 | #- atanhl 94 | #- atanl 95 | - cbrt 96 | - cbrtf 97 | #- cbrtl 98 | #- ceil 99 | - ceilf 100 | #- ceill 101 | - copysign 102 | - copysignf 103 | #- copysignl 104 | - cos 105 | - cosf 106 | - cosh 107 | - coshf 108 | #- coshl 109 | #- cosl 110 | - erf 111 | - erfc 112 | - erfcf 113 | #- erfcl 114 | - erff 115 | #- erfl 116 | - exp 117 | - exp2 118 | - exp2f 119 | #- exp2l 120 | - expf 121 | #- expl 122 | - expm1 123 | - expm1f 124 | #- expm1l 125 | - fabs 126 | - fabsf 127 | #- fabsl 128 | - fdim 129 | - fdimf 130 | #- fdiml 131 | - floor 132 | - floorf 133 | #- floorl 134 | - fma 135 | - fmaf 136 | #- fmal 137 | - fmax 138 | - fmaxf 139 | #- fmaxl 140 | - fmin 141 | - fminf 142 | #- fminl 143 | - fmod 144 | - fmodf 145 | #- fmodl 146 | - frexp 147 | - frexpf 148 | #- frexpl 149 | - hypot 150 | - hypotf 151 | #- hypotl 152 | - ilogb 153 | - ilogbf 154 | #- ilogbl 155 | - j0 156 | - j1 157 | - jn 158 | - ldexp 159 | - ldexpf 160 | #- ldexpl 161 | - lgamma 162 | - lgammaf 163 | #- lgammal 164 | - llrint 165 | - llrintf 166 | #- llrintl 167 | - llround 168 | - llroundf 169 | #- llroundl 170 | - log 171 | - log10 172 | - log10f 173 | #- log10l 174 | - log1p 175 | - log1pf 176 | #- log1pl 177 | - log2 178 | - log2f 179 | #- log2l 180 | - logb 181 | - logbf 182 | #- logbl 183 | - logf 184 | #- logl 185 | - lrint 186 | - lrintf 187 | #- lrintl 188 | - lround 189 | - lroundf 190 | #- lroundl 191 | - modf 192 | - modff 193 | #- modfl 194 | - nan 195 | - nanf 196 | #- nanl 197 | - nearbyint 198 | - nearbyintf 199 | #- nearbyintl 200 | - nextafter 201 | - nextafterf 202 | #- nextafterl 203 | #- nexttoward 204 | #- nexttowardf 205 | #- nexttowardl 206 | - pow 207 | - powf 208 | #- powl 209 | - remainder 210 | - remainderf 211 | #- remainderl 212 | - remquo 213 | - remquof 214 | #- remquol 215 | - rint 216 | - rintf 217 | #- rintl 218 | - round 219 | - roundf 220 | #- roundl 221 | - scalbln 222 | - scalblnf 223 | #- scalblnl 224 | - scalbn 225 | - scalbnf 226 | #- scalbnl 227 | - sin 228 | - sinf 229 | - sinh 230 | - sinhf 231 | #- sinhl 232 | #- sinl 233 | - sqrt 234 | - sqrtf 235 | #- sqrtl 236 | - tan 237 | - tanf 238 | - tanh 239 | - tanhf 240 | #- tanhl 241 | #- tanl 242 | - tgamma 243 | - tgammaf 244 | #- tgammal 245 | - trunc 246 | - truncf 247 | #- truncl 248 | - y0 249 | - y1 250 | - yn 251 | 252 | variables: 253 | - signgam 254 | -------------------------------------------------------------------------------- /include/posix/monetary.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - monetary 3 | 4 | requires: 5 | - locale 6 | - stddef 7 | - sys/types 8 | 9 | functions: 10 | - strfmon 11 | - strfmon_l 12 | -------------------------------------------------------------------------------- /include/posix/net/if.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - net/if 3 | 4 | constants: 5 | - IF_NAMESIZE 6 | 7 | structs: 8 | - if_nameindex 9 | 10 | functions: 11 | - if_freenameindex 12 | - if_indextoname 13 | - if_nameindex 14 | - if_nametoindex 15 | -------------------------------------------------------------------------------- /include/posix/netdb.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - netdb 3 | 4 | requires: 5 | - netinet/in 6 | - sys/socket 7 | - stdint 8 | 9 | constants: 10 | - AI_PASSIVE 11 | - AI_CANONNAME 12 | - AI_NUMERICHOST 13 | - AI_NUMERICSERV 14 | - AI_V4MAPPED 15 | - AI_ALL 16 | - AI_ADDRCONFIG 17 | 18 | - NI_NOFQDN 19 | - NI_NUMERICHOST 20 | - NI_NAMEREQD 21 | - NI_NUMERICSERV 22 | - NI_DGRAM 23 | - NI_NUMERICSCOPE 24 | 25 | - EAI_AGAIN 26 | - EAI_BADFLAGS 27 | - EAI_FAIL 28 | - EAI_FAMILY 29 | - EAI_MEMORY 30 | - EAI_NONAME 31 | - EAI_SERVICE 32 | - EAI_SOCKTYPE 33 | - EAI_SYSTEM 34 | - EAI_OVERFLOW 35 | 36 | # not posix 37 | - NI_MAXHOST 38 | - NI_MAXSERV 39 | 40 | structs: 41 | - hostent 42 | - netent 43 | - protoent 44 | - servent 45 | - addrinfo 46 | 47 | functions: 48 | - endhostent 49 | - endnetent 50 | - endprotoent 51 | - endservent 52 | - freeaddrinfo 53 | - gai_strerror 54 | - getaddrinfo 55 | - gethostent 56 | - getnameinfo 57 | - getnetbyaddr 58 | - getnetbyname 59 | - getnetent 60 | - getprotobyname 61 | - getprotobynumber 62 | - getprotoent 63 | - getservbyname 64 | - getservbyport 65 | - getservent 66 | - sethostent 67 | - setnetent 68 | - setprotoent 69 | - setservent 70 | -------------------------------------------------------------------------------- /include/posix/netinet/in.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - netinet/in 3 | 4 | requires: 5 | - sys/socket 6 | - stdint 7 | 8 | constants: 9 | - IPPROTO_IP 10 | - IPPROTO_IPV6 11 | - IPPROTO_ICMP 12 | - IPPROTO_RAW 13 | - IPPROTO_TCP 14 | - IPPROTO_UDP 15 | 16 | - INADDR_ANY 17 | - INADDR_BROADCAST 18 | - INADDR_NONE 19 | - INADDR_LOOPBACK 20 | 21 | - INET_ADDRSTRLEN 22 | - INET6_ADDRSTRLEN 23 | 24 | - IPV6_JOIN_GROUP 25 | - IPV6_LEAVE_GROUP 26 | - IPV6_MULTICAST_HOPS 27 | - IPV6_MULTICAST_IF 28 | - IPV6_MULTICAST_LOOP 29 | - IPV6_UNICAST_HOPS 30 | - IPV6_V6ONLY 31 | 32 | - IPV6_ADD_MEMBERSHIP # cygwin 33 | - IPV6_DROP_MEMBERSHIP # cygwin 34 | 35 | #macros: 36 | # - IN6_IS_ADDR_UNSPECIFIED 37 | # - IN6_IS_ADDR_LOOPBACK 38 | # - IN6_IS_ADDR_MULTICAST 39 | # - IN6_IS_ADDR_LINKLOCAL 40 | # - IN6_IS_ADDR_SITELOCAL 41 | # - IN6_IS_ADDR_V4MAPPED 42 | # - IN6_IS_ADDR_V4COMPAT 43 | # - IN6_IS_ADDR_MC_NODELOCAL 44 | # - IN6_IS_ADDR_MC_LINKLOCAL 45 | # - IN6_IS_ADDR_MC_SITELOCAL 46 | # - IN6_IS_ADDR_MC_ORGLOCAL 47 | # - IN6_IS_ADDR_MC_GLOBAL 48 | 49 | types: 50 | - in_port_t 51 | - in_addr_t 52 | 53 | structs: 54 | - in_addr 55 | - in6_addr 56 | - sockaddr_in 57 | - sockaddr_in6 58 | - ipv6_mreq 59 | -------------------------------------------------------------------------------- /include/posix/netinet/tcp.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - netinet/tcp 3 | 4 | constants: 5 | - TCP_NODELAY 6 | 7 | # not posix 8 | - TCP_KEEPIDLE 9 | - TCP_KEEPINTVL 10 | - TCP_KEEPCNT 11 | 12 | # darwin 13 | - TCP_KEEPALIVE 14 | -------------------------------------------------------------------------------- /include/posix/nl_types.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - nl_types 3 | 4 | constants: 5 | - NL_SETD 6 | - NL_CAT_LOCALE 7 | 8 | types: 9 | - nl_catd 10 | - nl_item 11 | 12 | functions: 13 | - catclose 14 | - catgets 15 | - catopen 16 | -------------------------------------------------------------------------------- /include/posix/poll.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - poll 3 | 4 | constants: 5 | - POLLIN 6 | - POLLRDNORM 7 | - POLLRDBAND 8 | - POLLPRI 9 | - POLLOUT 10 | - POLLWRNORM 11 | - POLLWRBAND 12 | - POLLERR 13 | - POLLHUP 14 | - POLLNVAL 15 | 16 | types: 17 | - nfds_t 18 | 19 | structs: 20 | - pollfd 21 | 22 | functions: 23 | - poll 24 | -------------------------------------------------------------------------------- /include/posix/pthread.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - pthread 3 | 4 | libraries: 5 | freebsd: 6 | - pthread 7 | 8 | requires: 9 | - sys/types 10 | - sched 11 | 12 | constants: 13 | - PTHREAD_BARRIER_SERIAL_THREAD 14 | - PTHREAD_CANCEL_ASYNCHRONOUS 15 | - PTHREAD_CANCEL_ENABLE 16 | - PTHREAD_CANCEL_DEFERRED 17 | - PTHREAD_CANCEL_DISABLE 18 | - PTHREAD_CANCELED 19 | - PTHREAD_CREATE_DETACHED 20 | - PTHREAD_CREATE_JOINABLE 21 | - PTHREAD_EXPLICIT_SCHED 22 | - PTHREAD_INHERIT_SCHED 23 | - PTHREAD_MUTEX_DEFAULT 24 | - PTHREAD_MUTEX_ERRORCHECK 25 | - PTHREAD_MUTEX_NORMAL 26 | - PTHREAD_MUTEX_RECURSIVE 27 | - PTHREAD_MUTEX_ROBUST 28 | - PTHREAD_MUTEX_STALLED 29 | - PTHREAD_PRIO_INHERIT 30 | - PTHREAD_PRIO_NONE 31 | - PTHREAD_PRIO_PROTECT 32 | - PTHREAD_PROCESS_SHARED 33 | - PTHREAD_PROCESS_PRIVATE 34 | - PTHREAD_SCOPE_PROCESS 35 | - PTHREAD_SCOPE_SYSTEM 36 | 37 | # FIXME: not parsed correctly 38 | #- PTHREAD_COND_INITIALIZER 39 | #- PTHREAD_MUTEX_INITIALIZER 40 | #- PTHREAD_RWLOCK_INITIALIZER 41 | 42 | # FIXME: resolves to {PTHREAD_MUTEX_INITIALIZER,0} on freebsd/cygwin 43 | #- PTHREAD_ONCE_INIT 44 | 45 | # freebsd 46 | - PTHREAD_DETACHED 47 | 48 | aliases: 49 | pthread_once: pthread_once_t # freebsd 50 | 51 | functions: 52 | - pthread_atfork 53 | - pthread_attr_destroy 54 | - pthread_attr_getdetachstate 55 | - pthread_attr_getguardsize 56 | - pthread_attr_getinheritsched 57 | - pthread_attr_getschedparam 58 | - pthread_attr_getschedpolicy 59 | - pthread_attr_getscope 60 | - pthread_attr_getstack 61 | - pthread_attr_getstacksize 62 | - pthread_attr_init 63 | - pthread_attr_setdetachstate 64 | - pthread_attr_setguardsize 65 | - pthread_attr_setinheritsched 66 | - pthread_attr_setschedparam 67 | - pthread_attr_setschedpolicy 68 | - pthread_attr_setscope 69 | - pthread_attr_setstack 70 | - pthread_attr_setstacksize 71 | - pthread_barrier_destroy 72 | - pthread_barrier_init 73 | - pthread_barrier_wait 74 | - pthread_barrierattr_destroy 75 | - pthread_barrierattr_getpshared 76 | - pthread_barrierattr_init 77 | - pthread_barrierattr_setpshared 78 | - pthread_cancel 79 | - pthread_cleanup_pop 80 | - pthread_cleanup_push 81 | - pthread_cond_broadcast 82 | - pthread_cond_destroy 83 | - pthread_cond_init 84 | - pthread_cond_signal 85 | - pthread_cond_timedwait 86 | - pthread_cond_wait 87 | - pthread_condattr_destroy 88 | - pthread_condattr_getclock 89 | - pthread_condattr_getpshared 90 | - pthread_condattr_init 91 | - pthread_condattr_setclock 92 | - pthread_condattr_setpshared 93 | - pthread_create 94 | - pthread_detach 95 | - pthread_equal 96 | - pthread_exit 97 | - pthread_getconcurrency 98 | - pthread_getcpuclockid 99 | - pthread_getschedparam 100 | - pthread_getspecific 101 | - pthread_join 102 | - pthread_key_create 103 | - pthread_key_delete 104 | - pthread_mutex_consistent 105 | - pthread_mutex_destroy 106 | - pthread_mutex_getprioceiling 107 | - pthread_mutex_init 108 | - pthread_mutex_lock 109 | - pthread_mutex_setprioceiling 110 | - pthread_mutex_timedlock 111 | - pthread_mutex_trylock 112 | - pthread_mutex_unlock 113 | - pthread_mutexattr_destroy 114 | - pthread_mutexattr_getprioceiling 115 | - pthread_mutexattr_getprotocol 116 | - pthread_mutexattr_getpshared 117 | - pthread_mutexattr_getrobust 118 | - pthread_mutexattr_gettype 119 | - pthread_mutexattr_init 120 | - pthread_mutexattr_setprioceiling 121 | - pthread_mutexattr_setprotocol 122 | - pthread_mutexattr_setpshared 123 | - pthread_mutexattr_setrobust 124 | - pthread_mutexattr_settype 125 | - pthread_once 126 | - pthread_rwlock_destroy 127 | - pthread_rwlock_init 128 | - pthread_rwlock_rdlock 129 | - pthread_rwlock_timedrdlock 130 | - pthread_rwlock_timedwrlock 131 | - pthread_rwlock_tryrdlock 132 | - pthread_rwlock_trywrlock 133 | - pthread_rwlock_unlock 134 | - pthread_rwlock_wrlock 135 | - pthread_rwlockattr_destroy 136 | - pthread_rwlockattr_getpshared 137 | - pthread_rwlockattr_init 138 | - pthread_rwlockattr_setpshared 139 | - pthread_self 140 | - pthread_setcancelstate 141 | - pthread_setcanceltype 142 | - pthread_setconcurrency 143 | - pthread_setschedparam 144 | - pthread_setschedprio 145 | - pthread_setspecific 146 | - pthread_spin_destroy 147 | - pthread_spin_init 148 | - pthread_spin_lock 149 | - pthread_spin_trylock 150 | - pthread_spin_unlock 151 | - pthread_testcancel 152 | -------------------------------------------------------------------------------- /include/posix/pwd.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - pwd 3 | 4 | requires: 5 | - sys/types 6 | 7 | structs: 8 | - passwd 9 | 10 | functions: 11 | - endpwent 12 | - getpwent 13 | - getpwnam 14 | - getpwnam_r 15 | - getpwuid 16 | - getpwuid_r 17 | - setpwent 18 | -------------------------------------------------------------------------------- /include/posix/regex.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - regex 3 | 4 | requires: 5 | - sys/types 6 | 7 | types: 8 | - regoff_t 9 | - reg_syntax_t # gnu 10 | 11 | structs: 12 | - regex_t 13 | - regmatch_t 14 | 15 | aliases: 16 | re_pattern_buffer: regex_t 17 | 18 | constants: 19 | - REG_EXTENDED 20 | - REG_ICASE 21 | - REG_NOSUB 22 | - REG_NEWLINE 23 | 24 | - REG_NOTBOL 25 | - REG_NOTEOL 26 | 27 | # FIXME: glibc: enum reg_errcode_t 28 | - REG_NOMATCH 29 | - REG_BADPAT 30 | - REG_ECOLLATE 31 | - REG_ECTYPE 32 | - REG_EESCAPE 33 | - REG_ESUBREG 34 | - REG_EBRACK 35 | - REG_EPAREN 36 | - REG_EBRACE 37 | - REG_BADBR 38 | - REG_ERANGE 39 | - REG_ESPACE 40 | - REG_BADRPT 41 | 42 | functions: 43 | - regcomp 44 | - regerror 45 | - regexec 46 | - regfree 47 | 48 | -------------------------------------------------------------------------------- /include/posix/sched.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sched 3 | 4 | requires: 5 | - sys/types 6 | - time 7 | 8 | constants: 9 | - SCHED_FIFO 10 | - SCHED_RR 11 | - SCHED_OTHER 12 | - SCHED_SPORADIC 13 | 14 | structs: 15 | - sched_param 16 | 17 | functions: 18 | - sched_get_priority_max 19 | - sched_get_priority_min 20 | - sched_getparam 21 | - sched_getscheduler 22 | - sched_rr_get_interval 23 | - sched_setparam 24 | - sched_setscheduler 25 | - sched_yield 26 | -------------------------------------------------------------------------------- /include/posix/search.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - search 3 | 4 | requires: 5 | - sys/types 6 | 7 | maps: 8 | __compar_fn_t: "Void* -> Int" # gnu 9 | __action_fn_t: "Int -> Void" # gnu 10 | 11 | enums: 12 | - ACTION 13 | - VISIT 14 | 15 | structs: 16 | - ENTRY 17 | 18 | aliases: 19 | entry: ENTRY # darwin, gnu, musl 20 | 21 | functions: 22 | - hcreate 23 | - hdestroy 24 | - hsearch 25 | - insque 26 | - lfind 27 | - lsearch 28 | - remque 29 | - tdelete 30 | - tfind 31 | - tsearch 32 | - twalk 33 | -------------------------------------------------------------------------------- /include/posix/semaphore.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - semaphore 3 | 4 | requires: 5 | - fcntl 6 | - time 7 | 8 | types: 9 | - sem_t 10 | 11 | functions: 12 | - sem_close 13 | - sem_destroy 14 | - sem_getvalue 15 | - sem_init 16 | - sem_open 17 | - sem_post 18 | - sem_timedwait 19 | - sem_trywait 20 | - sem_unlink 21 | - sem_wait 22 | -------------------------------------------------------------------------------- /include/posix/setjmp.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - setjmp 3 | 4 | types: 5 | - jmp_buf 6 | - sigjmp_buf 7 | 8 | functions: 9 | - siglongjmp 10 | - sigsetjmp 11 | 12 | # obsolete 13 | - _longjmp 14 | - longjmp 15 | - _setjmp 16 | - setjmp 17 | -------------------------------------------------------------------------------- /include/posix/signal.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - signal 3 | 4 | requires: 5 | - sys/types 6 | - time 7 | 8 | types: 9 | - sig_atomic_t 10 | - sigset_t 11 | #- mcontext_t 12 | 13 | structs: 14 | - sigaction 15 | - sigevent 16 | - siginfo_t 17 | - sigval 18 | - stack_t 19 | #- ucontext_t 20 | 21 | aliases: 22 | sigaltstack: stack_t 23 | siginfo: siginfo_t # gnu/i686, android 24 | 25 | constants: 26 | # FIXME: can't generate crystal code 27 | #- SIG_DFL 28 | #- SIG_ERR 29 | #- SIG_IGN 30 | 31 | - SIGEV_NONE 32 | - SIGEV_SIGNAL 33 | - SIGEV_THREAD 34 | 35 | - SIGHUP 36 | - SIGINT 37 | - SIGQUIT 38 | - SIGILL 39 | - SIGTRAP 40 | - SIGIOT 41 | - SIGABRT 42 | - SIGFPE 43 | - SIGKILL 44 | - SIGBUS 45 | - SIGSEGV 46 | - SIGSYS 47 | - SIGPIPE 48 | - SIGALRM 49 | - SIGTERM 50 | - SIGURG 51 | - SIGSTOP 52 | - SIGTSTP 53 | - SIGCONT 54 | - SIGCHLD 55 | - SIGCLD 56 | - SIGTTIN 57 | - SIGTTOU 58 | - SIGIO 59 | - SIGXCPU 60 | - SIGXFSZ 61 | - SIGVTALRM 62 | - SIGUSR1 63 | - SIGUSR2 64 | 65 | - SIGEMT # darwin 66 | - SIGINFO # darwin 67 | - SIGWINCH # darwin, gnu, musl 68 | - SIGPWR # gnu, musl 69 | - SIGSTKFLT # gnu, musl 70 | - SIGUNUSED # gnu, musl 71 | 72 | - SIG_BLOCK 73 | - SIG_UNBLOCK 74 | - SIG_SETMASK 75 | - SA_NOCLDSTOP 76 | - SA_ONSTACK 77 | - SA_RESETHAND 78 | - SA_RESTART 79 | - SA_SIGINFO 80 | - SA_NOCLDWAIT 81 | - SA_NODEFER 82 | - SS_ONSTACK 83 | - SS_DISABLE 84 | - MINSIGSTKSZ 85 | - SIGSTKSZ 86 | 87 | functions: 88 | - kill 89 | - killpg 90 | - psiginfo 91 | - psignal 92 | - pthread_kill 93 | - pthread_sigmask 94 | - raise 95 | - sigaction 96 | - sigaddset 97 | - sigaltstack 98 | - sigdelset 99 | - sigemptyset 100 | - sigfillset 101 | - sigismember 102 | - signal 103 | - sigpause 104 | - sigpending 105 | - sigprocmask 106 | - sigqueue 107 | - sigsuspend 108 | - sigtimedwait 109 | - sigwait 110 | - sigwaitinfo 111 | -------------------------------------------------------------------------------- /include/posix/spawn.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - spawn 3 | 4 | requires: 5 | - sys/types 6 | - signal 7 | - sched 8 | 9 | constants: 10 | - POSIX_SPAWN_RESETIDS 11 | - POSIX_SPAWN_SETPGROUP 12 | - POSIX_SPAWN_SETSCHEDPARAM 13 | - POSIX_SPAWN_SETSCHEDULER 14 | - POSIX_SPAWN_SETSIGDEF 15 | - POSIX_SPAWN_SETSIGMASK 16 | 17 | types: 18 | - posix_spawnattr_t 19 | - posix_spawn_file_actions_t 20 | 21 | functions: 22 | - posix_spawn 23 | - posix_spawn_file_actions_addclose 24 | - posix_spawn_file_actions_adddup2 25 | - posix_spawn_file_actions_addopen 26 | - posix_spawn_file_actions_destroy 27 | - posix_spawn_file_actions_init 28 | - posix_spawnattr_destroy 29 | - posix_spawnattr_getflags 30 | - posix_spawnattr_getpgroup 31 | - posix_spawnattr_getschedparam 32 | - posix_spawnattr_getschedpolicy 33 | - posix_spawnattr_getsigdefault 34 | - posix_spawnattr_getsigmask 35 | - posix_spawnattr_init 36 | - posix_spawnattr_setflags 37 | - posix_spawnattr_setpgroup 38 | - posix_spawnattr_setschedparam 39 | - posix_spawnattr_setschedpolicy 40 | - posix_spawnattr_setsigdefault 41 | - posix_spawnattr_setsigmask 42 | - posix_spawnp 43 | -------------------------------------------------------------------------------- /include/posix/stddef.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stddef 3 | 4 | constants: 5 | - NULL 6 | 7 | types: 8 | - ptrdiff_t 9 | - wchar_t 10 | - size_t 11 | -------------------------------------------------------------------------------- /include/posix/stdint.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stdint 3 | 4 | types: 5 | - int8_t 6 | - int16_t 7 | - int32_t 8 | - uint8_t 9 | - uint16_t 10 | - uint32_t 11 | - int64_t 12 | - uint64_t 13 | 14 | - int_least8_t 15 | - int_least16_t 16 | - int_least32_t 17 | - int_least64_t 18 | - uint_least8_t 19 | - uint_least16_t 20 | - uint_least32_t 21 | - uint_least64_t 22 | 23 | - int_fast8_t 24 | - int_fast16_t 25 | - int_fast32_t 26 | - int_fast64_t 27 | - uint_fast8_t 28 | - uint_fast16_t 29 | - uint_fast32_t 30 | - uint_fast64_t 31 | 32 | - intptr_t 33 | - uintptr_t 34 | - intmax_t 35 | - uintmax_t 36 | 37 | constants: 38 | - INT8_MIN 39 | - INT16_MIN 40 | - INT32_MIN 41 | - INT64_MIN 42 | 43 | - INT8_MAX 44 | - INT16_MAX 45 | - INT32_MAX 46 | - INT64_MAX 47 | 48 | - UINT8_MAX 49 | - UINT16_MAX 50 | - UINT32_MAX 51 | - UINT64_MAX 52 | 53 | - INT_LEAST8_MIN 54 | - INT_LEAST16_MIN 55 | - INT_LEAST32_MIN 56 | - INT_LEAST64_MIN 57 | 58 | - INT_LEAST8_MAX 59 | - INT_LEAST16_MAX 60 | - INT_LEAST32_MAX 61 | - INT_LEAST64_MAX 62 | 63 | - UINT_LEAST8_MAX 64 | - UINT_LEAST16_MAX 65 | - UINT_LEAST32_MAX 66 | - UINT_LEAST64_MAX 67 | 68 | - INT_FAST8_MIN 69 | - INT_FAST16_MIN 70 | - INT_FAST32_MIN 71 | - INT_FAST64_MIN 72 | 73 | - INT_FAST8_MAX 74 | - INT_FAST16_MAX 75 | - INT_FAST32_MAX 76 | - INT_FAST64_MAX 77 | 78 | - UINT_FAST8_MAX 79 | - UINT_FAST16_MAX 80 | - UINT_FAST32_MAX 81 | - UINT_FAST64_MAX 82 | 83 | - INTPTR_MIN 84 | - INTPTR_MAX 85 | - UINTPTR_MAX 86 | 87 | - INTMAX_MIN 88 | - INTMAX_MAX 89 | - UINTMAX_MAX 90 | 91 | - PTRDIFF_MIN 92 | - PTRDIFF_MAX 93 | 94 | - SIG_ATOMIC_MIN 95 | - SIG_ATOMIC_MAX 96 | 97 | - SIZE_MAX 98 | 99 | #- WCHAR_MIN 100 | #- WCHAR_MAX 101 | 102 | #- WINT_MIN 103 | #- WINT_MAX 104 | -------------------------------------------------------------------------------- /include/posix/stdio.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stdio 3 | 4 | requires: 5 | - sys/types 6 | - stddef 7 | #- stdarg 8 | 9 | constants: 10 | - BUFSIZ 11 | - L_ctermid 12 | 13 | - _IOFBF 14 | - _IOLBF 15 | - _IONBF 16 | 17 | - SEEK_CUR 18 | - SEEK_END 19 | - SEEK_SET 20 | 21 | - FILENAME_MAX 22 | - FOPEN_MAX 23 | - EOF 24 | 25 | types: 26 | - FILE = Void 27 | - fpos_t 28 | 29 | functions: 30 | - clearerr 31 | - ctermid 32 | - dprintf 33 | - fclose 34 | - fdopen 35 | - feof 36 | - ferror 37 | - fflush 38 | - fgetc 39 | - fgetpos 40 | - fgets 41 | - fileno 42 | - flockfile 43 | - fmemopen 44 | - fopen 45 | - fprintf 46 | - fputc 47 | - fputs 48 | - fread 49 | - freopen 50 | - fscanf 51 | - fseek 52 | - fseeko 53 | - fsetpos 54 | - ftell 55 | - ftello 56 | - ftrylockfile 57 | - funlockfile 58 | - fwrite 59 | - getc 60 | - getc_unlocked 61 | - getchar 62 | - getchar_unlocked 63 | - getdelim 64 | - getline 65 | - open_memstream 66 | - pclose 67 | - perror 68 | - popen 69 | - printf 70 | - putc 71 | - putc_unlocked 72 | - putchar 73 | - putchar_unlocked 74 | - puts 75 | - remove 76 | - rename 77 | - renameat 78 | - rewind 79 | - scanf 80 | - setbuf 81 | - setvbuf 82 | - snprintf 83 | - sprintf 84 | - sscanf 85 | - tmpfile 86 | - ungetc 87 | 88 | # FIXME: undefined constant VaList 89 | #- vdprintf 90 | #- vfprintf 91 | #- vfscanf 92 | #- vprintf 93 | #- vscanf 94 | #- vsnprintf 95 | #- vsprintf 96 | #- vsscanf 97 | 98 | #variables: 99 | # - stderr 100 | # - stdin 101 | # - stdout 102 | -------------------------------------------------------------------------------- /include/posix/stdlib.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - stdlib 3 | 4 | requires: 5 | - stddef 6 | - sys/wait 7 | - limits 8 | - math 9 | 10 | maps: 11 | __compar_fn_t: "Void* -> Int" # gnu 12 | 13 | types: 14 | - div_t 15 | - ldiv_t 16 | - lldiv_t 17 | 18 | #macros: 19 | # - MB_CUR_MAX = MB_CUR_MAX 20 | # - WIFEXITED 21 | # - WEXITSTATUS 22 | # - WIFSIGNALED 23 | # - WIFSTOPPED 24 | # - WSTOPSIG 25 | # - WTERMSIG 26 | 27 | constants: 28 | - EXIT_FAILURE 29 | - EXIT_SUCCESS 30 | - RAND_MAX 31 | 32 | functions: 33 | - "_Exit : NoReturn" 34 | - a64l 35 | - abort 36 | - abs 37 | - atexit 38 | - atof 39 | - atoi 40 | - atol 41 | - atoll 42 | - bsearch 43 | - calloc 44 | - div 45 | - drand48 46 | - erand48 47 | - "exit : NoReturn" 48 | - free 49 | - getenv 50 | - getsubopt 51 | - grantpt 52 | - initstate 53 | - jrand48 54 | - l64a 55 | - labs 56 | - lcong48 57 | - ldiv 58 | - llabs 59 | - lldiv 60 | - lrand48 61 | - malloc 62 | - mblen 63 | - mbstowcs 64 | - mbtowc 65 | - mkdtemp 66 | - mkstemp 67 | - mrand48 68 | - nrand48 69 | - posix_memalign 70 | - posix_openpt 71 | - ptsname 72 | - putenv 73 | - qsort 74 | - rand 75 | - random 76 | - realloc 77 | - realpath 78 | - seed48 79 | - setenv 80 | - setkey 81 | - setstate 82 | - srand 83 | - srand48 84 | - srandom 85 | - strtod 86 | - strtof 87 | - strtol 88 | # NOTE: crystal doesn't support "long double" 89 | #- strtold 90 | - strtoll 91 | - strtoul 92 | - strtoull 93 | - system 94 | - unlockpt 95 | - unsetenv 96 | - wcstombs 97 | - wctomb 98 | -------------------------------------------------------------------------------- /include/posix/string.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - string 3 | 4 | requires: 5 | - stddef 6 | #- locale 7 | 8 | functions: 9 | - memccpy 10 | - memchr 11 | - memcmp 12 | - memcpy 13 | - memmove 14 | - memset 15 | - stpcpy 16 | - stpncpy 17 | - strcat 18 | - strchr 19 | - strcmp 20 | #- strcoll 21 | #- strcoll_l 22 | - strcpy 23 | - strcspn 24 | - strdup 25 | - strerror 26 | #- strerror_l 27 | - strerror_r 28 | - strlen 29 | - strncat 30 | - strncmp 31 | - strncpy 32 | - strndup 33 | - strnlen 34 | - strpbrk 35 | - strrchr 36 | - strsignal 37 | - strspn 38 | - strstr 39 | - strtok 40 | - strtok_r 41 | - strxfrm 42 | #- strxfrm_l 43 | -------------------------------------------------------------------------------- /include/posix/strings.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - strings 3 | 4 | requires: 5 | - stddef 6 | #- locale 7 | 8 | functions: 9 | - ffs 10 | - strcasecmp 11 | - strcasecmp_l 12 | - strncasecmp 13 | - strncasecmp_l 14 | -------------------------------------------------------------------------------- /include/posix/sys/ipc.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/ipc 3 | 4 | requires: 5 | - sys/types 6 | 7 | constants: 8 | - IPC_CREAT 9 | - IPC_EXCL 10 | - IPC_NOWAIT 11 | 12 | - IPC_PRIVATE 13 | 14 | - IPC_RMID 15 | - IPC_SET 16 | - IPC_STAT 17 | 18 | structs: 19 | - ipc_perm 20 | 21 | functions: 22 | - ftok 23 | -------------------------------------------------------------------------------- /include/posix/sys/mman.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/mman 3 | 4 | requires: 5 | - sys/types 6 | 7 | constants: 8 | - PROT_EXEC 9 | - PROT_NONE 10 | - PROT_READ 11 | - PROT_WRITE 12 | 13 | - MAP_FIXED 14 | - MAP_PRIVATE 15 | - MAP_SHARED 16 | 17 | # not posix 18 | - MAP_ANON 19 | - MAP_ANONYMOUS 20 | 21 | - MS_ASYNC 22 | - MS_INVALIDATE 23 | - MS_SYNC 24 | 25 | - MCL_CURRENT 26 | - MCL_FUTURE 27 | 28 | - MAP_FAILED 29 | 30 | - POSIX_MADV_DONTNEED 31 | - POSIX_MADV_NORMAL 32 | - POSIX_MADV_RANDOM 33 | - POSIX_MADV_SEQUENTIAL 34 | - POSIX_MADV_WILLNEED 35 | 36 | - POSIX_TYPED_MEM_ALLOCATE 37 | - POSIX_TYPED_MEM_ALLOCATE_CONTIG 38 | - POSIX_TYPED_MEM_MAP_ALLOCATABLE 39 | 40 | # not posix 41 | - MADV_DONTNEED 42 | - MADV_NORMAL 43 | - MADV_RANDOM 44 | - MADV_SEQUENTIAL 45 | - MADV_WILLNEED 46 | - MADV_HUGEPAGE 47 | - MADV_NOHUGEPAGE 48 | 49 | structs: 50 | - posix_typed_mem_info 51 | 52 | functions: 53 | - mlock 54 | - mlockall 55 | - mmap 56 | - mprotect 57 | - msync 58 | - munlock 59 | - munlockall 60 | - munmap 61 | - shm_open 62 | - shm_unlink 63 | 64 | - posix_madvise 65 | - posix_mem_offset 66 | - posix_typed_mem_get_info 67 | - posix_typed_mem_open 68 | 69 | # not posix 70 | - madvise 71 | -------------------------------------------------------------------------------- /include/posix/sys/resource.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/resource 3 | 4 | requires: 5 | - sys/types 6 | - sys/time 7 | 8 | maps: 9 | __priority_which_t: int # gnu 10 | __rlimit_resource_t: int # gnu 11 | __rusage_who_t: int # gnu 12 | 13 | constants: 14 | - PRIO_PROCESS 15 | - PRIO_PGRP 16 | - PRIO_USER 17 | 18 | - RLIM_INFINITY 19 | - RLIM_SAVED_MAX 20 | - RLIM_SAVED_CUR 21 | 22 | - RUSAGE_SELF 23 | - RUSAGE_CHILDREN 24 | 25 | - RLIMIT_CORE 26 | - RLIMIT_CPU 27 | - RLIMIT_DATA 28 | - RLIMIT_FSIZE 29 | - RLIMIT_NOFILE 30 | - RLIMIT_STACK 31 | - RLIMIT_AS 32 | 33 | - RLIMIT_VMEM # freebsd 34 | 35 | types: 36 | - rlim_t 37 | 38 | structs: 39 | - rlimit 40 | - rusage 41 | 42 | functions: 43 | - getpriority 44 | - getrlimit 45 | - getrusage 46 | - setpriority 47 | - setrlimit 48 | -------------------------------------------------------------------------------- /include/posix/sys/select.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/select 3 | 4 | requires: 5 | - sys/types 6 | - sys/time 7 | - time 8 | - signal 9 | 10 | #macros: 11 | # - FD_CLR 12 | # - FD_ISSET 13 | # - FD_SET 14 | # - FD_ZERO 15 | 16 | constants: 17 | - FD_SETSIZE 18 | 19 | types: 20 | - fd_mask # freebsd 21 | 22 | structs: 23 | - fd_set 24 | 25 | functions: 26 | - pselect 27 | - select 28 | -------------------------------------------------------------------------------- /include/posix/sys/sem.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/sem 3 | 4 | requires: 5 | - sys/types 6 | - sys/ipc 7 | - time # cygwin 8 | 9 | structs: 10 | - semid_ds 11 | - sembuf 12 | 13 | constants: 14 | - SEM_UNDO 15 | - GETNCNT 16 | - GETPID 17 | - GETVAL 18 | - GETALL 19 | - GETZCNT 20 | - SETVAL 21 | - SETALL 22 | 23 | functions: 24 | - semctl 25 | - semget 26 | - semop 27 | -------------------------------------------------------------------------------- /include/posix/sys/shm.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/shm 3 | 4 | requires: 5 | - sys/types 6 | - sys/ipc 7 | - time # cygwin 8 | 9 | maps: 10 | timestruc_t: timespec # cygwin 11 | 12 | constants: 13 | - SHM_RDONLY 14 | - SHM_RND 15 | 16 | # FIXME: usually refers to internals 17 | #- SHMLBA 18 | 19 | types: 20 | - shmatt_t 21 | 22 | structs: 23 | - shmid_ds 24 | 25 | functions: 26 | - shmat 27 | - shmctl 28 | - shmdt 29 | - shmget 30 | -------------------------------------------------------------------------------- /include/posix/sys/socket.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/socket 3 | 4 | requires: 5 | - sys/types 6 | - sys/uio 7 | 8 | maps: 9 | __SOCKADDR_ARG: sockaddr* # gnu 10 | __CONST_SOCKADDR_ARG: sockaddr* # gnu 11 | 12 | #macros: 13 | # - CMSG_DATA(cmsg) 14 | # - CMSG_NXTHDR(mhdr,cmsg) 15 | # - CMSG_FIRSTHDR(mhdr) 16 | 17 | constants: 18 | - SCM_RIGHTS 19 | 20 | - SOCK_DGRAM 21 | - SOCK_RAW 22 | - SOCK_SEQPACKET 23 | - SOCK_STREAM 24 | 25 | - SOL_SOCKET 26 | 27 | - SO_ACCEPTCONN 28 | - SO_BROADCAST 29 | - SO_DEBUG 30 | - SO_DONTROUTE 31 | - SO_ERROR 32 | - SO_KEEPALIVE 33 | - SO_LINGER 34 | - SO_OOBINLINE 35 | - SO_RCVBUF 36 | - SO_RCVLOWAT 37 | - SO_RCVTIMEO 38 | - SO_REUSEADDR 39 | - SO_SNDBUF 40 | - SO_SNDLOWAT 41 | - SO_SNDTIMEO 42 | - SO_TYPE 43 | 44 | - SOMAXCONN 45 | 46 | - MSG_CTRUNC 47 | - MSG_DONTROUTE 48 | - MSG_EOR 49 | - MSG_OOB 50 | - MSG_NOSIGNAL 51 | - MSG_PEEK 52 | - MSG_TRUNC 53 | - MSG_WAITALL 54 | 55 | # not POSIX 56 | - PF_INET 57 | - PF_INET6 58 | - PF_UNIX 59 | - PF_UNSPEC 60 | - PF_LOCAL # glibc 61 | 62 | - AF_INET 63 | - AF_INET6 64 | - AF_UNIX 65 | - AF_UNSPEC 66 | - AF_LOCAL # cygwin 67 | 68 | - SHUT_RD 69 | - SHUT_RDWR 70 | - SHUT_WR 71 | 72 | # not posix 73 | - SOCK_CLOEXEC 74 | 75 | types: 76 | - socklen_t 77 | - sa_family_t 78 | 79 | structs: 80 | - sockaddr 81 | - sockaddr_storage 82 | - msghdr 83 | - cmsghdr 84 | - linger 85 | 86 | functions: 87 | - accept 88 | - bind 89 | - connect 90 | - getpeername 91 | - getsockname 92 | - getsockopt 93 | - listen 94 | - recv 95 | - recvfrom 96 | - recvmsg 97 | - send 98 | - sendmsg 99 | - sendto 100 | - setsockopt 101 | - shutdown 102 | - sockatmark 103 | - socket 104 | - socketpair 105 | -------------------------------------------------------------------------------- /include/posix/sys/stat.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/stat 3 | 4 | requires: 5 | - sys/types 6 | - time 7 | 8 | constants: 9 | - S_IFMT 10 | - S_IFBLK 11 | - S_IFCHR 12 | - S_IFIFO 13 | - S_IFREG 14 | - S_IFDIR 15 | - S_IFLNK 16 | - S_IFSOCK 17 | 18 | - S_IRUSR 19 | - S_IWUSR 20 | - S_IXUSR 21 | - S_IRWXU 22 | - S_IRGRP 23 | - S_IWGRP 24 | - S_IXGRP 25 | - S_IRWXG 26 | - S_IROTH 27 | - S_IWOTH 28 | - S_IXOTH 29 | - S_IRWXO 30 | 31 | - S_ISUID 32 | - S_ISGID 33 | - S_ISVTX 34 | 35 | #macros: 36 | # - S_ISBLK(m) 37 | # - S_ISCHR(m) 38 | # - S_ISDIR(m) 39 | # - S_ISFIFO(m) 40 | # - S_ISREG(m) 41 | # - S_ISLNK(m) 42 | # - S_ISSOCK(m) 43 | # - S_TYPEISMQ(buf) 44 | # - S_TYPEISSEM(buf) 45 | # - S_TYPEISSHM(buf) 46 | # - S_TYPEISTMO(buf) 47 | 48 | types: 49 | - fflags_t # freebsd 50 | 51 | structs: 52 | - stat 53 | 54 | functions: 55 | - chmod 56 | - fchmod 57 | - fchmodat 58 | - fstat 59 | - fstatat 60 | - futimens 61 | - lstat 62 | - mkdir 63 | - mkdirat 64 | - mkfifo 65 | - mkfifoat 66 | - mknod 67 | - mknodat 68 | - stat 69 | - umask 70 | - utimensat 71 | -------------------------------------------------------------------------------- /include/posix/sys/statvfs.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/statvfs 3 | 4 | requires: 5 | - sys/types 6 | 7 | constants: 8 | - ST_RDONLY 9 | - ST_NOSUID 10 | 11 | types: 12 | - statvfs 13 | 14 | functions: 15 | - fstatvfs 16 | - statvfs 17 | 18 | -------------------------------------------------------------------------------- /include/posix/sys/syscall.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/syscall 3 | 4 | constants: 5 | - SYS_getrandom 6 | -------------------------------------------------------------------------------- /include/posix/sys/time.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/time 3 | 4 | requires: 5 | - sys/types 6 | #- sys/select 7 | 8 | maps: 9 | __timezone_ptr_t: void* # gnu 10 | 11 | structs: 12 | - timeval 13 | 14 | # not posix 15 | - timezone 16 | 17 | functions: 18 | - utimes 19 | 20 | # not posix 21 | - gettimeofday 22 | -------------------------------------------------------------------------------- /include/posix/sys/times.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/times 3 | 4 | requires: 5 | - sys/types 6 | 7 | structs: 8 | - tms 9 | 10 | functions: 11 | - times 12 | -------------------------------------------------------------------------------- /include/posix/sys/types.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/types 3 | - pthread # android 4 | 5 | requires: 6 | - stddef 7 | - stdint # android 8 | 9 | types: 10 | - blkcnt_t 11 | - blksize_t 12 | - clock_t 13 | - clockid_t 14 | - dev_t 15 | - fsblkcnt_t 16 | - fsfilcnt_t 17 | - gid_t 18 | - id_t 19 | - ino_t 20 | - key_t 21 | - mode_t 22 | - nlink_t 23 | - off_t 24 | - pid_t 25 | 26 | - pthread_attr_t 27 | - pthread_barrier_t 28 | - pthread_barrierattr_t 29 | - pthread_cond_t 30 | - pthread_condattr_t 31 | - pthread_key_t 32 | - pthread_mutex_t 33 | - pthread_mutexattr_t 34 | - pthread_once_t 35 | - pthread_rwlock_t 36 | - pthread_rwlockattr_t 37 | - pthread_spinlock_t 38 | - pthread_t 39 | 40 | - ssize_t 41 | - suseconds_t 42 | - time_t 43 | - timer_t 44 | - uid_t 45 | -------------------------------------------------------------------------------- /include/posix/sys/uio.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/uio 3 | 4 | requires: 5 | - sys/types 6 | 7 | structs: 8 | - iovec 9 | 10 | functions: 11 | - readv 12 | - writev 13 | -------------------------------------------------------------------------------- /include/posix/sys/un.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/un 3 | 4 | requires: 5 | - sys/socket 6 | 7 | structs: 8 | - sockaddr_un 9 | -------------------------------------------------------------------------------- /include/posix/sys/utsname.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/utsname 3 | 4 | structs: 5 | - utsname 6 | 7 | functions: 8 | - uname 9 | -------------------------------------------------------------------------------- /include/posix/sys/wait.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - sys/wait 3 | 4 | requires: 5 | - sys/types 6 | - signal 7 | 8 | maps: 9 | __wait_status_ptr_t: Int* # cygwin 10 | __WAIT_STATUS: Int* # gnu 11 | 12 | #macros: 13 | # - WEXITSTATUS 14 | # - WIFCONTINUED 15 | # - WIFEXITED 16 | # - WIFSIGNALED 17 | # - WIFSTOPPED 18 | # - WSTOPSIG 19 | # - WTERMSIG 20 | 21 | constants: 22 | - WCONTINUED 23 | - WNOHANG 24 | - WUNTRACED 25 | 26 | - WEXITED 27 | - WNOWAIT 28 | - WSTOPPED 29 | 30 | types: 31 | - idtype_t 32 | 33 | functions: 34 | - wait 35 | - waitid 36 | - waitpid 37 | -------------------------------------------------------------------------------- /include/posix/syslog.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - syslog 3 | 4 | constants: 5 | - LOG_PID 6 | - LOG_CONS 7 | - LOG_NDELAY 8 | - LOG_ODELAY 9 | - LOG_NOWAIT 10 | 11 | - LOG_KERN 12 | - LOG_USER 13 | - LOG_MAIL 14 | - LOG_NEWS 15 | - LOG_UUCP 16 | - LOG_DAEMON 17 | - LOG_AUTH 18 | - LOG_CRON 19 | - LOG_LPR 20 | - LOG_LOCAL0 21 | - LOG_LOCAL1 22 | - LOG_LOCAL2 23 | - LOG_LOCAL3 24 | - LOG_LOCAL4 25 | - LOG_LOCAL5 26 | - LOG_LOCAL6 27 | - LOG_LOCAL7 28 | 29 | - LOG_EMERG 30 | - LOG_ALERT 31 | - LOG_CRIT 32 | - LOG_ERR 33 | - LOG_WARNING 34 | - LOG_NOTICE 35 | - LOG_INFO 36 | - LOG_DEBUG 37 | 38 | #macros: 39 | # - LOG_MASK 40 | 41 | functions: 42 | - closelog 43 | - openlog 44 | - setlogmask 45 | - syslog 46 | -------------------------------------------------------------------------------- /include/posix/termios.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - termios 3 | 4 | requires: 5 | - sys/types 6 | 7 | constants: 8 | - VEOF 9 | - VEOL 10 | - VERASE 11 | - VINTR 12 | - VKILL 13 | - VMIN 14 | - VQUIT 15 | - VSTART 16 | - VSTOP 17 | - VSUSP 18 | 19 | - BRKINT 20 | - ICRNL 21 | - IGNBRK 22 | - IGNCR 23 | - IGNPAR 24 | - INLCR 25 | - INPCK 26 | - ISTRIP 27 | - IXANY 28 | - IXOFF 29 | - IXON 30 | - PARMRK 31 | 32 | - OPOST 33 | - ONLCR 34 | - OCRNL 35 | - ONOCR 36 | - ONLRET 37 | - OFDEL 38 | - OFILL 39 | 40 | - CRDLY 41 | - CR0 42 | - CR1 43 | - CR2 44 | - CR3 45 | 46 | - TABDLY 47 | - TAB0 48 | - TAB1 49 | - TAB2 50 | - TAB3 51 | 52 | - BSDLY 53 | - BS0 54 | - BS1 55 | 56 | - VTDLY 57 | - VT0 58 | - VT1 59 | - FFDLY 60 | - FF0 61 | - FF1 62 | 63 | - NLDLY 64 | - NL0 65 | - NL1 66 | 67 | - B0 68 | - B50 69 | - B75 70 | - B110 71 | - B134 72 | - B150 73 | - B200 74 | - B300 75 | - B600 76 | - B1200 77 | - B1800 78 | - B2400 79 | - B4800 80 | - B9600 81 | - B19200 82 | - B38400 83 | 84 | - CSIZE 85 | - CS5 86 | - CS6 87 | - CS7 88 | - CS8 89 | - CSTOPB 90 | - CREAD 91 | - PARENB 92 | - PARODD 93 | - HUPCL 94 | - CLOCAL 95 | 96 | - ECHO 97 | - ECHOE 98 | - ECHOK 99 | - ECHONL 100 | - ICANON 101 | - IEXTEN 102 | - ISIG 103 | - NOFLSH 104 | - TOSTOP 105 | 106 | - TCSANOW 107 | - TCSADRAIN 108 | - TCSAFLUSH 109 | 110 | - TCIFLUSH 111 | - TCIOFLUSH 112 | - TCOFLUSH 113 | 114 | - TCIOFF 115 | - TCION 116 | - TCOOFF 117 | - TCOON 118 | 119 | types: 120 | - cc_t 121 | - speed_t 122 | - tcflag_t 123 | 124 | structs: 125 | - termios 126 | 127 | functions: 128 | - cfgetispeed 129 | - cfgetospeed 130 | - cfsetispeed 131 | - cfsetospeed 132 | - tcdrain 133 | - tcflow 134 | - tcflush 135 | - tcgetattr 136 | - tcgetsid 137 | - tcsendbreak 138 | - tcsetattr 139 | 140 | # not posix 141 | - cfmakeraw 142 | -------------------------------------------------------------------------------- /include/posix/time.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - time 3 | 4 | requires: 5 | - sys/types 6 | #- locale 7 | #- signal # cygwin 8 | 9 | #maps: 10 | # sigevent: void # cygwin 11 | 12 | constants: 13 | - CLOCKS_PER_SEC 14 | 15 | - CLOCK_MONOTONIC 16 | - CLOCK_PROCESS_CPUTIME_ID 17 | - CLOCK_REALTIME 18 | - CLOCK_THREAD_CPUTIME_ID 19 | 20 | - TIMER_ABSTIME 21 | 22 | structs: 23 | - tm 24 | - timespec 25 | - itimerspec 26 | 27 | functions: 28 | - clock 29 | - clock_getcpuclockid 30 | - clock_getres 31 | - clock_gettime 32 | - clock_nanosleep 33 | - clock_settime 34 | - difftime 35 | - getdate 36 | - gmtime 37 | - gmtime_r 38 | - localtime 39 | - localtime_r 40 | - mktime 41 | - nanosleep 42 | - strftime 43 | #- strftime_l 44 | - strptime 45 | - time 46 | - timer_create 47 | - timer_delete 48 | - timer_getoverrun 49 | - timer_gettime 50 | - timer_settime 51 | - tzset 52 | 53 | # not posix 54 | - timegm 55 | 56 | variables: 57 | - daylight 58 | - timezone 59 | - tzname 60 | -------------------------------------------------------------------------------- /include/posix/ulimit.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - ulimit 3 | 4 | constants: 5 | - UL_GETFSIZE 6 | - UL_SETFSIZE 7 | 8 | functions: 9 | - ulimit 10 | -------------------------------------------------------------------------------- /include/posix/unistd.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - unistd 3 | 4 | requires: 5 | - sys/types 6 | - stdint 7 | 8 | constants: 9 | - F_OK 10 | - R_OK 11 | - W_OK 12 | - X_OK 13 | 14 | - F_LOCK 15 | - F_TEST 16 | - F_TLOCK 17 | - F_ULOCK 18 | 19 | - _PC_2_SYMLINKS 20 | - _PC_ALLOC_SIZE_MIN 21 | - _PC_ASYNC_IO 22 | - _PC_CHOWN_RESTRICTED 23 | - _PC_FILESIZEBITS 24 | - _PC_LINK_MAX 25 | - _PC_MAX_CANON 26 | - _PC_MAX_INPUT 27 | - _PC_NAME_MAX 28 | - _PC_NO_TRUNC 29 | - _PC_PATH_MAX 30 | - _PC_PIPE_BUF 31 | - _PC_PRIO_IO 32 | - _PC_REC_INCR_XFER_SIZE 33 | - _PC_REC_MAX_XFER_SIZE 34 | - _PC_REC_MIN_XFER_SIZE 35 | - _PC_REC_XFER_ALIGN 36 | - _PC_SYMLINK_MAX 37 | - _PC_SYNC_IO 38 | - _PC_TIMESTAMP_RESOLUTION 39 | - _PC_VDISABLE 40 | 41 | - _SC_2_C_BIND 42 | - _SC_2_C_DEV 43 | - _SC_2_CHAR_TERM 44 | - _SC_2_FORT_DEV 45 | - _SC_2_FORT_RUN 46 | - _SC_2_LOCALEDEF 47 | - _SC_2_PBS 48 | - _SC_2_PBS_ACCOUNTING 49 | - _SC_2_PBS_CHECKPOINT 50 | - _SC_2_PBS_LOCATE 51 | - _SC_2_PBS_MESSAGE 52 | - _SC_2_PBS_TRACK 53 | - _SC_2_SW_DEV 54 | - _SC_2_UPE 55 | - _SC_2_VERSION 56 | - _SC_ADVISORY_INFO 57 | - _SC_AIO_LISTIO_MAX 58 | - _SC_AIO_MAX 59 | - _SC_AIO_PRIO_DELTA_MAX 60 | - _SC_ARG_MAX 61 | - _SC_ASYNCHRONOUS_IO 62 | - _SC_ATEXIT_MAX 63 | - _SC_BARRIERS 64 | - _SC_BC_BASE_MAX 65 | - _SC_BC_DIM_MAX 66 | - _SC_BC_SCALE_MAX 67 | - _SC_BC_STRING_MAX 68 | - _SC_CHILD_MAX 69 | - _SC_CLK_TCK 70 | - _SC_CLOCK_SELECTION 71 | - _SC_COLL_WEIGHTS_MAX 72 | - _SC_CPUTIME 73 | - _SC_DELAYTIMER_MAX 74 | - _SC_EXPR_NEST_MAX 75 | - _SC_FSYNC 76 | - _SC_GETGR_R_SIZE_MAX 77 | - _SC_GETPW_R_SIZE_MAX 78 | - _SC_HOST_NAME_MAX 79 | - _SC_IOV_MAX 80 | - _SC_IPV6 81 | - _SC_JOB_CONTROL 82 | - _SC_LINE_MAX 83 | - _SC_LOGIN_NAME_MAX 84 | - _SC_MAPPED_FILES 85 | - _SC_MEMLOCK 86 | - _SC_MEMLOCK_RANGE 87 | - _SC_MEMORY_PROTECTION 88 | - _SC_MESSAGE_PASSING 89 | - _SC_MONOTONIC_CLOCK 90 | - _SC_MQ_OPEN_MAX 91 | - _SC_MQ_PRIO_MAX 92 | - _SC_NGROUPS_MAX 93 | - _SC_OPEN_MAX 94 | - _SC_PAGE_SIZE 95 | - _SC_PAGESIZE 96 | - _SC_PRIORITIZED_IO 97 | - _SC_PRIORITY_SCHEDULING 98 | - _SC_RAW_SOCKETS 99 | - _SC_RE_DUP_MAX 100 | - _SC_READER_WRITER_LOCKS 101 | - _SC_REALTIME_SIGNALS 102 | - _SC_REGEXP 103 | - _SC_RTSIG_MAX 104 | - _SC_SAVED_IDS 105 | - _SC_SEM_NSEMS_MAX 106 | - _SC_SEM_VALUE_MAX 107 | - _SC_SEMAPHORES 108 | - _SC_SHARED_MEMORY_OBJECTS 109 | - _SC_SHELL 110 | - _SC_SIGQUEUE_MAX 111 | - _SC_SPAWN 112 | - _SC_SPIN_LOCKS 113 | - _SC_SPORADIC_SERVER 114 | - _SC_SS_REPL_MAX 115 | - _SC_STREAM_MAX 116 | - _SC_SYMLOOP_MAX 117 | - _SC_SYNCHRONIZED_IO 118 | - _SC_THREAD_ATTR_STACKADDR 119 | - _SC_THREAD_ATTR_STACKSIZE 120 | - _SC_THREAD_CPUTIME 121 | - _SC_THREAD_DESTRUCTOR_ITERATIONS 122 | - _SC_THREAD_KEYS_MAX 123 | - _SC_THREAD_PRIO_INHERIT 124 | - _SC_THREAD_PRIO_PROTECT 125 | - _SC_THREAD_PRIORITY_SCHEDULING 126 | - _SC_THREAD_PROCESS_SHARED 127 | - _SC_THREAD_ROBUST_PRIO_INHERIT 128 | - _SC_THREAD_ROBUST_PRIO_PROTECT 129 | - _SC_THREAD_SAFE_FUNCTIONS 130 | - _SC_THREAD_SPORADIC_SERVER 131 | - _SC_THREAD_STACK_MIN 132 | - _SC_THREAD_THREADS_MAX 133 | - _SC_THREADS 134 | - _SC_TIMEOUTS 135 | - _SC_TIMER_MAX 136 | - _SC_TIMERS 137 | - _SC_TRACE 138 | - _SC_TRACE_EVENT_FILTER 139 | - _SC_TRACE_EVENT_NAME_MAX 140 | - _SC_TRACE_INHERIT 141 | - _SC_TRACE_LOG 142 | - _SC_TRACE_NAME_MAX 143 | - _SC_TRACE_SYS_MAX 144 | - _SC_TRACE_USER_EVENT_MAX 145 | - _SC_TTY_NAME_MAX 146 | - _SC_TYPED_MEMORY_OBJECTS 147 | - _SC_TZNAME_MAX 148 | - _SC_V7_ILP32_OFF32 149 | - _SC_V7_ILP32_OFFBIG 150 | - _SC_V7_LP64_OFF64 151 | - _SC_V7_LPBIG_OFFBIG 152 | - _SC_VERSION 153 | - _SC_XOPEN_CRYPT 154 | - _SC_XOPEN_ENH_I18N 155 | - _SC_XOPEN_REALTIME 156 | - _SC_XOPEN_REALTIME_THREADS 157 | - _SC_XOPEN_SHM 158 | - _SC_XOPEN_STREAMS 159 | - _SC_XOPEN_UNIX 160 | - _SC_XOPEN_UUCP 161 | - _SC_XOPEN_VERSION 162 | 163 | - STDERR_FILENO 164 | - STDIN_FILENO 165 | - STDOUT_FILENO 166 | 167 | functions: 168 | - access 169 | - alarm 170 | - chdir 171 | - chown 172 | - close 173 | - confstr 174 | - crypt 175 | - dup 176 | - dup2 177 | - encrypt 178 | - "_exit : NoReturn" 179 | - execl 180 | - execle 181 | - execlp 182 | - execv 183 | - execve 184 | - execvp 185 | - faccessat 186 | - fchdir 187 | - fchown 188 | - fchownat 189 | - fdatasync 190 | - fexecve 191 | - "@[ReturnsTwice]\nfork" 192 | - fpathconf 193 | - fsync 194 | - ftruncate 195 | - getcwd 196 | - getegid 197 | - geteuid 198 | - getgid 199 | - getgroups 200 | - gethostid 201 | - gethostname 202 | - getlogin 203 | - getlogin_r 204 | - getopt 205 | - getpgid 206 | - getpgrp 207 | - getpid 208 | - getppid 209 | - getsid 210 | - getuid 211 | - isatty 212 | - lchown 213 | - link 214 | - linkat 215 | - lockf 216 | - lseek 217 | - nice 218 | - pathconf 219 | - pause 220 | - pipe 221 | - pread 222 | - pwrite 223 | - read 224 | - readlink 225 | - readlinkat 226 | - rmdir 227 | - setegid 228 | - seteuid 229 | - setgid 230 | - setpgid 231 | - setregid 232 | - setreuid 233 | - setsid 234 | - setuid 235 | - sleep 236 | - swab 237 | - symlink 238 | - symlinkat 239 | - sync 240 | - syscall 241 | - sysconf 242 | - tcgetpgrp 243 | - tcsetpgrp 244 | - truncate 245 | - ttyname 246 | - ttyname_r 247 | - unlink 248 | - unlinkat 249 | - write 250 | 251 | variables: 252 | - optarg 253 | - opterr 254 | - optind 255 | - optopt 256 | #- environ 257 | -------------------------------------------------------------------------------- /include/posix/utmpx.yml: -------------------------------------------------------------------------------- 1 | includes: 2 | - utmpx 3 | 4 | requires: 5 | - sys/types 6 | - sys/time 7 | 8 | structs: 9 | - utmpx 10 | 11 | constants: 12 | - EMPTY 13 | - BOOT_TIME 14 | - OLD_TIME 15 | - NEW_TIME 16 | - USER_PROCESS 17 | - INIT_PROCESS 18 | - LOGIN_PROCESS 19 | - DEAD_PROCESS 20 | 21 | functions: 22 | - endutxent 23 | - getutxent 24 | - getutxid 25 | - getutxline 26 | - pututxline 27 | - setutxent 28 | -------------------------------------------------------------------------------- /shard.lock: -------------------------------------------------------------------------------- 1 | version: 2.0 2 | shards: 3 | clang: 4 | git: https://github.com/crystal-lang/clang.cr.git 5 | version: 0.3.0+git.commit.d019b9ff105cd652f31cca73e950adbf41037d52 6 | 7 | crystal_lib: 8 | git: https://github.com/crystal-lang/crystal_lib.git 9 | version: 0.1.0+git.commit.513e51e0eea9341cd095c820a4563bbf6a53a2e5 10 | 11 | -------------------------------------------------------------------------------- /shard.yml: -------------------------------------------------------------------------------- 1 | name: posix 2 | version: 0.1.0 3 | crystal: 0.35.0 4 | 5 | authors: 6 | - Julien Portalier 7 | 8 | description: | 9 | POSIX libc bindings 10 | 11 | dependencies: 12 | crystal_lib: 13 | github: crystal-lang/crystal_lib 14 | 15 | license: Apache-2.0 16 | -------------------------------------------------------------------------------- /src/base.cr: -------------------------------------------------------------------------------- 1 | ifdef !x86_64 && !i686 2 | {% raise "Unsupported platform, only x86_64 and i686 are supported." %} 3 | end 4 | 5 | lib LibC 6 | alias Char = UInt8 7 | alias UChar = Char 8 | alias SChar = Int8 9 | alias Short = Int16 10 | alias UShort = UInt16 11 | alias Int = Int32 12 | alias UInt = UInt32 13 | 14 | ifdef x86_64 15 | alias Long = Int64 16 | alias ULong = UInt64 17 | elsif i686 18 | alias Long = Int32 19 | alias ULong = UInt32 20 | end 21 | 22 | alias LongLong = Int64 23 | alias ULongLong = UInt64 24 | alias Float = Float32 25 | alias Double = Float64 26 | 27 | $environ : Char** 28 | end 29 | -------------------------------------------------------------------------------- /src/definition.cr: -------------------------------------------------------------------------------- 1 | require "yaml" 2 | 3 | module POSIX 4 | class Definition 5 | YAML.mapping({ 6 | includes: { type: Array(String) }, 7 | requires: { type: Array(String), nilable: true }, 8 | constants: { type: Array(String), nilable: true }, 9 | enums: { type: Array(String), nilable: true }, 10 | types: { type: Array(String), nilable: true }, 11 | unions: { type: Array(String), nilable: true }, 12 | structs: { type: Array(String), nilable: true }, 13 | functions: { type: Array(String), nilable: true }, 14 | variables: { type: Array(String), nilable: true }, 15 | aliases: { type: Hash(String, String), nilable: true }, 16 | maps: { type: Hash(String, String), nilable: true }, 17 | libraries: { type: Hash(String, Array(String)), nilable: true }, 18 | }) 19 | 20 | def self.load(name, source, abi) 21 | definition = from_yaml(File.read(path(name, source))) 22 | definition.name = name 23 | definition.abi = abi 24 | definition 25 | end 26 | 27 | def self.path(name, source) 28 | File.join(source, "#{name}.yml") 29 | end 30 | 31 | property! name : String 32 | property! abi : String 33 | 34 | {% for kind in %w(includes requires constants enums types unions structs functions variables) %} 35 | def {{kind.id}} 36 | if list = @{{kind.id}} 37 | list.each { |item| yield(item.as(String)) } 38 | end 39 | end 40 | {% end %} 41 | 42 | {% for kind in %w(maps aliases) %} 43 | def {{kind.id}} 44 | if list = @{{kind.id}} 45 | list.each { |name, value| yield(name.as(String), value.as(String)) } 46 | end 47 | end 48 | {% end %} 49 | 50 | def libraries 51 | if libs = @libraries 52 | if list = libs[@abi]? 53 | list.as(Array) 54 | end 55 | end 56 | end 57 | end 58 | end 59 | -------------------------------------------------------------------------------- /src/main.cr: -------------------------------------------------------------------------------- 1 | require "./definition" 2 | require "./transformer" 3 | require "option_parser" 4 | 5 | module H2CR 6 | struct Options 7 | property arch : String 8 | property sys : String 9 | property abi : String 10 | property debug : Bool 11 | property source : String 12 | 13 | def initialize(@arch = "", @sys = "", @abi = "") 14 | @debug = false 15 | @source = File.join(Dir.current, "include", "posix") 16 | end 17 | 18 | def bits=(@bits : Int32) 19 | end 20 | 21 | def bits 22 | @bits || arch.includes?("64") ? 64 : 32 23 | end 24 | 25 | def target 26 | {arch, sys, abi}.join('-') 27 | end 28 | end 29 | 30 | def self.run 31 | options = Options.new 32 | 33 | parser = OptionParser.new 34 | parser.banner = "Usage: h2cr [options] files" 35 | 36 | parser.on("--arch=NAME", "Specify the ARCH (arm, arm64, mips, mips64, x86, x86_x64)") do |arch| 37 | options.arch = arch 38 | end 39 | 40 | parser.on("--sys=NAME", "Specify the OS (linux, macosx, win32)") do |sys| 41 | options.sys = sys 42 | end 43 | 44 | parser.on("--abi=NAME", "Specify the ABI (eg: android, cygwin, darwin, freebsd, gnu, musl, netbsd)") do |abi| 45 | options.abi = abi 46 | end 47 | 48 | parser.on("--bits=N", "Force the LONG bit size (32, 64)") do |n| 49 | options.bits = n.to_i 50 | end 51 | 52 | parser.on("--source=PATH", "Source directory in which to look for configuration files") do |source| 53 | options.source = source 54 | end 55 | 56 | parser.on("--debug", "Print the bindings to STDOUT") do 57 | options.debug = true 58 | end 59 | 60 | parser.on("-h", "--help", "Show this help") do 61 | puts parser 62 | exit 63 | end 64 | 65 | names = parser.parse(ARGV) 66 | names = nil if names.try(&.empty?) 67 | 68 | names ||= Dir[File.join(options.source, "**", "*.yml")] 69 | .map { |name| name.sub(File.join(options.source, ""), "").sub(".yml", "") } 70 | 71 | #unless options.debug 72 | # names.each do |name| 73 | # POSIX::Definition.load(name, options.source, options.abi).requires do |dep| 74 | # names << dep unless names.includes?(dep) 75 | # end 76 | # end 77 | #end 78 | 79 | names.sort.each do |name| 80 | path = File.join("targets", options.target, "c", "#{name}.cr") 81 | definition = POSIX::Definition.load(name, options.source, options.abi) 82 | transformer = POSIX::Transformer.new(definition, 83 | bits: options.bits, 84 | arch: options.arch) 85 | 86 | if options.debug 87 | puts "# #{path}" 88 | puts transformer.transform 89 | else 90 | parent = File.dirname(path) 91 | puts "#{name} => #{path}" 92 | Dir.mkdir_p(parent, mode = 0o755) unless Dir.exists?(parent) 93 | File.write(path, transformer.transform) 94 | end 95 | end 96 | end 97 | end 98 | 99 | H2CR.run 100 | -------------------------------------------------------------------------------- /src/resolver.cr: -------------------------------------------------------------------------------- 1 | module POSIX 2 | class Resolver 3 | private getter types 4 | getter unions 5 | getter structs 6 | 7 | def initialize 8 | @types = {} of String => String 9 | @unions = {} of String => CrystalLib::StructOrUnion 10 | @structs = {} of String => CrystalLib::StructOrUnion 11 | end 12 | 13 | # Resolves a type down to a Primitive, Union or Struct type. 14 | def resolve(name : String) 15 | if _name = types[name]? 16 | resolve(_name) 17 | else 18 | name 19 | end 20 | end 21 | 22 | def struct?(name) 23 | structs[name]? 24 | end 25 | 26 | def union?(name) 27 | unions[name]? 28 | end 29 | 30 | # Resolves a type, avoiding "private" types (ie. starting with an 31 | # underscore) as much as possible. 32 | # 33 | # For example we're resolving `__size_t` to `ssize_t` on the following 34 | # pattern: 35 | # 36 | # typedef ssize_t long 37 | # typedef __ssize_t ssize_t 38 | # 39 | # It also tres to avoid the glibc pattern: 40 | # 41 | # typedef __ssize_t long 42 | # typedef ssize_t __size_t 43 | # void fn(__ssize_t* x) 44 | # 45 | # which would bind to: 46 | # 47 | # alias X_SsizeT = Long 48 | # alias SsizeT = X_SsizeT 49 | # fun fn(x : X_SsizeT) 50 | # 51 | # when it should be as simple as: 52 | # 53 | # alias SsizeT = Long 54 | # fun fn(x : SsizeT) 55 | # 56 | def resolve_public(name : String) 57 | return name unless name.starts_with?('_') 58 | 59 | # looking up for: typedef ssize_t __ssize_t 60 | if value = types.key_for?(name) 61 | if value != name 62 | return value unless value.starts_with?('_') 63 | end 64 | end 65 | 66 | # looking down for: typedef __size_t ssize_t (recursively) 67 | if value = types[name]? 68 | if value != name && (val = resolve_public(value)) 69 | return val 70 | end 71 | end 72 | 73 | name 74 | end 75 | 76 | def map_default(name, value) 77 | types[name.to_s] = value.to_s 78 | end 79 | 80 | @outer_typedef : CrystalLib::ASTNode? 81 | 82 | def map_recursive(node) 83 | if node.is_a?(CrystalLib::Typedef) 84 | @outer_typedef = node 85 | end 86 | 87 | if node.is_a?(CrystalLib::StructOrUnion) 88 | _name = node.unscoped_name 89 | _name = @outer_typedef.try(&.name) if _name.empty? 90 | if _name 91 | case node.kind 92 | when :union 93 | unions[_name] = node 94 | when :struct 95 | structs[_name] = node 96 | end 97 | end 98 | end 99 | 100 | value = if node.responds_to?(:type) 101 | map_recursive(node.type) 102 | elsif node.responds_to?(:node) 103 | map_recursive(node.node) 104 | end 105 | name = find_name(node) 106 | 107 | if value 108 | unless value.empty? 109 | if node.is_a?(CrystalLib::PointerType) || 110 | node.is_a?(CrystalLib::IncompleteArrayType) 111 | value = "#{value}*" 112 | end 113 | 114 | if node.is_a?(CrystalLib::ConstantArrayType) 115 | value = "StaticArray(#{value}, #{node.size})" 116 | end 117 | 118 | if name 119 | unless name.empty? 120 | types[name] = value 121 | end 122 | end 123 | end 124 | end 125 | 126 | name 127 | end 128 | 129 | private def find_name(node) 130 | value = if node.responds_to?(:unscoped_name) 131 | node.unscoped_name 132 | elsif node.responds_to?(:name) 133 | node.name 134 | elsif node.responds_to?(:kind) 135 | node.kind.to_s 136 | elsif node.is_a?(CrystalLib::NodeRef) || 137 | node.is_a?(CrystalLib::PointerType) || 138 | node.is_a?(CrystalLib::IncompleteArrayType) || 139 | node.is_a?(CrystalLib::ConstantArrayType) || 140 | node.is_a?(CrystalLib::FunctionType) 141 | return 142 | else 143 | STDERR.puts "WARN: unsupported #{node.class.name} node:\n#{node.inspect}\n\n" 144 | return 145 | end 146 | case value 147 | when .empty? 148 | nil 149 | when "Char_S" 150 | "SChar" 151 | else 152 | value 153 | end 154 | end 155 | 156 | def map_recursive(node : CrystalLib::Function) 157 | end 158 | 159 | def map_recursive(node : CrystalLib::Define) 160 | #types[node.name] = node.value unless node.value.empty? 161 | end 162 | 163 | def map_recursive(node : CrystalLib::Enum) 164 | #node.values.each { |n| map_recursive(n) } 165 | end 166 | 167 | def map_recursive(node : CrystalLib::EnumValue) 168 | #map_enum_value(node) 169 | end 170 | 171 | #private def map_enum_value(node) 172 | # value = case node.value 173 | # when Int8 then "#{node.value}_i8" 174 | # when Int16 then "#{node.value}_i16" 175 | # when Int32 then "#{node.value}_i32" 176 | # when Int64 then "#{node.value}_i64" 177 | # when UInt8 then "#{node.value}_u8" 178 | # when UInt16 then "#{node.value}_u16" 179 | # when UInt32 then "#{node.value}_u32" 180 | # when UInt64 then "#{node.value}_u64" 181 | # when String then node.value.to_s 182 | # else 183 | # STDERR.puts "WARN: lost enum value type #{node.value.class.name} for #{node.value}" 184 | # node.value.to_s 185 | # end 186 | # types[node.name] = value unless value.empty? 187 | #end 188 | 189 | def inspect(io : IO) 190 | types.each do |name, value| 191 | io << name << " = " << value << "\n" 192 | end 193 | end 194 | end 195 | end 196 | -------------------------------------------------------------------------------- /src/transformer.cr: -------------------------------------------------------------------------------- 1 | require "crystal_lib" 2 | require "clang" 3 | require "compiler/crystal/formatter" 4 | require "./resolver" 5 | 6 | STDERR.sync = true 7 | 8 | module CrystalLib 9 | class StructOrUnion 10 | def dup(name) 11 | cpy = StructOrUnion.new(kind, name.to_s) 12 | cpy.fields = fields 13 | cpy 14 | end 15 | end 16 | 17 | class Function 18 | def dup(name) 19 | cpy = Function.new(name.to_s, return_type, variadic?) 20 | cpy.args = args 21 | cpy 22 | end 23 | end 24 | 25 | class Var 26 | def dup(name) 27 | Var.new(name.to_s, type) 28 | end 29 | end 30 | end 31 | 32 | module POSIX 33 | class Transformer 34 | getter definition : Definition 35 | getter nodes : Array(CrystalLib::ASTNode) 36 | getter resolver : Resolver 37 | 38 | private getter requirements 39 | private getter processed 40 | 41 | def initialize(@definition, @bits : Int32, @arch : String) 42 | @resolver = Resolver.new 43 | @nodes = CrystalLib::Parser.parse(header) 44 | 45 | definition.maps { |name, value| resolver.map_default(name, value) } 46 | @nodes.each { |node| resolver.map_recursive(node) } 47 | 48 | @requirements = [] of String 49 | @processed = [] of String 50 | end 51 | 52 | def transform 53 | code = String.build &->transform(String::Builder) 54 | Crystal::Formatter.format(code) 55 | rescue e : Crystal::SyntaxException 56 | puts code, "problem at line #{e.line_number}, col #{e.column_number} in #{e.filename}" 57 | raise e 58 | end 59 | 60 | def transform(io : IO) 61 | definition.requires do |name| 62 | _name = name.as(String) 63 | if File.dirname(_name) == File.dirname(definition.name) 64 | io << "require \"./#{File.basename(_name)}\"\n" 65 | elsif File.dirname(definition.name) != "." 66 | io << "require \"../#{_name}\"\n" 67 | else 68 | io << "require \"./#{_name}\"\n" 69 | end 70 | end 71 | io << "\n" 72 | 73 | if libs = definition.libraries 74 | io << "@[Link(" << libs.map(&.inspect).join(", ") << ")]\n" 75 | end 76 | 77 | io << "lib LibC\n" 78 | 79 | definition.constants { |name| transform(io, name, :constant) } 80 | io << "\n" 81 | 82 | definition.enums { |name| transform(io, name, :enum) } 83 | io << "\n" 84 | 85 | definition.types do |name| 86 | if name.index('=') 87 | name, type = name.split('=', 2).map(&.strip) 88 | io << " type " << name << " = " << type << "\n" 89 | else 90 | transform(io, name, :type) 91 | end 92 | end 93 | io << "\n" 94 | 95 | definition.unions { |name| transform(io, name, :union) } 96 | io << "\n" 97 | 98 | definition.structs { |name| transform(io, name, :struct) } 99 | io << "\n" 100 | 101 | definition.aliases do |name, value| 102 | io << " alias #{crname(name)} = #{crname(value)}\n" 103 | end 104 | io << "\n" 105 | 106 | definition.functions do |name| 107 | if name.index('\n') 108 | flags = name.strip.split('\n') 109 | name = flags.pop 110 | end 111 | if name.index('=') 112 | crystal_name, name = name.split('=', 2).map(&.strip) 113 | end 114 | if name.index(':') 115 | name, return_type = name.split(':', 2).map(&.strip) 116 | end 117 | if node = find_node(name, :function) 118 | processed << name.as(String) 119 | if node.is_a?(CrystalLib::Function) 120 | transform(io, node.as(CrystalLib::Function), name: crystal_name, return_type: return_type, flags: flags) 121 | next 122 | end 123 | end 124 | STDERR.puts "WARN: can't find #{name}" 125 | end 126 | io << "\n" 127 | 128 | definition.variables { |name| transform(io, name, :variable) } 129 | io << "\n" 130 | 131 | until requirements.empty? 132 | requirements.uniq! 133 | 134 | name = requirements.shift 135 | next if processed.includes?(name) 136 | processed << name 137 | next unless name.starts_with?('_') 138 | 139 | if node = resolver.unions[name]? 140 | transform(io, node.dup(name)) 141 | elsif node = resolver.structs[name]? 142 | transform(io, node, name) 143 | end 144 | end 145 | 146 | io << "end\n" 147 | end 148 | 149 | def transform(io, name, type : Symbol) 150 | if node = find_node(name, type) 151 | if type == :struct 152 | while node.is_a?(CrystalLib::Define) 153 | node = find_node(node.value, type) 154 | end 155 | if node.is_a?(CrystalLib::StructOrUnion) 156 | node = node.dup(name) 157 | end 158 | end 159 | processed << name.as(String) 160 | transform(io, node) 161 | else 162 | STDERR.puts "WARN: can't find #{name}" 163 | end 164 | end 165 | 166 | def find_node(name, type) 167 | case type 168 | when :function 169 | # prefer functions over macros 170 | if node = nodes.select(&.is_a?(CrystalLib::Function)).find(&.name.==(name)) 171 | return node 172 | end 173 | 174 | # follow #defines to find function 175 | _name = name 176 | while node = find_node(_name, :any) 177 | break unless node.is_a?(CrystalLib::Define) 178 | _name = node.value 179 | end 180 | if node.is_a?(CrystalLib::Function) 181 | return node.dup(name) 182 | end 183 | when :union 184 | if node = nodes.select(&.is_a?(CrystalLib::StructOrUnion)).find(&.unscoped_name.==(name)) 185 | return node 186 | end 187 | when :type 188 | # prefer typedef over #define 189 | if node = nodes.select(&.is_a?(CrystalLib::Typedef)).find(&.name.==(name)) 190 | return node 191 | end 192 | when :variable 193 | # follow #defines to find variable 194 | _name = name 195 | while node = find_node(_name, :any) 196 | break unless node.is_a?(CrystalLib::Define) 197 | _name = node.value 198 | end 199 | if node.is_a?(CrystalLib::Var) 200 | return node.dup(name) 201 | end 202 | end 203 | 204 | nodes.find do |node| 205 | if node.responds_to?(:unscoped_name) 206 | node.unscoped_name == name 207 | else 208 | node.name == name 209 | end 210 | end 211 | end 212 | 213 | def transform(io, node : CrystalLib::Define) 214 | value = node.value 215 | 216 | if node.name == value 217 | # macro definition may reference an enum value 218 | if enum_value = find_enum_value(node.name) 219 | value = enum_value.value.to_s 220 | end 221 | end 222 | 223 | _value = crvalue(value) 224 | begin 225 | ast = Crystal::Parser.parse(_value) 226 | if ast.is_a?(Crystal::Call) 227 | raise "" unless %w(new | >> <<).includes?(ast.name) 228 | end 229 | rescue 230 | STDERR.puts "WARN: can't parse #{node.name}: #{value}" 231 | else 232 | io << " " << node.name.sub(/^[_]+/, "") << " = " << _value << "\n" 233 | end 234 | end 235 | 236 | def transform(io, node : CrystalLib::Enum, name = nil) 237 | name ||= node.name 238 | 239 | io << " enum " << crname(name) << " : " << crtype(node.type) << "\n" 240 | node.values.each do |ev| 241 | io << " " << crname(ev.name) << " = " << ev.value << "\n" 242 | end 243 | io << " end\n" 244 | end 245 | 246 | def transform(io, node : CrystalLib::StructOrUnion, name = nil) 247 | if private_struct?(node) 248 | io << " type " << crname(node.unscoped_name) << " = Void\n" 249 | return 250 | end 251 | 252 | definition = String.build do |str| 253 | str << " " << node.kind << " " << crname(name || node.unscoped_name) << "\n" 254 | 255 | field_names = [] of String 256 | 257 | node.fields.each_with_index do |field, index| 258 | # FIXME: fixes a bug on gnu64 includes where `in_addr` is reported as 259 | # having `s_addr` twice... 260 | unless (field_name = field.name).empty? 261 | next if field_names.includes?(field_name) 262 | field_names << field_name 263 | end 264 | 265 | type = field.type 266 | 267 | case type = field.type 268 | when CrystalLib::NodeRef 269 | # nested structs/unions 270 | case nested = type.node 271 | when CrystalLib::StructOrUnion 272 | if nested.unscoped_name == "" 273 | type = nested.dup(node.unscoped_name + field.name) 274 | transform(io, type) 275 | end 276 | else 277 | raise "UNSUPPORTED nested: #{nested.name} (#{nested.class.name})" 278 | end 279 | end 280 | 281 | _name = field.name.empty? ? "__reserved_#{index}" : field.name 282 | _type = crtype(type) 283 | _type = "Void*" if _type == "Void" 284 | 285 | str << " " << _name << " : " << _type << "\n" 286 | end 287 | 288 | str << " end\n" 289 | end 290 | 291 | io << definition 292 | end 293 | 294 | def transform(io, node : CrystalLib::Typedef) 295 | name, type = node.name, node.type 296 | 297 | # avoids "private" definitions starting with underscores 298 | while type.is_a?(CrystalLib::TypedefType) 299 | break unless type.name.starts_with?('_') 300 | type = type.type 301 | end 302 | 303 | if type.is_a?(CrystalLib::NodeRef) 304 | type = type.node 305 | end 306 | 307 | if type.is_a?(CrystalLib::StructOrUnion) 308 | transform(io, type.dup(name)) 309 | elsif type.is_a?(CrystalLib::Enum) 310 | transform(io, type, name) 311 | else 312 | _type = crtype(type) 313 | 314 | if _type == "Void*" 315 | io << " type " << crname(name) << " = Void*\n" 316 | else 317 | if type.is_a?(CrystalLib::PointerType) 318 | node = type.type 319 | if node.is_a?(CrystalLib::NodeRef) 320 | node = node.node 321 | end 322 | transform(io, node) 323 | end 324 | io << " alias " << crname(name) << " = " << _type << "\n" 325 | end 326 | end 327 | end 328 | 329 | def transform(io, node : CrystalLib::Function, name = nil, return_type = nil, flags = nil) 330 | if flags 331 | flags.each do |flag| 332 | io << " " << flag << "\n" 333 | end 334 | end 335 | 336 | if name 337 | io << " fun " << name << " = " << node.name 338 | else 339 | io << " fun " << node.name 340 | end 341 | 342 | if node.args.any? || node.variadic? 343 | io << '(' 344 | 345 | # FIXME: fun signal is wrongly identified as taking 3 params on darwin target 346 | node.args.shift if node.name == "signal" && node.args.size == 3 347 | 348 | node.args.each_with_index do |arg, index| 349 | name = arg.name 350 | name = name.sub(/^_+/, "").downcase 351 | name = "x#{index}" if name.empty? 352 | io << ", " unless index == 0 353 | io << name << " : " << crtype(arg.type) 354 | end 355 | 356 | io << ", ..." if node.variadic? 357 | io << ')' 358 | end 359 | 360 | io << " : " << (return_type || crtype(node.return_type)) << "\n" 361 | end 362 | 363 | def transform(io, node : CrystalLib::Var) 364 | io << " $" << node.name << " : " << crtype(node.type) << "\n" 365 | end 366 | 367 | def transform(io, node) 368 | STDERR.puts "unsupported node (#{node.class.name})" 369 | end 370 | 371 | def find_enum_value(name) 372 | @nodes.each do |node| 373 | next unless node.is_a?(CrystalLib::Enum) 374 | node.values.each do |enum_value| 375 | return enum_value if enum_value.name == name 376 | end 377 | end 378 | nil 379 | end 380 | 381 | def crname(cname) 382 | case cname 383 | when "ssize_t" 384 | "SSizeT" 385 | when "uchar", "char_u", "char_s" 386 | "Char" 387 | when "schar" 388 | "SChar" 389 | when "ushort" 390 | "UShort" 391 | when "ulong" 392 | "ULong" 393 | when /^uint(.*)/ 394 | "UInt#{$1}".camelcase 395 | when .starts_with?("_") 396 | "X_#{cname.downcase.gsub(' ', '_').camelcase}" 397 | when /\s/ 398 | cname.split(/\s+/).map { |cn| crname(cn).as(String) }.join 399 | when /^[A-Z]/ 400 | if cname.includes?('_') 401 | cname.downcase.camelcase 402 | else 403 | cname 404 | end 405 | else 406 | cname.downcase.camelcase 407 | end 408 | end 409 | 410 | def crtype(ctype) 411 | case ctype 412 | when CrystalLib::TypedefType 413 | name = ctype.name 414 | if (ref = ctype.type).is_a?(CrystalLib::NodeRef) 415 | # avoids private struct reference 416 | if (_node = ref.node).is_a?(CrystalLib::StructOrUnion) 417 | if _node.unscoped_name != "" && !_node.unscoped_name.starts_with?('_') 418 | ctype = _node 419 | name = ctype.unscoped_name 420 | end 421 | end 422 | elsif (func = ctype.type).is_a?(CrystalLib::FunctionType) 423 | # avoids private func reference 424 | return crtype(func) if name.starts_with?('_') 425 | end 426 | 427 | _name = resolver.resolve_public(name) 428 | crtype_struct_or_union(_name) || crname(_name) 429 | when CrystalLib::PrimitiveType 430 | crname(ctype.to_s) 431 | when CrystalLib::UnexposedType 432 | "Void" 433 | when CrystalLib::PointerType 434 | "#{crtype(ctype.type)}*" 435 | when CrystalLib::ConstantArrayType 436 | "StaticArray(#{crtype(ctype.type)}, #{ctype.size})" 437 | when CrystalLib::IncompleteArrayType 438 | "#{crtype(ctype.type)}*" 439 | when CrystalLib::NodeRef 440 | crtype(ctype.node) 441 | when CrystalLib::Enum 442 | p [:type, ctype] 443 | when CrystalLib::StructOrUnion 444 | if ctype.kind == :struct && private_struct?(ctype) 445 | "Void" 446 | elsif rtype = resolver.resolve_public(ctype.unscoped_name) 447 | if rtype.starts_with?("_") && rtype == ctype.unscoped_name 448 | "Void" 449 | else 450 | crtype_struct_or_union(rtype) || crname(rtype) 451 | end 452 | else 453 | crtype_struct_or_union(ctype.unscoped_name) || 454 | crname(ctype.unscoped_name) 455 | end 456 | when CrystalLib::FunctionType 457 | inputs = ctype.inputs.map { |arg| crtype(arg).as(String) }.join(", ") 458 | "#{inputs} -> #{crtype(ctype.output)}" 459 | when CrystalLib::ErrorType 460 | crname(ctype.name) 461 | else 462 | raise "unsupported type: #{ctype.inspect}" 463 | end 464 | end 465 | 466 | private def crtype_struct_or_union(name) 467 | if name == "__pid_t" 468 | p resolver.struct?(name) 469 | end 470 | 471 | if resolver.struct?(name) 472 | if name.starts_with?('_') 473 | # HACK: let's skip implementation detail 474 | return "Void" 475 | else 476 | requirements << name 477 | end 478 | elsif resolver.union?(name) 479 | requirements << name 480 | end 481 | nil 482 | end 483 | 484 | private def private_struct?(node : CrystalLib::StructOrUnion) 485 | #node.kind == :struct && (node.fields.empty? || node.fields.all?(&.name.starts_with?('_'))) 486 | node.kind == :struct && node.fields.empty? 487 | end 488 | 489 | def crvalue(value) 490 | if value.starts_with?('(') && value.ends_with?(')') 491 | value = value[1 .. -2] 492 | end 493 | 494 | # resolves constant value 495 | value = value.gsub(/\b_[A-Z0-9_]+/) do |m| 496 | if (node = nodes.find(&.name.==(m))).is_a?(CrystalLib::Define) 497 | node.value =~ /^[+-.xo\da-f()]+[ULF]*$/ ? node.value : m 498 | else 499 | m 500 | end 501 | end 502 | 503 | value = value 504 | .gsub(/\b0(\d+)/, "0o\\1") 505 | .gsub(/\b([+-.xo\da-fA-F]+)F\b/, "\\1_f32") 506 | .gsub(/\b([+-.xo\da-f]+)LL\b/i, "\\1_i64") 507 | .gsub(/\b([+-.xo\da-f]+)L\b/i, "\\1_i#{bits}") 508 | .gsub(/\b([+-.xo\da-f]+)LL\b/i, "\\1_u64") 509 | .gsub(/\b([+-.xo\da-f]+)ULL\b/i, "\\1_u64") 510 | .gsub(/\b([+-.xo\da-f]+)UL\b/i, "\\1_u#{bits}") 511 | .gsub(/\b([+-.xo\da-f]+)U\b/i, "\\1_u32") 512 | 513 | # execute stdint macros 514 | [8, 16, 32, 64].each do |n| 515 | value = value 516 | .sub(/_*UINT#{n}_C\((.+)\)/, "\\1_u#{n}") 517 | .sub(/_*INT#{n}_C\((.+)\)/, "\\1_i#{n}") 518 | end 519 | 520 | if value =~ /^\((?:const)?(.+?)\)([-x\da-f]+)$/ 521 | t, v = $1, $2 522 | 523 | if t.ends_with?("*") 524 | t = crname(t[0 .. -2]) 525 | t = "Pointer(#{resolver.resolve_public(t)})" 526 | else 527 | t = crname(resolver.resolve_public(t)) 528 | end 529 | 530 | value = "#{t}.new(#{v})" 531 | end 532 | 533 | if value =~ /^[A-Z][A-Z0-9_]+$/ 534 | "LibC::#{value}" 535 | else 536 | value 537 | end 538 | end 539 | 540 | # Extract long bit size from limits.h. 541 | # 542 | # This doesn't work on GNU libc which requires the compiler to define the 543 | # LONG_BIT, INT_MAX, ... constants. 544 | def bits 545 | @bits ||= begin 546 | if node = resolve_constant("LONG_BIT") 547 | return node.value.to_i 548 | else 549 | STDERR.puts "ERROR: impossible to determine LONG BIT size" 550 | exit 551 | end 552 | end 553 | end 554 | 555 | private def resolve_constant(name) 556 | node = nodes.find(&.name.==(name)) 557 | while node.is_a?(CrystalLib::Define) 558 | return node if node.value =~ /^\d+$/ 559 | node = nodes.find(&.name.==(node.value)) 560 | end 561 | end 562 | 563 | def header 564 | String.build do |str| 565 | # cygwin 566 | str << "#define __CYGWIN__ 1\n" 567 | 568 | # gnu 569 | str << "#define _GNU_SOURCE 1\n" 570 | str << "#define _GCC_LIMITS_H_ 1\n" 571 | #str << "#undef __x86_64__\n" unless bits == 64 # LFS (i686) 572 | 573 | # arm-gnueabihf | arm-androideabi 574 | if @arch.starts_with?("arm") 575 | #str << "#define __ARM_PCS_VFP 1\n" # hard-float 576 | str << "typedef unsigned long size_t;\n" 577 | end 578 | 579 | # aarch64-gnu 580 | #if @arch.starts_with?("aarch64") 581 | # str << "typedef unsigned long long size_t;\n" 582 | # str << "typedef int wchar_t;\n" 583 | #end 584 | 585 | # darwin 586 | str << "#define _DARWIN_NO_64_BIT_INODE\n" # FIXME: LFS 587 | str << "#define lint\n" # ntohs, ... 588 | 589 | #str << "#define _POSIX_C_SOURCE 200809L\n" 590 | #str << "#define _XOPEN_SOURCE 700\n" 591 | 592 | str << "#include \n" 593 | definition.includes { |h| str << "#include <#{h}.h>\n" } 594 | end 595 | end 596 | end 597 | end 598 | --------------------------------------------------------------------------------