MODULE vis; (* DEE 2015-02-02/2015-12-07. *) (* Exercise 2-29 of Software Tools in Pascal. *) FROM ST IMPORT getc, putc; FROM STchars IMPORT BACKSPACE, BLANK, ESCAPE, ENDFILE, NEWLINE, TAB, character; FROM STstrings IMPORT putdec; FROM STutility IMPORT isalphanum, ispunct; CONST CR = 13; LF = 10; FF = 12; VT = 11; (* vis: make visible non-printable ASCII characters. *) (* Modeled after Edition 8 Unix vis; see The Unix Programming Environment. *) PROCEDURE vis; VAR c: character; BEGIN WHILE (getc(c) # ENDFILE) DO IF (c = BLANK) OR isalphanum(c) THEN putc(c) ELSIF (c = 127) THEN putc(ESCAPE); putdec(c, 1) ELSIF (c < 8) THEN putc(ESCAPE); putc(ORD('0')); putc(ORD('0')); putdec(c, 1) ELSIF (c = ESCAPE) THEN putc(ESCAPE); putc(ESCAPE) (* @ *) ELSIF ispunct(c) THEN putc(c) ELSIF (c = BACKSPACE) THEN putc(ESCAPE); putc(ORD('b')) ELSIF (c = TAB) THEN putc(ESCAPE); putc(ORD('t')) ELSIF (c = NEWLINE) THEN putc(ESCAPE); putc(ORD('n')); putc(NEWLINE) ELSIF (c = VT) THEN putc(ESCAPE); putc(ORD('v')) ELSIF (c = FF) THEN putc(ESCAPE); putc(ORD('f')) ELSIF (c = CR) THEN putc(ESCAPE); putc(ORD('r')) (*If it is not NEWLINE.*) ELSIF (c = LF) THEN putc(ESCAPE); putc(ORD('l')) (*If it is not NEWLINE.*) ELSIF (c < 32) THEN putc(ESCAPE); putc(ORD('0')); putdec(c, 1) END END END vis; BEGIN vis END vis.