source: trunk/minix/lib/ack/libm2/Terminal.mod@ 20

Last change on this file since 20 was 9, checked in by Mattia Monga, 14 years ago

Minix 3.1.2a

File size: 2.0 KB
Line 
1#
2(*
3 (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
4 See the copyright notice in the ACK home directory, in the file "Copyright".
5*)
6
7(*$R-*)
8IMPLEMENTATION MODULE Terminal;
9(*
10 Module: Input/Output to/from terminals
11 Author: Ceriel J.H. Jacobs
12 Version: $Header: /cvsup/minix/src/lib/ack/libm2/Terminal.mod,v 1.1 2005/10/10 15:27:46 beng Exp $
13
14 Implementation for Unix.
15*)
16 FROM SYSTEM IMPORT ADR;
17#ifdef __USG
18 FROM Unix IMPORT read, write, open, fcntl;
19#else
20 FROM Unix IMPORT read, write, open, ioctl;
21#endif
22 VAR fildes: INTEGER;
23 unreadch: CHAR;
24 unread: BOOLEAN;
25 tty: ARRAY[0..8] OF CHAR;
26
27 PROCEDURE Read(VAR ch: CHAR);
28 BEGIN
29 IF unread THEN
30 ch := unreadch;
31 unread := FALSE
32 ELSE
33 IF read(fildes, ADR(ch), 1) < 0 THEN
34 ;
35 END;
36 END;
37 unreadch := ch;
38 END Read;
39
40 PROCEDURE BusyRead(VAR ch: CHAR);
41 VAR l: INTEGER;
42 BEGIN
43 IF unread THEN
44 ch := unreadch;
45 unread := FALSE
46 ELSE
47#ifdef __USG
48 l := fcntl(fildes, (*FGETFL*) 3, 0);
49 IF fcntl(fildes,
50 (* FSETFL *) 4,
51 l + (*ONDELAY*) 2) < 0 THEN
52 ;
53 END;
54 IF read(fildes, ADR(ch), 1) = 0 THEN
55 ch := 0C;
56 ELSE
57 unreadch := ch;
58 END;
59 IF fcntl(fildes, (*FSETFL*)4, l) < 0 THEN
60 ;
61 END;
62#else
63#ifdef __BSD4_2
64 IF ioctl(fildes, INTEGER(ORD('f')*256+127+4*65536+40000000H), ADR(l)) < 0 THEN
65#else
66 IF ioctl(fildes, INTEGER(ORD('f')*256+127), ADR(l)) < 0 THEN
67#endif
68 ;
69 END;
70
71 IF l = 0 THEN
72 ch := 0C;
73 ELSE
74 IF read(fildes, ADR(ch), 1) < 0 THEN
75 ;
76 END;
77 unreadch := ch;
78 END;
79#endif
80 END;
81 END BusyRead;
82
83 PROCEDURE ReadAgain;
84 BEGIN
85 unread := TRUE;
86 END ReadAgain;
87
88 PROCEDURE Write(ch: CHAR);
89 BEGIN
90 IF write(fildes, ADR(ch), 1) < 0 THEN
91 ;
92 END;
93 END Write;
94
95 PROCEDURE WriteLn;
96 BEGIN
97 Write(12C);
98 END WriteLn;
99
100 PROCEDURE WriteString(s: ARRAY OF CHAR);
101 VAR i: CARDINAL;
102 BEGIN
103 i := 0;
104 WHILE (i <= HIGH(s)) & (s[i] # 0C) DO
105 Write(s[i]);
106 INC(i)
107 END
108 END WriteString;
109
110BEGIN
111 tty := "/dev/tty";
112 fildes := open(ADR(tty), 2);
113 unread := FALSE;
114END Terminal.
Note: See TracBrowser for help on using the repository browser.