MODULE detab; (*DEE 2014-01-20*) FROM ST IMPORT getc, putc; FROM STchars IMPORT character, BACKSPACE, BLANK, ENDFILE, NEWLINE, TAB; FROM Tabs IMPORT tabpos, tabstops, settabs; (* detab: convert tabs to equivalent number of blanks. *) PROCEDURE detab; VAR c: character; col: INTEGER; BEGIN settabs(tabstops); (* Set initial tab stops. *) col := 1; WHILE (getc(c) # ENDFILE) DO IF (c = TAB) THEN REPEAT putc(BLANK); INC(col) UNTIL (tabpos(col, tabstops)) ELSIF (c = NEWLINE) THEN putc(NEWLINE); col := 1 ELSE putc(c); INC(col) END; END END detab; BEGIN detab END detab. MODULE detab; (*DEE 2014-01-20/2015-11-30*) FROM ST IMPORT getc, putc; FROM STchars IMPORT character, BACKSPACE, BLANK, ENDFILE, NEWLINE, TAB; FROM Tabs IMPORT tabpos, tabstops, settabs; (* detab: convert tabs to equivalent number of blanks. *) (* Exercise 1-6 of Software Tools in Pascal. *) PROCEDURE detab; VAR c: character; col: INTEGER; BEGIN settabs(tabstops); (* Set initial tab stops. *) col := 1; WHILE (getc(c) # ENDFILE) DO IF (c = TAB) THEN REPEAT putc(BLANK); INC(col) UNTIL (tabpos(col, tabstops)) ELSIF (c = NEWLINE) THEN putc(NEWLINE); col := 1 ELSIF (c = BACKSPACE) THEN putc(c); IF (col >= 1) THEN DEC(col) END ELSE putc(c); INC(col) END; END END detab; BEGIN detab END detab. MODULE detab; (*DEE 2014-01-20/2015-11-30/2020-05-03*) (* Software Tools in Pascal, exercise 1-6. *) FROM STextIO IMPORT ReadChar, SkipLine, WriteChar, WriteLn; FROM SIOResult IMPORT ReadResult, ReadResults; FROM Tabs IMPORT MAXLINE, settabs, tabpos, tabtype, tabstops; (* detab: convert tabs to equivalent number of blanks. *) PROCEDURE detab; CONST BACKSPACE = 10C; BLANK = 40C; TAB = 11C; VAR c: CHAR; col: INTEGER; BEGIN settabs(tabstops); (* Set initial tab stops. *) col := 1; ReadChar(c); WHILE ReadResult() # endOfInput DO IF (c = TAB) THEN REPEAT WriteChar(BLANK); INC(col) UNTIL (tabpos(col, tabstops)) ELSIF ReadResult() = endOfLine THEN SkipLine; WriteLn; col := 1 ELSIF (c = BACKSPACE) THEN WriteChar(c); IF (col >= 1) THEN DEC(col) END ELSE WriteChar(c); INC(col) END; ReadChar(c) END END detab; BEGIN detab END detab. MODULE detab; (*DEE 2014-01-20/2015-11-30/2015-12-01/2020-05-03*) (*Software Tools in Pascal, exercises 1-6 and 1-7a.*) FROM STextIO IMPORT ReadChar, SkipLine, WriteChar, WriteLn; FROM SIOResult IMPORT ReadResult, ReadResults; FROM Tabs IMPORT setTabPos; (* detab: convert tabs to equivalent number of blanks. *) PROCEDURE detab; CONST BACKSPACE = 10C; BLANK = 40C; TAB = 11C; VAR c: CHAR; col: INTEGER; BEGIN col := 1; ReadChar(c); WHILE ReadResult() # endOfInput DO IF (c = TAB) THEN REPEAT WriteChar(BLANK); INC(col) UNTIL (setTabPos(col)) ELSIF ReadResult() = endOfLine THEN SkipLine; WriteLn; col := 1 ELSIF (c = BACKSPACE) THEN WriteChar(c); IF (col >= 1) THEN DEC(col) END ELSE WriteChar(c); INC(col) END; ReadChar(c) END END detab; BEGIN detab END detab.