2409 lines
70 KiB
Plaintext
2409 lines
70 KiB
Plaintext
{$IFDEF WIN32}
|
||
{$I DEFINES.INC}
|
||
{$ENDIF}
|
||
|
||
{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S+,V-}
|
||
|
||
UNIT Mail1;
|
||
|
||
INTERFACE
|
||
|
||
USES
|
||
Common;
|
||
|
||
FUNCTION Inputmessage(Pub,
|
||
IsReply: Boolean;
|
||
CONST MsgTitle: Str40;
|
||
VAR MHeader: MHeaderRec;
|
||
CONST ReadInMsg: AStr;
|
||
MaxLineLen: Byte;
|
||
MaxMsgLines: Integer): Boolean;
|
||
PROCEDURE Anonymous(Offline: Boolean; VAR MHeader: MHeaderRec);
|
||
|
||
IMPLEMENTATION
|
||
|
||
USES
|
||
Crt,
|
||
Common5,
|
||
File8,
|
||
File0,
|
||
Mail0,
|
||
TimeFunc;
|
||
|
||
VAR
|
||
InportFile: Text;
|
||
InportFileOpen: Boolean;
|
||
Escp: Boolean;
|
||
|
||
PROCEDURE Anonymous(Offline: Boolean; VAR MHeader: MHeaderRec);
|
||
VAR
|
||
An: Anontyp;
|
||
HeaderL: AStr;
|
||
UName,
|
||
Junk: Str36;
|
||
Cmd: Char;
|
||
Counter: Byte;
|
||
BEGIN
|
||
IF (ReadMsgArea <> -1) THEN
|
||
BEGIN
|
||
An := MemMsgArea.Anonymous;
|
||
IF (An = ATNo) AND (AACS(General.AnonPubPost) AND (NOT Offline)) THEN
|
||
An := ATYes;
|
||
IF (RPostAn IN ThisUser.Flags) THEN
|
||
An := ATNo;
|
||
END
|
||
ELSE IF (AACS(General.AnonPrivPost)) THEN
|
||
An := ATYes
|
||
ELSE
|
||
An := ATNo;
|
||
IF (Offline) THEN
|
||
BEGIN
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
IF (An = ATNo) THEN
|
||
FOR Counter := 1 TO 5 DO
|
||
BEGIN
|
||
HeaderL := Headerline(MHeader,FileSize(MsgHdrF),FileSize(MsgHdrF),Counter,Junk);
|
||
IF (HeaderL <> '') THEN
|
||
PrintACR(HeaderL);
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
ReadMsg(FileSize(MsgHdrF),FileSize(MsgHdrF),FileSize(MsgHdrF));
|
||
Reset(MsgHdrF);
|
||
IF (IOResult = 2) THEN
|
||
ReWrite(MsgHdrF);
|
||
Reset(MsgTxtF,1);
|
||
IF (IOResult = 2) THEN
|
||
ReWrite(MsgTxtF,1);
|
||
IF (IOResult <> 0) THEN
|
||
SysOpLog('Anon: error opening message areas.');
|
||
END;
|
||
END;
|
||
CASE An OF
|
||
ATNo : ;
|
||
ATForced : IF (CoSysOp) THEN
|
||
MHeader.From.Anon := 2
|
||
ELSE
|
||
MHeader.From.Anon := 1;
|
||
ATYes : BEGIN
|
||
NL;
|
||
IF PYNQ(AOnOff(ReadMsgArea <> - 1,'Post anonymously? ','Send anonymously? '),0,FALSE) THEN
|
||
IF (CoSysOp) THEN
|
||
MHeader.From.Anon := 2
|
||
ELSE
|
||
MHeader.From.Anon := 1;
|
||
END;
|
||
ATDearAbby : BEGIN
|
||
NL;
|
||
Print(AOnOff(ReadMsgArea <> - 1,'Post as:','Send as:'));
|
||
NL;
|
||
Print('1. Abby');
|
||
Print('2. Problemed Person');
|
||
Print('3. '+Caps(ThisUser.Name));
|
||
NL;
|
||
Prt('Which? ');
|
||
OneK(Cmd,'123'^M,TRUE,TRUE);
|
||
CASE Cmd OF
|
||
'1' : MHeader.From.Anon := 3;
|
||
'2' : MHeader.From.Anon := 4;
|
||
END;
|
||
END;
|
||
ATAnyName : BEGIN
|
||
NL;
|
||
Print('You can post under any name in this area.');
|
||
NL;
|
||
Prt('Name: ');
|
||
InputDefault(UName,MHeader.From.A1S,36,[InterActiveEdit],TRUE);
|
||
IF (UName <> MHeader.From.A1S) THEN
|
||
BEGIN
|
||
MHeader.From.Anon := 5;
|
||
MHeader.From.A1S := Caps(UName);
|
||
END;
|
||
END;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE InputLine(VAR S: AStr; MaxLineLen: Byte);
|
||
VAR
|
||
CKeyPos,
|
||
RP,
|
||
Counter,
|
||
Counter1: Integer;
|
||
CKey,
|
||
ccc: Char;
|
||
HitCmdKey,
|
||
HitBkSpc,
|
||
DoThisChar: Boolean;
|
||
|
||
PROCEDURE BkSpc;
|
||
BEGIN
|
||
IF (CKeyPos > 1) THEN
|
||
BEGIN
|
||
IF (S[CKeyPos - 2] = '^') AND (S[CKeyPos - 1] IN [#0..#9]) THEN
|
||
BEGIN
|
||
Dec(CKeyPos);
|
||
UserColor(1);
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
BackSpace;
|
||
Dec(RP);
|
||
END;
|
||
Dec(CKeyPos);
|
||
END;
|
||
END;
|
||
|
||
BEGIN
|
||
Write_Msg := TRUE;
|
||
HitCmdKey := FALSE;
|
||
HitBkSpc := FALSE;
|
||
ccc := '1';
|
||
RP := 1;
|
||
CKeyPos := 1;
|
||
S := '';
|
||
IF (LastLineStr <> '') THEN
|
||
BEGIN
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
AllowAbort := FALSE;
|
||
Reading_A_Msg := TRUE;
|
||
PrintMain(LastLineStr);
|
||
Reading_A_Msg := FALSE;
|
||
AllowAbort := TRUE;
|
||
S := LastLineStr;
|
||
LastLineStr := '';
|
||
IF (Pos(^[,S) > 0) THEN
|
||
Escp := TRUE;
|
||
CKeyPos := (Length(S) + 1);
|
||
RP := CKeyPos;
|
||
END;
|
||
REPEAT
|
||
IF ((InportFileOpen) AND (Buf = '')) THEN
|
||
IF (NOT EOF(InportFile)) THEN
|
||
BEGIN
|
||
Counter1 := 0;
|
||
REPEAT
|
||
Inc(Counter1);
|
||
Read(InportFile,Buf[Counter1]);
|
||
IF (Buf[Counter1] = ^J) THEN
|
||
Dec(Counter1);
|
||
UNTIL (Counter1 >= 255) OR (Buf[Counter1] = ^M) OR (EOF(InportFile));
|
||
Buf[0] := Chr(Counter1);
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
Close(InportFile);
|
||
InportFileOpen := FALSE;
|
||
DOSANSIOn := FALSE;
|
||
Buf := ^P+'1';
|
||
END;
|
||
CKey := Char(GetKey);
|
||
DoThisChar := FALSE;
|
||
IF ((CKey >= #32) AND (CKey <= #255)) THEN
|
||
BEGIN
|
||
IF (CKey = '/') AND (CKeyPos = 1) THEN
|
||
HitCmdKey := TRUE
|
||
ELSE
|
||
DoThisChar := TRUE;
|
||
END
|
||
ELSE
|
||
CASE CKey OF
|
||
^[ : DoThisChar := TRUE;
|
||
^H : IF (CKeyPos = 1) THEN
|
||
BEGIN
|
||
HitCmdKey := TRUE;
|
||
HitBkSpc := TRUE;
|
||
END
|
||
ELSE
|
||
BkSpc;
|
||
^I : BEGIN
|
||
Counter := (5 - (CKeyPos MOD 5));
|
||
IF ((CKeyPos + Counter) < StrLen) AND ((RP + Counter) < ThisUser.LineLen) THEN
|
||
FOR Counter1 := 1 TO Counter DO
|
||
BEGIN
|
||
OutKey(' ');
|
||
IF (Trapping) THEN
|
||
Write(TrapFile,' ');
|
||
S[CKeyPos] := ' ';
|
||
Inc(RP);
|
||
Inc(CKeyPos);
|
||
END;
|
||
END;
|
||
^J : BEGIN
|
||
OutKey(CKey);
|
||
S[CKeyPos] := CKey;
|
||
IF (Trapping) THEN
|
||
Write(TrapFile,^J);
|
||
Inc(CKeyPos);
|
||
END;
|
||
^N : BEGIN
|
||
OutKey(^H);
|
||
S[CKeyPos] := ^H;
|
||
IF (Trapping) THEN
|
||
Write(TrapFile,^H);
|
||
Inc(CKeyPos);
|
||
Dec(RP);
|
||
END;
|
||
^P : IF (OkANSI OR OkAvatar) AND (CKeyPos < (StrLen - 1)) THEN
|
||
BEGIN
|
||
CKey := Char(GetKey);
|
||
IF (CKey IN ['0'..'9']) THEN
|
||
BEGIN
|
||
ccc := CKey;
|
||
S[CKeyPos] := '^';
|
||
Inc(CKeyPos);
|
||
S[CKeyPos] := CKey;
|
||
Inc(CKeyPos);
|
||
UserColor(Ord(CKey) - Ord('0'));
|
||
END;
|
||
CKey := #0;
|
||
END;
|
||
^W : IF (CKeyPos = 1) THEN
|
||
BEGIN
|
||
HitCmdKey := TRUE;
|
||
HitBkSpc := TRUE;
|
||
END
|
||
ELSE
|
||
REPEAT
|
||
BkSpc
|
||
UNTIL (CKeyPos = 1) OR (S[CKeyPos] = ' ') OR ((S[CKeyPos] = ^H) AND (S[CKeyPos - 1] <> '^'));
|
||
^X,^Y : BEGIN
|
||
CKeyPos := 1;
|
||
FOR Counter := 1 TO (RP - 1) DO
|
||
BackSpace;
|
||
RP := 1;
|
||
IF (ccc <> '1') THEN
|
||
BEGIN
|
||
CKey := ccc;
|
||
S[CKeyPos] := '^';
|
||
Inc(CKeyPos);
|
||
S[CKeyPos] := CKey;
|
||
Inc(CKeyPos);
|
||
UserColor(Ord(CKey) - Ord('0'));
|
||
END;
|
||
CKey := #0;
|
||
END;
|
||
END;
|
||
IF (DoThisChar) AND ((CKey <> ^G) AND (CKey <> ^M)) THEN
|
||
IF ((CKeyPos < StrLen) AND (Escp)) OR ((RP < ThisUser.LineLen) AND (NOT Escp)) THEN
|
||
BEGIN
|
||
IF (CKey = ^[) THEN
|
||
Escp := TRUE;
|
||
S[CKeyPos] := CKey;
|
||
Inc(CKeyPos);
|
||
Inc(RP);
|
||
OutKey(CKey);
|
||
IF (Trapping) THEN
|
||
Write(TrapFile,CKey);
|
||
END;
|
||
UNTIL (((RP - 1) = MaxLineLen) AND (NOT Escp)) OR (CKeyPos = StrLen) OR (CKey = ^M) OR (HitCmdKey) OR (HangUp);
|
||
IF (HitCmdKey) THEN
|
||
BEGIN
|
||
IF (HitBkSpc) THEN
|
||
S := '/'^H
|
||
ELSE
|
||
S := '/';
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
S[0] := Chr(CKeyPos - 1);
|
||
IF (CKey <> ^M) AND (CKeyPos <> StrLen) AND (NOT Escp) THEN
|
||
BEGIN
|
||
Counter := (CKeyPos - 1);
|
||
WHILE (Counter > 1) AND (S[Counter] <> ' ') AND ((S[Counter] <> ^H) OR (S[Counter - 1] = '^')) DO
|
||
Dec(Counter);
|
||
IF (Counter > (RP DIV 2)) AND (Counter <> (CKeyPos - 1)) THEN
|
||
BEGIN
|
||
LastLineStr := Copy(S,(Counter + 1),(CKeyPos - Counter));
|
||
FOR Counter1 := (CKeyPos - 2) DOWNTO Counter DO
|
||
BackSpace;
|
||
S[0] := Chr(Counter - 1);
|
||
END;
|
||
END;
|
||
IF (Escp) AND (RP = ThisUser.LineLen) THEN
|
||
CKeyPos := StrLen;
|
||
IF (CKeyPos <> StrLen) THEN
|
||
NL
|
||
ELSE
|
||
BEGIN
|
||
RP := 1;
|
||
CKeyPos := 1;
|
||
S := S + #29;
|
||
END;
|
||
END;
|
||
Write_Msg := FALSE;
|
||
END;
|
||
|
||
FUNCTION Inputmessage(Pub,
|
||
IsReply: Boolean;
|
||
CONST MsgTitle: Str40;
|
||
VAR MHeader: MHeaderRec;
|
||
CONST ReadInMsg: AStr;
|
||
MaxLineLen: Byte;
|
||
MaxMsgLines: Integer): Boolean;
|
||
CONST
|
||
TopScreen = 3; {first screen line for Text entry}
|
||
ScrollSize = 5; {number OF lines to scroll by}
|
||
TYPE
|
||
LinePointer = ^LineArray;
|
||
LineArray = ARRAY [1..500] OF STRING[120];
|
||
VAR
|
||
LinePtr: LinePointer;
|
||
PhyLine: ARRAY [1..20] OF STRING[78];
|
||
TotalLines: 1..500;
|
||
|
||
MsgSubj: Str40;
|
||
|
||
MsgTo: Str36;
|
||
|
||
ScreenLines,
|
||
MaxLines,
|
||
LastQuoteLine,
|
||
MaxQuoteLines,
|
||
CurrentLine,
|
||
TopLine,
|
||
CCol: Integer;
|
||
|
||
DisableMCI,
|
||
CantAbort,
|
||
Insert_Mode,
|
||
SaveMsg: Boolean;
|
||
|
||
PROCEDURE DoLines;
|
||
BEGIN
|
||
IF (OkANSI OR OkAvatar) THEN
|
||
Print('^4<><34><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>:<3A><>Ŀ^1')
|
||
ELSE
|
||
Print('[---:----:----:----:----:----:----:----|----:----:----:----:----:----:----:---]');
|
||
END;
|
||
|
||
PROCEDURE ANSIG(X,Y: Byte);
|
||
BEGIN
|
||
IF (ComPortSpeed > 0) THEN
|
||
IF (OkAvatar) THEN
|
||
SerialOut(^V^H+Chr(Y)+Chr(X))
|
||
ELSE
|
||
SerialOut(#27+'['+IntToStr(Y)+';'+IntToStr(X)+'H');
|
||
IF (WantOut) THEN
|
||
GoToXY(X,Y);
|
||
END;
|
||
|
||
PROCEDURE Count_Lines;
|
||
BEGIN
|
||
TotalLines := MaxLines;
|
||
WHILE (TotalLines > 0) AND (Length(LinePtr^[TotalLines]) = 0) DO
|
||
Dec(TotalLines);
|
||
END;
|
||
|
||
PROCEDURE Append_Space;
|
||
BEGIN
|
||
LinePtr^[CurrentLine] := LinePtr^[CurrentLine]+' ';
|
||
END;
|
||
|
||
FUNCTION CurLength: Integer;
|
||
BEGIN
|
||
CurLength := Length(LinePtr^[CurrentLine]);
|
||
END;
|
||
|
||
FUNCTION Line_Boundry: Boolean;
|
||
{is the cursor at either the start OF the END OF a line?}
|
||
BEGIN
|
||
Line_Boundry := (CCol = 1) OR (CCol > CurLength);
|
||
END;
|
||
|
||
FUNCTION CurChar: Char;
|
||
{return the character under the cursor}
|
||
BEGIN
|
||
IF (CCol <= CurLength) THEN
|
||
CurChar := LinePtr^[CurrentLine][CCol]
|
||
ELSE
|
||
CurChar := ' ';
|
||
END;
|
||
|
||
FUNCTION LastChar: Char;
|
||
{return the last character on the current line}
|
||
BEGIN
|
||
IF (CurLength = 0) THEN
|
||
LastChar := ' '
|
||
ELSE
|
||
LastChar := LinePtr^[CurrentLine][CurLength];
|
||
END;
|
||
|
||
PROCEDURE Remove_Trailing;
|
||
BEGIN
|
||
WHILE (Length(LinePtr^[CurrentLine]) > 0) AND (LinePtr^[CurrentLine][Length(LinePtr^[CurrentLine])] <= ' ') DO
|
||
Dec(LinePtr^[CurrentLine][0]);
|
||
END;
|
||
|
||
FUNCTION Delimiter: Boolean;
|
||
{return TRUE IF the current character is a Delimiter FOR words}
|
||
BEGIN
|
||
CASE CurChar OF
|
||
'0'..'9', 'a'..'z', 'A'..'Z', '_':
|
||
Delimiter := FALSE;
|
||
ELSE
|
||
Delimiter := TRUE;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Reposition(x: Boolean);
|
||
VAR
|
||
Eol: Integer;
|
||
BEGIN
|
||
IF (x) THEN
|
||
BEGIN
|
||
Eol := (CurLength + 1);
|
||
IF (CCol > Eol) THEN
|
||
CCol := Eol;
|
||
END;
|
||
Count_Lines;
|
||
ANSIG(CCol,((CurrentLine - TopLine) + TopScreen));
|
||
IF (Pos('>',Copy(LinePtr^[CurrentLine],1,4)) > 0) THEN
|
||
Usercolor(3)
|
||
ELSE
|
||
Usercolor(1);
|
||
END;
|
||
|
||
PROCEDURE Set_PhyLine;
|
||
{set physical line to match logical line (indicates display update)}
|
||
BEGIN
|
||
PhyLine[((CurrentLine - TopLine) + 1)] := LinePtr^[CurrentLine];
|
||
END;
|
||
|
||
PROCEDURE Clear_Eol;
|
||
BEGIN
|
||
IF (NOT OkAvatar) THEN
|
||
SerialOut(#27'[K')
|
||
ELSE
|
||
SerialOut(^V^G);
|
||
IF (WantOut) THEN
|
||
ClrEOL;
|
||
END;
|
||
|
||
PROCEDURE Truncate_Line;
|
||
{update screen after changing END-OF-line}
|
||
BEGIN
|
||
IF (CCol > 0) THEN
|
||
LinePtr^[CurrentLine][0] := Chr(CCol - 1);
|
||
Reposition(TRUE);
|
||
Clear_Eol;
|
||
{Set_PhyLine; don't understand this}
|
||
END;
|
||
|
||
PROCEDURE Refresh_Screen;
|
||
VAR
|
||
PLine,
|
||
PCol,
|
||
Phline,
|
||
Junk: Integer;
|
||
BEGIN
|
||
IF (CurrentLine >= MaxLines) THEN
|
||
CurrentLine := MaxLines;
|
||
PLine := CurrentLine;
|
||
CurrentLine := TopLine;
|
||
PCol := CCol;
|
||
CCol := 1;
|
||
FOR Junk := TopLine TO ((TopLine + ScreenLines) - 1) DO
|
||
BEGIN
|
||
CurrentLine:= Junk;
|
||
Phline := ((CurrentLine - TopLine) + 1);
|
||
IF (CurrentLine > MaxLines) THEN
|
||
BEGIN
|
||
Reposition (TRUE);
|
||
Prompt('^9--');
|
||
PhyLine[Phline] := '--';
|
||
Clear_Eol;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
IF (LinePtr^[CurrentLine] <> PhyLine[Phline]) THEN
|
||
BEGIN
|
||
Reposition (TRUE);
|
||
MCIAllowed := FALSE;
|
||
ColorAllowed := FALSE;
|
||
AllowAbort := FALSE;
|
||
PrintMain(Copy(LinePtr^[CurrentLine],1,MaxLineLen));
|
||
MCIAllowed := TRUE;
|
||
ColorAllowed := TRUE;
|
||
AllowAbort := TRUE;
|
||
IF (CurLength < Length(PhyLine[Phline])) THEN
|
||
Clear_Eol;
|
||
Set_PhyLine;
|
||
END;
|
||
END;
|
||
END;
|
||
Tleft;
|
||
CCol := PCol;
|
||
CurrentLine := PLine;
|
||
Reposition(TRUE);
|
||
END;
|
||
|
||
PROCEDURE Scroll_Screen(Lines: Integer);
|
||
BEGIN
|
||
Inc(TopLine,Lines);
|
||
IF (CurrentLine < TopLine) OR (CurrentLine >= (TopLine + ScreenLines)) THEN
|
||
TopLine := ((CurrentLine - ScreenLines) DIV 2);
|
||
IF (TopLine < 1) THEN
|
||
TopLine := 1
|
||
ELSE IF (TopLine >= MaxLines) THEN
|
||
Dec(TopLine,ScrollSize DIV 2);
|
||
Refresh_Screen;
|
||
END;
|
||
|
||
PROCEDURE Cursor_Up;
|
||
BEGIN
|
||
IF (CurrentLine > 1) THEN
|
||
Dec(CurrentLine);
|
||
IF (CurrentLine < TopLine) THEN
|
||
Scroll_Screen(-ScrollSize)
|
||
ELSE
|
||
Reposition(FALSE);
|
||
END;
|
||
|
||
PROCEDURE Cursor_Down;
|
||
BEGIN
|
||
Inc(CurrentLine);
|
||
IF (CurrentLine >= MaxLines) THEN
|
||
BEGIN
|
||
CurrentLine := MaxLines;
|
||
IF (InportFileOpen) THEN
|
||
BEGIN
|
||
InportFileOpen := FALSE;
|
||
Close(InportFile);
|
||
END;
|
||
END;
|
||
IF ((CurrentLine - TopLine) >= ScreenLines) THEN
|
||
Scroll_Screen(ScrollSize)
|
||
ELSE
|
||
Reposition(FALSE);
|
||
END;
|
||
|
||
PROCEDURE Cursor_EndLine;
|
||
BEGIN
|
||
CCol := (MaxLineLen + 1); (* 78 or 79 chars, Test This *)
|
||
Reposition(TRUE);
|
||
END;
|
||
|
||
PROCEDURE Cursor_StartLine;
|
||
BEGIN
|
||
CCol := 1;
|
||
Reposition(TRUE);
|
||
END;
|
||
|
||
PROCEDURE Cursor_Left;
|
||
BEGIN
|
||
IF (CCol = 1) THEN
|
||
BEGIN
|
||
Cursor_Up;
|
||
Cursor_EndLine;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
Dec(CCol);
|
||
IF (NOT OkAvatar) THEN
|
||
SerialOut(#27'[D')
|
||
ELSE
|
||
SerialOut(^V^E);
|
||
GoToXY((WhereX - 1),WhereY);
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Cursor_Right;
|
||
BEGIN
|
||
IF (CCol > CurLength) THEN
|
||
BEGIN
|
||
CCol := 1;
|
||
Cursor_Down;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
OutKey(CurChar);
|
||
Inc(CCol);
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Cursor_WordRight;
|
||
BEGIN
|
||
IF (Delimiter) THEN
|
||
BEGIN
|
||
{skip blanks right}
|
||
REPEAT
|
||
Cursor_Right;
|
||
IF (Line_Boundry) THEN
|
||
Exit;
|
||
UNTIL (NOT Delimiter);
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
{find Next blank right}
|
||
REPEAT
|
||
Cursor_Right;
|
||
IF (Line_Boundry) THEN
|
||
Exit;
|
||
UNTIL (Delimiter);
|
||
{THEN move to a Word start (recursive)}
|
||
Cursor_WordRight;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Cursor_WordLeft;
|
||
BEGIN
|
||
IF (Delimiter) THEN
|
||
BEGIN
|
||
{skip blanks left}
|
||
REPEAT
|
||
Cursor_Left;
|
||
IF (Line_Boundry) THEN
|
||
Exit;
|
||
UNTIL (NOT Delimiter);
|
||
{find Next blank left}
|
||
REPEAT
|
||
Cursor_Left;
|
||
IF (Line_Boundry) THEN
|
||
Exit;
|
||
UNTIL (Delimiter);
|
||
{move to start OF the Word}
|
||
Cursor_Right;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
{find Next blank left}
|
||
REPEAT
|
||
Cursor_Left;
|
||
IF (Line_Boundry) THEN
|
||
Exit;
|
||
UNTIL (Delimiter);
|
||
{AND THEN move a Word left (recursive)}
|
||
Cursor_WordLeft;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Delete_Line;
|
||
{Delete the line at the cursor}
|
||
VAR
|
||
LineNum1: Integer;
|
||
BEGIN
|
||
FOR LineNum1 := CurrentLine TO (MaxLines - 1) DO
|
||
LinePtr^[LineNum1] := LinePtr^[LineNum1 + 1];
|
||
LinePtr^[MaxLines] := '';
|
||
IF (CurrentLine <= TotalLines) AND (TotalLines > 1) THEN
|
||
Dec(TotalLines);
|
||
END;
|
||
|
||
PROCEDURE Insert_Line(CONST Contents: AStr);
|
||
{open a new line at the cursor}
|
||
VAR
|
||
LineNum1: Integer;
|
||
BEGIN
|
||
FOR LineNum1 := MaxLines DOWNTO (CurrentLine + 1) DO
|
||
LinePtr^[LineNum1] := LinePtr^[LineNum1 - 1];
|
||
LinePtr^[CurrentLine] := Contents;
|
||
IF (CurrentLine < TotalLines) THEN
|
||
Inc(TotalLines);
|
||
IF (CurrentLine > TotalLines) THEN
|
||
TotalLines := CurrentLine;
|
||
END;
|
||
|
||
PROCEDURE Reformat_Paragraph;
|
||
BEGIN
|
||
Remove_Trailing;
|
||
CCol := CurLength;
|
||
{FOR each line OF the paragraph}
|
||
WHILE (CurChar <> ' ') DO
|
||
BEGIN
|
||
{FOR each Word OF the current line}
|
||
REPEAT
|
||
{determine Length OF first Word on the following line}
|
||
Inc(CurrentLine);
|
||
Remove_Trailing;
|
||
CCol := 1;
|
||
WHILE (CurChar <> ' ') DO
|
||
Inc(CCol);
|
||
Dec(CurrentLine);
|
||
{hoist a Word From the following line IF it will fit}
|
||
IF (CCol > 1) AND ((CCol + CurLength) < MaxLineLen) THEN
|
||
BEGIN
|
||
IF (CurLength > 0) THEN
|
||
BEGIN
|
||
{add a second space after sentences}
|
||
CASE LastChar OF
|
||
'.', '?', '!':
|
||
Append_Space;
|
||
END;
|
||
Append_Space;
|
||
END;
|
||
LinePtr^[CurrentLine] := LinePtr^[CurrentLine] + Copy(LinePtr^[CurrentLine + 1],1,(CCol - 1));
|
||
{remove the hoisted Word}
|
||
Inc(CurrentLine);
|
||
WHILE (CurChar = ' ') AND (CCol <= CurLength) DO
|
||
Inc(CCol);
|
||
Delete(LinePtr^[CurrentLine],1,(CCol - 1));
|
||
IF (CurLength = 0) THEN
|
||
Delete_Line;
|
||
Dec(CurrentLine);
|
||
END
|
||
ELSE
|
||
CCol := 0; {END OF line}
|
||
UNTIL (CCol = 0);
|
||
{no more lines will fit - either time FOR Next line, OR END OF paragraph}
|
||
Inc(CurrentLine);
|
||
CCol := 1;
|
||
Remove_Trailing;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Word_Wrap;
|
||
{line is full AND a character must be inserted. perform Word-wrap,
|
||
updating screen AND leave ready FOR the insertion}
|
||
VAR
|
||
TempStr1: AStr;
|
||
PCol,
|
||
PLine: Integer;
|
||
BEGIN
|
||
Remove_Trailing;
|
||
PLine := CurrentLine;
|
||
PCol := CCol;
|
||
{find start OF Word to wrap}
|
||
CCol := CurLength;
|
||
WHILE (CCol > 0) AND (CurChar <> ' ') DO
|
||
Dec(CCol);
|
||
{cancel wrap IF no spaces IN whole line}
|
||
IF (CCol = 0) THEN
|
||
BEGIN
|
||
CCol := 1;
|
||
Cursor_Down;
|
||
Exit;
|
||
END;
|
||
{get the portion to be moved down}
|
||
Inc(CCol);
|
||
TempStr1 := Copy(LinePtr^[CurrentLine],CCol,MaxLineLen);
|
||
{remove it From current line AND refresh screen}
|
||
Truncate_Line;
|
||
{place Text on open a new line following the cursor}
|
||
Inc(CurrentLine);
|
||
Insert_Line(TempStr1);
|
||
{join the wrapped Text WITH the following lines OF Text}
|
||
Reformat_Paragraph;
|
||
{restore cursor to proper position after the wrap}
|
||
CurrentLine := PLine;
|
||
IF (PCol > CurLength) THEN
|
||
BEGIN
|
||
CCol := (PCol - CurLength); {position cursor after wrapped Word}
|
||
Inc(CurrentLine); {Cursor_Down;}
|
||
END
|
||
ELSE
|
||
CCol := PCol; {restore original cursor position}
|
||
IF ((CurrentLine - TopLine) >= ScreenLines) THEN
|
||
Scroll_Screen(ScrollSize)
|
||
ELSE
|
||
Refresh_Screen;
|
||
END;
|
||
|
||
PROCEDURE Join_Lines;
|
||
{join the current line WITH the following line, IF possible}
|
||
BEGIN
|
||
Inc(CurrentLine);
|
||
Remove_Trailing;
|
||
Dec(CurrentLine);
|
||
Remove_Trailing;
|
||
IF ((CurLength + Length(LinePtr^[CurrentLine + 1])) >= MaxLineLen) THEN
|
||
Exit;
|
||
IF (LastChar <> ' ') THEN
|
||
Append_Space;
|
||
LinePtr^[CurrentLine] := LinePtr^[CurrentLine]+LinePtr^[CurrentLine + 1];
|
||
Inc(CurrentLine);
|
||
Delete_Line;
|
||
Dec(CurrentLine);
|
||
Refresh_Screen;
|
||
END;
|
||
|
||
PROCEDURE Split_Line;
|
||
{splits the current line at the cursor, leaves cursor IN original position}
|
||
VAR
|
||
TempStr1: AStr;
|
||
PCol: Integer;
|
||
BEGIN
|
||
PCol := CCol;
|
||
Remove_Trailing; {get the portion FOR the Next line}
|
||
TempStr1 := Copy(LinePtr^[CurrentLine],CCol,MaxLineLen);
|
||
Truncate_Line;
|
||
CCol := 1; {open a blank line}
|
||
Inc(CurrentLine);
|
||
Insert_Line(TempStr1);
|
||
IF ((CurrentLine - TopLine) > (ScreenLines - 2)) THEN
|
||
Scroll_Screen(ScrollSize)
|
||
ELSE
|
||
Refresh_Screen;
|
||
Dec(CurrentLine);
|
||
CCol := PCol;
|
||
END;
|
||
|
||
PROCEDURE Cursor_NewLine;
|
||
BEGIN
|
||
IF (Insert_Mode) THEN
|
||
Split_Line;
|
||
CCol := 1;
|
||
Cursor_Down;
|
||
END;
|
||
|
||
PROCEDURE Reformat;
|
||
{reformat paragraph, update display}
|
||
VAR
|
||
PLine: Integer;
|
||
BEGIN
|
||
PLine := CurrentLine;
|
||
Reformat_Paragraph;
|
||
{find start OF Next paragraph}
|
||
WHILE (CurLength = 0) AND (CurrentLine <= TotalLines) DO
|
||
Inc(CurrentLine);
|
||
{find top OF screen FOR Redisplay}
|
||
WHILE ((CurrentLine - TopLine) > (ScreenLines - 2)) DO
|
||
BEGIN
|
||
Inc(TopLine,ScrollSize);
|
||
PLine := TopLine;
|
||
END;
|
||
Refresh_Screen;
|
||
END;
|
||
|
||
PROCEDURE Insert_Char(C1: Char);
|
||
BEGIN
|
||
IF (CCol < CurLength) THEN
|
||
BEGIN
|
||
Remove_Trailing;
|
||
IF (CCol > CurLength) THEN
|
||
Reposition(TRUE);
|
||
END;
|
||
IF (Insert_Mode AND (CurLength >= MaxLineLen)) OR (CCol > MaxLineLen) THEN
|
||
BEGIN
|
||
IF (CCol <= MaxLineLen) THEN
|
||
Word_Wrap
|
||
ELSE IF (C1 = ' ') THEN
|
||
BEGIN
|
||
Cursor_NewLine;
|
||
Exit;
|
||
END
|
||
ELSE IF (LastChar = ' ') THEN
|
||
Cursor_NewLine {nonspace w/space at END-line is newline}
|
||
ELSE
|
||
Word_Wrap; {otherwise wrap Word down AND continue}
|
||
END;
|
||
{Insert character into the middle OF a line}
|
||
IF (Insert_Mode) AND (CCol <= CurLength) THEN
|
||
BEGIN
|
||
Insert(C1,LinePtr^[CurrentLine],CCol);
|
||
{update display line following cursor}
|
||
MCIAllowed := FALSE;
|
||
ColorAllowed := FALSE;
|
||
AllowAbort := FALSE;
|
||
PrintMain(Copy(LinePtr^[CurrentLine],CCol,MaxLineLen));
|
||
MCIAllowed := TRUE;
|
||
ColorAllowed := TRUE;
|
||
AllowAbort := TRUE;
|
||
{position cursor FOR Next insertion}
|
||
Inc(CCol);
|
||
Reposition(TRUE);
|
||
END
|
||
ELSE
|
||
BEGIN {append a character to the END OF a line}
|
||
WHILE (CurLength < CCol) DO
|
||
Append_Space;
|
||
LinePtr^[CurrentLine][CCol] := C1;
|
||
{advance the cursor, updating the display}
|
||
Cursor_Right;
|
||
END;
|
||
Set_PhyLine;
|
||
END;
|
||
|
||
PROCEDURE Delete_Char;
|
||
BEGIN
|
||
{Delete whole line IF it is empty}
|
||
IF (CCol > CurLength) AND (CurLength > 0) THEN
|
||
Join_Lines
|
||
ELSE IF (CCol <= CurLength) THEN
|
||
BEGIN {Delete IN the middle OF a line}
|
||
Delete(LinePtr^[CurrentLine],CCol,1);
|
||
MCIAllowed := FALSE;
|
||
ColorAllowed := FALSE;
|
||
AllowAbort := FALSE;
|
||
PrintMain(Copy(LinePtr^[CurrentLine],CCol,MaxLineLen)+' ');
|
||
MCIAllowed := TRUE;
|
||
ColorAllowed := TRUE;
|
||
AllowAbort := TRUE;
|
||
Reposition(TRUE);
|
||
Set_PhyLine;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Delete_WordRight;
|
||
BEGIN
|
||
IF (CurChar = ' ') THEN
|
||
REPEAT {skip blanks right}
|
||
Delete_Char;
|
||
UNTIL (CurChar <> ' ') OR (CCol > CurLength)
|
||
ELSE
|
||
BEGIN
|
||
REPEAT {find Next blank right}
|
||
Delete_Char;
|
||
UNTIL (Delimiter);
|
||
Delete_Char;
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Page_Down;
|
||
BEGIN
|
||
IF ((TopLine + ScreenLines) < MaxLines) THEN
|
||
BEGIN
|
||
Inc(CurrentLine,ScrollSize);
|
||
Scroll_Screen(ScrollSize);
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE Page_Up;
|
||
BEGIN
|
||
IF (TopLine > 1) THEN
|
||
BEGIN
|
||
Dec(CurrentLine,ScrollSize);
|
||
IF (CurrentLine < 1) THEN
|
||
CurrentLine := 1;
|
||
Scroll_Screen(-ScrollSize);
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
CurrentLine := 1;
|
||
CCol := 1;
|
||
Scroll_Screen(0);
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE FS_Delete_Line;
|
||
{Delete the line at the cursor, update display}
|
||
BEGIN
|
||
Delete_Line;
|
||
Refresh_Screen;
|
||
END;
|
||
|
||
PROCEDURE Display_Insert_Status;
|
||
BEGIN
|
||
ANSIG(69,1);
|
||
Prompt('^1(Mode: ');
|
||
IF (Insert_Mode) THEN
|
||
Prompt('INS)')
|
||
ELSE
|
||
Prompt('OVR)');
|
||
END;
|
||
|
||
PROCEDURE Prepare_Screen;
|
||
VAR
|
||
Counter: Integer;
|
||
BEGIN
|
||
CLS;
|
||
ANSIG(1,1);
|
||
IF (TimeWarn) THEN
|
||
Prompt(^G^G' |12Warning: |10You have less than '+IntToStr(NSL DIV 60 + 1)+' '+
|
||
Plural('minute',NSL DIV 60 + 1)+' remaining online!')
|
||
ELSE
|
||
BEGIN
|
||
Prompt('^1(Ctrl-Z = Help) ^5To:^1 '+PadLeftStr(MsgTo,20)+' ^5Subj: ^1');
|
||
IF (MHeader.FileAttached = 0) THEN
|
||
Print(PadLeftStr(MsgSubj,20))
|
||
ELSE
|
||
Print(PadLeftStr(StripName(MsgSubj),20));
|
||
Display_Insert_Status;
|
||
END;
|
||
ANSIG(1,2);
|
||
DoLines;
|
||
FOR Counter := 1 TO ScreenLines DO {physical lines are now invalid}
|
||
PhyLine[Counter] := '';
|
||
Scroll_Screen(0); {causes Redisplay}
|
||
END;
|
||
|
||
PROCEDURE Redisplay;
|
||
BEGIN
|
||
TopLine := ((CurrentLine - ScreenLines) DIV 2);
|
||
Prepare_Screen;
|
||
END;
|
||
|
||
PROCEDURE FS_Help;
|
||
BEGIN
|
||
CLS;
|
||
PrintF('FSHELP');
|
||
PauseScr(FALSE);
|
||
Prepare_Screen;
|
||
END;
|
||
|
||
PROCEDURE DoQuote(RedrawScreen: Boolean);
|
||
VAR
|
||
QuoteFile: Text;
|
||
TempStr1: AStr;
|
||
Fline,
|
||
Nline,
|
||
QuoteLi: Integer;
|
||
Done: Boolean;
|
||
|
||
PROCEDURE GetOut(x: Boolean);
|
||
BEGIN
|
||
IF (x) THEN
|
||
Close(QuoteFile);
|
||
IF (InvisEdit) AND (RedrawScreen) THEN
|
||
Prepare_Screen;
|
||
MCIAllowed := TRUE;
|
||
END;
|
||
|
||
BEGIN
|
||
Assign(QuoteFile,'TEMPQ'+IntToStr(ThisNode));
|
||
Reset(QuoteFile);
|
||
IF (IOResult <> 0) THEN
|
||
Exit;
|
||
IF (MaxQuoteLines = 0) THEN
|
||
BEGIN
|
||
WHILE NOT EOF(QuoteFile) DO
|
||
BEGIN
|
||
ReadLn(QuoteFile,TempStr1);
|
||
Inc(MaxQuoteLines);
|
||
END;
|
||
Close(QuoteFile);
|
||
Reset(QuoteFile);
|
||
END;
|
||
|
||
MCIAllowed := FALSE;
|
||
Done := FALSE;
|
||
|
||
REPEAT
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
CLS;
|
||
QuoteLi := 0;
|
||
IF (LastQuoteLine > 0) THEN
|
||
WHILE NOT EOF(QuoteFile) AND (QuoteLi < LastQuoteLine) DO
|
||
BEGIN
|
||
ReadLn(QuoteFile,TempStr1);
|
||
Inc(QuoteLi);
|
||
END;
|
||
IF EOF(QuoteFile) THEN
|
||
BEGIN
|
||
LastQuoteLine := 0;
|
||
QuoteLi := 0;
|
||
Reset(QuoteFile);
|
||
END;
|
||
WHILE (NOT EOF(QuoteFile)) AND ((QuoteLi - LastQuoteLine) < (PageLength - 4)) DO
|
||
BEGIN
|
||
ReadLn(QuoteFile,TempStr1);
|
||
Inc(QuoteLi);
|
||
TempStr1 := Copy(PadRightInt(QuoteLi,Length(IntToStr(MaxQuoteLines)))+':'+TempStr1,1,MaxLineLen);
|
||
PrintACR('^3'+TempStr1);
|
||
END;
|
||
Close(QuoteFile);
|
||
Reset(QuoteFile);
|
||
REPEAT
|
||
NL;
|
||
Prt('First line to quote [^5?^4=^5Help^4]: ');
|
||
Scaninput(TempStr1,'HQ?'^M);
|
||
IF (TempStr1 = '?') THEN
|
||
BEGIN
|
||
NL;
|
||
Print('^1<^3Q^1>uit, <^3H^1>eader, <^3?^1>Help, or first line to quote.');
|
||
END
|
||
ELSE IF (TempStr1 = 'H') THEN
|
||
BEGIN
|
||
WHILE (TempStr1 > '') AND (NOT EOF(QuoteFile)) AND (CurrentLine <= MaxLines) DO
|
||
BEGIN
|
||
ReadLn(QuoteFile,TempStr1);
|
||
IF (InvisEdit) THEN
|
||
Insert_Line(TempStr1)
|
||
ELSE
|
||
BEGIN
|
||
LinePtr^[TotalLines] := TempStr1;
|
||
Inc(TotalLines);
|
||
END;
|
||
Inc(CurrentLine);
|
||
END;
|
||
Close(QuoteFile);
|
||
Reset(QuoteFile);
|
||
TempStr1 := 'H';
|
||
END;
|
||
UNTIL ((TempStr1 <> '?') AND (TempStr1 <> 'H')) OR (HangUp);
|
||
Fline := StrToInt(TempStr1);
|
||
IF (Fline <= 0) THEN
|
||
LastQuoteLine := QuoteLi;
|
||
IF (TempStr1 = 'Q') THEN
|
||
Done := TRUE;
|
||
IF (Fline > MaxQuoteLines) OR (HangUp) THEN
|
||
BEGIN
|
||
GetOut(TRUE);
|
||
Exit;
|
||
END;
|
||
IF (Fline > 0) THEN
|
||
BEGIN
|
||
Prt('Last line to quote: ');
|
||
Scaninput(TempStr1,'Q'^M);
|
||
IF (TempStr1 <> #13) THEN
|
||
Nline := StrToInt(TempStr1)
|
||
ELSE
|
||
Nline := Fline;
|
||
IF (Nline < Fline) OR (Nline > MaxQuoteLines) THEN
|
||
BEGIN
|
||
GetOut(TRUE);
|
||
Exit;
|
||
END;
|
||
Nline := ((Nline - Fline) + 1);
|
||
WHILE (NOT EOF(QuoteFile)) AND (Fline > 1) DO
|
||
BEGIN
|
||
Dec(Fline);
|
||
ReadLn(QuoteFile,TempStr1);
|
||
END;
|
||
IF (NOT InvisEdit) THEN
|
||
CurrentLine := TotalLines;
|
||
WHILE (NOT EOF(QuoteFile)) AND (Nline > 0) AND (CurrentLine <= MaxLines) DO
|
||
BEGIN
|
||
Dec(Nline);
|
||
ReadLn(QuoteFile,TempStr1);
|
||
IF (InvisEdit) THEN
|
||
Insert_Line(TempStr1)
|
||
ELSE
|
||
BEGIN
|
||
LinePtr^[TotalLines] := TempStr1;
|
||
Inc(TotalLines);
|
||
END;
|
||
Inc(CurrentLine);
|
||
END;
|
||
Done := TRUE;
|
||
END;
|
||
UNTIL (Done) OR (HangUp);
|
||
GetOut(TRUE);
|
||
LastError := IOResult;
|
||
END;
|
||
|
||
PROCEDURE FS_Editor;
|
||
VAR
|
||
GKey: Word;
|
||
SaveTimeWarn: Boolean;
|
||
BEGIN
|
||
InvisEdit := TRUE;
|
||
Insert_Mode := TRUE;
|
||
SaveTimeWarn := TimeWarn;
|
||
Count_Lines;
|
||
IF (TotalLines > 0) THEN
|
||
CurrentLine := (TotalLines + 1)
|
||
ELSE
|
||
CurrentLine := 1;
|
||
CCol := 1;
|
||
TopLine := 1;
|
||
ScreenLines := (PageLength - 4);
|
||
IF (ScreenLines > 20) THEN
|
||
ScreenLines := 20;
|
||
WHILE (CurrentLine - TopLine) > (ScrollSize + 3) DO
|
||
Inc(TopLine,ScrollSize);
|
||
Prepare_Screen;
|
||
REPEAT
|
||
IF ((InportFileOpen) AND (Buf = '')) THEN
|
||
IF (NOT EOF(InportFile)) THEN
|
||
BEGIN
|
||
ReadLn(InportFile,Buf);
|
||
Buf := Buf + ^M
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
Close(InportFile);
|
||
InportFileOpen := FALSE;
|
||
END;
|
||
IF (TimeWarn) AND (NOT SaveTimeWarn) THEN
|
||
BEGIN
|
||
ANSIG(1,1);
|
||
Prompt(^G^G' |12Warning: |10You have '+IntToStr(NSL DIV 60)+' minute(s) remaining online!');
|
||
ANSIG(CCol,((CurrentLine - TopLine) + TopScreen));
|
||
SaveTimeWarn := TRUE;
|
||
END;
|
||
GKey := GetKey;
|
||
CASE GKey OF
|
||
47 :
|
||
IF (CCol = 1) AND (NOT InportFileOpen) THEN
|
||
GKey := 27
|
||
ELSE
|
||
Insert_Char(Char(GKey));
|
||
127 :
|
||
Delete_Char;
|
||
32..46, 48..126, 128..254 :
|
||
Insert_Char(Char(GKey));
|
||
8 : BEGIN
|
||
IF (CCol = 1) THEN
|
||
BEGIN
|
||
Cursor_Left;
|
||
Join_Lines;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
Cursor_Left;
|
||
Delete_Char;
|
||
END;
|
||
END;
|
||
F_CTRLLEFT,1 :
|
||
Cursor_WordLeft; { ^A }
|
||
2 : Reformat; { ^B }
|
||
F_PGDN,3 :
|
||
Page_Down; { ^C }
|
||
F_RIGHT,4 :
|
||
Cursor_Right; { ^D }
|
||
F_UP,5 :
|
||
Cursor_Up; { ^E }
|
||
F_CTRLRIGHT,6 :
|
||
Cursor_WordRight; { ^F }
|
||
F_DEL,7 :
|
||
Delete_Char; { ^G }
|
||
9 : REPEAT
|
||
Insert_Char(' ');
|
||
UNTIL ((CCol MOD 5) = 0); { ^I }
|
||
10 :
|
||
Join_Lines; { ^J }
|
||
F_END,11 :
|
||
Cursor_EndLine; { ^K }
|
||
12 :
|
||
Redisplay; { ^L }
|
||
13 :
|
||
Cursor_NewLine; { ^M }
|
||
14 :
|
||
BEGIN
|
||
Split_Line;
|
||
Reposition(TRUE);
|
||
END; { ^N }
|
||
16 :
|
||
BEGIN { ^P }
|
||
GKey := GetKey;
|
||
IF (GKey IN [0..9,Ord('0')..Ord('9')]) THEN
|
||
BEGIN
|
||
Insert_Char('^');
|
||
Insert_Char(Char(GKey));
|
||
END
|
||
ELSE
|
||
Buf := Char(GKey);
|
||
GKey := 0;
|
||
END;
|
||
17 :
|
||
DoQuote(TRUE); { ^Q }
|
||
F_PGUP,18 :
|
||
Page_Up; { ^R }
|
||
F_LEFT,19 :
|
||
Cursor_Left; { ^S }
|
||
20 :
|
||
Delete_WordRight;{ ^T }
|
||
F_INS,22 :
|
||
BEGIN { ^V }
|
||
Insert_Mode := NOT Insert_Mode;
|
||
Display_Insert_Status;
|
||
Reposition(TRUE);
|
||
END;
|
||
F_HOME,23 :
|
||
Cursor_StartLine; { ^W }
|
||
F_DOWN,24 :
|
||
Cursor_Down; { ^X }
|
||
25 :
|
||
FS_Delete_Line; { ^Y }
|
||
26 :
|
||
FS_Help; { ^Z }
|
||
END;
|
||
UNTIL ((GKey = 27) AND (NOT InportFileOpen)) OR (HangUp);
|
||
IF (InportFileOpen) THEN
|
||
BEGIN
|
||
Close(InportFile);
|
||
InportFileOpen := FALSE;
|
||
END;
|
||
Count_Lines;
|
||
InvisEdit := FALSE;
|
||
END;
|
||
|
||
PROCEDURE PrintMsgTitle;
|
||
BEGIN
|
||
NL;
|
||
(*
|
||
Print(FString.lentermsg1);
|
||
*)
|
||
lRGLngStr(6,FALSE);
|
||
(*
|
||
Print(FString.lentermsg2);
|
||
*)
|
||
lRGLNGStr(7,FALSE);
|
||
DoLines;
|
||
END;
|
||
|
||
PROCEDURE InputTheMessage(CantAbort1: Boolean; VAR DisableMCI1,SaveMsg1: Boolean);
|
||
VAR
|
||
LineStr,
|
||
TempStr1,
|
||
TempStr2,
|
||
TempStr3: AStr;
|
||
SaveMsgSubj: Str40;
|
||
Cmd,
|
||
Drive: Char;
|
||
SaveFileAttached,
|
||
HelpCounter: Byte;
|
||
Counter,
|
||
LineNum1,
|
||
LineNum2: SmallInt;
|
||
ShowCont,
|
||
ExitMsg,
|
||
SaveLine,
|
||
AbortMsg: Boolean;
|
||
|
||
PROCEDURE EditMsgTo(VAR MsgTo1: Str36);
|
||
VAR
|
||
User: UserRecordType;
|
||
TempMsgTo: Str36;
|
||
UNum: Integer;
|
||
BEGIN
|
||
{ Print(FString.default + ^M^J); }
|
||
lRGLngStr(34,FALSE);
|
||
IF (Pub) AND (NOT (MAInternet IN MemMsgArea.MAFlags)) THEN
|
||
BEGIN
|
||
Prt('To: ');
|
||
IF (MsgTo1 <> '') THEN
|
||
InputDefault(TempMsgTo,MsgTo1,36,[NoLineFeed,CapWords],FALSE)
|
||
ELSE
|
||
BEGIN
|
||
MPL(36);
|
||
InputMain(TempMsgTo,36,[NoLineFeed,CapWords]);
|
||
END;
|
||
MsgTo1 := TempMsgTo;
|
||
UserColor(6);
|
||
FOR UNum := 1 TO LennMCI(MsgTo1) DO
|
||
BackSpace;
|
||
UNum := StrToInt(MsgTo1);
|
||
IF (UNum >= 1) AND (UNum <= (MaxUsers - 1)) AND NOT (NetMail IN MHeader.Status) THEN
|
||
BEGIN
|
||
LoadURec(User,UNum);
|
||
MsgTo1 := Caps(User.Name);
|
||
MHeader.MTO.UserNum := UNum;
|
||
MHeader.MTO.Real := User.RealName;
|
||
IF (Pub) AND (MARealName IN MemMsgArea.MAFlags) THEN
|
||
MsgTo1 := Caps(User.RealName)
|
||
ELSE
|
||
MsgTo1 := Caps(User.Name);
|
||
END;
|
||
IF (SQOutSp(MsgTo1) = '') THEN
|
||
MsgTo1 := 'All';
|
||
IF (MsgTo1 <> '') THEN
|
||
BEGIN
|
||
Prompt(MsgTo1);
|
||
UserColor(1);
|
||
NL;
|
||
END;
|
||
END
|
||
ELSE IF (NOT (MAInternet IN MemMsgArea.MAFlags)) THEN
|
||
Print(PadLeftStr('^4To: ^6'+Caps(MsgTo1),40));
|
||
END;
|
||
|
||
PROCEDURE EditMsgSubj(VAR MsgSubj1: Str40; CantAbort2: Boolean);
|
||
VAR
|
||
TempMsgSubj: Str40;
|
||
BEGIN
|
||
IF (MHeader.FileAttached = 0) AND (NOT CantAbort2) THEN
|
||
BEGIN
|
||
Prt('Subject: ');
|
||
IF (MsgSubj1 <> '') THEN
|
||
InputDefault(TempMsgSubj,MsgSubj1,40,[NoLineFeed],FALSE)
|
||
ELSE
|
||
BEGIN
|
||
MPL(40);
|
||
InputMain(TempMsgSubj,40,[NoLineFeed]);
|
||
END;
|
||
IF (TempMsgSubj <> '') THEN
|
||
MsgSubj1 := TempMsgSubj
|
||
ELSE
|
||
BEGIN
|
||
IF (MsgSubj1 <> '') THEN
|
||
Prompt('^6'+MsgSubj1+'^1');
|
||
END;
|
||
NL;
|
||
END
|
||
ELSE
|
||
MsgSubj1 := MHeader.Subject;
|
||
UserColor(1);
|
||
END;
|
||
|
||
PROCEDURE FileAttach(VAR ExitMsg1: Boolean);
|
||
VAR
|
||
FileName: Str40;
|
||
DOk,
|
||
KAbort,
|
||
AddBatch: Boolean;
|
||
TransferTime: LongInt;
|
||
BEGIN
|
||
NL;
|
||
Prt('File name: ');
|
||
MPL(40);
|
||
Input(FileName,40);
|
||
NL;
|
||
IF (NOT CoSysOp) OR (NOT IsUL(FileName)) THEN
|
||
FileName := General.FileAttachPath+StripName(FileName);
|
||
IF (NOT Exist(FileName)) AND (NOT InCom) AND (NOT Exist(FileName)) AND (FileName <> '') THEN
|
||
BEGIN
|
||
Print('^7That file does not exist!^1');
|
||
ExitMsg1 := FALSE;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
IF Exist(FileName) AND (NOT CoSysOp) THEN
|
||
BEGIN
|
||
Print('^7You cannot use that file name!^1');
|
||
ExitMsg1 := FALSE;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
IF (NOT Exist(FileName)) AND (InCom) THEN
|
||
BEGIN
|
||
Receive(FileName,TempDir+'\UP',FALSE,DOk,KAbort,AddBatch,TransferTime);
|
||
MHeader.FileAttached := 1;
|
||
END
|
||
ELSE IF Exist(FileName) THEN
|
||
BEGIN
|
||
DOk := TRUE;
|
||
MHeader.FileAttached := 2;
|
||
END;
|
||
IF (DOk) THEN
|
||
BEGIN
|
||
MsgSubj := FileName;
|
||
IF (CoSysOp) AND (NOT (NetMail IN MHeader.Status)) THEN
|
||
BEGIN
|
||
IF PYNQ('Delete file upon receipt? ',0,FALSE) THEN
|
||
MHeader.FileAttached := 1
|
||
ELSE
|
||
MHeader.FileAttached := 2
|
||
END
|
||
ELSE
|
||
MHeader.FileAttached := 1;
|
||
END
|
||
ELSE
|
||
MHeader.FileAttached := 0;
|
||
END;
|
||
END;
|
||
UserColor(1);
|
||
END;
|
||
|
||
PROCEDURE ListMsg(LineNum1: Integer; DisplayLineNum: Boolean; VAR SaveLine: Boolean);
|
||
BEGIN
|
||
MCIAllowed := FALSE;
|
||
AllowContinue := TRUE;
|
||
DOSANSIOn := FALSE;
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
NL;
|
||
WHILE ((LineNum1 <= (TotalLines - 1)) AND (NOT Abort) AND (NOT HangUp)) DO
|
||
BEGIN
|
||
IF (DisplayLineNum) THEN
|
||
Print('^3'+IntToStr(LineNum1)+':');
|
||
Reading_A_Msg := TRUE;
|
||
IF (NOT DOSANSIOn) THEN
|
||
IF (Pos('>',Copy(LinePtr^[LineNum1],1,4)) > 0) THEN
|
||
UserColor(3)
|
||
ELSE
|
||
UserColor(1);
|
||
PrintACR(LinePtr^[LineNum1]);
|
||
Reading_A_Msg := FALSE;
|
||
Inc(LineNum1);
|
||
END;
|
||
IF (DisplayLineNum) THEN
|
||
BEGIN
|
||
NL;
|
||
Print(' ^7** ^3'+IntToStr(TotalLines - 1)+' '+(Plural('line',(TotalLines - 1))+' ^7**'));
|
||
END;
|
||
MCIAllowed := TRUE;
|
||
AllowContinue := FALSE;
|
||
DOSANSIOn := FALSE;
|
||
SaveLine := FALSE;
|
||
UserColor(1);
|
||
END;
|
||
|
||
PROCEDURE UploadFile;
|
||
VAR
|
||
TempStr1: AStr;
|
||
DOk,
|
||
KAbort,
|
||
AddBatch: Boolean;
|
||
TransferTime: LongInt;
|
||
BEGIN
|
||
NL;
|
||
TempStr1 := '';
|
||
IF (CoSysOp) THEN
|
||
BEGIN
|
||
Prt('Enter file to import [Enter=Upload]: ');
|
||
MPL(40);
|
||
Input(TempStr1,40);
|
||
END;
|
||
IF (TempStr1 = '') THEN
|
||
BEGIN
|
||
TempStr1 := 'TEMPMSG.'+IntToStr(ThisNode);
|
||
IF Exist(TempStr1) THEN
|
||
Kill(TempStr1);
|
||
END;
|
||
IF (NOT Exist(TempStr1)) AND (InCom) THEN
|
||
BEGIN
|
||
Receive(TempStr1,TempDir+'UP\',FALSE,DOk,KAbort,AddBatch,TransferTime);
|
||
TempStr1 := TempDir+'UP\'+TempStr1;
|
||
END;
|
||
IF ((TempStr1 <> '') AND (NOT HangUp)) THEN
|
||
BEGIN
|
||
Assign(InportFile,TempStr1);
|
||
Reset(InportFile);
|
||
IF (IOResult = 0) THEN
|
||
InportFileOpen := TRUE;
|
||
END;
|
||
UserColor(1);
|
||
END;
|
||
|
||
BEGIN
|
||
FillChar(LinePtr^,(MaxLines * 121),0);
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
AbortMsg := FALSE;
|
||
SaveMsg1 := FALSE;
|
||
DisableMCI1 := FALSE;
|
||
TotalLines := 1;
|
||
LastLineStr := '';
|
||
|
||
IF (NOT CheckDriveSpace('Message posting',General.MsgPath,General.MinSpaceForPost)) THEN
|
||
MsgSubj := ''
|
||
ELSE
|
||
BEGIN
|
||
IF (ReadInMsg <> '') THEN
|
||
BEGIN
|
||
Assign(InportFile,ReadInMsg);
|
||
Reset(InportFile);
|
||
IF (IOResult = 0) THEN
|
||
BEGIN
|
||
WHILE (NOT EOF(InportFile)) AND ((TotalLines - 1) <= MaxLines) DO
|
||
BEGIN
|
||
ReadLn(InportFile,LinePtr^[TotalLines]);
|
||
Inc(TotalLines);
|
||
END;
|
||
Close(InportFile);
|
||
END;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
EditMsgTo(MsgTo);
|
||
NL;
|
||
EditMsgSubj(MsgSubj,CantAbort1);
|
||
END;
|
||
END;
|
||
|
||
IF (MsgSubj = '') THEN
|
||
IF (NOT CantAbort1) THEN
|
||
BEGIN
|
||
SaveMsg1 := FALSE;
|
||
NL;
|
||
Print('Aborted!');
|
||
Exit;
|
||
END;
|
||
|
||
IF (FSEditor IN ThisUser.SFlags) THEN
|
||
BEGIN
|
||
REPEAT
|
||
FS_Editor;
|
||
REPEAT
|
||
ExitMsg := TRUE;
|
||
NL;
|
||
Prt('Full screen editor (^5?^4=^5Help^4): ');
|
||
OneK(Cmd,^M'ACFMQSTU?',TRUE,TRUE);
|
||
NL;
|
||
CASE Cmd OF
|
||
'A' : IF (CantAbort1) THEN
|
||
BEGIN
|
||
Print('^7You can not abort this message!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF PYNQ('Abort message? ',0,FALSE) THEN
|
||
BEGIN
|
||
AbortMsg := TRUE;
|
||
SaveMsg1 := FALSE;
|
||
NL;
|
||
Print('Aborted!');
|
||
END;
|
||
'C' : IF (TotalLines = 0) THEN
|
||
BEGIN
|
||
Print('^7Nothing to clear!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF PYNQ('Clear message? ',0,FALSE) THEN
|
||
FOR LineNum1 := 1 TO TotalLines DO
|
||
LinePtr^[LineNum1][0] := #0;
|
||
'F' : IF (NOT AACS(General.FileAttachACS)) THEN
|
||
BEGIN
|
||
Print('^7You do not have access to this command!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF (CantAbort1) THEN
|
||
BEGIN
|
||
Print('^7You can not attach a file to this message!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF (MHeader.FileAttached > 0) THEN
|
||
BEGIN
|
||
Print('File attached: ^5'+StripName(MsgSubj));
|
||
NL;
|
||
IF (PYNQ('Replace the attached file? ',0,FALSE)) THEN
|
||
FileAttach(ExitMsg)
|
||
ELSE
|
||
BEGIN
|
||
NL;
|
||
IF (PYNQ('Remove the attached file? ',0,FALSE)) THEN
|
||
BEGIN
|
||
SaveFileAttached := MHeader.FileAttached;
|
||
SaveMsgSubj := MsgSubj;
|
||
MHeader.FileAttached := 0;
|
||
MsgSubj := '';
|
||
NL;
|
||
EditMsgSubj(MsgSubj,CantAbort1);
|
||
IF (MsgSubj = '') THEN
|
||
BEGIN
|
||
MsgSubj := SaveMsgSubj;
|
||
MHeader.FileAttached := SaveFileAttached;
|
||
NL;
|
||
Print('Aborted!');
|
||
END;
|
||
END;
|
||
END;
|
||
END
|
||
ELSE IF PYNQ('Attach a file to this message? ',0,FALSE) THEN
|
||
FileAttach(ExitMsg);
|
||
'M' : IF (NOT AACS(MemMsgArea.MCIACS)) THEN
|
||
BEGIN
|
||
Print('^7You do not have access to this command!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE
|
||
DisableMCI1 := PYNQ('Disable MCI Codes for this message ['+SQOutSp(ShowYesNo(DisableMCI1))+']? ',0,FALSE);
|
||
'Q' : IF (NOT Exist('TEMPQ'+IntToStr(ThisNode))) THEN
|
||
BEGIN
|
||
Print('^7You are not replying to a message!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF ((TotalLines + 1) = MaxLines) THEN
|
||
BEGIN
|
||
Print('^7You have reached the maximum line limit!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
InvisEdit := TRUE;
|
||
DoQuote(FALSE);
|
||
InvisEdit := FALSE;
|
||
END;
|
||
'S' : BEGIN
|
||
FOR Counter := TotalLines DOWNTO 1 DO
|
||
BEGIN
|
||
LineNum2 := 0;
|
||
FOR LineNum1 := 1 TO Length(LinePtr^[Counter]) DO
|
||
IF (LinePtr^[Counter][LineNum1] <> ' ') THEN
|
||
Inc(LineNum2);
|
||
IF (LineNum2 = 0) THEN
|
||
BEGIN
|
||
LinePtr^[Counter][0] := #0;
|
||
Dec(TotalLines)
|
||
END
|
||
ELSE
|
||
Counter := 1;
|
||
END;
|
||
IF (CantAbort1) AND (TotalLines = 0) THEN
|
||
BEGIN
|
||
Print('^7You must complete this message!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF (TotalLines = 0) THEN
|
||
BEGIN
|
||
Print('^7Nothing to save!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
SaveMsg1 := TRUE;
|
||
AbortMsg := FALSE;
|
||
Inc(TotalLines);
|
||
END;
|
||
END;
|
||
'T' : IF (CantAbort1) THEN
|
||
BEGIN
|
||
Print('^7The receiver and subject can not be changed!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
IF (NOT Pub) OR (MAInternet IN MemMsgArea.MAFlags) THEN
|
||
BEGIN
|
||
Print('^7The receiver of this message can not be changed!');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE
|
||
EditMsgTo(MsgTo);
|
||
NL;
|
||
IF (MHeader.FileAttached > 0) THEN
|
||
BEGIN
|
||
Print('^7The subject of this message can not be changed!');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE
|
||
EditMsgSubj(MsgSubj,CantAbort1);
|
||
END;
|
||
'U' : IF ((TotalLines + 1) = MaxLines) THEN
|
||
BEGIN
|
||
Print('^7You have reached the maximum line limit!^1');
|
||
ExitMsg := FALSE;
|
||
END
|
||
ELSE IF PYNQ('Import a file to this message? ',0,FALSE) THEN
|
||
UploadFile;
|
||
^M : ExitMsg := TRUE;
|
||
'?' : BEGIN
|
||
PrintF('FSHELP');
|
||
ExitMsg := FALSE;
|
||
END;
|
||
END;
|
||
UNTIL (AbortMsg) OR (ExitMsg) OR (SaveMsg1) OR (HangUp);
|
||
UNTIL ((AbortMsg) OR (SaveMsg1) OR (HangUp));
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
PrintMsgTitle;
|
||
HelpCounter := 1;
|
||
REPEAT
|
||
SaveLine := TRUE;
|
||
ExitMsg := TRUE;
|
||
InputLine(LineStr,MaxLineLen);
|
||
REPEAT
|
||
IF (LineStr = '/'^H) THEN
|
||
BEGIN
|
||
SaveLine := FALSE;
|
||
IF ((TotalLines - 1) >= 1) THEN
|
||
BEGIN
|
||
Dec(TotalLines);
|
||
LastLineStr := LinePtr^[TotalLines];
|
||
IF (LastLineStr[Length(LastLineStr)] = #1) THEN
|
||
LastLineStr := Copy(LastLineStr,1,(Length(LastLineStr) - 1));
|
||
NL;
|
||
Print('^3Backed up to line '+IntToStr(TotalLines)+':^1');
|
||
END;
|
||
END;
|
||
IF (LineStr = '/') AND (NOT (InportFileOpen)) THEN
|
||
BEGIN
|
||
SaveLine := FALSE;
|
||
ShowCont := TRUE;
|
||
NL;
|
||
Prt('Line editor (^5?^4=^5Help^4): ');
|
||
OneK(Cmd,^M'ACDFILMOPQRSTUZ?',TRUE,TRUE);
|
||
IF (Cmd <> ^M) THEN
|
||
NL;
|
||
CASE Cmd OF
|
||
'A' : IF (CantAbort1) THEN
|
||
Print('^7You can not abort this message!^1')
|
||
ELSE IF PYNQ('Abort message? ',0,FALSE) THEN
|
||
BEGIN
|
||
AbortMsg := TRUE;
|
||
SaveMsg1 := FALSE;
|
||
ShowCont := FALSE;
|
||
NL;
|
||
Print('Aborted!');
|
||
END;
|
||
'C' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7Nothing to clear!^1')
|
||
ELSE IF PYNQ('Clear message? ',0,FALSE) THEN
|
||
BEGIN
|
||
IF ((TotalLines - 1) = MaxLines) THEN
|
||
ExitMsg := TRUE;
|
||
FOR LineNum1 := 1 TO (TotalLines - 1) DO
|
||
LinePtr^[LineNum1][0] := #0;
|
||
TotalLines := 1;
|
||
Escp := FALSE;
|
||
ShowCont := FALSE;
|
||
NL;
|
||
Print('^0Message cleared ... Start over ...^1');
|
||
NL;
|
||
END;
|
||
'D' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7No lines to delete!^1')
|
||
ELSE
|
||
BEGIN
|
||
LineNum1 := -1;
|
||
InputIntegerWOC('Delete which line',LineNum1,[NumbersOnly],1,(TotalLines - 1));
|
||
IF (LineNum1 >= 1) AND (LineNum1 <= (TotalLines - 1)) THEN
|
||
BEGIN
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
NL;
|
||
Print('^3Line '+IntToStr(LineNum1)+':');
|
||
MCIAllowed := FALSE;
|
||
PrintAcr('^1'+LinePtr^[LineNum1]);
|
||
MCIAllowed := TRUE;
|
||
NL;
|
||
IF (PYNQ('Delete this line? ',0,FALSE)) THEN
|
||
BEGIN
|
||
IF ((TotalLines - 1) = MaxLines) THEN
|
||
ExitMsg := TRUE;
|
||
FOR LineNum2 := LineNum1 TO (TotalLines - 2) DO
|
||
LinePtr^[LineNum2] := LinePtr^[LineNum2 + 1];
|
||
Dec(TotalLines);
|
||
NL;
|
||
Print('^0Line '+IntToStr(LineNum1)+' deleted.^1');
|
||
END;
|
||
END;
|
||
END;
|
||
'F' : IF (NOT AACS(General.FileAttachACS)) THEN
|
||
Print('^7You do not have access to this command!^1')
|
||
ELSE IF (CantAbort1) THEN
|
||
Print('^7You can not attach a file to this message!^1')
|
||
ELSE IF (MHeader.FileAttached > 0) THEN
|
||
BEGIN
|
||
Print('File attached: ^5'+StripName(MsgSubj));
|
||
NL;
|
||
IF (PYNQ('Replace the attached file? ',0,FALSE)) THEN
|
||
BEGIN
|
||
FileAttach(ExitMsg);
|
||
ExitMsg := TRUE;
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
NL;
|
||
IF (PYNQ('Remove the attached file? ',0,FALSE)) THEN
|
||
BEGIN
|
||
SaveFileAttached := MHeader.FileAttached;
|
||
SaveMsgSubj := MsgSubj;
|
||
MHeader.FileAttached := 0;
|
||
MsgSubj := '';
|
||
NL;
|
||
EditMsgSubj(MsgSubj,CantAbort1);
|
||
IF (MsgSubj = '') THEN
|
||
BEGIN
|
||
MsgSubj := SaveMsgSubj;
|
||
MHeader.FileAttached := SaveFileAttached;
|
||
NL;
|
||
Print('Aborted!');
|
||
END;
|
||
END;
|
||
END;
|
||
END
|
||
ELSE IF PYNQ('Attach a file to this message? ',0,FALSE) THEN
|
||
BEGIN
|
||
FileAttach(ExitMsg);
|
||
ExitMsg := TRUE;
|
||
END;
|
||
'I' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7No lines to insert before!^1')
|
||
ELSE IF ((TotalLines - 1) >= MaxLines) THEN
|
||
Print('^7You have reached the maximum line limit!^1')
|
||
ELSE
|
||
BEGIN
|
||
LineNum1 := -1;
|
||
InputIntegerWOC('Insert before which line',LineNum1,[NumbersOnly],1,TotalLines);
|
||
IF (LineNum1 >= 1) AND (LineNum1 <= TotalLines) THEN
|
||
BEGIN
|
||
NL;
|
||
Print('^3Line '+IntToStr(LineNum1)+':');
|
||
UserColor(1);
|
||
InputLine(TempStr1,MaxLineLen);
|
||
NL;
|
||
IF (PYNQ('Insert this line? ',0,FALSE)) THEN
|
||
BEGIN
|
||
FOR LineNum2 := TotalLines DOWNTO (LineNum1 + 1) DO
|
||
LinePtr^[LineNum2] := LinePtr^[LineNum2 - 1];
|
||
LinePtr^[LineNum1] := TempStr1;
|
||
Inc(TotalLines);
|
||
IF ((TotalLines - 1) = MaxLines) THEN
|
||
ExitMsg := FALSE;
|
||
NL;
|
||
Print('^0Line '+IntToStr(LineNum1)+' inserted.^1');
|
||
END;
|
||
END;
|
||
END;
|
||
'L' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7Nothing to list!^1')
|
||
ELSE
|
||
BEGIN
|
||
IF (PYNQ('List entire message? ',0,TRUE)) THEN
|
||
BEGIN
|
||
NL;
|
||
ListMsg(1,PYNQ('List message with line numbers? ',0,FALSE),SaveLine);
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
LineNum1 := -1;
|
||
InputIntegerWOC('%LFStaring line number',LineNum1,[NumbersOnly],1,(TotalLines - 1));
|
||
IF (LineNum1 >= 1) AND (LineNum1 <= (TotalLines - 1)) THEN
|
||
BEGIN
|
||
NL;
|
||
ListMsg(LineNum1,PYNQ('List message with line numbers? ',0,FALSE),SaveLine);
|
||
END;
|
||
END;
|
||
ShowCont := FALSE;
|
||
END;
|
||
'M' : IF (NOT AACS(MemMsgArea.MCIACS)) THEN
|
||
Print('^7You do not have access to this command!^1')
|
||
ELSE
|
||
DisableMCI1 := PYNQ('Disable MCI Codes for this message ['+SQOutSp(ShowYesNo(DisableMCI1))+']? ',0,FALSE);
|
||
'O' : PrintF('COLOR');
|
||
'P' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7No lines to replace a string!^1')
|
||
ELSE
|
||
BEGIN
|
||
LineNum1 := -1;
|
||
InputIntegerWOC('Line to replace string',LineNum1,[NumbersOnly],1,(TotalLines - 1));
|
||
IF (LineNum1 >= 1) AND (LineNum1 <= (TotalLines - 1)) THEN
|
||
BEGIN
|
||
TempStr3 := LinePtr^[LineNum1];
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
NL;
|
||
Print('^3Old line '+IntToStr(LineNum1)+':');
|
||
MCIAllowed := FALSE;
|
||
PrintACR('^1'+TempStr3);
|
||
MCIAllowed := TRUE;
|
||
NL;
|
||
Print('^4Enter string to replace:');
|
||
Prt(': ');
|
||
InputL(TempStr1,MaxLineLen);
|
||
IF (TempStr1 <> '') THEN
|
||
IF (Pos(TempStr1,LinePtr^[LineNum1]) = 0) THEN
|
||
BEGIN
|
||
NL;
|
||
Print('^7String not found.^1');
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
NL;
|
||
Print('^4Enter replacement string:');
|
||
Prt(': ');
|
||
InputL(TempStr2,MaxLineLen);
|
||
IF (TempStr2 <> '') THEN
|
||
BEGIN
|
||
IF (Pos(TempStr1,TempStr3) > 0) THEN
|
||
BEGIN
|
||
Insert(TempStr2,TempStr3,(Pos(TempStr1,TempStr3) + Length(TempStr1)));
|
||
Delete(TempStr3,Pos(TempStr1,TempStr3),Length(TempStr1));
|
||
END;
|
||
NL;
|
||
Print('^3New line '+IntToStr(LineNum1)+':');
|
||
MCIAllowed := FALSE;
|
||
PrintACR('^1'+TempStr3);
|
||
MCIAllowed := TRUE;
|
||
NL;
|
||
IF (PYNQ('Save this line? ',0,FALSE)) THEN
|
||
BEGIN
|
||
Insert(TempStr2,LinePtr^[LineNum1],(Pos(TempStr1,LinePtr^[LineNum1]) + Length(TempStr1)));
|
||
Delete(LinePtr^[LineNum1],Pos(TempStr1,LinePtr^[LineNum1]),Length(TempStr1));
|
||
NL;
|
||
Print('^0Line '+IntToStr(LineNum1)+' saved.^1');
|
||
END;
|
||
END;
|
||
END;
|
||
END;
|
||
END;
|
||
'Q' : IF (NOT Exist('TEMPQ'+IntToStr(ThisNode))) THEN
|
||
Print('^7You are not replying to a message!^1')
|
||
ELSE IF ((TotalLines - 1) >= MaxLines) THEN
|
||
Print('^7You have reached the maximum line limit!^1')
|
||
ELSE
|
||
BEGIN
|
||
DoQuote(FALSE);
|
||
NL;
|
||
CLS;
|
||
PrintMsgTitle;
|
||
Print('^0Quoting complete ... Continue ...^1');
|
||
NL;
|
||
IF ((TotalLines - 1) >= 1) THEN
|
||
IF ((TotalLines - 1) > 10) THEN
|
||
ListMsg(((TotalLines - 1) - 10),FALSE,SaveLine)
|
||
ELSE
|
||
ListMsg(1,FALSE,SaveLine);
|
||
ShowCont := FALSE;
|
||
END;
|
||
'R' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7No last line to delete!^1')
|
||
ELSE
|
||
BEGIN
|
||
LineNum1 := (TotalLines - 1);
|
||
Print('^3Line '+IntToStr(LineNum1)+':');
|
||
MCIAllowed := FALSE;
|
||
PrintAcr('^1'+LinePtr^[(LineNum1)]);
|
||
MCIAllowed := TRUE;
|
||
NL;
|
||
IF (PYNQ('Delete the last line? ',0,FALSE)) THEN
|
||
BEGIN
|
||
IF ((TotalLines - 1) = MaxLines) THEN
|
||
ExitMsg := TRUE;
|
||
Dec(TotalLines);
|
||
NL;
|
||
Print('^0Line '+IntToStr(LineNum1)+' deleted.^1');
|
||
END;
|
||
END;
|
||
'S' : BEGIN
|
||
WHILE (((TotalLines - 1) >= 1) AND ((LinePtr^[TotalLines - 1] = '') OR
|
||
(LinePtr^[TotalLines - 1] = ^J))) DO
|
||
Dec(TotalLines);
|
||
FOR Counter := (TotalLines - 1) DOWNTO 1 DO
|
||
BEGIN
|
||
LineNum2 := 0;
|
||
FOR LineNum1 := 1 TO Length(LinePtr^[Counter]) DO
|
||
IF (LinePtr^[Counter][LineNum1] <> ' ') THEN
|
||
Inc(LineNum2);
|
||
IF (LineNum2 = 0) THEN
|
||
BEGIN
|
||
LinePtr^[Counter][0] := #0;
|
||
Dec(TotalLines)
|
||
END
|
||
ELSE
|
||
Counter := 1;
|
||
END;
|
||
IF (CantAbort1) AND ((TotalLines - 1) < 1) THEN
|
||
Print('^7You must complete this message!^1')
|
||
ELSE IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7Nothing to save!^1')
|
||
ELSE
|
||
BEGIN
|
||
SaveMsg1 := TRUE;
|
||
AbortMsg := FALSE;
|
||
ShowCont := FALSE;
|
||
END;
|
||
END;
|
||
'T' : IF (CantAbort1) THEN
|
||
Print('^7The receiver and subject can not be changed!^1')
|
||
ELSE
|
||
BEGIN
|
||
IF (NOT Pub) OR (MAInternet IN MemMsgArea.MAFlags) THEN
|
||
Print('^7The receiver of this message can not be changed!')
|
||
ELSE
|
||
EditMsgTo(MsgTo);
|
||
NL;
|
||
IF (MHeader.FileAttached > 0) THEN
|
||
Print('^7The subject of this message can not be changed!')
|
||
ELSE
|
||
EditMsgSubj(MsgSubj,CantAbort1);
|
||
END;
|
||
'U' : IF ((TotalLines - 1) >= MaxLines) THEN
|
||
Print('^7You have reached the maximum line limit!^1')
|
||
ELSE IF PYNQ('Import a file to this message? ',0,FALSE) THEN
|
||
UploadFile;
|
||
'Z' : IF ((TotalLines - 1) < 1) THEN
|
||
Print('^7No lines to replace!')
|
||
ELSE
|
||
BEGIN
|
||
LineNum1 := -1;
|
||
InputIntegerWOC('Line number to replace',LineNum1,[NumbersOnly],1,(TotalLines - 1));
|
||
IF ((LineNum1 >= 1) AND (LineNum1 <= (TotalLines - 1))) THEN
|
||
BEGIN
|
||
Abort := FALSE;
|
||
Next := FALSE;
|
||
NL;
|
||
Print('^3Old line '+IntToStr(LineNum1)+':');
|
||
MCIAllowed := FALSE;
|
||
PrintACR('^1'+LinePtr^[LineNum1]);
|
||
MCIAllowed := TRUE;
|
||
Print('^3New line '+IntToStr(LineNum1)+':');
|
||
UserColor(1);
|
||
InputLine(TempStr1,MaxLineLen);
|
||
NL;
|
||
IF PYNQ('Replace this line? ',0,FALSE) THEN
|
||
BEGIN
|
||
IF (LinePtr^[LineNum1][Length(LinePtr^[LineNum1])] = #1) AND (TempStr1[Length(TempStr1)]<>#1) THEN
|
||
LinePtr^[LineNum1] := TempStr1 + #1
|
||
ELSE
|
||
LinePtr^[LineNum1] := TempStr1;
|
||
NL;
|
||
Print('^0Line '+IntToStr(LineNum1)+' replaced.^1');
|
||
END;
|
||
END;
|
||
END;
|
||
^M : BEGIN
|
||
IF (HelpCounter = 5) THEN
|
||
BEGIN
|
||
NL;
|
||
PrintF('PRHELP');
|
||
HelpCounter := 0;
|
||
END;
|
||
Inc(HelpCounter);
|
||
END;
|
||
'?' : PrintF('PRHELP');
|
||
END;
|
||
IF (ShowCont) AND (ExitMsg) THEN
|
||
BEGIN
|
||
NL;
|
||
Print('^0Continue...^1');
|
||
NL;
|
||
END;
|
||
END;
|
||
IF (SaveLine) THEN
|
||
BEGIN
|
||
LinePtr^[TotalLines] := LineStr;
|
||
Inc(TotalLines);
|
||
IF (LineStr <> '') THEN
|
||
HelpCounter := 1
|
||
ELSE
|
||
BEGIN
|
||
IF (HelpCounter = 5) THEN
|
||
BEGIN
|
||
Print('^0Enter "/?" on a blank line for help.^1');
|
||
Dec(TotalLines,5);
|
||
HelpCounter := 0;
|
||
END;
|
||
Inc(HelpCounter);
|
||
END;
|
||
IF ((TotalLines - 1) >= MaxLines) THEN
|
||
BEGIN
|
||
NL;
|
||
Print('^7You have reached the maximum line limit!');
|
||
IF (InportFileOpen) THEN
|
||
BEGIN
|
||
InportFileOpen := FALSE;
|
||
Close(InportFile);
|
||
END;
|
||
HelpCounter := 1;
|
||
ExitMsg := FALSE;
|
||
LineStr := '/';
|
||
END;
|
||
END;
|
||
UNTIL (AbortMsg) OR (ExitMsg) OR (SaveMsg1) OR (HangUp);
|
||
UNTIL ((AbortMsg) OR (SaveMsg1) OR (HangUp));
|
||
END;
|
||
END;
|
||
|
||
PROCEDURE SaveIt(DisableMCI1: Boolean);
|
||
VAR
|
||
LineStr: AStr;
|
||
UserName: Str36;
|
||
C: Char;
|
||
LineNum1,
|
||
Counter: Integer;
|
||
AddTagLine: Boolean;
|
||
BEGIN
|
||
|
||
IF (ReadInMsg <> '') THEN
|
||
BEGIN
|
||
|
||
Assign(InportFile,ReadInMsg);
|
||
ReWrite(InportFile);
|
||
IF (IOResult = 0) THEN
|
||
BEGIN
|
||
FOR LineNum1 := 1 TO (TotalLines - 1) DO
|
||
WriteLn(InportFile,LinePtr^[LineNum1]);
|
||
Close(InportFile);
|
||
END;
|
||
|
||
END
|
||
ELSE
|
||
BEGIN
|
||
|
||
AddTagLine := FALSE;
|
||
IF (MAQuote IN MemMsgArea.MAFlags) THEN
|
||
AddTagLine := PYNQ('Add a tagline to your message? ',0,TRUE);
|
||
|
||
MHeader.Subject := MsgSubj;
|
||
MHeader.OriginDate := '';
|
||
MHeader.From.Anon := 0;
|
||
MHeader.MTO.Anon := 0;
|
||
MHeader.Replies := 0;
|
||
MHeader.ReplyTo := 0;
|
||
MHeader.Date := GetPackDateTime;
|
||
GetDayOfWeek(MHeader.DayOfWeek);
|
||
|
||
IF (Pub AND (MemMsgArea.MAType IN [1,2])) OR (NOT Pub AND (NetMail IN MHeader.Status)) THEN
|
||
BEGIN
|
||
NewEchoMail := TRUE;
|
||
IF (NOT (MAScanOut IN MemMsgArea.MAFlags)) THEN
|
||
UpdateBoard;
|
||
END;
|
||
|
||
MHeader.From.UserNum := UserNum;
|
||
|
||
UserName := AllCaps(ThisUser.Name);
|
||
|
||
IF (NOT Pub) AND (NetMail IN MHeader.Status) AND (ThisUser.Name <> AllCaps(ThisUser.RealName)) THEN
|
||
IF (General.AllowAlias) THEN
|
||
BEGIN
|
||
NL;
|
||
IF PYNQ('Send this with your real name? ',0,TRUE) THEN
|
||
UserName := AllCaps(ThisUser.RealName);
|
||
END;
|
||
|
||
MHeader.From.A1S := UserName;
|
||
MHeader.From.Real := AllCaps(ThisUser.RealName);
|
||
MHeader.From.Name := AllCaps(ThisUser.Name);
|
||
|
||
MHeader.Status := [] + (MHeader.Status * [NetMail]);
|
||
|
||
IF (Pub) AND (RValidate IN ThisUser.Flags) THEN
|
||
Include(MHeader.Status,Unvalidated);
|
||
|
||
IF (AACS(MemMsgArea.MCIACS)) THEN
|
||
BEGIN
|
||
Include(MHeader.Status,AllowMCI);
|
||
IF (DisableMCI1) THEN
|
||
Exclude(MHeader.Status,AllowMCI);
|
||
END;
|
||
|
||
IF (Pub) THEN
|
||
BEGIN
|
||
MHeader.MTO.Name := MsgTo;
|
||
MHeader.MTO.Real := MsgTo;
|
||
MHeader.MTO.A1S := MsgTo;
|
||
END;
|
||
|
||
IF (NOT (NetMail IN MHeader.Status)) THEN
|
||
Anonymous(FALSE,MHeader);
|
||
|
||
NL;
|
||
Prompt('^5Saving...');
|
||
|
||
Reset(MsgTxtF,1);
|
||
IF (IOResult = 2) THEN
|
||
ReWrite(MsgTxtF,1);
|
||
MHeader.TextSize := 0;
|
||
MHeader.Pointer := (FileSize(MsgTxtF) + 1);
|
||
Seek(MsgTxtF,FileSize(MsgTxtF));
|
||
|
||
IF (NetMail IN MHeader.Status) AND (Pos('@',MHeader.MTO.A1S) > 0) THEN
|
||
BEGIN
|
||
|
||
FOR Counter := 1 TO Length(MHeader.MTO.A1S) DO
|
||
IF (MHeader.MTO.A1S[Counter] IN ['A'..'Z']) THEN
|
||
Inc(MHeader.MTO.A1S[Counter],32);
|
||
|
||
LineStr := 'To: '+MsgTo;
|
||
BlockWrite(MsgTxtF,LineStr,Length(LineStr) + 1);
|
||
Inc(MHeader.TextSize,Length(LineStr) + 1);
|
||
|
||
MHeader.MTO.A1S := 'UUCP';
|
||
END;
|
||
|
||
IF ((Pub) AND (MAFilter IN MemMsgArea.MAFlags)) THEN
|
||
FOR LineNum1 := 1 TO (TotalLines - 1) DO
|
||
IF (Length(LinePtr^[LineNum1]) > 0) THEN
|
||
BEGIN
|
||
LinePtr^[LineNum1] := StripColor(LinePtr^[LineNum1]);
|
||
FOR Counter := 1 TO Length(LinePtr^[LineNum1]) DO
|
||
BEGIN
|
||
C := LinePtr^[LineNum1][Counter];
|
||
IF (C IN [#0..#1,#3..#31,#127..#255]) THEN
|
||
C := '*';
|
||
LinePtr^[LineNum1][Counter] := C;
|
||
END;
|
||
END;
|
||
|
||
FOR LineNum1 := 1 TO (TotalLines - 1) DO
|
||
BEGIN
|
||
LineStr := LinePtr^[LineNum1];
|
||
Inc(MHeader.TextSize,(Length(LineStr) + 1));
|
||
BlockWrite(MsgTxtF,LineStr,(Length(LineStr) + 1));
|
||
END;
|
||
|
||
IF (AddTagLine) THEN
|
||
BEGIN
|
||
LineStr := '';
|
||
Inc(MHeader.TextSize,(Length(LineStr) + 1));
|
||
BlockWrite(MsgTxtF,LineStr,(Length(LineStr) + 1));
|
||
LineStr := '... '+GetTagLine;
|
||
Inc(MHeader.TextSize,(Length(LineStr) + 1));
|
||
BlockWrite(MsgTxtF,LineStr,(Length(LineStr) + 1));
|
||
END;
|
||
|
||
IF (MemMsgArea.MAType IN [1,2]) AND (MAAddTear IN MemMsgarea.MAFlags) THEN
|
||
BEGIN
|
||
LineStr := '';
|
||
Inc(MHeader.TextSize,(Length(LineStr) + 1));
|
||
BlockWrite(MsgTxtF,LineStr,1);
|
||
|
||
LineStr := '--- Renegade v'+General.Version;
|
||
Inc(MHeader.TextSize,(Length(LineStr) + 1));
|
||
BlockWrite(MsgTxtF,LineStr,(Length(LineStr) + 1));
|
||
|
||
IF (MemMsgArea.AKA > 19) THEN
|
||
MemMsgArea.AKA := 0;
|
||
|
||
LineStr := ' * Origin: ';
|
||
IF (MemMsgArea.Origin <> '') THEN
|
||
LineStr := LineStr + MemMsgArea.Origin
|
||
ELSE
|
||
LineStr := LineStr + General.Origin;
|
||
|
||
LineStr := LineStr + ' (';
|
||
|
||
LineStr := LineStr + IntToStr(General.AKA[MemMsgArea.AKA].Zone)+':'+
|
||
IntToStr(General.AKA[MemMsgArea.AKA].Net)+'/'+
|
||
IntToStr(General.AKA[MemMsgArea.AKA].Node);
|
||
|
||
IF (General.AKA[MemMsgArea.AKA].Point > 0) THEN
|
||
LineStr := LineStr + '.'+IntToStr(General.AKA[MemMsgArea.AKA].Point);
|
||
|
||
LineStr := LineStr + ')';
|
||
Inc(MHeader.TextSize,(Length(LineStr) + 1));
|
||
BlockWrite(MsgTxtF,LineStr,(Length(LineStr) + 1));
|
||
|
||
END;
|
||
|
||
Close(MsgTxtF);
|
||
LastError := IOResult;
|
||
|
||
BackErase(9);
|
||
|
||
END;
|
||
|
||
InputMessage := TRUE;
|
||
|
||
END;
|
||
|
||
BEGIN
|
||
CLS;
|
||
InputMessage := FALSE;
|
||
|
||
MaxLines := ((MaxAvail DIV 120) - 20);
|
||
IF (MaxLines > MaxMsgLines) THEN
|
||
MaxLines := MaxMsgLines;
|
||
GetMem(LinePtr,(MaxLines * 120));
|
||
|
||
InportFileOpen := FALSE;
|
||
Escp := FALSE;
|
||
MaxQuoteLines := 0;
|
||
LastQuoteLine := 0;
|
||
|
||
IF (NOT IsReply) THEN
|
||
MsgTo := ''
|
||
ELSE
|
||
BEGIN
|
||
IF (MARealName IN MemMsgArea.MAFlags) THEN
|
||
MsgTo := Caps(MHeader.MTO.Real)
|
||
ELSE
|
||
MsgTo := Caps(MHeader.MTO.A1S)
|
||
END;
|
||
|
||
IF (InResponseTo <> '') THEN
|
||
MsgSubj := InResponseTo
|
||
ELSE
|
||
MsgSubj := MsgTitle;
|
||
|
||
IF (MsgSubj[1] <> '\') THEN
|
||
CantAbort := FALSE
|
||
ELSE
|
||
BEGIN
|
||
MsgSubj := Copy(MsgSubj,2,(Length(MsgSubj) - 1));
|
||
MHeader.Subject := MsgSubj;
|
||
CantAbort := TRUE;
|
||
END;
|
||
|
||
IF (MsgSubj[1] = #1) THEN
|
||
BEGIN
|
||
MsgSubj := Copy(MsgSubj,2,(Length(MsgSubj) - 1));
|
||
IF (MHeader.Subject[1] = #1) THEN
|
||
MHeader.Subject := Copy(MHeader.Subject,2,(Length(MHeader.Subject) - 1));
|
||
END
|
||
ELSE IF (MsgSubj <> '') AND (Copy(MsgSubj,1,3) <> 'Re:') THEN
|
||
MsgSubj := 'Re: '+Copy(MsgSubj,1,36);
|
||
|
||
MHeader.FileAttached := 0;
|
||
|
||
InputTheMessage(CantAbort,DisableMCI,SaveMsg);
|
||
|
||
IF (SaveMsg) THEN
|
||
SaveIt(DisableMCI);
|
||
|
||
Kill('TEMPQ'+IntToStr(ThisNode));
|
||
|
||
DOSANSIOn := FALSE;
|
||
|
||
FreeMem(LinePtr,(MaxLines * 120));
|
||
END;
|
||
|
||
END.
|