123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- #+build linux, darwin, netbsd, openbsd, freebsd
- package posix
- import "core:c"
- when ODIN_OS == .Darwin {
- foreign import lib "system:System.framework"
- } else {
- foreign import lib "system:c"
- }
- // stdio.h - standard buffered input/output
- foreign lib {
- /*
- Generates a string that, when used as a pathname,
- refers to the current controlling terminal for the current process.
- If s is nil, the returned string might be static and overwritten by subsequent calls or other factors.
- If s is not nil, s is assumed len(s) >= L_ctermid.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctermid.html ]]
- */
- ctermid :: proc(s: [^]byte) -> cstring ---
- /*
- Equivalent to fprintf but output is written to the file descriptor.
- Return: number of bytes written, negative (setting errno) on failure
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/dprintf.html ]]
- */
- dprintf :: proc(fildse: FD, format: cstring, #c_vararg args: ..any) -> c.int ---
- /*
- Associate a stream with a file descriptor.
- Returns: nil (setting errno) on failure, the stream on success
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopen.html ]]
- */
- fdopen :: proc(fildes: FD, mode: cstring) -> ^FILE ---
- /*
- Map a stream pointer to a file descriptor.
- Returns: the file descriptor or -1 (setting errno) on failure
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/fileno.html ]]
- */
- fileno :: proc(stream: ^FILE) -> FD ---
- /*
- Locks a file.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/flockfile.html ]]
- */
- flockfile :: proc(file: ^FILE) ---
- /*
- Tries to lock a file.
-
- Returns: 0 if it could be locked, non-zero if it couldn't
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/flockfile.html ]]
- */
- ftrylockfile :: proc(file: ^FILE) -> c.int ---
- /*
- Unlocks a file.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/flockfile.html ]]
- */
- funlockfile :: proc(file: ^FILE) ---
- /*
- Open a memory buffer stream.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/fmemopen.html ]]
- */
- fmemopen :: proc(buf: [^]byte, size: c.size_t, mode: cstring) -> ^FILE ---
- /*
- Reposition a file-position indicator in a stream.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseeko.html ]]
- */
- fseeko :: proc(stream: ^FILE, offset: off_t, whence: Whence) -> result ---
- /*
- Return the file offset in a stream.
- Returns: the current file offset, -1 (setting errno) on error
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftello.html ]]
- */
- ftello :: proc(^FILE) -> off_t ---
- /*
- Open a dynamic memory buffer stream.
- Returns: nil (setting errno) on failure, the stream on success
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html ]]
- */
- open_memstream :: proc(bufp: ^[^]byte, sizep: ^c.size_t) -> ^FILE ---
- /*
- Read a delimited record from the stream.
- Returns: the number of bytes written or -1 on failure/EOF
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html ]]
- */
- getdelim :: proc(lineptr: ^cstring, n: ^c.size_t, delimiter: c.int, stream: ^FILE) -> c.ssize_t ---
- /*
- Read a line delimited record from the stream.
- Returns: the number of bytes written or -1 on failure/EOF
- Example:
- fp := posix.fopen(#file, "r")
- if fp == nil {
- posix.exit(1)
- }
- line: cstring
- length: uint
- for {
- read := posix.getline(&line, &length, fp)
- if read == -1 do break
- posix.printf("Retrieved line of length %zu :\n", read)
- posix.printf("%s", line)
- }
- if posix.ferror(fp) != 0 {
- /* handle error */
- }
- posix.free(rawptr(line))
- posix.fclose(fp)
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html ]]
- */
- getline :: proc(lineptr: ^cstring, n: ^c.size_t, stream: ^FILE) -> c.ssize_t ---
- /*
- Equivalent to rename but relative directories are resolved from their respective fds.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/renameat.html ]]
- */
- renameat :: proc(oldfd: FD, old: cstring, newfd: FD, new: cstring) -> result ---
- }
- when ODIN_OS == .Darwin {
- L_ctermid :: 1024
- L_tmpnam :: 1024
- P_tmpdir :: "/var/tmp/"
- } else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD {
- L_ctermid :: 1024
- L_tmpnam :: 1024
- P_tmpdir :: "/tmp/"
- } else when ODIN_OS == .Linux {
- L_ctermid :: 20 // 20 on musl, 9 on glibc
- L_tmpnam :: 20
- P_tmpdir :: "/tmp/"
- }
|