188 lines
5.0 KiB
ObjectPascal
188 lines
5.0 KiB
ObjectPascal
Unit BBS_NodeList;
|
|
|
|
// ====================================================================
|
|
// Mystic BBS Software Copyright 1997-2013 By James Coyle
|
|
// ====================================================================
|
|
//
|
|
// This file is part of Mystic BBS.
|
|
//
|
|
// Mystic BBS is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Mystic BBS is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Mystic BBS. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// ====================================================================
|
|
|
|
{$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.
|