]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/m2/mc-boot-ch/Gtermios.cc
1 /* Gtermios.c handwritten module for mc.
3 Copyright (C) 2010-2023 Free Software Foundation, Inc.
4 Contributed by Gaius Mulley <gaius@glam.ac.uk>.
6 This file is part of GNU Modula-2.
8 GNU Modula-2 is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GNU Modula-2 is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Modula-2; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
25 #include "gm2-libs-host.h"
31 #ifdef TERMIOS_NEEDS_XOPEN_SOURCE
35 #if defined(__cplusplus)
36 #define EXTERN extern "C"
41 #define EXPORT(X) termios##_##X
64 /* input flag bits. */
79 /* output flag bits. */
138 /* character size. */
168 doSetUnset (tcflag_t
*bitset
, unsigned int mask
, int value
)
173 (*bitset
) &= (~mask
);
182 /* InitTermios - new data structure. */
185 EXPORT (InitTermios
) (void)
187 struct termios
*p
= (struct termios
*)malloc (sizeof (struct termios
));
189 memset (p
, 0, sizeof (struct termios
));
193 /* KillTermios - delete data structure. */
196 EXPORT (KillTermios
) (struct termios
*p
)
202 /* tcsnow - return the value of TCSANOW. */
205 EXPORT (tcsnow
) (void)
210 /* tcsdrain - return the value of TCSADRAIN. */
213 EXPORT (tcsdrain
) (void)
218 /* tcsflush - return the value of TCSAFLUSH. */
221 EXPORT (tcsflush
) (void)
226 /* cfgetospeed - return output baud rate. */
229 EXPORT (cfgetospeed
) (struct termios
*t
)
231 return cfgetospeed (t
);
234 /* cfgetispeed - return input baud rate. */
237 EXPORT (cfgetispeed
) (struct termios
*t
)
239 return cfgetispeed (t
);
242 /* cfsetospeed - set output baud rate. */
245 EXPORT (cfsetospeed
) (struct termios
*t
, unsigned int b
)
247 return cfsetospeed (t
, b
);
250 /* cfsetispeed - set input baud rate. */
253 EXPORT (cfsetispeed
) (struct termios
*t
, unsigned int b
)
255 return cfsetispeed (t
, b
);
258 /* cfsetspeed - set input and output baud rate. */
261 EXPORT (cfsetspeed
) (struct termios
*t
, unsigned int b
)
263 int val
= cfsetispeed (t
, b
);
265 return cfsetospeed (t
, b
);
270 /* tcgetattr - get state of, fd, into, t. */
273 EXPORT (tcgetattr
) (int fd
, struct termios
*t
)
275 return tcgetattr (fd
, t
);
278 /* tcsetattr - set state of, fd, to, t, using option. */
281 EXPORT (tcsetattr
) (int fd
, int option
, struct termios
*t
)
283 return tcsetattr (fd
, option
, t
);
286 /* cfmakeraw - sets the terminal to raw mode. */
289 EXPORT (cfmakeraw
) (struct termios
*t
)
291 #if defined(HAVE_CFMAKERAW)
292 return cfmakeraw (t
);
296 /* tcsendbreak - send zero bits for duration. */
299 EXPORT (tcsendbreak
) (int fd
, int duration
)
301 return tcsendbreak (fd
, duration
);
304 /* tcdrain - waits for pending output to be written on, fd. */
307 EXPORT (tcdrain
) (int fd
)
312 /* tcflushi - flush input. */
315 EXPORT (tcflushi
) (int fd
)
317 #if defined(TCIFLUSH)
318 return tcflush (fd
, TCIFLUSH
);
324 /* tcflusho - flush output. */
327 EXPORT (tcflusho
) (int fd
)
329 #if defined(TCOFLUSH)
330 return tcflush (fd
, TCOFLUSH
);
336 /* tcflushio - flush input and output. */
339 EXPORT (tcflushio
) (int fd
)
341 #if defined(TCIOFLUSH)
342 return tcflush (fd
, TCIOFLUSH
);
348 /* tcflowoni - restart input on, fd. */
351 EXPORT (tcflowoni
) (int fd
)
354 return tcflow (fd
, TCION
);
360 /* tcflowoffi - stop input on, fd. */
363 EXPORT (tcflowoffi
) (int fd
)
366 return tcflow (fd
, TCIOFF
);
372 /* tcflowono - restart output on, fd. */
375 EXPORT (tcflowono
) (int fd
)
378 return tcflow (fd
, TCOON
);
384 /* tcflowoffo - stop output on, fd. */
387 EXPORT (tcflowoffo
) (int fd
)
390 return tcflow (fd
, TCOOFF
);
396 /* GetFlag - sets a flag value from, t, in, b, and returns TRUE if,
400 EXPORT (GetFlag
) (struct termios
*t
, Flag f
, int *b
)
407 *b
= ((t
->c_iflag
& IGNBRK
) == IGNBRK
);
414 *b
= ((t
->c_iflag
& BRKINT
) == BRKINT
);
421 *b
= ((t
->c_iflag
& IGNPAR
) == IGNPAR
);
428 *b
= ((t
->c_iflag
& PARMRK
) == PARMRK
);
435 *b
= ((t
->c_iflag
& INPCK
) == INPCK
);
442 *b
= ((t
->c_iflag
& ISTRIP
) == ISTRIP
);
449 *b
= ((t
->c_iflag
& INLCR
) == INLCR
);
456 *b
= ((t
->c_iflag
& IGNCR
) == IGNCR
);
463 *b
= ((t
->c_iflag
& ICRNL
) == ICRNL
);
470 *b
= ((t
->c_iflag
& IUCLC
) == IUCLC
);
477 *b
= ((t
->c_iflag
& IXON
) == IXON
);
484 *b
= ((t
->c_iflag
& IXANY
) == IXANY
);
491 *b
= ((t
->c_iflag
& IXOFF
) == IXOFF
);
498 *b
= ((t
->c_iflag
& IMAXBEL
) == IMAXBEL
);
505 *b
= ((t
->c_oflag
& OPOST
) == OPOST
);
512 *b
= ((t
->c_oflag
& OLCUC
) == OLCUC
);
519 *b
= ((t
->c_oflag
& ONLCR
) == ONLCR
);
526 *b
= ((t
->c_oflag
& OCRNL
) == OCRNL
);
533 *b
= ((t
->c_oflag
& ONOCR
) == ONOCR
);
540 *b
= ((t
->c_oflag
& ONLRET
) == ONLRET
);
547 *b
= ((t
->c_oflag
& OFILL
) == OFILL
);
554 *b
= ((t
->c_oflag
& OFDEL
) == OFDEL
);
561 *b
= ((t
->c_oflag
& NL0
) == NL0
);
568 *b
= ((t
->c_oflag
& NL1
) == NL1
);
575 *b
= ((t
->c_oflag
& CR0
) == CR0
);
582 *b
= ((t
->c_oflag
& CR1
) == CR1
);
589 *b
= ((t
->c_oflag
& CR2
) == CR2
);
596 *b
= ((t
->c_oflag
& CR3
) == CR3
);
603 *b
= ((t
->c_oflag
& TAB0
) == TAB0
);
610 *b
= ((t
->c_oflag
& TAB1
) == TAB1
);
617 *b
= ((t
->c_oflag
& TAB2
) == TAB2
);
624 *b
= ((t
->c_oflag
& TAB3
) == TAB3
);
631 *b
= ((t
->c_oflag
& BS0
) == BS0
);
638 *b
= ((t
->c_oflag
& BS1
) == BS1
);
645 *b
= ((t
->c_oflag
& FF0
) == FF0
);
652 *b
= ((t
->c_oflag
& FF1
) == FF1
);
659 *b
= ((t
->c_oflag
& VT0
) == VT0
);
666 *b
= ((t
->c_oflag
& VT1
) == VT1
);
673 *b
= ((t
->c_cflag
& B0
) == B0
);
680 *b
= ((t
->c_cflag
& B50
) == B50
);
687 *b
= ((t
->c_cflag
& B75
) == B75
);
694 *b
= ((t
->c_cflag
& B110
) == B110
);
701 *b
= ((t
->c_cflag
& B134
) == B134
);
708 *b
= ((t
->c_cflag
& B150
) == B150
);
715 *b
= ((t
->c_cflag
& B200
) == B200
);
722 *b
= ((t
->c_cflag
& B300
) == B300
);
729 *b
= ((t
->c_cflag
& B600
) == B600
);
736 *b
= ((t
->c_cflag
& B1200
) == B1200
);
743 *b
= ((t
->c_cflag
& B1800
) == B1800
);
750 *b
= ((t
->c_cflag
& B2400
) == B2400
);
757 *b
= ((t
->c_cflag
& B4800
) == B4800
);
764 *b
= ((t
->c_cflag
& B9600
) == B9600
);
771 *b
= ((t
->c_cflag
& B19200
) == B19200
);
778 *b
= ((t
->c_cflag
& B38400
) == B38400
);
785 *b
= ((t
->c_cflag
& B57600
) == B57600
);
792 *b
= ((t
->c_cflag
& B115200
) == B115200
);
799 *b
= ((t
->c_cflag
& B230400
) == B230400
);
806 *b
= ((t
->c_cflag
& B460800
) == B460800
);
813 *b
= ((t
->c_cflag
& B500000
) == B500000
);
820 *b
= ((t
->c_cflag
& B576000
) == B576000
);
827 *b
= ((t
->c_cflag
& B921600
) == B921600
);
833 #if defined(B1000000)
834 *b
= ((t
->c_cflag
& B1000000
) == B1000000
);
840 #if defined(B1152000)
841 *b
= ((t
->c_cflag
& B1152000
) == B1152000
);
847 #if defined(B1500000)
848 *b
= ((t
->c_cflag
& B1500000
) == B1500000
);
854 #if defined(B2000000)
855 *b
= ((t
->c_cflag
& B2000000
) == B2000000
);
861 #if defined(B2500000)
862 *b
= ((t
->c_cflag
& B2500000
) == B2500000
);
868 #if defined(B3000000)
869 *b
= ((t
->c_cflag
& B3000000
) == B3000000
);
875 #if defined(B3500000)
876 *b
= ((t
->c_cflag
& B3500000
) == B3500000
);
882 #if defined(B4000000)
883 *b
= ((t
->c_cflag
& B4000000
) == B4000000
);
889 #if defined(__MAX_BAUD)
890 *b
= ((t
->c_cflag
& __MAX_BAUD
) == __MAX_BAUD
);
897 *b
= ((t
->c_cflag
& CRTSCTS
) == CRTSCTS
);
904 *b
= ((t
->c_cflag
& CS5
) == CS5
);
911 *b
= ((t
->c_cflag
& CS6
) == CS6
);
918 *b
= ((t
->c_cflag
& CS7
) == CS7
);
925 *b
= ((t
->c_cflag
& CS8
) == CS8
);
932 *b
= ((t
->c_cflag
& CSTOPB
) == CSTOPB
);
939 *b
= ((t
->c_cflag
& CREAD
) == CREAD
);
946 *b
= ((t
->c_cflag
& PARENB
) == PARENB
);
953 *b
= ((t
->c_cflag
& PARODD
) == PARODD
);
960 *b
= ((t
->c_cflag
& HUPCL
) == HUPCL
);
967 *b
= ((t
->c_cflag
& CLOCAL
) == CLOCAL
);
974 *b
= ((t
->c_lflag
& ISIG
) == ISIG
);
981 *b
= ((t
->c_lflag
& ICANON
) == ICANON
);
988 *b
= ((t
->c_lflag
& XCASE
) == XCASE
);
995 *b
= ((t
->c_lflag
& ECHO
) == ECHO
);
1002 *b
= ((t
->c_lflag
& ECHOE
) == ECHOE
);
1009 *b
= ((t
->c_lflag
& ECHOK
) == ECHOK
);
1016 *b
= ((t
->c_lflag
& ECHONL
) == ECHONL
);
1023 *b
= ((t
->c_lflag
& NOFLSH
) == NOFLSH
);
1030 *b
= ((t
->c_lflag
& TOSTOP
) == TOSTOP
);
1036 #if defined(ECHOCTL)
1037 *b
= ((t
->c_lflag
& ECHOCTL
) == ECHOCTL
);
1043 #if defined(ECHOPRT)
1044 *b
= ((t
->c_lflag
& ECHOPRT
) == ECHOPRT
);
1051 *b
= ((t
->c_lflag
& ECHOKE
) == ECHOKE
);
1058 *b
= ((t
->c_lflag
& FLUSHO
) == FLUSHO
);
1065 *b
= ((t
->c_lflag
& PENDIN
) == PENDIN
);
1072 *b
= ((t
->c_lflag
& IEXTEN
) == IEXTEN
);
1081 /* SetFlag - sets a flag value in, t, to, b, and returns TRUE if this
1082 flag value is supported. */
1085 EXPORT (SetFlag
) (struct termios
*t
, Flag f
, int b
)
1091 return doSetUnset (&t
->c_iflag
, IGNBRK
, b
);
1097 return doSetUnset (&t
->c_iflag
, BRKINT
, b
);
1103 return doSetUnset (&t
->c_iflag
, IGNPAR
, b
);
1109 return doSetUnset (&t
->c_iflag
, PARMRK
, b
);
1115 return doSetUnset (&t
->c_iflag
, INPCK
, b
);
1121 return doSetUnset (&t
->c_iflag
, ISTRIP
, b
);
1127 return doSetUnset (&t
->c_iflag
, INLCR
, b
);
1133 return doSetUnset (&t
->c_iflag
, IGNCR
, b
);
1139 return doSetUnset (&t
->c_iflag
, ICRNL
, b
);
1145 return doSetUnset (&t
->c_iflag
, IUCLC
, b
);
1151 return doSetUnset (&t
->c_iflag
, IXON
, b
);
1157 return doSetUnset (&t
->c_iflag
, IXANY
, b
);
1163 return doSetUnset (&t
->c_iflag
, IXOFF
, b
);
1168 #if defined(IMAXBEL)
1169 return doSetUnset (&t
->c_iflag
, IMAXBEL
, b
);
1175 return doSetUnset (&t
->c_oflag
, OPOST
, b
);
1181 return doSetUnset (&t
->c_oflag
, OLCUC
, b
);
1187 return doSetUnset (&t
->c_oflag
, ONLCR
, b
);
1193 return doSetUnset (&t
->c_oflag
, OCRNL
, b
);
1199 return doSetUnset (&t
->c_oflag
, ONOCR
, b
);
1205 return doSetUnset (&t
->c_oflag
, ONLRET
, b
);
1211 return doSetUnset (&t
->c_oflag
, OFILL
, b
);
1217 return doSetUnset (&t
->c_oflag
, OFDEL
, b
);
1223 return doSetUnset (&t
->c_oflag
, NL0
, b
);
1229 return doSetUnset (&t
->c_oflag
, NL1
, b
);
1235 return doSetUnset (&t
->c_oflag
, CR0
, b
);
1241 return doSetUnset (&t
->c_oflag
, CR1
, b
);
1247 return doSetUnset (&t
->c_oflag
, CR2
, b
);
1253 return doSetUnset (&t
->c_oflag
, CR3
, b
);
1259 return doSetUnset (&t
->c_oflag
, TAB0
, b
);
1265 return doSetUnset (&t
->c_oflag
, TAB1
, b
);
1271 return doSetUnset (&t
->c_oflag
, TAB2
, b
);
1277 return doSetUnset (&t
->c_oflag
, TAB3
, b
);
1283 return doSetUnset (&t
->c_oflag
, BS0
, b
);
1289 return doSetUnset (&t
->c_oflag
, BS1
, b
);
1295 return doSetUnset (&t
->c_oflag
, FF0
, b
);
1301 return doSetUnset (&t
->c_oflag
, FF1
, b
);
1307 return doSetUnset (&t
->c_oflag
, VT0
, b
);
1313 return doSetUnset (&t
->c_oflag
, VT1
, b
);
1319 return doSetUnset (&t
->c_cflag
, B0
, b
);
1325 return doSetUnset (&t
->c_cflag
, B50
, b
);
1331 return doSetUnset (&t
->c_cflag
, B75
, b
);
1337 return doSetUnset (&t
->c_cflag
, B110
, b
);
1343 return doSetUnset (&t
->c_cflag
, B134
, b
);
1349 return doSetUnset (&t
->c_cflag
, B150
, b
);
1355 return doSetUnset (&t
->c_cflag
, B200
, b
);
1361 return doSetUnset (&t
->c_cflag
, B300
, b
);
1367 return doSetUnset (&t
->c_cflag
, B600
, b
);
1373 return doSetUnset (&t
->c_cflag
, B1200
, b
);
1379 return doSetUnset (&t
->c_cflag
, B1800
, b
);
1385 return doSetUnset (&t
->c_cflag
, B2400
, b
);
1391 return doSetUnset (&t
->c_cflag
, B4800
, b
);
1397 return doSetUnset (&t
->c_cflag
, B9600
, b
);
1403 return doSetUnset (&t
->c_cflag
, B19200
, b
);
1409 return doSetUnset (&t
->c_cflag
, B38400
, b
);
1415 return doSetUnset (&t
->c_cflag
, B57600
, b
);
1420 #if defined(B115200)
1421 return doSetUnset (&t
->c_cflag
, B115200
, b
);
1426 #if defined(B230400)
1427 return doSetUnset (&t
->c_cflag
, B230400
, b
);
1432 #if defined(B460800)
1433 return doSetUnset (&t
->c_cflag
, B460800
, b
);
1438 #if defined(B500000)
1439 return doSetUnset (&t
->c_cflag
, B500000
, b
);
1444 #if defined(B576000)
1445 return doSetUnset (&t
->c_cflag
, B576000
, b
);
1450 #if defined(B921600)
1451 return doSetUnset (&t
->c_cflag
, B921600
, b
);
1456 #if defined(B1000000)
1457 return doSetUnset (&t
->c_cflag
, B1000000
, b
);
1462 #if defined(B1152000)
1463 return doSetUnset (&t
->c_cflag
, B1152000
, b
);
1468 #if defined(B1500000)
1469 return doSetUnset (&t
->c_cflag
, B1500000
, b
);
1474 #if defined(B2000000)
1475 return doSetUnset (&t
->c_cflag
, B2000000
, b
);
1480 #if defined(B2500000)
1481 return doSetUnset (&t
->c_cflag
, B2500000
, b
);
1486 #if defined(B3000000)
1487 return doSetUnset (&t
->c_cflag
, B3000000
, b
);
1492 #if defined(B3500000)
1493 return doSetUnset (&t
->c_cflag
, B3500000
, b
);
1498 #if defined(B4000000)
1499 return doSetUnset (&t
->c_cflag
, B4000000
, b
);
1504 #if defined(__MAX_BAUD)
1505 return doSetUnset (&t
->c_cflag
, __MAX_BAUD
, b
);
1510 #if defined(CRTSCTS)
1511 return doSetUnset (&t
->c_cflag
, CRTSCTS
, b
);
1517 return doSetUnset (&t
->c_cflag
, CS5
, b
);
1523 return doSetUnset (&t
->c_cflag
, CS6
, b
);
1529 return doSetUnset (&t
->c_cflag
, CS7
, b
);
1535 return doSetUnset (&t
->c_cflag
, CS8
, b
);
1541 return doSetUnset (&t
->c_cflag
, CSTOPB
, b
);
1547 return doSetUnset (&t
->c_cflag
, CREAD
, b
);
1553 return doSetUnset (&t
->c_cflag
, PARENB
, b
);
1559 return doSetUnset (&t
->c_cflag
, PARODD
, b
);
1565 return doSetUnset (&t
->c_cflag
, HUPCL
, b
);
1571 return doSetUnset (&t
->c_cflag
, CLOCAL
, b
);
1577 return doSetUnset (&t
->c_lflag
, ISIG
, b
);
1583 return doSetUnset (&t
->c_lflag
, ICANON
, b
);
1589 return doSetUnset (&t
->c_lflag
, XCASE
, b
);
1595 return doSetUnset (&t
->c_lflag
, ECHO
, b
);
1601 return doSetUnset (&t
->c_lflag
, ECHOE
, b
);
1607 return doSetUnset (&t
->c_lflag
, ECHOK
, b
);
1613 return doSetUnset (&t
->c_lflag
, ECHONL
, b
);
1619 return doSetUnset (&t
->c_lflag
, NOFLSH
, b
);
1625 return doSetUnset (&t
->c_lflag
, TOSTOP
, b
);
1630 #if defined(ECHOCTL)
1631 return doSetUnset (&t
->c_lflag
, ECHOCTL
, b
);
1636 #if defined(ECHOPRT)
1637 return doSetUnset (&t
->c_lflag
, ECHOPRT
, b
);
1643 return doSetUnset (&t
->c_lflag
, ECHOKE
, b
);
1649 return doSetUnset (&t
->c_lflag
, FLUSHO
, b
);
1655 return doSetUnset (&t
->c_lflag
, PENDIN
, b
);
1661 return doSetUnset (&t
->c_lflag
, IEXTEN
, b
);
1669 /* GetChar - sets a CHAR, ch, value from, t, and returns TRUE if this
1670 value is supported. */
1673 EXPORT (GetChar
) (struct termios
*t
, ControlChar c
, char *ch
)
1680 *ch
= t
->c_cc
[VINTR
];
1687 *ch
= t
->c_cc
[VQUIT
];
1694 *ch
= t
->c_cc
[VERASE
];
1701 *ch
= t
->c_cc
[VKILL
];
1708 *ch
= t
->c_cc
[VEOF
];
1715 *ch
= t
->c_cc
[VTIME
];
1722 *ch
= t
->c_cc
[VMIN
];
1729 *ch
= t
->c_cc
[VSWTC
];
1736 *ch
= t
->c_cc
[VSTART
];
1743 *ch
= t
->c_cc
[VSTOP
];
1750 *ch
= t
->c_cc
[VSUSP
];
1757 *ch
= t
->c_cc
[VEOL
];
1763 #if defined(VREPRINT)
1764 *ch
= t
->c_cc
[VREPRINT
];
1770 #if defined(VDISCARD)
1771 *ch
= t
->c_cc
[VDISCARD
];
1777 #if defined(VWERASE)
1778 *ch
= t
->c_cc
[VWERASE
];
1785 *ch
= t
->c_cc
[VLNEXT
];
1792 *ch
= t
->c_cc
[VEOL2
];
1802 /* SetChar - sets a CHAR value in, t, and returns TRUE if, c, is
1806 EXPORT (SetChar
) (struct termios
*t
, ControlChar c
, char ch
)
1813 t
->c_cc
[VINTR
] = ch
;
1820 t
->c_cc
[VQUIT
] = ch
;
1827 t
->c_cc
[VERASE
] = ch
;
1834 t
->c_cc
[VKILL
] = ch
;
1848 t
->c_cc
[VTIME
] = ch
;
1862 t
->c_cc
[VSWTC
] = ch
;
1869 t
->c_cc
[VSTART
] = ch
;
1876 t
->c_cc
[VSTOP
] = ch
;
1883 t
->c_cc
[VSUSP
] = ch
;
1896 #if defined(VREPRINT)
1897 t
->c_cc
[VREPRINT
] = ch
;
1903 #if defined(VDISCARD)
1904 t
->c_cc
[VDISCARD
] = ch
;
1910 #if defined(VWERASE)
1911 t
->c_cc
[VWERASE
] = ch
;
1918 t
->c_cc
[VLNEXT
] = ch
;
1925 t
->c_cc
[VEOL2
] = ch
;
1936 _M2_termios_init (void)
1941 _M2_termios_finish (void)