{$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.
