summary refs log tree commit diff stats
path: root/lib/posix/termios.nim
blob: c08de73424422637df1feadd8d508ffb6ba0fa2f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#
#
#            Nim's Runtime Library
#        (c) Copyright 2015 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

{.deadCodeElim: on.}  # dce option deprecated
import posix

type
  Speed* = cuint
  Cflag* = cuint
{.deprecated: [Tcflag: Cflag].}

const
  NCCS* = when defined(macosx): 20 else: 32

when defined(linux) and defined(amd64):
  type
    Termios* {.importc: "struct termios", header: "<termios.h>".} = object
      c_iflag*: Cflag        # input mode flags
      c_oflag*: Cflag        # output mode flags
      c_cflag*: Cflag        # control mode flags
      c_lflag*: Cflag        # local mode flags
      c_line*: cuchar
      c_cc*: array[NCCS, cuchar]  # control characters
      c_ispeed*: Speed
      c_ospeed*: Speed
else:
  type
    Termios* {.importc: "struct termios", header: "<termios.h>".} = object
      c_iflag*: Cflag        # input mode flags
      c_oflag*: Cflag        # output mode flags
      c_cflag*: Cflag        # control mode flags
      c_lflag*: Cflag        # local mode flags
      c_cc*: array[NCCS, cuchar]  # control characters

# cc characters

var
  VINTR* {.importc, header: "<termios.h>".}: cint
  VQUIT* {.importc, header: "<termios.h>".}: cint
  VERASE* {.importc, header: "<termios.h>".}: cint
  VKILL* {.importc, header: "<termios.h>".}: cint
  VEOF* {.importc, header: "<termios.h>".}: cint
  VTIME* {.importc, header: "<termios.h>".}: cint
  VMIN* {.importc, header: "<termios.h>".}: cint
  VSTART* {.importc, header: "<termios.h>".}: cint
  VSTOP* {.importc, header: "<termios.h>".}: cint
  VSUSP* {.importc, header: "<termios.h>".}: cint
  VEOL* {.importc, header: "<termios.h>".}: cint

# iflag bits

var
  IGNBRK* {.importc, header: "<termios.h>".}: Cflag
  BRKINT* {.importc, header: "<termios.h>".}: Cflag
  IGNPAR* {.importc, header: "<termios.h>".}: Cflag
  PARMRK* {.importc, header: "<termios.h>".}: Cflag
  INPCK* {.importc, header: "<termios.h>".}: Cflag
  ISTRIP* {.importc, header: "<termios.h>".}: Cflag
  INLCR* {.importc, header: "<termios.h>".}: Cflag
  IGNCR* {.importc, header: "<termios.h>".}: Cflag
  ICRNL* {.importc, header: "<termios.h>".}: Cflag
  IUCLC* {.importc, header: "<termios.h>".}: Cflag
  IXON* {.importc, header: "<termios.h>".}: Cflag
  IXANY* {.importc, header: "<termios.h>".}: Cflag
  IXOFF* {.importc, header: "<termios.h>".}: Cflag

# oflag bits

var
  OPOST* {.importc, header: "<termios.h>".}: Cflag
  ONLCR* {.importc, header: "<termios.h>".}: Cflag
  OCRNL* {.importc, header: "<termios.h>".}: Cflag
  ONOCR* {.importc, header: "<termios.h>".}: Cflag
  ONLRET* {.importc, header: "<termios.h>".}: Cflag
  OFILL* {.importc, header: "<termios.h>".}: Cflag
  OFDEL* {.importc, header: "<termios.h>".}: Cflag
  NLDLY* {.importc, header: "<termios.h>".}: Cflag
  NL0* {.importc, header: "<termios.h>".}: Cflag
  NL1* {.importc, header: "<termios.h>".}: Cflag
  CRDLY* {.importc, header: "<termios.h>".}: Cflag
  CR0* {.importc, header: "<termios.h>".}: Cflag
  CR1* {.importc, header: "<termios.h>".}: Cflag
  CR2* {.importc, header: "<termios.h>".}: Cflag
  CR3* {.importc, header: "<termios.h>".}: Cflag
  TABDLY* {.importc, header: "<termios.h>".}: Cflag
  TAB0* {.importc, header: "<termios.h>".}: Cflag
  TAB1* {.importc, header: "<termios.h>".}: Cflag
  TAB2* {.importc, header: "<termios.h>".}: Cflag
  TAB3* {.importc, header: "<termios.h>".}: Cflag
  BSDLY* {.importc, header: "<termios.h>".}: Cflag
  BS0* {.importc, header: "<termios.h>".}: Cflag
  BS1* {.importc, header: "<termios.h>".}: Cflag
  FFDLY* {.importc, header: "<termios.h>".}: Cflag
  FF0* {.importc, header: "<termios.h>".}: Cflag
  FF1* {.importc, header: "<termios.h>".}: Cflag
  VTDLY* {.importc, header: "<termios.h>".}: Cflag
  VT0* {.importc, header: "<termios.h>".}: Cflag
  VT1* {.importc, header: "<termios.h>".}: Cflag

# cflag bit meaning

var
  B0* {.importc, header: "<termios.h>".}: Speed
  B50* {.importc, header: "<termios.h>".}: Speed
  B75* {.importc, header: "<termios.h>".}: Speed
  B110* {.importc, header: "<termios.h>".}: Speed
  B134* {.importc, header: "<termios.h>".}: Speed
  B150* {.importc, header: "<termios.h>".}: Speed
  B200* {.importc, header: "<termios.h>".}: Speed
  B300* {.importc, header: "<termios.h>".}: Speed
  B600* {.importc, header: "<termios.h>".}: Speed
  B1200* {.importc, header: "<termios.h>".}: Speed
  B1800* {.importc, header: "<termios.h>".}: Speed
  B2400* {.importc, header: "<termios.h>".}: Speed
  B4800* {.importc, header: "<termios.h>".}: Speed
  B9600* {.importc, header: "<termios.h>".}: Speed
  B19200* {.importc, header: "<termios.h>".}: Speed
  B38400* {.importc, header: "<termios.h>".}: Speed
  B57600* {.importc, header: "<termios.h>".}: Speed
  B115200* {.importc, header: "<termios.h>".}: Speed
  B230400* {.importc, header: "<termios.h>".}: Speed
  B460800* {.importc, header: "<termios.h>".}: Speed
  B500000* {.importc, header: "<termios.h>".}: Speed
  B576000* {.importc, header: "<termios.h>".}: Speed
  B921600* {.importc, header: "<termios.h>".}: Speed
  B1000000* {.importc, header: "<termios.h>".}: Speed
  B1152000* {.importc, header: "<termios.h>".}: Speed
  B1500000* {.importc, header: "<termios.h>".}: Speed
  B2000000* {.importc, header: "<termios.h>".}: Speed
  B2500000* {.importc, header: "<termios.h>".}: Speed
  B3000000* {.importc, header: "<termios.h>".}: Speed
  B3500000* {.importc, header: "<termios.h>".}: Speed
  B4000000* {.importc, header: "<termios.h>".}: Speed
  EXTA* {.importc, header: "<termios.h>".}: Speed
  EXTB* {.importc, header: "<termios.h>".}: Speed
  CSIZE* {.importc, header: "<termios.h>".}: Cflag
  CS5* {.importc, header: "<termios.h>".}: Cflag
  CS6* {.importc, header: "<termios.h>".}: Cflag
  CS7* {.importc, header: "<termios.h>".}: Cflag
  CS8* {.importc, header: "<termios.h>".}: Cflag
  CSTOPB* {.importc, header: "<termios.h>".}: Cflag
  CREAD* {.importc, header: "<termios.h>".}: Cflag
  PARENB* {.importc, header: "<termios.h>".}: Cflag
  PARODD* {.importc, header: "<termios.h>".}: Cflag
  HUPCL* {.importc, header: "<termios.h>".}: Cflag
  CLOCAL* {.importc, header: "<termios.h>".}: Cflag

# lflag bits

var
  ISIG* {.importc, header: "<termios.h>".}: Cflag
  ICANON* {.importc, header: "<termios.h>".}: Cflag
  ECHO* {.importc, header: "<termios.h>".}: Cflag
  ECHOE* {.importc, header: "<termios.h>".}: Cflag
  ECHOK* {.importc, header: "<termios.h>".}: Cflag
  ECHONL* {.importc, header: "<termios.h>".}: Cflag
  NOFLSH* {.importc, header: "<termios.h>".}: Cflag
  TOSTOP* {.importc, header: "<termios.h>".}: Cflag
  IEXTEN* {.importc, header: "<termios.h>".}: Cflag

# tcflow() and TCXONC use these

var
  TCOOFF* {.importc, header: "<termios.h>".}: cint
  TCOON* {.importc, header: "<termios.h>".}: cint
  TCIOFF* {.importc, header: "<termios.h>".}: cint
  TCION* {.importc, header: "<termios.h>".}: cint

# tcflush() and TCFLSH use these

var
  TCIFLUSH* {.importc, header: "<termios.h>".}: cint
  TCOFLUSH* {.importc, header: "<termios.h>".}: cint
  TCIOFLUSH* {.importc, header: "<termios.h>".}: cint

# tcsetattr uses these

var
  TCSANOW* {.importc, header: "<termios.h>".}: cint
  TCSADRAIN* {.importc, header: "<termios.h>".}: cint
  TCSAFLUSH* {.importc, header: "<termios.h>".}: cint

# Compare a character C to a value VAL from the `cc' array in a
#   `struct termios'.  If VAL is _POSIX_VDISABLE, no character can match it.

template cceq*(val, c): untyped =
  c == val and val != POSIX_VDISABLE

# Return the output baud rate stored in *TERMIOS_P.

proc cfGetOspeed*(termios: ptr Termios): Speed {.importc: "cfgetospeed",
    header: "<termios.h>".}
# Return the input baud rate stored in *TERMIOS_P.

proc cfGetIspeed*(termios: ptr Termios): Speed {.importc: "cfgetispeed",
    header: "<termios.h>".}
# Set the output baud rate stored in *TERMIOS_P to SPEED.

proc cfSetOspeed*(termios: ptr Termios; speed: Speed): cint {.
    importc: "cfsetospeed", header: "<termios.h>".}
# Set the input baud rate stored in *TERMIOS_P to SPEED.

proc cfSetIspeed*(termios: ptr Termios; speed: Speed): cint {.
    importc: "cfsetispeed", header: "<termios.h>".}
# Set both the input and output baud rates in *TERMIOS_OP to SPEED.

proc tcGetAttr*(fd: cint; termios: ptr Termios): cint {.
    importc: "tcgetattr", header: "<termios.h>".}
# Set the state of FD to *TERMIOS_P.
#   Values for OPTIONAL_ACTIONS (TCSA*) are in <bits/termios.h>.

proc tcSetAttr*(fd: cint; optional_actions: cint; termios: ptr Termios): cint {.
    importc: "tcsetattr", header: "<termios.h>".}
# Set *TERMIOS_P to indicate raw mode.

proc tcSendBreak*(fd: cint; duration: cint): cint {.importc: "tcsendbreak",
    header: "<termios.h>".}
# Wait for pending output to be written on FD.
#
#   This function is a cancellation point and therefore not marked with
#  .

proc tcDrain*(fd: cint): cint {.importc: "tcdrain", header: "<termios.h>".}
# Flush pending data on FD.
#   Values for QUEUE_SELECTOR (TC{I,O,IO}FLUSH) are in <bits/termios.h>.

proc tcFlush*(fd: cint; queue_selector: cint): cint {.importc: "tcflush",
    header: "<termios.h>".}
# Suspend or restart transmission on FD.
#   Values for ACTION (TC[IO]{OFF,ON}) are in <bits/termios.h>.

proc tcFlow*(fd: cint; action: cint): cint {.importc: "tcflow",
    header: "<termios.h>".}
# Get process group ID for session leader for controlling terminal FD.

# Window size ioctl.  Should work on on any Unix that xterm has been ported to.
var TIOCGWINSZ*{.importc, header: "<sys/ioctl.h>".}: culong

type IOctl_WinSize* = object
  ws_row*, ws_col*, ws_xpixel*, ws_ypixel*: cushort

proc ioctl*(fd: cint, request: culong, reply: ptr IOctl_WinSize): int {.
  importc: "ioctl", header: "<stdio.h>", varargs.}