IMPLEMENTATION MODULE Misc; (* Copyright (C) 1988,1989 Jensen & Partners International *) IMPORT Str, IO, Window; PROCEDURE InputStr ( VAR S : ARRAY OF CHAR; MaxLen : CARDINAL ) ; (* Inputs a string, using Window module, allowing normal line editing *) VAR ins : BOOLEAN ; k : CHAR ; x,y,p,l,i : CARDINAL ; BEGIN x := Window.WhereX() ; y := Window.WhereY() ; p := 0 ; ins := TRUE ; (* Insert mode *) IF (MaxLen = 0) THEN l := Str.Length(S) ; ELSE l := MaxLen; END; IO.WrCharRep(' ',l); Window.GotoXY(x,y); LOOP IF p>l THEN p := l END ; IO.WrStr(S) ; IF Str.Length(S) < l THEN IO.WrChar(' '); END; (* if *) Window.GotoXY(x+p,y) ; k := IO.RdCharDirect() ; IF k = 0C THEN (* Extended character *) CASE IO.RdCharDirect() OF | CHR(75) : k := CHR(19) ; (* LeftArr -> ^S *) | CHR(77) : k := CHR(4) ; (* RightArr -> ^D *) | CHR(71) : k := CHR(1) ; (* Home -> ^A *) | CHR(79) : k := CHR(6) ; (* End -> ^F *) | CHR(83) : k := CHR(7) ; (* Del -> ^G *) | CHR(82) : k := CHR(22) ; (* Ins -> ^V *) END ; END ; CASE k OF | ' '..'~' : IF ins THEN Str.Insert(S,k,p) ; ELSIF p=l THEN Str.Append(S,k) ; ELSE S[p] := k ; END ; INC(p) ; | CHR(1) : p := 0 ; (* Home *) | CHR(6) : p := Str.Length(S) ; (* End *) | CHR(19) : IF p>0 THEN DEC(p) END ; (* Left *) | CHR(4) : IF p0 THEN (* BackSpace *) DEC(p) ; Str.Delete(S,p,1) ; END ; | CHR(22) : ins := NOT ins ; (* Toggle Ins/Ovr *) | CHR(27) : S[0] := 0C; Window.GotoXY(x,y); FOR i := 1 TO l DO IO.WrChar(' '); END; p := 0; | CHR(13) : RETURN ; (* Enter *) END ; Window.GotoXY(x,y) ; END ; END InputStr ; END Misc.