diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2024-02-12 16:43:51 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2024-02-12 16:43:51 -0700 |
| commit | 47643cc5cc4db4c0fb2aaa7f37cedb049fce7def (patch) | |
| tree | b1028914cc897c70278973d47239dfb41efb57c1 /lib/std | |
| parent | 0c88f927f161224f5c5ce2b12a76133a421af081 (diff) | |
| download | zig-47643cc5cc4db4c0fb2aaa7f37cedb049fce7def.tar.gz zig-47643cc5cc4db4c0fb2aaa7f37cedb049fce7def.zip | |
std.os.termios: add type safety to iflag field
This creates `tc_iflag_t` even though such a type is not defined by
libc.
I also collected the missing flag bits from all the operating systems.
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/c.zig | 120 | ||||
| -rw-r--r-- | lib/std/c/darwin.zig | 15 | ||||
| -rw-r--r-- | lib/std/c/netbsd.zig | 14 | ||||
| -rw-r--r-- | lib/std/c/openbsd.zig | 15 | ||||
| -rw-r--r-- | lib/std/os.zig | 8 | ||||
| -rw-r--r-- | lib/std/os/linux.zig | 61 |
6 files changed, 161 insertions, 72 deletions
diff --git a/lib/std/c.zig b/lib/std/c.zig index 9794e3560b..5a85d40b69 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -793,7 +793,7 @@ pub const NCCS = switch (native_os) { pub const termios = switch (native_os) { .linux => std.os.linux.termios, .macos, .ios, .tvos, .watchos => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, @@ -802,7 +802,7 @@ pub const termios = switch (native_os) { ospeed: speed_t, }, .freebsd, .kfreebsd, .netbsd, .dragonfly, .openbsd => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, @@ -811,7 +811,7 @@ pub const termios = switch (native_os) { ospeed: speed_t, }, .haiku => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, @@ -821,14 +821,14 @@ pub const termios = switch (native_os) { cc: [NCCS]cc_t, }, .solaris, .illumos => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, cc: [NCCS]cc_t, }, .emscripten, .wasi => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, @@ -840,6 +840,116 @@ pub const termios = switch (native_os) { else => @compileError("target libc does not have termios"), }; +pub const tc_iflag_t = switch (native_os) { + .linux => std.os.linux.tc_iflag_t, + .macos, .ios, .tvos, .watchos => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IXON: bool = false, + IXOFF: bool = false, + IXANY: bool = false, + _12: u1 = 0, + IMAXBEL: bool = false, + IUTF8: bool = false, + _: u17 = 0, + }, + .netbsd, .freebsd, .kfreebsd, .dragonfly => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IXON: bool = false, + IXOFF: bool = false, + IXANY: bool = false, + _12: u1 = 0, + IMAXBEL: bool = false, + _: u18 = 0, + }, + .openbsd => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IXON: bool = false, + IXOFF: bool = false, + IXANY: bool = false, + IUCLC: bool = false, + IMAXBEL: bool = false, + _: u18 = 0, + }, + .haiku => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IUCLC: bool = false, + IXON: bool = false, + IXANY: bool = false, + IXOFF: bool = false, + _: u19 = 0, + }, + .solaris, .illumos => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IUCLC: bool = false, + IXON: bool = false, + IXANY: bool = false, + _12: u1 = 0, + IMAXBEL: bool = false, + _14: u1 = 0, + DOSMODE: bool = false, + _: u16 = 0, + }, + .emscripten, .wasi => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IUCLC: bool = false, + IXON: bool = false, + IXANY: bool = false, + IXOFF: bool = false, + IMAXBEL: bool = false, + IUTF8: bool = false, + _: u17 = 0, + }, + else => @compileError("target libc does not have tc_iflag_t"), +}; + pub const tcflag_t = switch (native_os) { .linux => std.os.linux.tcflag_t, .macos, .ios, .tvos, .watchos => u64, diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index 715678de22..d9e456921e 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -2692,21 +2692,6 @@ pub const SHUT = struct { pub const RDWR = 2; }; -pub const IGNBRK: tcflag_t = 0x00000001; // ignore BREAK condition -pub const BRKINT: tcflag_t = 0x00000002; // map BREAK to SIGINTR -pub const IGNPAR: tcflag_t = 0x00000004; // ignore (discard) parity errors -pub const PARMRK: tcflag_t = 0x00000008; // mark parity and framing errors -pub const INPCK: tcflag_t = 0x00000010; // enable checking of parity errors -pub const ISTRIP: tcflag_t = 0x00000020; // strip 8th bit off chars -pub const INLCR: tcflag_t = 0x00000040; // map NL into CR -pub const IGNCR: tcflag_t = 0x00000080; // ignore CR -pub const ICRNL: tcflag_t = 0x00000100; // map CR to NL (ala CRMOD) -pub const IXON: tcflag_t = 0x00000200; // enable output flow control -pub const IXOFF: tcflag_t = 0x00000400; // enable input flow control -pub const IXANY: tcflag_t = 0x00000800; // any char will restart after stop -pub const IMAXBEL: tcflag_t = 0x00002000; // ring bell on input queue full -pub const IUTF8: tcflag_t = 0x00004000; // maintain state for UTF-8 VERASE - pub const OPOST: tcflag_t = 0x00000001; //enable following output processing pub const ONLCR: tcflag_t = 0x00000002; // map NL to CR-NL (ala CRMOD) pub const OXTABS: tcflag_t = 0x00000004; // expand tabs to spaces diff --git a/lib/std/c/netbsd.zig b/lib/std/c/netbsd.zig index 8f668beb63..cdb0564973 100644 --- a/lib/std/c/netbsd.zig +++ b/lib/std/c/netbsd.zig @@ -806,20 +806,6 @@ pub const T = struct { pub const IOCXMTFRAME = 0x80087444; }; -// Input flags - software input processing -pub const IGNBRK: tcflag_t = 0x00000001; // ignore BREAK condition -pub const BRKINT: tcflag_t = 0x00000002; // map BREAK to SIGINT -pub const IGNPAR: tcflag_t = 0x00000004; // ignore (discard) parity errors -pub const PARMRK: tcflag_t = 0x00000008; // mark parity and framing errors -pub const INPCK: tcflag_t = 0x00000010; // enable checking of parity errors -pub const ISTRIP: tcflag_t = 0x00000020; // strip 8th bit off chars -pub const INLCR: tcflag_t = 0x00000040; // map NL into CR -pub const IGNCR: tcflag_t = 0x00000080; // ignore CR -pub const ICRNL: tcflag_t = 0x00000100; // map CR to NL (ala CRMOD) -pub const IXON: tcflag_t = 0x00000200; // enable output flow control -pub const IXOFF: tcflag_t = 0x00000400; // enable input flow control -pub const IXANY: tcflag_t = 0x00000800; // any char will restart after stop -pub const IMAXBEL: tcflag_t = 0x00002000; // ring bell on input queue full // Output flags - software output processing pub const OPOST: tcflag_t = 0x00000001; // enable following output processing diff --git a/lib/std/c/openbsd.zig b/lib/std/c/openbsd.zig index a8dc6e615d..1a0d788fb3 100644 --- a/lib/std/c/openbsd.zig +++ b/lib/std/c/openbsd.zig @@ -768,21 +768,6 @@ pub const AUTH = struct { pub const ALLOW: c_int = (OKAY | ROOTOKAY | SECURE); }; -// Input flags - software input processing -pub const IGNBRK: tcflag_t = 0x00000001; // ignore BREAK condition -pub const BRKINT: tcflag_t = 0x00000002; // map BREAK to SIGINT -pub const IGNPAR: tcflag_t = 0x00000004; // ignore (discard) parity errors -pub const PARMRK: tcflag_t = 0x00000008; // mark parity and framing errors -pub const INPCK: tcflag_t = 0x00000010; // enable checking of parity errors -pub const ISTRIP: tcflag_t = 0x00000020; // strip 8th bit off chars -pub const INLCR: tcflag_t = 0x00000040; // map NL into CR -pub const IGNCR: tcflag_t = 0x00000080; // ignore CR -pub const ICRNL: tcflag_t = 0x00000100; // map CR to NL (ala CRMOD) -pub const IXON: tcflag_t = 0x00000200; // enable output flow control -pub const IXOFF: tcflag_t = 0x00000400; // enable input flow control -pub const IXANY: tcflag_t = 0x00000800; // any char will restart after stop -pub const IUCLC: tcflag_t = 0x00001000; // translate upper to lower case -pub const IMAXBEL: tcflag_t = 0x00002000; // ring bell on input queue full // Output flags - software output processing pub const OPOST: tcflag_t = 0x00000001; // enable following output processing diff --git a/lib/std/os.zig b/lib/std/os.zig index f686e867ff..de994e4f14 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -106,7 +106,6 @@ pub const MFD = system.MFD; pub const MMAP2_UNIT = system.MMAP2_UNIT; pub const MSG = system.MSG; pub const NAME_MAX = system.NAME_MAX; -pub const NCCS = system.NCCS; pub const O = system.O; pub const PATH_MAX = system.PATH_MAX; pub const POLL = system.POLL; @@ -173,9 +172,7 @@ pub const siginfo_t = system.siginfo_t; pub const sigset_t = system.sigset_t; pub const sockaddr = system.sockaddr; pub const socklen_t = system.socklen_t; -pub const speed_t = system.speed_t; pub const stack_t = system.stack_t; -pub const tcflag_t = system.tcflag_t; pub const termios = system.termios; pub const time_t = system.time_t; pub const timespec = system.timespec; @@ -187,6 +184,11 @@ pub const uid_t = system.uid_t; pub const user_desc = system.user_desc; pub const utsname = system.utsname; +pub const NCCS = system.NCCS; +pub const speed_t = system.speed_t; +pub const tcflag_t = system.tcflag_t; +pub const tc_iflag_t = system.tc_iflag_t; + pub const F_OK = system.F_OK; pub const R_OK = system.R_OK; pub const W_OK = system.W_OK; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index f2c3eaf3fd..2c3254bd06 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -5005,7 +5005,6 @@ pub const rusage = extern struct { }; pub const speed_t = u32; -pub const tcflag_t = u32; pub const NCCS = switch (native_arch) { .powerpc, .powerpcle, .powerpc64, .powerpc64le => 19, @@ -5045,23 +5044,43 @@ pub const B3000000 = 0o0010015; pub const B3500000 = 0o0010016; pub const B4000000 = 0o0010017; -pub const tc_iflag_t = packed struct(u32) { - IGNBRK: bool = false, - BRKINT: bool = false, - IGNPAR: bool = false, - PARMRK: bool = false, - INPCK: bool = false, - ISTRIP: bool = false, - INLCR: bool = false, - IGNCR: bool = false, - ICRNL: bool = false, - IUCLC: bool = false, - IXON: bool = false, - IXANY: bool = false, - IXOFF: bool = false, - IMAXBEL: bool = false, - IUTF8: bool = false, - _: u17 = 0, +pub const tc_iflag_t = switch (native_arch) { + .powerpc, .powerpcle, .powerpc64, .powerpc64le => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IXON: bool = false, + IXOFF: bool = false, + IXANY: bool = false, + IUCLC: bool = false, + IMAXBEL: bool = false, + IUTF8: bool = false, + _: u17 = 0, + }, + else => packed struct(u32) { + IGNBRK: bool = false, + BRKINT: bool = false, + IGNPAR: bool = false, + PARMRK: bool = false, + INPCK: bool = false, + ISTRIP: bool = false, + INLCR: bool = false, + IGNCR: bool = false, + ICRNL: bool = false, + IUCLC: bool = false, + IXON: bool = false, + IXANY: bool = false, + IXOFF: bool = false, + IMAXBEL: bool = false, + IUTF8: bool = false, + _: u17 = 0, + }, }; pub const cc_t = switch (native_arch) { @@ -5124,6 +5143,8 @@ pub const cc_t = switch (native_arch) { }, }; +pub const tcflag_t = u32; + pub const OPOST: tcflag_t = 1; pub const OLCUC: tcflag_t = 2; pub const ONLCR: tcflag_t = 4; @@ -5168,7 +5189,7 @@ pub const TCSA = enum(c_uint) { pub const termios = switch (native_arch) { .powerpc, .powerpcle, .powerpc64, .powerpc64le => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, @@ -5178,7 +5199,7 @@ pub const termios = switch (native_arch) { ospeed: speed_t, }, else => extern struct { - iflag: tcflag_t, + iflag: tc_iflag_t, oflag: tcflag_t, cflag: tcflag_t, lflag: tcflag_t, |
