'===========================================================================
' Subject: NODELIST READER AND COMPILER       Date: 02-13-93 (00:00)       
'  Author: Quinn Tyler Jackson                Code: PDS, VB                
'  Origin: FidoNet QUIK_BAS Echo            Packet: MISC.ABC
'===========================================================================
'NAME:          NODELIST.BAS
'DESC:          Nodelist reader and compiler
'DIALECT:       PDS 7.1 or VBDOS 1.0
'AUTHOR:        Quinn Tyler Jackson  13 Feb 1993
'       (With great thanks to Coridon Henshaw's original NODELIST.BAS)
'               (My version is 10 times faster than his was.)
'$DYNAMIC
 
DEFINT A-Z
TYPE NodelistType
		  Zone            AS INTEGER
		  Region          AS INTEGER
		  Net             AS INTEGER
		  Node            AS INTEGER
		  System          AS STRING * 36
		  Location        AS STRING * 36
		  Sysop           AS STRING * 36
		  Phone           AS STRING * 20
		  BPS             AS STRING * 5
		  Flags           AS STRING * 50
END TYPE
 
CONST ENTRY_BUFFER = 256
CONST DATA_FIELDS = 8
 
DIM SHARED BufferPtr AS INTEGER
 
CLS
ParseNodelist "NODELIST.022", "NODELIST.DBF"
 
REM $STATIC
FUNCTION BreakString% (OutArray() AS STRING * 50, InString AS STRING)
 
ON LOCAL ERROR GOTO HandleError
 
Ptr = 1
DO
	  Comma = INSTR(Ptr, InString, ",")
	  OutArray(OutArrayPtr) = MID$(InString, Ptr, (Comma - Ptr))
	  Ptr = Comma + 1
	  OutArrayPtr = OutArrayPtr + 1
	  IF OutArrayPtr = 7 THEN
		  OutArray(7) = MID$(InString, Ptr)
		  EXIT DO
	  END IF
LOOP UNTIL Comma = 0
 
BreakString = OutArrayPtr
EXIT FUNCTION
 
HandleError:
'BreakString = 0
RESUME ExitFunction
 
ExitFunction:
 
END FUNCTION
 
STATIC SUB FlushBuffers (FlushFileHandle, NodeList() AS NodelistType)
 
FOR Ptr = 0 TO BufferPtr
 
	 RecNum = RecNum + 1
	 PUT #FlushFileHandle, RecNum, NodeList(Ptr)
 
NEXT Ptr
 
REDIM NodeList(0 TO ENTRY_BUFFER) AS NodelistType
BufferPtr = 0
 
END SUB
 
SUB ParseNodelist (NodelistFile AS STRING, ParsedListFile AS STRING)
 
StartTime! = TIMER
IF DIR$(ParsedListFile) <> "" THEN
	 KILL ParsedListFile
END IF
 
'$STATIC
DIM NodelistBuffer(0 TO 7) AS STRING * 50
DIM NodeList(0 TO ENTRY_BUFFER) AS NodelistType
'$DYNAMIC
 
BufferPtr = 0
 
NodelistHandle = FREEFILE
OPEN NodelistFile FOR INPUT AS NodelistHandle LEN = 1024
ParsedListHandle = FREEFILE
OPEN ParsedListFile FOR RANDOM AS ParsedListHandle LEN = LEN(NodeList(0))
 
DO
		  LINE INPUT #NodelistHandle, Buffer$
 
					 Options = BreakString(NodelistBuffer(), Buffer$)
 
					 SELECT CASE LEFT$(Buffer$, 1)
								CASE "Z"
										  TempZone = VAL(NodelistBuffer(1))
								CASE "R"
										  TempRegion = VAL(NodelistBuffer(1))
								CASE "H"
										  SELECT CASE LEFT$(Buffer$, 3)
												CASE "Hos"
													 TempNet = VAL(NodelistBuffer(1))
												CASE "Hub"
													 TempNode = VAL(NodelistBuffer(1))
										  END SELECT
								CASE ","
										  TempNode = VAL(NodelistBuffer(1))
								CASE ELSE
									 GOTO JumpPast
					 END SELECT
 
					 NodeList(BufferPtr).Zone = TempZone
					 NodeList(BufferPtr).Region = TempRegion
					 NodeList(BufferPtr).Net = TempNet
					 NodeList(BufferPtr).Node = TempNode
					 NodeList(BufferPtr).System = NodelistBuffer(2)
					 NodeList(BufferPtr).Location = NodelistBuffer(3)
					 NodeList(BufferPtr).Sysop = NodelistBuffer(4)
					 NodeList(BufferPtr).Phone = NodelistBuffer(5)
					 NodeList(BufferPtr).BPS = NodelistBuffer(6)
					 NodeList(BufferPtr).Flags = NodelistBuffer(7)
 
					 REDIM NodelistBuffer(0 TO 7) AS STRING * 50
 
BufferPtr = BufferPtr + 1
 
IF BufferPtr = ENTRY_BUFFER THEN
	 FlushBuffers ParsedListHandle, NodeList()
END IF
 
JumpPast:
LOOP UNTIL EOF(NodelistHandle)
 
FlushBuffers ParsedListHandle, NodeList()
PRINT INT(TIMER - StartTime! + .5); "seconds."
 
END SUB
