home *** CD-ROM | disk | FTP | other *** search
/ World of Ham Radio 1997 / WOHR97_AmSoft_(1997-02-01).iso / amsoft / win95 / source.zi_ / CALLFIND.BAS < prev    next >
BASIC Source File  |  1995-05-04  |  12KB  |  400 lines

  1. 'AmSoft CallFind Program v1.01 (CALLFIND.COM - CALLFIND.BAS)
  2. 'Copyright (C)1995 Alan Freeman, KC5JGP
  3. 'Contact Pete DeVolpi KC3TL, AmSoft, World of Ham Radio CD-Rom (717) 938-8249
  4. 'for permission to use these routines & code for your software that reads the
  5. 'cd-rom database.
  6.  
  7. DEFINT A-Z
  8. DECLARE SUB FindCall (Drive$, Search$, Record AS ANY, Index AS ANY, Record1 AS ANY)
  9. DECLARE FUNCTION ConvCase$ (P$)
  10. DECLARE FUNCTION Exist (File$)
  11. DECLARE FUNCTION FCCDate$ (D$)
  12. DECLARE FUNCTION ProperName$ (Work$)
  13. DECLARE FUNCTION Trim$ (Work$)
  14. CONST False = 0, True = NOT False
  15.  
  16.    TYPE IndexStructure          '16 bytes total
  17.       Unknown  AS STRING * 4    'Unused
  18.       RecPoint AS STRING * 4    'Record Pointer
  19.       CallSign AS STRING * 7    'Call Sign
  20.       Valid    AS STRING * 1    'CHR$(32) if it's a good record
  21.    END TYPE
  22.    DIM Index AS IndexStructure
  23.  
  24.    TYPE DataStructure           '131 bytes total
  25.       Address2  AS STRING * 15  'Licensee's Address
  26.       City      AS STRING * 20  'City
  27.       State     AS STRING * 2   'State
  28.       Zip       AS STRING * 10  'Zip code xxxxx-xxxx
  29.       LicClass  AS STRING * 1   'N,T,P,G,A,E
  30.       OldCall   AS STRING * 8   'Old call sign
  31.       Fill      AS STRING * 1   'unused
  32.       CallSign  AS STRING * 8   'Call Sign
  33.       LastName  AS STRING * 20  'Last Name
  34.       Suffix    AS STRING * 4   'Name Suffix Jr Sr III etc
  35.       FirstName AS STRING * 11  'First Name
  36.       Initial   AS STRING * 1   'Middle Initial
  37.       ExpireDay AS STRING * 5   'License Expiration date
  38.       Birthday  AS STRING * 5   'Licensee's Birthday
  39.       Address1  AS STRING * 20  'Licensee's Address
  40.    END TYPE
  41.    DIM Record1 AS DataStructure
  42.  
  43.    TYPE DataStructure2          '131 bytes total
  44.       CallSign  AS STRING * 8   'Call Sign
  45.       LastName  AS STRING * 20  'Last Name
  46.       Suffix    AS STRING * 4   'Name Suffix Jr Sr III etc
  47.       FirstName AS STRING * 11  'First Name
  48.       Initial   AS STRING * 1   'Middle Initial
  49.       ExpireDay AS STRING * 5   'License Expiration date
  50.       Birthday  AS STRING * 5   'Licensee's Birthday
  51.       Address1  AS STRING * 20  'Licensee's Address
  52.       Address2  AS STRING * 15  'Licensee's Address
  53.       City      AS STRING * 20  'City
  54.       State     AS STRING * 2   'State
  55.       Zip       AS STRING * 10  'Zip code xxxxx-xxxx
  56.       LicClass  AS STRING * 1   'N,T,P,G,A,E
  57.       OldCall   AS STRING * 8   'Old call sign
  58.       Fill      AS STRING * 1   'unused
  59.    END TYPE
  60.    DIM Record AS DataStructure2
  61.  
  62.    Cmd$ = UCASE$(COMMAND$)   'does user want help?
  63.    Where = INSTR(Cmd$, "?")
  64.    IF Where <> 0 THEN HelpMe = True
  65.                 
  66.    Where = INSTR(Cmd$, "/LPT1")  'route to LPT1
  67.    IF Where <> 0 THEN
  68.       LPT1 = True
  69.       Cmd$ = Trim$(LEFT$(Cmd$, Where - 1) + MID$(Cmd$, Where + 5))
  70.    END IF
  71.  
  72.    Where = INSTR(Cmd$, "/LPT2")  'route to LPT2
  73.    IF Where <> 0 THEN
  74.       LPT2 = True
  75.       Cmd$ = Trim$(LEFT$(Cmd$, Where - 1) + MID$(Cmd$, Where + 5))
  76.    END IF
  77.  
  78.    Where = INSTR(Cmd$, "/EXPORT")  'route to file
  79.    IF Where <> 0 THEN
  80.       Export = True
  81.       Cmd$ = Trim$(LEFT$(Cmd$, Where - 1) + MID$(Cmd$, Where + 7))
  82.    END IF
  83.  
  84.    Where = INSTR(Cmd$, "/LABEL")  'format as a label
  85.    IF Where <> 0 THEN
  86.       Label = True
  87.       Cmd$ = Trim$(LEFT$(Cmd$, Where - 1) + MID$(Cmd$, Where + 6))
  88.    END IF
  89.  
  90.    Where = INSTR(Cmd$, "/")      'switch and alternate CD drive designation
  91.    Where2 = INSTR(Cmd$, ":")
  92.    IF Where <> 0 AND Where2 <> 0 THEN
  93.       Drive$ = MID$(Cmd$, Where + 1, 2)
  94.       Cmd$ = Trim$(LEFT$(Cmd$, Where - 1) + MID$(Cmd$, Where + 3))
  95.    ELSE
  96.       Drive$ = "D:"
  97.    END IF
  98.  
  99. HelpHere:
  100.    IF NOT Exist(Drive$ + "callsign.dat") OR HelpMe THEN
  101.       CLS
  102.       IF NOT HelpMe THEN
  103.          PRINT "AmSoft CDRom database not found on drive "; Drive$
  104.          BEEP
  105.          PRINT
  106.       END IF
  107.       PRINT "AmSoft CallFind Program v1.01"
  108.       PRINT "(C)1995 Alan Freeman, KC5JGP."
  109.       PRINT "     Syntax: CALLFIND {callsign} {/E:} {/EXPORT} {/LABEL} {/?}"
  110.       PRINT
  111.       PRINT "     /E: is the CDRom drivespec, if other than D: (default)"
  112.       PRINT "     /EXPORT sends data to a file called CALLFIND.TXT"
  113.       PRINT "     /LABEL  sends only the name/address data to screen or file."
  114.       PRINT "     /LPT1 or /LPT2 sends the data to your printer."
  115.       PRINT
  116.       PRINT "     Example: CALLFIND KC5JGP /F: /EXPORT /LABEL"
  117.       PRINT
  118.       SYSTEM
  119.    END IF
  120.  
  121.    IF Cmd$ <> "" THEN
  122.       Search$ = Trim$(Cmd$)
  123.    ELSE
  124.       CLS
  125.       INPUT ; "Enter Callsign: ", Search$
  126.       IF Trim$(Search$) = "" THEN HelpMe = True: GOTO HelpHere
  127.       PRINT
  128.    END IF
  129.    
  130.    Search$ = UCASE$(Search$) 'capitalize
  131.    IF Trim$(Search$) <> "" THEN
  132.       CALL FindCall(Drive$, Search$, Record, Index, Record1)
  133.    END IF
  134.  
  135.    IF (Export OR LPT1 OR LPT2) AND Search$ <> "" THEN
  136.       FreeOne = FREEFILE
  137.  
  138.       IF LPT1 THEN
  139.          File$ = "LPT1:"
  140.       ELSEIF LPT2 THEN
  141.          File$ = "LPT2:"
  142.       ELSE
  143.          File$ = "Callfind.TXT"
  144.       END IF
  145.  
  146.       OPEN File$ FOR OUTPUT AS #FreeOne
  147.    
  148.       PRINT #FreeOne, Trim$(ConvCase$(Record.FirstName)) + CHR$(32);
  149.  
  150.       IF Trim$(Record.Initial) <> "" THEN
  151.          PRINT #FreeOne, Record.Initial + CHR$(32);
  152.       END IF
  153.       PRINT #FreeOne, Trim$(ConvCase$(Record.LastName));
  154.  
  155.       IF Trim$(Record.Suffix) <> "" THEN
  156.          PRINT #FreeOne, CHR$(32) + Trim$(ConvCase$(Record.Suffix));
  157.       END IF
  158.       PRINT #FreeOne, CHR$(44) + CHR$(32) + Record.CallSign
  159.  
  160.       PRINT #FreeOne, ConvCase$(Record.Address1)
  161.  
  162.       IF Trim$(Record.Address2) <> "" THEN
  163.          PRINT #FreeOne, ConvCase$(Record.Address2)
  164.       END IF
  165.       PRINT #FreeOne, Trim$(ConvCase$(Record.City)) + CHR$(32);
  166.  
  167.       PRINT #FreeOne, Record.State + CHR$(32) + CHR$(32);
  168.  
  169.       PRINT #FreeOne, Record.Zip
  170.  
  171.       PRINT #FreeOne,
  172.  
  173.       IF NOT Label THEN
  174.          SELECT CASE Record.LicClass
  175.             CASE "N": Class$ = "Novice"
  176.             CASE "T": Class$ = "Tech No-code"
  177.             CASE "P": Class$ = "Tech-Plus HF"
  178.             CASE "G": Class$ = "General"
  179.             CASE "A": Class$ = "Advanced"
  180.             CASE "E": Class$ = "Extra"
  181.             CASE ELSE
  182.          END SELECT
  183.  
  184.          PRINT #FreeOne, "License: "; Class$
  185.  
  186.          PRINT #FreeOne, "Expires: "; FCCDate$(Record.ExpireDay)
  187.  
  188.          PRINT #FreeOne, "Birth  : "; FCCDate$(Record.Birthday)
  189.  
  190.          IF Trim$(Record.OldCall) <> "" THEN
  191.             PRINT #FreeOne, "OldCall: "; Record.OldCall
  192.          END IF
  193.  
  194.          PRINT #FreeOne,
  195.       END IF
  196.    ELSEIF Export AND Search$ = "" THEN
  197.  
  198.       PRINT #FreeOne, "* * * Call Not Found * * *"
  199.  
  200.    END IF
  201.  
  202.    IF NOT Export AND Search$ <> "" THEN
  203.       CLS
  204.       PRINT Trim$(ConvCase$(Record.FirstName)) + CHR$(32);
  205.  
  206.       IF Trim$(Record.Initial) <> "" THEN
  207.          PRINT Record.Initial + CHR$(32);
  208.       END IF
  209.       PRINT Trim$(ConvCase$(Record.LastName));
  210.  
  211.       IF Trim$(Record.Suffix) <> "" THEN
  212.          PRINT CHR$(32) + Trim$(ConvCase$(Record.Suffix));
  213.       END IF
  214.       PRINT CHR$(44) + CHR$(32) + Record.CallSign
  215.  
  216.       PRINT ConvCase$(Record.Address1)
  217.  
  218.       IF Trim$(Record.Address2) <> "" THEN
  219.          PRINT ConvCase$(Record.Address2)
  220.       END IF
  221.       PRINT Trim$(ConvCase$(Record.City)) + CHR$(32);
  222.  
  223.       PRINT Record.State + CHR$(32) + CHR$(32);
  224.  
  225.       PRINT Record.Zip
  226.  
  227.       PRINT
  228.  
  229.       IF NOT Label THEN
  230.          SELECT CASE Record.LicClass
  231.             CASE "N": Class$ = "Novice"
  232.             CASE "T": Class$ = "Tech No-code"
  233.             CASE "P": Class$ = "Tech-Plus HF"
  234.             CASE "G": Class$ = "General"
  235.             CASE "A": Class$ = "Advanced"
  236.             CASE "E": Class$ = "Extra"
  237.             CASE ELSE
  238.          END SELECT
  239.          PRINT "License: "; Class$
  240.          PRINT "Expires: "; FCCDate$(Record.ExpireDay)
  241.          PRINT "Birth  : "; FCCDate$(Record.Birthday)
  242.          IF Trim$(Record.OldCall) <> "" THEN
  243.             PRINT "OldCall: "; Record.OldCall
  244.          END IF
  245.          PRINT
  246.       END IF
  247.    ELSEIF NOT Export AND Search$ = "" THEN
  248.       PRINT #FreeOne, "* * * Call Not Found * * *"
  249.    END IF
  250.  
  251.    IF NOT Export THEN
  252.       PRINT
  253.       PRINT "AmSoft CallFind Program v1.01"
  254.       PRINT "(C)1995 Alan Freeman, KC5JGP."
  255.       PRINT
  256.    END IF
  257.    SYSTEM
  258.  
  259. FUNCTION ConvCase$ (Work$) STATIC
  260.    Work$ = ProperName(Work$)
  261.    IF INSTR(UCASE$(Work$), "POB") <> 0 THEN
  262.       Where = INSTR(UCASE$(Work$), "POB")
  263.       MID$(Work$, Where, 3) = "POB"
  264.    END IF
  265.    IF INSTR(UCASE$(Work$), "AFB") <> 0 THEN
  266.       Where = INSTR(UCASE$(Work$), "AFB")
  267.       MID$(Work$, Where, 3) = "AFB"
  268.    END IF
  269.    ConvCase$ = Work$
  270. END FUNCTION
  271.  
  272. FUNCTION Exist (File$)
  273.    Exist = False
  274.    ON LOCAL ERROR GOTO NoFile
  275.    FileNo = FREEFILE
  276.    OPEN File$ FOR RANDOM ACCESS READ SHARED AS #FileNo
  277.    CLOSE #FileNo
  278.    Exist = True
  279.    EXIT FUNCTION
  280.  
  281. NoFile:
  282.    Exist = False
  283.  
  284. END FUNCTION
  285.  
  286. FUNCTION FCCDate$ (D$) STATIC
  287.    Yr$ = LEFT$(D$, 2)
  288.    Leap = 0
  289.    IF VAL(Yr$) MOD 4 = 0 THEN Leap = 1
  290.    D = VAL(MID$(D$, 3))
  291.    
  292.    M = 0 'Month
  293.    DT = 0
  294.    DO
  295.       M = M + 1
  296.       MT = VAL(MID$("312831303130313130313031", M * 2 - 1, 2))
  297.       DT = DT + MT
  298.       IF Leap AND M = 2 THEN DT = DT + 1
  299.    LOOP WHILE DT < D
  300.  
  301.    IF DT >= D THEN
  302.       DT = DT - MT
  303.       IF Leap AND M = 2 THEN DT = DT - 1
  304.    END IF
  305.    
  306.    D = (D - DT) 'Day
  307.    D$ = RIGHT$(CHR$(48) + Trim$(STR$(M)), 2) + CHR$(47)
  308.    D$ = D$ + RIGHT$(CHR$(48) + Trim$(STR$(D)), 2) + CHR$(47) + Yr$
  309.    FCCDate$ = D$
  310. END FUNCTION
  311.  
  312. SUB FindCall (Drive$, Search$, Record AS DataStructure2, Index AS IndexStructure, Record1 AS DataStructure)
  313.  
  314.    Handle = FREEFILE
  315.    OPEN Drive$ + "AMSOFT_C.IDX" FOR RANDOM ACCESS READ SHARED AS #Handle LEN = LEN(Index)
  316.    MaxRecs& = LOF(Handle) / 16&
  317.    PrevRec& = 0&
  318.    LastRec& = 0&
  319.  
  320. FindInIndex:
  321.    SearchRec& = INT((MaxRecs& - LastRec&) / 2) + LastRec&
  322.  
  323. GetIndex:
  324.    GET #Handle, SearchRec&, Index
  325.    IF Index.Valid <> CHR$(32) THEN
  326.       SearchRec& = SearchRec& + 1
  327.       GOTO GetIndex
  328.    END IF
  329.    Found$ = Trim$(Index.CallSign)
  330.    IF Search$ = Found$ OR ABS(SearchRec& - PrevRec&) < 25 THEN
  331.       GOTO FoundInIndex
  332.    END IF
  333.    PrevRec& = SearchRec&
  334.    IF Found$ > Search$ THEN
  335.       MaxRecs& = PrevRec&
  336.    ELSE
  337.       LastRec& = PrevRec&
  338.    END IF
  339.    GOTO FindInIndex
  340.  
  341. FoundInIndex:
  342.    Fetch& = CVL(Index.RecPoint)
  343.    CLOSE #Handle
  344.  
  345. SlideDatabase:
  346.    Handle = FREEFILE
  347.    OPEN Drive$ + "CALLSIGN.DAT" FOR RANDOM ACCESS READ SHARED AS #Handle LEN = 131' LEN(Record)
  348.    GET #Handle, Fetch& + 3, Record1
  349.    Found$ = Trim$(Record1.CallSign)
  350.    IF Found$ = Search$ THEN Place& = Fetch& + 3: GOTO FoundIt
  351.    IF Found$ > Search$ THEN
  352.       DO
  353.          Fetch& = Fetch& - 1
  354.          GET #Handle, Fetch& + 3, Record1
  355.          Found$ = Trim$(Record1.CallSign)
  356.          IF Search$ >= Found$ THEN Place& = Fetch& + 3: GOTO FoundIt
  357.       LOOP
  358.    ELSE
  359.       DO
  360.          Fetch& = Fetch& + 1
  361.          GET #Handle, Fetch& + 3, Record1
  362.          Found$ = Trim$(Record1.CallSign)
  363.          IF Search$ <= Found$ THEN Place& = Fetch& + 3: GOTO FoundIt
  364.       LOOP
  365.    END IF
  366.  
  367. FoundIt:
  368.    CLOSE #Handle
  369.    IF Search$ <> Found$ THEN
  370.       Search$ = "": EXIT SUB
  371.    END IF
  372.    Handle = FREEFILE
  373.    OPEN Drive$ + "CALLSIGN.DAT" FOR BINARY ACCESS READ SHARED AS #Handle LEN = LEN(Record)
  374.    SEEK #Handle, ((Place& - 1) * 131) + 58
  375.    GET #Handle, , Record
  376.    CLOSE #Handle
  377. END SUB
  378.  
  379. FUNCTION ProperName$ (Work$)
  380.    ProperName$ = ""
  381.    FOR X = 1 TO LEN(Work$)
  382.       Letter$ = MID$(Work$, X, 1)
  383.       IF Last$ = CHR$(32) OR X = 1 THEN
  384.          MID$(Work$, X, 1) = UCASE$(Letter$)
  385.       ELSE
  386.          IF ASC(Letter$) > 64 AND ASC(Letter$) < 91 THEN
  387.             Letter$ = CHR$(ASC(Letter$) + 32)
  388.             MID$(Work$, X, 1) = Letter$
  389.          END IF
  390.       END IF
  391.       Last$ = Letter$
  392.    NEXT
  393.    ProperName$ = Work$
  394. END FUNCTION
  395.  
  396. FUNCTION Trim$ (Work$)
  397.    Trim$ = LTRIM$(RTRIM$(Work$))
  398. END FUNCTION
  399.  
  400.