(* --------------------------------------------------------------------------

:Program.    ToolSupport.mod
:Contents.   Procedures used in the CPic - Tools.
:Author.     Thomas Zipproth
:Address.    Dr. Jochner Weg 10, 8948 Mindelheim, Germany
:Phone.      08261/4838
:Copyright.  PD
:Language.   Modula-2
:Translator. M2-Amiga A+l V3.3d
:History.    V1.0 [thz] 10.7.90
:Remark.     This reduces the size about 5k.

---------------------------------------------------------------------------*)

(* $S- $F- $V- $R- $N- *)
IMPLEMENTATION MODULE ToolSupport;

FROM Arts   IMPORT Assert,dosCmdBuf,wbStarted;
FROM SYSTEM IMPORT CAST,ADR,SETREG;
FROM Dos    IMPORT FileHandlePtr,Output,Write;


VAR  CommLine : POINTER TO CHAR;
     OutHandle: FileHandlePtr;


PROCEDURE ScanString(VAR str: ARRAY OF CHAR;
                     VAR len: INTEGER; VAR termCh: CHAR);
VAR
  InQuotes: BOOLEAN;
  QuoteCh: CHAR;
BEGIN
  InQuotes:=FALSE; len:=0;
  REPEAT
    termCh := CommLine^; INC(CAST(LONGINT,CommLine));
  UNTIL termCh # ' ';
  WHILE (termCh>' ') OR (InQuotes AND (termCh=' ')) DO
    IF InQuotes AND (termCh=QuoteCh) THEN
      InQuotes:=FALSE
    ELSIF NOT InQuotes AND ((termCh='"') OR (termCh="'")) THEN
      QuoteCh:=termCh; InQuotes:=TRUE
    ELSE
      IF len<=HIGH(str) THEN
        str[len]:=termCh; INC(len)
      END;
    END;
    termCh := CommLine^; INC(CAST(LONGINT,CommLine));
  END;
  IF len<=HIGH(str) THEN str[len] := 00C END;
END ScanString;


PROCEDURE NumArgs(): INTEGER;
VAR cnt,len: INTEGER; ch: ARRAY[0..0] OF CHAR; termCh: CHAR;
BEGIN
  cnt:=0; CommLine:=dosCmdBuf;
  REPEAT
    ScanString(ch,len,termCh);
    IF len#0 THEN INC(cnt) END;
  UNTIL termCh<' ';
  RETURN cnt;
END NumArgs;


PROCEDURE GetArg(arg: INTEGER; VAR argument: ARRAY OF CHAR; VAR len: INTEGER);
VAR termCh : CHAR;
    ActArg : INTEGER;
BEGIN
  CommLine:=dosCmdBuf; ActArg:=0;
  REPEAT
    INC(ActArg);
    ScanString(argument,len,termCh);
  UNTIL (ActArg=arg) OR (termCh<' ');
  IF ActArg#arg THEN
    argument[0]:=00C; len:=0
  END
END GetArg;


PROCEDURE WriteString(str: ARRAY OF CHAR);
VAR length,l: INTEGER;
BEGIN
  length:=0; l:=HIGH(str);
  WHILE (length<=l) AND (str[length] # 00C) DO
    INC(length)
  END;
  SETREG(0,Write(OutHandle,ADR(str),length))
END WriteString;


PROCEDURE WriteLn;
VAR ch : CHAR;
BEGIN
  ch := 12C;
  SETREG(0,Write(OutHandle,ADR(ch),1));
END WriteLn;


PROCEDURE WriteInt(x: LONGINT; n: INTEGER);
VAR str   : ARRAY[0..15] OF CHAR;
    a,b,l : LONGINT;
    neg   : BOOLEAN;

BEGIN
  FOR l:=0 TO 15 DO str[l]:=" " END;
  l:=15; IF x<0 THEN neg:=TRUE; x:=-x; ELSE neg:=FALSE END;
  REPEAT
    a:=x DIV 10; b:=x-a*10; x:=a;
    str[l]:=CHAR(b+48); DEC(l);
  UNTIL x=0;
  IF neg THEN str[l]:="-"; DEC(l) END;
  SETREG(0,Write(OutHandle,ADR(str[16-n]),n));
END WriteInt;


PROCEDURE StrToInt(VAR str: ARRAY OF CHAR; VAR x : INTEGER);
VAR ch  : CHAR;
    d,l : INTEGER;
BEGIN
  x:=0; l:=0; ch:=str[0];
  WHILE (ch#12C) AND (ch#0C) AND (l<=HIGH(str)) DO
    IF (ch>="0") AND (ch<="9") THEN
      d := ORD(ch)-48;
      IF (32767-d) DIV 10 >= x THEN x := 10*x+d END;
    END;
    INC(l); ch:=str[l];
  END;
  IF str[0]="-" THEN x := -x END;
END StrToInt;


BEGIN

  Assert(NOT wbStarted,ADR("Only CLI !"));
  OutHandle:=Output();

END ToolSupport.mod
