Renegade-1.19/SOURCE/SYSOP4.PAS

564 lines
14 KiB
Plaintext
Raw Permalink Blame History

{$IFDEF WIN32}
{$I DEFINES.INC}
{$ENDIF}
{$A+,B-,D-,E-,F+,I-,L-,N-,O+,R-,S-,V-}
UNIT SysOp4;
INTERFACE
USES
Common;
PROCEDURE TEdit1;
PROCEDURE TEdit(CONST FSpec: AStr);
IMPLEMENTATION
USES
Dos;
PROCEDURE TEdit1;
VAR
FSpec: AStr;
Dir: DirStr;
Name: NameStr;
Ext: ExtStr;
BEGIN
NL;
Prt('File name: ');
IF (FileSysOp) THEN
BEGIN
MPL(50);
Input(FSpec,50);
END
ELSE
BEGIN
MPL(12);
Input(FSpec,12);
FSplit(FSpec,Dir,Name,Ext);
FSpec := Name+Ext;
END;
TEdit(FSpec);
END;
PROCEDURE TEdit(CONST FSpec: AStr);
TYPE
StrPtr = ^StrRec;
StrRec = RECORD
S: AStr;
Next,
Last: StrPtr;
END;
VAR
TopHeap: ^Byte;
Fil: Text;
Cur,
Nex,
Las,
Top,
Bottom,
Used: StrPtr;
S: AStr;
TotalLines,
CurLine,
I: Integer;
Done,
AllRead: Boolean;
PROCEDURE InLi(VAR S1: AStr);
VAR
C,
C1: Char;
Cp,
Rp,
CV,
CC: Integer;
PROCEDURE BKSpc;
BEGIN
IF (Cp > 1) THEN
BEGIN
IF (S1[Cp - 2] = '^') AND (S1[Cp - 1] IN ['0'..'9']) THEN
BEGIN
UserColor(1);
Dec(Cp);
END
ELSE IF (S1[Cp - 1] = #8) THEN
BEGIN
Prompt(' ');
Inc(Rp);
END
ELSE IF (S1[Cp - 1] <> #10) THEN
BEGIN
Prompt(#8+' '+#8);
Dec(Rp);
END;
Dec(Cp);
END;
END;
BEGIN
Rp := 1;
Cp := 1;
S1 := '';
IF (LastLineStr <> '') THEN
BEGIN
Prompt(LastLineStr);
S1 := LastLineStr;
LastLineStr := '';
Cp := (Length(S1) + 1);
Rp := Cp;
END;
REPEAT
C := Char(GetKey);
CASE C of
#32..#255 :
IF (Cp < StrLen) AND (Rp < ThisUser.LineLen) THEN
BEGIN
S1[Cp] := C;
Inc(Cp);
Inc(Rp);
OutKey(C);
END;
^H : BKSpc;
^S : BEGIN
CV := (5 - (Cp MOD 5));
IF ((Cp + CV) < StrLen) AND ((Rp + CV) < ThisUser.LineLen) THEN
FOR CC := 1 TO CV DO
BEGIN
Prompt(' ');
S1[Cp] := ' ';
Inc(Rp);
Inc(Cp);
END;
END;
^P : IF (OkANSI OR OkAvatar) AND (Cp < (StrLen - 1)) THEN
BEGIN
C1 := Char(GetKey);
IF (C1 IN ['0'..'9']) THEN
BEGIN
S1[Cp] := '^';
Inc(Cp);
S1[Cp] := C1;
Inc(Cp);
UserColor(Ord(S1[Cp - 1]));
END;
END;
^X : BEGIN
Cp := 1;
FOR CV := 1 TO (Rp - 1) DO
Prompt(#8+' '+#8);
UserColor(1);
Rp := 1;
END;
END;
UNTIL ((C = ^M) OR (Rp = ThisUser.LineLen) OR (HangUp));
S1[0] := Chr(Cp - 1);
IF (C <> ^M ) THEN
BEGIN
CV := (Cp - 1);
WHILE (CV > 1) AND (S1[CV] <> ' ') AND ((S1[CV] <> ^H) OR (S1[CV - 1] = '^')) DO
Dec(CV);
IF (CV > (Rp DIV 2)) AND (CV <> (Cp - 1)) THEN
BEGIN
LastLineStr := Copy(S1,(CV + 1),(Cp - CV));
FOR CC := (Cp - 2) DOWNTO CV DO
Prompt(^H);
FOR CC := (Cp - 2) DOWNTO CV DO
Prompt(' ');
S1[0] := Chr(CV - 1);
END;
END;
NL;
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 > 2048) 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
S1: AStr;
BEGIN
IF (NOT Abort) THEN
BEGIN
IF (Cp = NIL) THEN
S1 := ' ^5'+'[^3'+'END^5'+']'
ELSE
S1 := PadRightInt(Cl,4)+': '+Cp^.S;
PrintACR(S1);
END;
END;
PROCEDURE PL;
BEGIN
Abort := FALSE;
PLine(CurLine,Cur);
END;
BEGIN
{$IFDEF MSDOS}
Mark(TopHeap);
{$ENDIF}
{$IFDEF WIN32}
// REETODO Prepare to leak memory...
{$ENDIF}
Used := NIL;
Top := NIL;
Bottom := NIL;
AllRead := TRUE;
IF (FSpec = '') THEN
BEGIN
Print('Aborted.');
END
ELSE
BEGIN
Abort := FALSE;
Next := FALSE;
TotalLines := 0;
New(Cur);
Cur^.Last := NIL;
Cur^.S := '';
NL;
Assign(Fil,FSpec);
Reset(Fil);
IF (IOResult <> 0) THEN
BEGIN
ReWrite(Fil);
IF (IOResult <> 0) THEN
BEGIN
Print('Error reading file.');
Abort := TRUE;
END
ELSE
BEGIN
Close(Fil);
Erase(Fil);
Print('New file.');
TotalLines := 0;
Cur := NIL;
Top := Cur;
Bottom := Cur;
END;
END
ELSE
BEGIN
Abort := NOT NewPtr(Nex);
Top := Nex;
Print('^1Loading...');
WHILE ((NOT EOF(Fil)) AND (NOT Abort)) DO
BEGIN
Inc(TotalLines);
Cur^.Next := Nex;
Nex^.Last := Cur;
Cur := Nex;
ReadLn(Fil,S);
Cur^.S := S;
Abort := NOT NewPtr(Nex);
END;
Close(Fil);
Cur^.Next := NIL;
IF (TotalLines = 0) THEN
BEGIN
Cur := NIL;
Top := NIL;
END;
Bottom := Cur;
IF (Abort) THEN
BEGIN
NL;
Print(^G^G'|12WARNING: |10Not all of file read.^3');
NL;
AllRead := FALSE;
END;
Abort := FALSE;
END;
IF (NOT Abort) THEN
BEGIN
Print('Total lines: '+IntToStr(TotalLines));
Cur := Top;
IF (Top <> NIL) THEN
Top^.Last := NIL;
CurLine := 1;
Done := FALSE;
PL;
REPEAT
Prt(':');
Input(S,10);
IF (S = '') THEN
S := '+';
IF (StrToInt(S) > 0) THEN
BEGIN
I := StrToInt(S);
IF ((I > 0) AND (I <= TotalLines)) THEN
BEGIN
WHILE (I <> CurLine) DO
IF (I < CurLine) THEN
BEGIN
IF (Cur = NIL) THEN
BEGIN
Cur := Bottom;
CurLine := TotalLines;
END
ELSE
BEGIN
Dec(CurLine);
Cur := Cur^.Last;
END;
END
ELSE
BEGIN
Inc(CurLine);
Cur := Cur^.Next;
END;
PL;
END;
END
ELSE
CASE S[1] of
'?' : BEGIN
LCmds(14,3,'+Forward line','-Back line');
LCmds(14,3,'Top','Bottom');
LCmds(14,3,'Print line','List');
LCmds(14,3,'Insert lines','Delete line');
LCmds(14,3,'Replace line','Clear all');
LCmds(14,3,'Quit (Abort)','Save');
LCmds(14,3,'*Center line','!Memory Available');
END;
'!' : Print('Heap space available: '+IntToStr(MemAvail));
'*' : IF (Cur <> NIL) THEN
Cur^.S := #2+Cur^.S;
'+' : IF (Cur <> NIL) THEN
BEGIN
I := StrToInt(Copy(S,2,9));
IF (I = 0) THEN
I := 1;
WHILE (Cur <> NIL) AND (I > 0) DO
BEGIN
Cur := Cur^.Next;
Inc(CurLine);
Dec(I);
END;
PL;
END;
'-' : BEGIN
I := StrToInt(Copy(S,2,9));
IF (I = 0) THEN
I := 1;
IF (Cur = NIL) THEN
BEGIN
Cur := Bottom;
CurLine := TotalLines;
Dec(I);
END;
IF (Cur <> NIL) THEN
IF (Cur^.Last <> NIL) THEN
BEGIN
WHILE ((Cur^.Last <> NIL) AND (I > 0)) DO
BEGIN
Cur := Cur^.Last;
Dec(CurLine);
Dec(I);
END;
PL;
END;
END;
'B' : BEGIN
Cur := NIL;
CurLine := (TotalLines + 1);
PL;
END;
'C' : IF PYNQ('Clear workspace? ',0,FALSE) THEN
BEGIN
TotalLines := 0;
CurLine := 1;
Cur := NIL;
Top := NIL;
Bottom := NIL;
{$IFDEF MSDOS}
Release(TopHeap);
{$ENDIF}
{$IFDEF WIN32}
// REETODO Likely going to leak memory right about now
{$ENDIF}
END;
'D' : BEGIN
I := StrToInt(Copy(S,2,9));
IF (I = 0) THEN
I := 1;
WHILE (Cur <> NIL) AND (I > 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(TotalLines);
Dec(I);
END;
PL;
END;
'I' : BEGIN
Abort := FALSE;
Next := FALSE;
LastLineStr := '';
NL;
Print(' Enter "." on a separate line to exit insert mode.');
IF (OkANSI OR OkAvatar) THEN
Print('^2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^1');
Dec(ThisUser.LineLen,6);
S := '';
WHILE (S <> '.') AND (S <> '.'+#1) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
Prompt(PadRightInt(CurLine,4)+': ');
InLi(S);
IF (S <> '.') AND (S <> '.'+#1) THEN
BEGIN
Abort := NOT NewPtr(Nex);
IF (Abort) THEN
Print('Out of space.')
ELSE
BEGIN
Nex^.S := S;
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(TotalLines);
END
END;
END;
Inc(ThisUser.LineLen,6);
END;
'L' : BEGIN
Abort := FALSE;
Next := FALSE;
Nex := Cur;
I := CurLine;
WHILE (Nex <> NIL) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
PLine(I,Nex);
Nex := Nex^.Next;
Inc(I);
END;
END;
'P' : PL;
'R' : IF (Cur <> NIL) THEN
BEGIN
PL;
Prompt(PadRightInt(CurLine,4)+': ');
InLi(S);
Cur^.S := S;
END;
'Q' : Done := TRUE;
'S' : BEGIN
IF (NOT AllRead) THEN
BEGIN
UserColor(5);
Prompt('Not all of file read. ');
AllRead := PYNQ('Save anyway? ',0,FALSE);
END;
IF (AllRead) THEN
BEGIN
Done := TRUE;
Print('Saving ...');
SysOpLog('Saved "'+FSpec+'"');
ReWrite(Fil);
I := 0;
Cur := Top;
WHILE (Cur <> NIL) DO
BEGIN
WriteLn(Fil,Cur^.S);
Cur := Cur^.Next;
Dec(I);
END;
IF (I = 0) THEN
WriteLn(Fil);
Close(Fil);
END;
END;
'T' : BEGIN
Cur := Top;
CurLine := 1;
PL;
END;
END;
UNTIL ((Done) OR (HangUp));
END;
END;
{$IFDEF MSDOS}
Release(TopHeap);
{$ENDIF}
{$IFDEF WIN32}
// REETODO Likely going to leak memory right about now
{$ENDIF}
PrintingFile := FALSE;
LastError := IOResult;
END;
END.