MODULE entab;(*DEE 2014-01-20*) FROM ST IMPORT getc, putc; FROM STchars IMPORT BLANK, ENDFILE, NEWLINE, TAB, character; FROM Tabs IMPORT settabs, tabstops, tabpos; (* Replace blanks by tabs and blanks. *) PROCEDURE entab; VAR c: character; col, newcol: INTEGER; BEGIN settabs(tabstops); (* Set initial tab stops. *) col := 1; REPEAT newcol := col; WHILE (getc(c) = BLANK) DO INC(newcol); IF (tabpos(newcol, tabstops)) THEN putc(TAB); col := newcol END END; WHILE (col < newcol) DO putc(BLANK); (* Output leftover blanks. *) INC(col) END; IF (c # ENDFILE) THEN putc(c); IF (c = NEWLINE) THEN col := 1 ELSE INC(col) END END UNTIL (c = ENDFILE) END entab; BEGIN entab END entab. MODULE entab;(* David Egan Evans 2014-01-20/22 *) (* Software Tools in Pascal, exercises 2-2. *) FROM ST IMPORT getc, putc; FROM STchars IMPORT BACKSPACE, BLANK, ENDFILE, NEWLINE, TAB, character; FROM Tabs IMPORT settabs, tabstops, tabpos; (* Replace blanks by tabs and blanks. *) PROCEDURE entab; VAR c: character; col, newcol: INTEGER; BEGIN settabs(tabstops); (* Set initial tab stops. *) col := 1; REPEAT newcol := col; WHILE (getc(c) = BLANK) DO INC(newcol); IF (tabpos(newcol, tabstops)) THEN putc(TAB); col := newcol END END; IF (c = TAB) THEN col := newcol END; WHILE (col < newcol) DO putc(BLANK); (* Output leftover blanks. *) INC(col) END; IF (c # ENDFILE) THEN putc(c); IF (c = NEWLINE) THEN col := 1 ELSIF (c = BACKSPACE) THEN IF (col >= 2) THEN DEC(col) END ELSE INC(col) END END UNTIL (c = ENDFILE) END entab; BEGIN entab END entab.