MISC.MOD 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. IMPLEMENTATION MODULE Misc;
  2. (*
  3. Copyright (C) 1988,1989 Jensen & Partners International
  4. *)
  5. IMPORT Str, IO, Window;
  6. PROCEDURE InputStr ( VAR S : ARRAY OF CHAR; MaxLen : CARDINAL ) ;
  7. (* Inputs a string, using Window module, allowing normal line editing *)
  8. VAR
  9. ins : BOOLEAN ;
  10. k : CHAR ;
  11. x,y,p,l,i : CARDINAL ;
  12. BEGIN
  13. x := Window.WhereX() ; y := Window.WhereY() ;
  14. p := 0 ;
  15. ins := TRUE ; (* Insert mode *)
  16. IF (MaxLen = 0) THEN
  17. l := Str.Length(S) ;
  18. ELSE
  19. l := MaxLen;
  20. END;
  21. IO.WrCharRep(' ',l);
  22. Window.GotoXY(x,y);
  23. LOOP
  24. IF p>l THEN p := l END ;
  25. IO.WrStr(S) ;
  26. IF Str.Length(S) < l THEN
  27. IO.WrChar(' ');
  28. END; (* if *)
  29. Window.GotoXY(x+p,y) ;
  30. k := IO.RdCharDirect() ;
  31. IF k = 0C THEN (* Extended character *)
  32. CASE IO.RdCharDirect() OF
  33. | CHR(75) : k := CHR(19) ; (* LeftArr -> ^S *)
  34. | CHR(77) : k := CHR(4) ; (* RightArr -> ^D *)
  35. | CHR(71) : k := CHR(1) ; (* Home -> ^A *)
  36. | CHR(79) : k := CHR(6) ; (* End -> ^F *)
  37. | CHR(83) : k := CHR(7) ; (* Del -> ^G *)
  38. | CHR(82) : k := CHR(22) ; (* Ins -> ^V *)
  39. END ;
  40. END ;
  41. CASE k OF
  42. | ' '..'~' : IF ins THEN Str.Insert(S,k,p) ;
  43. ELSIF p=l THEN Str.Append(S,k) ;
  44. ELSE S[p] := k ;
  45. END ;
  46. INC(p) ;
  47. | CHR(1) : p := 0 ; (* Home *)
  48. | CHR(6) : p := Str.Length(S) ; (* End *)
  49. | CHR(19) : IF p>0 THEN DEC(p) END ; (* Left *)
  50. | CHR(4) : IF p<l THEN INC(p) END ; (* Right *)
  51. | CHR(7) : IF p<l THEN (* Del *)
  52. Str.Delete(S,p,1) ;
  53. END ;
  54. | CHR(8) : IF p>0 THEN (* BackSpace *)
  55. DEC(p) ; Str.Delete(S,p,1) ;
  56. END ;
  57. | CHR(22) : ins := NOT ins ; (* Toggle Ins/Ovr *)
  58. | CHR(27) : S[0] := 0C;
  59. Window.GotoXY(x,y);
  60. FOR i := 1 TO l DO
  61. IO.WrChar(' ');
  62. END;
  63. p := 0;
  64. | CHR(13) : RETURN ; (* Enter *)
  65. END ;
  66. Window.GotoXY(x,y) ;
  67. END ;
  68. END InputStr ;
  69. END Misc.
  70.