[9] | 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-*)
|
---|
| 8 | IMPLEMENTATION 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 |
|
---|
| 110 | BEGIN
|
---|
| 111 | tty := "/dev/tty";
|
---|
| 112 | fildes := open(ADR(tty), 2);
|
---|
| 113 | unread := FALSE;
|
---|
| 114 | END Terminal.
|
---|