home *** CD-ROM | disk | FTP | other *** search
- {$A-}
- program chapter1;
- {$I TOOLU.PAS}
- { Note: X$ disables the include file }
- {X$I OS-CPM80.PAS <-- CP/M-80 users include this file }
- {X$I OS-CPM86.PAS <-- CP/M-86 users include this file }
- {X$I OS-MSDOS.PAS <-- MS-DOS v 2 users include this file }
- {$I OS-OTHER.PAS <-- MS-DOS v 1 and all others }
-
- { OS support is not in chapter1 of K&P, but this is a good place to add it }
-
-
- PROCEDURE COPY;
- VAR C:CHARACTER;
- BEGIN
- WHILE(GETC(C)<>ENDFILE)DO
- PUTC(C)
- END;
-
-
- PROCEDURE CHARCOUNT;
- VAR
- NC:INTEGER;
- C:CHARACTER;
- BEGIN
- NC:=0;
- WHILE (GETC(C)<>ENDFILE)DO
- NC:=NC+1;
- PUTDEC(NC,1);
- PUTC(NEWLINE)
- END;
-
- PROCEDURE LINECOUNT;
- VAR
- N1:INTEGER;
- C:CHARACTER;
- BEGIN
- N1:=0;
- WHILE(GETC(C)<>ENDFILE)DO
- IF(C=NEWLINE)THEN
- N1:=N1+1;
- PUTDEC(N1,1);
- PUTC(NEWLINE)
- END;
-
- PROCEDURE CallShell;
- { read first line of STDIN, put in process queue }
- { W. Kempton -- 5 Jan 85 }
- begin
- if ActiveProcessQ then
- ERROR('Shell: Processes already queued -- aborted');
- ActiveProcessQ := GETLINE(ProcessQueue,STDIN,MAXSTR);
- end;
-
-
-
- PROCEDURE WORDCOUNT;
- VAR
- NW:INTEGER;
- 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
- ELSE IF (NOT INWORD)THEN BEGIN
- INWORD:=TRUE;
- NW:=NW+1
- END;
- PUTDEC(NW,1);
- PUTC(NEWLINE)
- END;
-
- PROCEDURE DETAB;
- CONST
- MAXLINE=1000;
- TYPE
- TABTYPE=ARRAY[1..MAXLINE] OF BOOLEAN;
- VAR
- C:CHARACTER;
- COL:INTEGER;
- TABSTOPS:TABTYPE;
-
- FUNCTION TABPOS(COL:INTEGER;VAR TABSTOPS:TABTYPE)
- :BOOLEAN;
- BEGIN
- IF(COL>MAXLINE)THEN
- TABPOS:=TRUE
- ELSE
- TABPOS:=TABSTOPS[COL]
- END;
-
- PROCEDURE SETTABS(VAR TABSTOPS:TABTYPE);
- CONST
- TABSPACE= TabSpaces ; { was 4 in K&P }
- VAR
- I:INTEGER;
- BEGIN
- FOR I:=1 TO MAXLINE DO
- TABSTOPS[I]:=(I MOD TABSPACE = 1)
- END;
-
- BEGIN
- SETTABS(TABSTOPS);
- COL:=1;
- WHILE(GETC(C)<>ENDFILE)DO
- IF(C=TAB)THEN
- REPEAT
- PUTC(BLANK);
- COL:=COL+1
- UNTIL(TABPOS(COL,TABSTOPS))
- ELSE IF(C=NEWLINE)THEN BEGIN
- PUTC(NEWLINE);
- COL:=1
- END
- ELSE BEGIN
- PUTC(C);
- COL:=COL+1
- END
- END;
-
-
-
- PROCEDURE COMMAND;
-
- BEGIN
- IF (GlobalArg1='copy') THEN COPY
- ELSE IF (GlobalArg1='charcount') THEN CHARCOUNT
- ELSE IF (GlobalArg1='linecount') THEN LINECOUNT
- ELSE IF (GlobalArg1='wordcount') THEN WORDCOUNT
- ELSE IF (GlobalArg1='detab') THEN DETAB
- ELSE IF (GlobalArg1='list') THEN listcat
- ELSE IF (GlobalArg1='shell') THEN CallShell
- ELSE error('Chap 1: can''t happen');
- END;(*COMMAND*)
-
-
- BEGIN
- command;
- ENDCMD;
- END.