MODULE wordcount; (*DEE 2015-11-25*) FROM ST IMPORT getc, putc; FROM STchars IMPORT character, BLANK, ENDFILE, NEWLINE, TAB; FROM STstrings IMPORT putdec; (* wordcount: count words in standard input *) PROCEDURE wordcount; VAR nw: CARDINAL; c: character; inword: BOOLEAN; BEGIN nw := 0; inword := FALSE; WHILE (getc(c) # ENDFILE) DO IF (c = BLANK) OR (c = NEWLINE) OR (c = TAB) THEN inword := FALSE ELSIF ~inword THEN inword := TRUE; INC(nw) END END; putdec(nw, 1); putc(NEWLINE) END wordcount; BEGIN wordcount END wordcount. MODULE wordcount; (*DEE 2020-05-31*) (* Uses ISO/IEC 10514-1:1996 library *) FROM SIOResult IMPORT ReadResult, ReadResults; FROM STextIO IMPORT ReadChar, SkipLine, WriteLn; FROM SWholeIO IMPORT WriteCard; VAR nw: CARDINAL; PROCEDURE wordcount; CONST BLANK = 40C; TAB = 11C; VAR c: CHAR; inword: BOOLEAN; BEGIN nw := 0; inword := FALSE; ReadChar(c); WHILE ReadResult() # endOfInput DO IF ReadResult() = endOfLine THEN SkipLine; inword := FALSE; ELSIF (c = BLANK) OR (c = TAB) THEN inword := FALSE; ELSIF ~inword THEN inword := TRUE; INC(nw) END; ReadChar(c) END; WriteCard(nw, 1); WriteLn END wordcount; BEGIN wordcount END wordcount. MODULE wordcount;(*DEE 2015-11-25/2018-06-02*) (*See Exercise 1-4 in Software Tools.*) FROM ST IMPORT error, getarg, getc, putc; FROM STchars IMPORT character, BLANK, ENDFILE, MINUS, NEWLINE, TAB; FROM STstrings IMPORT MAXSTR, putdec, string; VAR cmd: string; (* command type *) nc, nl, nw: INTEGER; (* TODO: these should be able to be combined. *) PROCEDURE help; BEGIN error('usage: wordcount [ -l | -w | -c ]') END help; PROCEDURE wordcount; VAR c: character; inword: BOOLEAN; BEGIN nl := 0; nw := 0; nc := 0; inword := FALSE; WHILE (getc(c) # ENDFILE) DO IF (c = BLANK) OR (c = NEWLINE) OR (c = TAB) THEN inword := FALSE; IF (c = NEWLINE) THEN INC(nl) END ELSIF ~inword THEN inword := TRUE; INC(nw) END; INC(nc) END END wordcount; BEGIN IF getarg(1, cmd, MAXSTR) THEN IF (cmd[1] # MINUS) THEN help (* PIM4 doesn't require VAL, but PIM3 and ISO/IEC 10514-1:1996 do. *) ELSIF (cmd[2] = VAL(INTEGER, ORD('l'))) THEN wordcount; putdec(nl,1) ELSIF (cmd[2] = VAL(INTEGER, ORD('w'))) THEN wordcount; putdec(nw, 1) ELSIF (cmd[2] = VAL(INTEGER, ORD('c'))) THEN wordcount; putdec(nc,1) ELSE help END ELSE (* If options can be combined, default to 'nw, 1'. *) wordcount; putdec(nl, 8); putdec(nw, 8); putdec(nc, 8) END; putc(NEWLINE) END wordcount. MODULE wordcount; (*DEE 2020-05-31*) FROM SIOResult IMPORT ReadResult, ReadResults; FROM STextIO IMPORT ReadChar, SkipLine, WriteLn; FROM SWholeIO IMPORT WriteCard; VAR nc, nl, nw: CARDINAL; PROCEDURE wordcount; CONST BLANK = 40C; TAB = 11C; VAR c: CHAR; inword: BOOLEAN; BEGIN nl := 0; nw := 0; nc := 0; inword := FALSE; ReadChar(c); WHILE ReadResult() # endOfInput DO IF ReadResult() = endOfLine THEN SkipLine; inword := FALSE; INC(nl) ELSIF (c = BLANK) OR (c = TAB) THEN inword := FALSE; ELSIF ~inword THEN inword := TRUE; INC(nw) END; INC(nc); ReadChar(c) END; WriteCard(nl, 8); WriteCard(nw, 8); WriteCard(nc, 8); WriteLn END wordcount; BEGIN wordcount; END wordcount. MODULE wordcount; (*DEE 2015-11-25/2017-10-14*) (* Modula-2 simple word count filter. *) (* PIM3/4 compatible, using the ISO/IEC 10514-1:1996 standard library. *) FROM TextIO IMPORT ReadToken, WriteString, WriteLn; FROM STextIO IMPORT ReadChar, SkipLine; FROM SWholeIO IMPORT WriteInt; FROM StdChans IMPORT ErrChan, OutChan; FROM SIOResult IMPORT ReadResult, ReadResults; FROM ProgramArgs IMPORT IsArgPresent, NextArg, ArgChan; TYPE string = ARRAY [1..256] OF CHAR; CONST MINUS = 55C; VAR cmd: string; (* command type *) nc, nl, nw: INTEGER; PROCEDURE error(CONST s: ARRAY OF CHAR); BEGIN WriteString(ErrChan(), s); WriteLn(ErrChan()); HALT(1) END error; PROCEDURE help; BEGIN error('usage: wordcount [ -l | -w | -c ]') END help; (*See Exercise 1-4 in Software Tools.*) PROCEDURE wc; CONST BLANK = 40C; TAB = 11C; VAR c: CHAR; inword: BOOLEAN; BEGIN nl := 0; nw := 0; nc := 0; inword := FALSE; ReadChar(c); WHILE ReadResult() # endOfInput DO IF ReadResult() = endOfLine THEN SkipLine; inword := FALSE; INC(nl) ELSIF (c = BLANK) OR (c = TAB) THEN inword := FALSE; ELSIF ~inword THEN inword := TRUE; INC(nw) END; INC(nc); ReadChar(c) END END wc; BEGIN IF IsArgPresent() THEN NextArg() END; (* Eat command name. *) IF IsArgPresent() THEN ReadToken(ArgChan(), cmd); IF (cmd[1] # MINUS) THEN help ELSIF (cmd[2] = 'l') THEN wc; WriteInt(nl, 1) ELSIF (cmd[2] = 'w') THEN wc; WriteInt(nw, 1) ELSIF (cmd[2] = 'c') THEN wc; WriteInt(nc, 1) ELSE help END ELSE wc; WriteInt(nl, 8); WriteInt(nw, 8); WriteInt(nc, 8) END; WriteLn(OutChan()) END wordcount. MODULE wordcount; (*DEE 2015-11-25/2016-08-23/2017-10-14/2018-06-02/2018-09-22/2020-05-03*) FROM TextIO IMPORT ReadToken, WriteString, WriteLn; FROM STextIO IMPORT ReadChar, SkipLine; FROM SWholeIO IMPORT WriteInt; FROM StdChans IMPORT ErrChan, OutChan; FROM SIOResult IMPORT ReadResult, ReadResults; FROM ProgramArgs IMPORT IsArgPresent, NextArg, ArgChan; TYPE string = ARRAY [1..256] OF CHAR; CONST MINUS = 55C; VAR cmd: string; (* command type *) nc, nl, nw: INTEGER; PROCEDURE error(CONST s: ARRAY OF CHAR); BEGIN WriteString(ErrChan(), s); WriteLn(ErrChan()); HALT(1) END error; (* TODO: these should be able to be combined, instead of using -a. *) PROCEDURE help; BEGIN error('usage: wordcount [ -a | -l | -w | -c ]') END help; (* wordcount: count characters, lines, and words from the standard input. *) (*See Exercise 1-4 in Software Tools.*) PROCEDURE wordcount; CONST BLANK = 40C; TAB = 11C; VAR c: CHAR; inword: BOOLEAN; BEGIN nl := 0; nw := 0; nc := 0; inword := FALSE; ReadChar(c); WHILE ReadResult() # endOfInput DO IF ReadResult() = endOfLine THEN SkipLine; inword := FALSE; INC(nl) ELSIF (c = BLANK) OR (c = TAB) THEN inword := FALSE; ELSIF ~inword THEN inword := TRUE; INC(nw) END; INC(nc); ReadChar(c) END END wordcount; BEGIN IF IsArgPresent() THEN NextArg() END; (* Eat command name. *) IF IsArgPresent() THEN ReadToken(ArgChan(), cmd); IF (cmd[1] # MINUS) THEN help ELSIF (cmd[2] = 'l') THEN wordcount; WriteInt(nl, 1) ELSIF (cmd[2] = 'w') THEN wordcount; WriteInt(nw, 1) ELSIF (cmd[2] = 'c') THEN wordcount; WriteInt(nc, 1) ELSIF (cmd[2] = 'a') THEN wordcount; WriteInt(nl, 8); WriteInt(nw, 8); WriteInt(nc, 8) ELSE help END ELSE wordcount; WriteInt(nw, 8); (* Remain compatible with Software Tools wordcount. *) END; WriteLn(OutChan()) END wordcount.