home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD99699192000.psc / source / CWNBinarySearch.cls next >
Encoding:
Visual Basic class definition  |  2000-08-04  |  4.9 KB  |  191 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "CWordNetFile"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. Private m_filenumber As Integer
  17. Private m_filepath As String
  18. Private m_filesize As Long
  19. Private m_filedir As String
  20. Private m_filename As String
  21. Private m_lastSeek As Long
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. Public Property Get filename() As String
  30. 'used when retrieving value of a property, on the right side of an assignment.
  31. 'Syntax: Debug.Print X.m_filename
  32.     If IsObject(m_filename) Then
  33.         filename = m_filename
  34.     Else
  35.         filename = m_filename
  36.     End If
  37. End Property
  38.  
  39. Public Function Seek2(seekloc As Long) As Long
  40.     Seek2 = 1
  41.     If seekloc < 1 Or seekloc > m_filesize Then
  42.         Exit Function
  43.     End If
  44.     Seek #m_filenumber, seekloc
  45.     m_lastSeek = Seek(m_filenumber)
  46.     Seek2 = 0
  47. End Function
  48. Public Function ReadLine() As String
  49.     ReadLineBySeek = Empty
  50.     ReadLineBySeek = ""
  51.     Dim sbuf As String
  52.     sbuf = " "
  53.     Seek #m_filenumber, m_lastSeek
  54.     m_lastSeek = Seek(m_filenumber)
  55.     Do
  56.         Get #m_filenumber, , sbuf
  57.         If EOF(m_filenumber) Or sbuf = Chr(10) Then
  58.             Exit Do
  59.         End If
  60.         ReadLineBySeek = ReadLineBySeek & sbuf
  61.     Loop
  62.     ReadLine = ReadLineBySeek
  63. End Function
  64.  
  65.  
  66. 'Public Function seekbyword(sm_filepath As String, ByVal key As String, sresults As Collection, Optional repeats As Integer = 1)
  67. Public Function Construct(sm_filedir As String, sfilename As String)
  68.     m_filedir = sm_filedir
  69.     m_filename = sfilename
  70.     m_filepath = m_filedir & "\" & m_filename
  71.     m_filenumber = FreeFile
  72.     m_filesize = FileLen(m_filepath)
  73.     Open m_filepath For Binary Access Read As m_filenumber
  74.     
  75.  
  76.  
  77. End Function
  78. Public Function Destruct()
  79.     Close m_filenumber
  80. End Function
  81. Public Function SeekByWord(ByVal key As String, Optional line2 = "") As Integer
  82.     SeekByWord = 1
  83.     If key = "" Then
  84.         Exit Function
  85.     End If
  86.  
  87.     If Left(key, 1) = " " Then Exit Function
  88.     
  89.     key = key + " "
  90.     keylen = Len(key)
  91.     
  92.     Dim start2  As Long
  93.     Dim middle2  As Long
  94.     Dim end2 As Long
  95.     Dim offset2 As Long
  96.     Dim line2isbig As Boolean
  97.  
  98.     start2 = 1
  99.     end2 = m_filesize + 1
  100.  
  101.     currentdepth = 0
  102.     Do
  103.         If start2 >= end2 Then
  104.             'offset2 = end2
  105.             Exit Do
  106.         End If
  107.         
  108.         middle2 = (start2 + end2) / 2
  109.  
  110.         line2 = nw(middle2, offset2, m_filenumber, m_filesize)
  111.         'Debug.Print line2isbig & vbCrLf & start2 & " " & middle2 & " " & end2 & " " & line2;
  112.         'If line2 = "" Then
  113.         '    Exit Do
  114.         'End If
  115.         
  116.         
  117.  
  118.         If line2 > key Or line2 = "" Then
  119.             line2isbig = True
  120.         Else
  121.             line2isbig = False
  122.         End If
  123.         If offset2 > end2 Then
  124.             If end2 = middle2 - 1 Then MsgBox ("endless loop")
  125.             end2 = middle2 - 1
  126.         ElseIf Left(line2, keylen) = key Then
  127.             SeekByWord = 0
  128.             Exit Do
  129.         ElseIf line2isbig Then
  130.             If end2 = middle2 - 1 Then MsgBox ("endless loop")
  131.             end2 = middle2 - 1
  132.         ElseIf line2isbig = False Then
  133.             start2 = offset2 + Len(line2) - 1 ' PERFORMANCE TUNER ?? HOW EFFECTIVE?
  134.         End If
  135.  
  136.         
  137.     Loop
  138.  
  139. endproc:
  140.     If Left(line2, keylen) = key Then SeekByWord = 0
  141.         If Left(line2, 1) = " " Or Left(line2, Len(key)) < key Then
  142.                 middle2 = offset2
  143.                 line2 = nw(middle2, offset2, m_filenumber, m_filesize)
  144.         End If
  145.     m_lastSeek = offset2
  146. End Function
  147.  
  148. Private Function nw(seekloc As Long, newseekloc As Long, m_filenumber As Integer, m_filesize As Long) As String 'nextword
  149.     nw = ""
  150.     
  151.     Seek #m_filenumber, seekloc
  152.     
  153.     Dim sbuf As String
  154.     sbuf = Space(1)
  155.     
  156.     stopchar = True
  157.     sresult = ""
  158.     stopchar_found = False
  159.     lastloc = m_filesize
  160.     Do
  161.         Get #m_filenumber, , sbuf
  162.          If EOF(m_filenumber) Then Exit Do
  163.         If seekloc <= 1 Then
  164.             seekloc = 1
  165.             stopchar_found = True
  166.  
  167.         ElseIf seekloc >= lastloc Then
  168.             seekloc = lastloc
  169.         End If
  170.  
  171.         If stopchar_found Then
  172.             If sbuf = Chr(10) Then
  173.                 
  174.                 Exit Do
  175.             Else
  176.                 sresult = sresult & sbuf
  177.             End If
  178.         Else
  179.             If sbuf = Chr(10) Then
  180.                 stopchar_found = True
  181.                 newseekloc = Seek(m_filenumber)
  182.             End If
  183.         End If
  184.     Loop
  185.     
  186.     nw = sresult
  187.  
  188.  
  189. End Function
  190.  
  191.