mysticbbs/mystic/bbs_nodelist.pas

167 lines
4.1 KiB
ObjectPascal

Unit BBS_NodeList;
{$I M_OPS.PAS}
Interface
Uses
BBS_Common,
BBS_Records,
BBS_DataBase;
Type
RecNodeSearch = Record
Keyword : String[8];
SysopName : String[30];
BBSName : String[30];
Location : String[30];
Phone : String[20];
Address : RecEchoMailAddr;
Internet : String[40];
End;
TNodeListSearch = Class
SearchStr : String;
SearchZone : String[5];
SearchNet : String[5];
SearchNode : String[5];
AddrSearch : Boolean;
Opened : Boolean;
ListFile : Text;
ListBuffer : Array[1..1024 * 4] of Char;
CurAddr : RecEchoMailAddr;
NodeData : RecNodeSearch;
Constructor Create;
Destructor Destroy; Override;
Function ResetSearch (NodeList: String; Str: String) : Boolean;
Function FindNext (Var Res: RecNodeSearch) : Boolean;
End;
Implementation
Uses
m_Strings;
Constructor TNodeListSearch.Create;
Begin
Inherited Create;
Opened := False;
End;
Destructor TNodeListSearch.Destroy;
Begin
Inherited Destroy;
If Opened Then Close(ListFile);
End;
Function TNodeListSearch.ResetSearch (NodeList: String; Str: String) : Boolean;
Var
A : Byte;
B : Byte;
Begin
Result := False;
SearchStr := strReplace(strUpper(strStripB(Str, ' ')), '*', '?');
If Opened Then Begin
Close (ListFile);
Opened := False;
End;
If SearchStr = '' Then Exit;
A := Pos(':', SearchStr);
B := Pos('/', SearchStr);
If (A = 0) or (B <= A) Then
AddrSearch := False
Else
AddrSearch := True;
// AddrSearch := Not (A = 0) or (B <= A);
If AddrSearch Then Begin
SearchZone := Copy(SearchStr, 1, A - 1);
SearchNet := Copy(SearchStr, A + 1, B - 1 - A);
SearchNode := Copy(SearchStr, B + 1, 255);
End;
FileMode := 66;
Assign (ListFile, NodeList);
SetTextBuf (ListFile, ListBuffer);
Reset (ListFile);
Opened := IoResult = 0;
Result := Opened;
End;
Function TNodeListSearch.FindNext (Var Res: RecNodeSearch) : Boolean;
Var
Str : String;
Begin
Result := False;
If Not Opened Then Exit;
FillChar (NodeData, SizeOf(NodeData), 0);
While Not Eof(ListFile) Do Begin
ReadLn (ListFile, Str);
If (Str = '') or (Str[1] = ';') Then Continue;
NodeData.Keyword := strUpper(strWordGet(1, Str, ','));
If NodeData.Keyword = 'ZONE' Then Begin
FillChar (CurAddr, SizeOf(CurAddr), 0);
CurAddr.Zone := strS2I(strWordGet(2, Str, ','));
End Else
If (NodeData.Keyword = 'REGION') or (NodeData.Keyword = 'HOST') Then Begin
CurAddr.Net := strS2I(strWordGet(2, Str, ','));
End Else
CurAddr.Node := strS2I(strWordGet(2, Str, ','));
NodeData.BBSName := strReplace(strWordGet(3, Str, ','), '_', ' ');
NodeData.Location := strReplace(strWordGet(4, Str, ','), '_', ' ');
NodeData.SysopName := strReplace(strWordGet(5, Str, ','), '_', ' ');
NodeData.Phone := strReplace(strWordGet(6, Str, ','), '_', ' ');
If Pos('INA:', Str) > 0 Then Begin
Str := Copy(Str, Pos('INA:', Str) + 4, 255);
NodeData.Internet := Copy(Str, 1, Pos(',', Str) - 1);
End;
If AddrSearch Then Begin
Result := True;
If (SearchZone <> '?') and (CurAddr.Zone <> strS2I(SearchZone)) Then
Result := False;
If (SearchNet <> '?') and (CurAddr.Net <> strS2I(SearchNet)) Then
Result := False;
If (SearchNode <> '?') and (CurAddr.Node <> strS2I(SearchNode)) Then
Result := False;
End Else Begin
Result := (Pos(SearchStr, strUpper(NodeData.BBSName)) > 0) or
(Pos(SearchStr, strUpper(NodeData.Location)) > 0) or
(Pos(SearchStr, strUpper(NodeData.SysopName)) > 0) or
(Pos(SearchStr, strUpper(NodeData.Phone)) > 0) or
(Pos(SearchStr, strUpper(NodeData.Internet)) > 0);
End;
If Result Then Begin
NodeData.Address := CurAddr;
Res := NodeData;
Exit;
End;
End;
End;
End.