Nodelist parser

Area:    Quik_Bas
  Msg:    #400
 Date:    02-14-93 19:35 (Public) 
 From:    Robert Church            
 To:      Coridon Henshaw          
 Subject: Nodelist parser          
Hello Coridon!

I couldn't get your nodelist parser to work, so I re-wrote 
it.  I'm a lowly QB user, not PDS, so this may be the 
problem.
I don't know which one is faster, like I said, I couldn't 
get yours to work.  Here's what I cam up with:

'NAME: NODELIST.BAS
'FROM: Robert Church@1:105/330.3
'DESC: Nodelist reader

DECLARE FUNCTION ExtractAddress$ (Zone%, Net%, Node%)
DECLARE SUB PrintNodeListData (X%, Y%, Nodelist AS ANY)
' The following is in the QB example program TOKEN.BAS.
' This babie's a _gem_!
DECLARE FUNCTION StrTok$ (Buffer$, Delim$)

DEFINT A-Z

TYPE AddrType
        Zone            AS INTEGER
        Region          AS INTEGER
        Net             AS INTEGER
        Node            AS INTEGER
        Pnt           AS INTEGER        'forget something?
END TYPE

TYPE NodelistType
        Addr            AS AddrType
        Sys             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

DIM Nodelist AS NodelistType
DIM NodeData$(1 TO 30)

OPEN "\POINT\QNODE\NODELIST.043" FOR INPUT AS #1
'
'Change to match the current nodelist number
'

T& = TIMER
DO
   DO
      LINE INPUT #1, Buffer$
   LOOP UNTIL LEN(Buffer$) OR EOF(1)
   IF LEFT$(Buffer$, 1) <> ";" THEN
      Word$ = StrTok$(Buffer$, ",")
      FldNum = 0
      DO
         FldNum = FldNum + 1
         NodeData$(FldNum) = Word$
         Word$ = StrTok$("", ",")
      LOOP UNTIL LEN(Word$) = 0

      SELECT CASE NodeData$(1)
         CASE "Zone"
            Nodelist.Addr.Zone = VAL(NodeData$(2))
            Nodelist.Addr.Region = 1
            Nodelist.Addr.Net = 1
            Nodelist.Addr.Node = 0
            Nodelist.Addr.Pnt = 0
            AddThis = 1       'a bit kludgy
                              'makes it so that the rest of 
the routine                               'knows to add one 
to the rest of the fields          CASE "Region"
            Nodelist.Addr.Region = VAL(NodeData$(2))
            Nodelist.Addr.Net = Nodelist.Addr.Region
            Nodelist.Addr.Node = 0
            Nodelist.Addr.Pnt = 0
            AddThis = 1
         CASE "Host"
            Nodelist.Addr.Net = VAL(NodeData$(2))
            Nodelist.Addr.Node = 0
            Nodelist.Addr.Pnt = 0
            AddThis = 1
         CASE "Down"
            Nodelist.Addr.Node = VAL(NodeData$(2))
            Nodelist.Addr.Pnt = 0
            NDF$ = "Down"
            AddThis = 1
         CASE "Hub"
            Nodelist.Addr.Node = VAL(NodeData$(2))
            Nodelist.Addr.Pnt = 0
            NDF$ = "Hub"
            AddThis = 1
         CASE "Pvt"
            Nodelist.Addr.Node = VAL(NodeData$(2))
            Nodelist.Addr.Pnt = 0
            NDF$ = "Pvt"
            AddThis = 1
         CASE "Pnt"
            Nodelist.Flags = Nodelist.Flags + ",Pnt"
            Nodelist.Addr.Pnt = VAL(NodeData$(2))
            AddThis = 1
         CASE ELSE
            Nodelist.Addr.Node = VAL(NodeData$(1))
            Nodelist.Addr.Pnt = 0
            AddThis = 0
      END SELECT
      Nodelist.Sys = NodeData$(2 + AddThis)
      Nodelist.Location = NodeData$(3 + AddThis)
      Nodelist.Sysop = NodeData$(4 + AddThis)
      Nodelist.Phone = NodeData$(5 + AddThis)
      Nodelist.BPS = NodeData$(6 + AddThis)
      Ctr = 7 + AddThis
      DO
         S$ = NodeData$(Ctr)
         NDF$ = NDF$ + "," + S$
         Ctr = Ctr + 1
      LOOP WHILE LEN(S$) > 0
      Nodelist.Flags = NDF$
      NDF$ = ""
      'PrintNodeListData 3, 2, Nodelist
      'DO: LOOP UNTIL LEN(INKEY$)
   END IF
LOOP UNTIL EOF(1)
PRINT "TIME:  "; TIMER - T&; "seconds."

FUNCTION ExtractAddress$ (Zone, Net, Node)
ExtractAddress$ = RTRIM$(LTRIM$(STR$(Zone))) + ":" + 
RTRIM$(LTRIM$(STR$(Net))) + "/" + 
RTRIM$(LTRIM$(STR$(Node))) END FUNCTION

SUB PrintNodeListData (X, Y, Nodelist AS NodelistType)
LOCATE X, Y
PRINT "    Address: "; ExtractAddress(Nodelist.Addr.Zone, 
Nodelist.Addr.Net, Nodelist.Addr.Node); "      " PRINT "    
ĀRegion: "; RTRIM$(LTRIM$(STR$(Nodelist.Addr.Region))) 
PRINT "System name: "; Nodelist.Sys
PRINT "   Location: "; Nodelist.Location
PRINT "      Sysop: "; Nodelist.Sysop
PRINT "      Phone: "; Nodelist.Phone
PRINT "   BPS Rate: "; Nodelist.BPS
PRINT "      Flags: "; Nodelist.Flags
END SUB

' TOKEN.BAS
'
' Demonstrates a BASIC version of the strtok C function.
'
DECLARE FUNCTION StrTok$ (Source$, Delimiters$)

FUNCTION StrTok$ (Srce$, Delim$)
STATIC Start%, SaveStr$

   ' If first call, make a copy of the string.
   IF LEN(Srce$) THEN
      Start% = 1: SaveStr$ = Srce$
   END IF

   Ln% = LEN(SaveStr$)
   BegPos% = Start%
   ' Look for start of a token (character that isn't 
delimiter).    WHILE BegPos% <= Ln% AND INSTR(Delim$, 
MID$(SaveStr$, BegPos%, 1)) <> 0       BegPos% = BegPos% + 1
   WEND
   ' Test for token start found.
   IF BegPos% > Ln% THEN
      StrTok$ = "": EXIT FUNCTION
   END IF
   ' Find the end of the token.
   EndPos% = BegPos%
   WHILE EndPos% <= Ln% AND INSTR(Delim$, MID$(SaveStr$, 
EndPos%, 1)) = 0       EndPos% = EndPos% + 1
   WEND
   StrTok$ = MID$(SaveStr$, BegPos%, EndPos% - BegPos%)
   ' Set starting point for search for next token.
   Start% = EndPos%

END FUNCTION

I would be willing to take the entire nodelist compiler off 
of your hands and write a little API for things like keying 
by sysop, keying by address, etc.  I have some ideas for a 
small nodelist format.  Is there any special information 
you'll need in the nodelist, or is it pretty much standard 
BBS fare?

[-= Rob =-]

...Real programmers drink Jolt!
--- timEd/B7
 * Origin: -= The Floating Point =- Hillsboro, Oregon, USA, 
Earth (1:105/330.3)

Outer Court
Echo Basic Postings

Books at Amazon:

Back to BASIC: The History, Corruption, and Future of the Language

Hackers: Heroes of the Computer Revolution (including Tiny BASIC)

Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution

The Advent of the Algorithm: The Idea that Rules the World

Moths in the Machine: The Power and Perils of Programming

Mastering Visual Basic .NET