(*****************************************************************************) (*> <*) (*> SYSOP4 .PAS - Written by Eric Oman <*) (*> <*) (*> SysOp functions: Text Editor. <*) (*> <*) (*> <*) (*****************************************************************************) {$A+,B+,D-,E+,F+,I+,L+,N-,O+,R-,S+,V-} unit sysop4; interface uses crt, dos, {rcg11172000 no overlay under Linux.} {overlay,} common; procedure tedit1; procedure tedit(fspec:astr); implementation type strptr=^strrec; strrec= record i:astr; next,last:strptr; end; var topheap:^byte; lastvar:byte; procedure tedit1; var espec,s1,s2,s3:astr; f:file; begin nl; prt('Filename: '); if (fso) then begin nl; mpl(79); input(espec,79); end else begin mpl(12); input(espec,12); fsplit(espec,s1,s2,s3); espec:=s2+s3; end; if (pos('.',espec)=0) then espec:=espec+'.MSG'; nofile:=FALSE; assign(f,systat.afilepath+espec); {$I-} reset(f); {$I+} if (ioresult<>0) then begin if (fso) then begin assign(f,systat.gfilepath+espec); {$I-} reset(f); {$I+} nofile:=(ioresult<>0); if (not nofile) then espec:=systat.gfilepath+espec; end; end else espec:=systat.afilepath+espec; if (nofile) then espec:=systat.afilepath+espec; tedit(espec); if (filerec(f).mode<>fmclosed) then begin {$I-} close(f); {$I+} nofile:=(ioresult<>0); end; end; procedure tedit(fspec:astr); var fil:text; cur,nex,las,b4,top,bottom,used:strptr; i1,i2,ps1,ps2,ps3:astr; tline,curline,c1,c2:integer; abort,next,done,allread:boolean; procedure inli(var i:astr); var cp,rp:integer; c,c1:char; cv,cc:integer; procedure bkspc; begin if (cp>1) then begin if (i[cp-2]=#3) and (i[cp-1] in [#0..#9]) then begin cl(1); dec(cp); end else if i[cp-1]=#8 then begin prompt(' '); inc(rp); end else if i[cp-1]<>#10 then begin prompt(#8+' '+#8); dec(rp); end; dec(cp); end; end; begin rp:=1; cp:=1; i:=''; if (ll<>'') then begin prompt(ll); i:=ll; ll:=''; cp:=length(i)+1; rp:=cp; end; repeat getkey(c); case c of #32..#255:if (cp1) and (cp1 then repeat bkspc; until (cp=1) or (i[cp]=' ') or ((i[cp]=^H) and (i[cp-1]<>#3)); ^X:begin cp:=1; for cv:=1 to rp-1 do prompt(#8+' '+#8); cl(1); rp:=1; end; end; until ((c=^M) or (rp=thisuser.linelen) or (hangup)); i[0]:=chr(cp-1); if c<>^M then begin cv:=cp-1; while (cv>1) and (i[cv]<>' ') and ((i[cv]<>^H) or (i[cv-1]=#3)) do dec(cv); if (cv>(rp div 2)) and (cv<>cp-1) then begin ll:=copy(i,cv+1,cp-cv); for cc:=cp-2 downto cv do prompt(^H); for cc:=cp-2 downto cv do prompt(' '); i[0]:=chr(cv-1); end; end; nl; { if c=^M then i:=i+chr(1);} end; function newptr(var x:strptr):boolean; begin if (used<>nil) then begin x:=used; used:=used^.next; newptr:=TRUE; end else begin if (maxavail<0) or (maxavail>100) then begin new(x); newptr:=TRUE; end else newptr:=FALSE; end; end; procedure oldptr(var x:strptr); begin x^.next:=used; used:=x; end; procedure pline(cl:integer; var cp:strptr; var abort:boolean); var next:boolean; i:astr; begin if (not abort) then begin if (cp=nil) then i:=' '+#3+#5+'['+#3+#3+'END'+#3+#5+']' else begin i:=cstr(cl); while length(i)<4 do i:=' '+i; i:=i+': '+cp^.i; end; printacr(i,abort,next); end; end; procedure pl; var abort:boolean; begin abort:=FALSE; pline(curline,cur,abort); end; begin topheap:=heapptr; { topheap:=ptr(seg(lastvar),ofs(lastvar));} release(topheap); used:=nil; top:=nil; bottom:=nil; allread:=TRUE; fsplit(fspec,ps1,ps2,ps3); if (not fso) and (ps3<>'.MSG') and (ps3<>'.ANS') and (ps3<>'.40C') and (ps3<>'.TXT') then fspec:=''; if (fspec='') then print('Illegal filename.') else begin nl; assign(fil,fspec); abort:=FALSE; {$I-} reset(fil); {$I+} tline:=0; new(cur); cur^.last:=nil; cur^.i:=''; if (ioresult<>0) then begin {$I-} rewrite(fil); {$I+} if (ioresult<>0) then begin print('Error reading file.'); abort:=TRUE; end else begin close(fil); erase(fil); print('New file.'); tline:=0; cur:=nil; top:=cur; bottom:=cur; end; end else begin abort:=not newptr(nex); top:=nex; print('Loading...'); while ((not eof(fil)) and (not abort)) do begin inc(tline); cur^.next:=nex; nex^.last:=cur; cur:=nex; readln(fil,i1); cur^.i:=i1; abort:=not newptr(nex); end; close(fil); cur^.next:=nil; if (tline=0) then begin cur:=nil; top:=nil; end; bottom:=cur; if (abort) then begin print('Not all of file read.'); allread:=FALSE; end; abort:=FALSE; end; if (not abort) then begin print('Total lines: '+cstr(tline)); cur:=top; if (top<>nil) then top^.last:=nil; curline:=1; done:=FALSE; pl; repeat prt(':'); input(i1,10); if (i1='') then i1:='+'; if (value(i1)>0) then begin c1:=value(i1); if ((c1>0) and (c1<=tline)) then begin while (c1<>curline) do if (c1nil) then cur^.i:=#2+cur^.i; '+':if (cur<>nil) then begin c1:=value(copy(i1,2,9)); if (c1=0) then c1:=1; while (cur<>nil) and (c1>0) do begin cur:=cur^.next; inc(curline); dec(c1); end; pl; end; '-':begin c1:=value(copy(i1,2,9)); if (c1=0) then c1:=1; if (cur=nil) then begin cur:=bottom; curline:=tline; dec(c1); end; if (cur<>nil) then if (cur^.last<>nil) then begin while ((cur^.last<>nil) and (c1>0)) do begin cur:=cur^.last; dec(curline); dec(c1); end; pl; end; end; 'B':begin cur:=nil; curline:=tline+1; pl; end; 'C':if pynq('Clear workspace? ') then begin tline:=0; curline:=1; cur:=nil; top:=nil; bottom:=nil; release(topheap); end; 'D':begin c1:=value(copy(i1,2,9)); if (c1=0) then c1:=1; while (cur<>nil) and (c1>0) do begin las:=cur^.last; nex:=cur^.next; if (las<>nil) then las^.next:=nex; if (nex<>nil) then nex^.last:=las; oldptr(cur); if (bottom=cur) then bottom:=las; if (top=cur) then top:=nex; cur:=nex; dec(tline); dec(c1); end; pl; end; 'I':begin abort:=FALSE; ll:=''; nl; print(' Enter "." on a seperate line to exit insert mode.'); print(' [ ^S : Sign date ^B : Spinning cursor ] '); if okansi then sprint(#3#2+' ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ'); i1:=''; dec(thisuser.linelen,6); while (not hangup) and (not abort) and (i1<>'.') and (i1<>'.'+#1) do begin i2:=cstr(curline); while length(i2)<>4 do i2:=' '+i2; i2:=i2+': '; prompt(i2); inli(i1); if (i1<>'.') and (i1<>'.'+#1) then begin abort:=not newptr(nex); if not abort then begin nex^.i:=i1; if (top=cur) then if (cur=nil) then begin nex^.last:=nil; nex^.next:=nil; top:=nex; bottom:=nex; end else begin nex^.next:=cur; cur^.last:=nex; top:=nex; end else begin if cur=nil then begin bottom^.next:=nex; nex^.last:=bottom; nex^.next:=nil; bottom:=nex; end else begin las:=cur^.last; nex^.last:=las; nex^.next:=cur; cur^.last:=nex; las^.next:=nex; end; end; inc(curline); inc(tline); end else print('Out of space.'); end; end; inc(thisuser.linelen,6); end; 'L':begin abort:=FALSE; nex:=cur; c1:=curline; while (not abort) and (nex<>nil) do begin pline(c1,nex,abort); nex:=nex^.next; inc(c1); end; end; 'P':pl; 'R':if (cur<>nil) then begin pl; i2:=cstr(curline); while length(i2)<>4 do i2:=' '+i2; i2:=i2+': '; prompt(i2); inli(i1); cur^.i:=i1; end; 'Q':done:=TRUE; 'S':begin if (not allread) then begin cl(5); prompt('Not all of file read. '); allread:=pynq('Save anyway? '); end; if allread then begin done:=TRUE; c1:=0; writeln('Saving...'); sysoplog('TEDIT: Saved "'+fspec+'"'); rewrite(fil); cur:=top; while cur<>nil do begin writeln(fil,cur^.i); cur:=cur^.next; dec(c1); end; if (c1=0) then writeln(fil); close(fil); end; end; 'T':begin cur:=top; curline:=1; pl; end; end; until ((done) or (hangup)); prompt('2'); end; end; {}{}{} { topheap:=ptr(seg(lastvar),ofs(lastvar));} {}{}{} sprompt('3'); release(topheap); sprompt('4'); printingfile:=FALSE; cfilteron:=FALSE; sprompt('5'); end; end.