| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- MODULE editor;
- (* based on the kilo editor building course*)
- (* Step 18 *)
- IMPORT FIO, SYSTEM, termios, STextIO, NumberIO;
- IMPORT CharClass, STextIO, libc;
- VAR
- c : CHAR;
- p : POINTER TO CHAR;
- thetermios : termios.TERMIOS;
- raw : termios.TERMIOS;
- result : INTEGER;
- number : CARDINAL;
- PROCEDURE die (s : ARRAY OF CHAR);
- BEGIN
- libc.perror(s);
- HALT
- END die;
- PROCEDURE disableRawMode(): INTEGER;
- VAR
- TCSAFLUSH : INTEGER;
- result : INTEGER;
-
- BEGIN
- TCSAFLUSH := termios.tcsflush ();
- IF termios.tcsetattr(FIO.StdIn, TCSAFLUSH, thetermios) = -1 THEN
- die("tcsetattr")
- END;
- RETURN result;
- END disableRawMode;
- PROCEDURE enableRawMode;
- (*
- static void setControlLines(int port, int dtr, int rts)
- {
- struct termios tty;
- tcgetattr(port, &tty);
- cfmakeraw(&tty); // Sets raw mode, 8N1, etc.
- tty.c_cflag &= ~CRTSCTS; // Disable hardware flow control
- tty.c_cflag |= CLOCAL; // Ignore modem control lines
- tcsetattr(port, TCSANOW, &tty);
- int flags = TIOCM_DTR | TIOCM_RTS;
- ioctl(port, TIOCMBIS, &flags); // Set bits
- } *)
- (* termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
- termios_p->c_oflag &= ~OPOST;
- termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
- termios_p->c_cflag &= ~(CSIZE|PARENB);
- termios_p->c_cflag |= CS8; *)
- VAR
- TCSAFLUSH : INTEGER;
- result : INTEGER;
- bresult : BOOLEAN;
- BEGIN
- TCSAFLUSH := termios.tcsflush ();
- libc.atexit(disableRawMode);
- termios.cfmakeraw(raw);
- bresult := termios.SetFlag(raw,termios.crtscts, FALSE);
- bresult := termios.SetFlag(raw,termios.clocal, TRUE);
- result := termios.tcsnow();
- (* STextIO.WriteChar(CHR(13)) *)
- bresult := termios.SetChar(raw,termios.vmin,CHR(0));
- bresult := termios.SetChar(raw,termios.vtime,CHR(1));
- END enableRawMode;
- BEGIN
- thetermios := termios.InitTermios();
- raw := termios.InitTermios();
- IF termios.tcgetattr(FIO.StdIn, thetermios) = -1 THEN
- die("tcgetattr")
- END;
- IF termios.tcgetattr(FIO.StdIn, raw) = -1 THEN
- die("tcgetattr")
- END;
- enableRawMode;
- p := SYSTEM.ADR(c);
- LOOP
- c := CHR(0);
- number := (FIO.ReadNBytes(FIO.StdIn,1,p));
- IF ORD(c) < 32 THEN
- NumberIO.WriteCard(ORD(c),5);
- STextIO.WriteLn;
- STextIO.WriteChar(CHR(13));
- ELSE
- NumberIO.WriteCard(ORD(c),5);
- STextIO.WriteString(" ('");
- STextIO.WriteChar(c);
- STextIO.WriteString(" ')");
- STextIO.WriteLn;
- STextIO.WriteChar(CHR(13));
- END;
- IF c = "q" THEN
- EXIT
- END;
- END;
- END editor.
|