summary refs log tree commit diff stats
path: root/lib/posix/termios.nim
blob: 44f029039370b309210f61d36457db797b64ea97 (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
250
251
252
253
254
255
256
257
258
259
260
261
262
#
#
#            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.}
import posix

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

const
  NCCS* = 32

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         # line discipline
    c_cc*: array[NCCS, cuchar]  # control characters

# cc characters

const
  VINTR* = 0
  VQUIT* = 1
  VERASE* = 2
  VKILL* = 3
  VEOF* = 4
  VTIME* = 5
  VMIN* = 6
  VSWTC* = 7
  VSTART* = 8
  VSTOP* = 9
  VSUSP* = 10
  VEOL* = 11
  VREPRINT* = 12
  VDISCARD* = 13
  VWERASE* = 14
  VLNEXT* = 15
  VEOL2* = 16

# iflag bits

const
  IGNBRK* = 1
  BRKINT* = 2
  IGNPAR* = 4
  PARMRK* = 10
  INPCK* = 20
  ISTRIP* = 40
  INLCR* = 100
  IGNCR* = 200
  ICRNL* = 400
  IUCLC* = 1000
  IXON* = 2000
  IXANY* = 4000
  IXOFF* = 10000
  IMAXBEL* = 20000
  IUTF8* = 40000

# oflag bits

const
  OPOST* = 1
  OLCUC* = 2
  ONLCR* = 4
  OCRNL* = 10
  ONOCR* = 20
  ONLRET* = 40
  OFILL* = 100
  OFDEL* = 200
  NLDLY* = 400
  NL0* = 0
  NL1* = 400
  CRDLY* = 3000
  CR0* = 0
  CR1* = 1000
  CR2* = 2000
  CR3* = 3000
  TABDLY* = 14000
  TAB0* = 0
  TAB1* = 4000
  TAB2* = 10000
  TAB3* = 14000
  BSDLY* = 20000
  BS0* = 0
  BS1* = 20000
  FFDLY* = 0o000000100000
  FF0* = 0
  FF1* = 0o000000100000
  VTDLY* = 40000
  VT0* = 0
  VT1* = 40000
  XTABS* = 14000

# cflag bit meaning

const
  CBAUD* = 10017
  B0* = 0
  B50* = 1
  B75* = 2
  B110* = 3
  B134* = 4
  B150* = 5
  B200* = 6
  B300* = 7
  B600* = 10
  B1200* = 11
  B1800* = 12
  B2400* = 13
  B4800* = 14
  B9600* = 15
  B19200* = 16
  B38400* = 17
  EXTA* = B19200
  EXTB* = B38400
  CSIZE* = 60
  CS5* = 0
  CS6* = 20
  CS7* = 40
  CS8* = 60
  CSTOPB* = 100
  CREAD* = 200
  PARENB* = 400
  PARODD* = 1000
  HUPCL* = 2000
  CLOCAL* = 4000
  CBAUDEX* = 10000
  B57600* = 10001
  B115200* = 10002
  B230400* = 10003
  B460800* = 10004
  B500000* = 10005
  B576000* = 10006
  B921600* = 10007
  B1000000* = 10010
  B1152000* = 10011
  B1500000* = 10012
  B2000000* = 10013
  B2500000* = 10014
  B3000000* = 10015
  B3500000* = 10016
  B4000000* = 10017
  MAX_BAUD* = B4000000
  CIBAUD* = 2003600000
  CMSPAR* = 0o010000000000
  CRTSCTS* = 0o020000000000

# lflag bits

const
  ISIG* = 1
  ICANON* = 2
  XCASE* = 4
  ECHO* = 10
  ECHOE* = 20
  ECHOK* = 40
  ECHONL* = 100
  NOFLSH* = 200
  TOSTOP* = 400
  ECHOCTL* = 1000
  ECHOPRT* = 2000
  ECHOKE* = 4000
  FLUSHO* = 10000
  PENDIN* = 40000
  IEXTEN* = 0o000000100000
  EXTPROC* = 0o000000200000

# tcflow() and TCXONC use these

const
  TCOOFF* = 0
  TCOON* = 1
  TCIOFF* = 2
  TCION* = 3

# tcflush() and TCFLSH use these

const
  TCIFLUSH* = 0
  TCOFLUSH* = 1
  TCIOFLUSH* = 2

# tcsetattr uses these

const
  TCSANOW* = 0
  TCSADRAIN* = 1
  TCSAFLUSH* = 2

# 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: expr): expr =
  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 cfSetSpeed*(termios: ptr Termios; speed: Speed): cint {.
    importc: "cfsetspeed", header: "<termios.h>".}
# Put the state of FD into *TERMIOS_P.

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 cfMakeRaw*(termios: ptr Termios) {.importc: "cfmakeraw",
    header: "<termios.h>".}
# Send zero bits on FD.

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.

proc tcGetSid*(fd: cint): Pid {.importc: "tcgetsid", header: "<termios.h>".}