DEFINITION MODULE MAINREAD;
VAR entrych,exitch:CHAR;
    textmode:(overwrite,insert,overflow);
PROCEDURE EDITPREP(len:CARDINAL);
PROCEDURE EDIT(VAR S:ARRAY OF CHAR);
PROCEDURE EDITL(VAR S:ARRAY OF CHAR);
PROCEDURE BLANK(X,Y,L:CARDINAL);
PROCEDURE SETMAINRD;
PROCEDURE MRDSTR(VAR S:ARRAY OF CHAR);
VAR cur:CARDINAL;
END MAINREAD.
IMPLEMENTATION MODULE MAINREAD;
FROM STDIO IMPORT RDSTR,RDCHAR,CURSOR,UNCURS,WRCHAR,GOTOXY,GETXY,MOVEX,
   WAITKEY,WRSUBSTR,WRSPS,BUFFRDCHAR,PRINTABLE;
FROM STRINGS IMPORT APPEND,INSERT,DELETE,LENGTH;
CONST edit  =07I;
      left  =08I;
      right =09I;
      down  =0AI;
      up    =0BI;
      delete=0CI;
      enter =0DI;
VAR end,lim,MX,MY:CARDINAL;
 
PROCEDURE EDITPREP(len:CARDINAL);
BEGIN
lim:=len;cur:=0;GETXY(MX,MY)
END EDITPREP;

PROCEDURE GETCH(S:ARRAY OF CHAR;n:CARDINAL):CHAR;HEX
DD E1 E1 D1 C1 C5 D5 E5 DD E5 ED 4B (@lim) AF ED
42 D0 09 EB E5 CD (@LENGTH+1) A7 EB ED 52 3E 20 C1 D0
19 09 7E C9 END GETCH;
 
PROCEDURE EDIT(VAR S:ARRAY OF CHAR);
VAR  CH,curch:CHAR;
BEGIN
end:=LENGTH(S);
LOOP curch:=GETCH(S,cur);GOTOXY(MX,MY);MOVEX(cur);CURSOR(curch);
  IF entrych<>CHR(0) THEN CH:=entrych;entrych:=CHR(0)
  ELSE CH:=WAITKEY() END;MOVEX(-1);UNCURS(curch);
  CASE CH OF
  right:IF cur<end THEN INC(cur) ELSE EXIT END|
  left:IF cur>0 THEN DEC(cur) ELSE EXIT END|
  delete:
    IF cur>0 THEN MOVEX(-1);DEC(cur);DEC(end);
      DELETE(S,cur,1);WRSUBSTR(S,cur+1,end)
    ELSE EXIT END|
  ELSE
    IF PRINTABLE(CH) AND (cur<lim) THEN
      IF textmode=overwrite THEN 
        IF cur=end THEN INC(end);APPEND(S,CH) ELSE S[cur]:=CH END;
        INC(cur)
      ELSIF (end<lim) OR (textmode=overflow) THEN
        INSERT(S,cur,CH);INC(cur);
        IF end<lim THEN INC(end) END;
        MOVEX(-1);WRSUBSTR(S,cur-1,end-1)
      ELSE EXIT END
    ELSE EXIT END END END;
GOTOXY(MX,MY);MOVEX(end);exitch:=CH
END EDIT;
 
PROCEDURE MRDSTR(VAR S:ARRAY OF CHAR);
BEGIN
EDITPREP(HIGH(S)+1);S[0]:='';
REPEAT EDITL(S) UNTIL exitch=enter;
END MRDSTR;
 
PROCEDURE EDITL(VAR S:ARRAY OF CHAR);
TYPE CSET=SET OF CHAR[0I..0FI];
CONST EXITS=CSET{enter,up,down};
BEGIN
REPEAT EDIT(S);
IF exitch=edit THEN BLANK(MX,MY,end);S[0]:=0I;cur:=0 END
UNTIL exitch IN EXITS
END EDITL;
 
PROCEDURE BLANK(X,Y,L:CARDINAL);
BEGIN
GOTOXY(X,Y);WRSPS(L);GOTOXY(X,Y)
END BLANK;
 
PROCEDURE SETMAINRD;
BEGIN
entrych:=CHR(0);
RDSTR:=MRDSTR;
RDCHAR:=BUFFRDCHAR
END SETMAINRD;

BEGIN
textmode:=insert;
SETMAINRD
END MAINREAD.
