| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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 p<l THEN INC(p) END ; (* Right *)
- | CHR(7) : IF p<l THEN (* Del *)
- Str.Delete(S,p,1) ;
- END ;
- | CHR(8) : IF p>0 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.
|