home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / read_and_w217231192010.psc / CREATION / DOMAINS / CodeSection / GFMP3 / BSmod.bas
BASIC Source File  |  2003-11-07  |  31KB  |  749 lines

  1. Attribute VB_Name = "BSmod"
  2. Option Explicit
  3. '(c)2001-2003 by Louis.
  4. '
  5. 'NOTE: do not enable 'on error Resume Next to increase speed
  6. '(speed is the main reason to implement BSmod).
  7. 'NOTE: Byte vars seem internally to be converted to long when checking its
  8. 'value, thus If ByteString(1) = 0& is faster than If ByteString(1) = 0 (tested).
  9. 'But attention: allocation is faster with Integer values, thus
  10. 'Let ByteString(1) = 0 is faster than Let ByteString(1) = 0&.
  11. 'Also Select Case is NOT faster when comparing Byte- with Long values.
  12. 'Select Case ByteString(1): Case 1%: End Select is faster than
  13. 'Select Case ByteString(1): Case 1&: End Select.
  14. '
  15. #Const TargetProjectDefinesByteUCaseTableFlag = True
  16. #Const TargetProjectDefinesByteLCaseTableFlag = True
  17. '
  18. 'general use
  19. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  20. Public Declare Sub BYTESTRING_COPYMEMORY Lib "kernel32.dll" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  21. 'GETBYTESTRINGLENGTH
  22. Dim ByteStringLengthMax As Long 'use global var to increase speed
  23. 'GETBYTESTRINGLENGTHFIXED
  24. Dim ByteStringLengthFixed As Long
  25. 'BYTEUCASE
  26. Dim ByteUCaseTableDefinedFlag As Boolean
  27. Dim ByteUCaseTable(0 To 255) As Byte
  28. 'BYTELCASE
  29. Dim ByteLCaseTableDefinedFlag As Boolean
  30. Dim ByteLCaseTable(0 To 255) As Byte
  31. 'other
  32. Dim ByteString1LengthGlobal As Long 'used to save time of memory allocation
  33. Dim ByteString2LengthGlobal As Long 'used to save time of memory allocation
  34. Dim TempGlobal As Long 'used to save time of memory allocation
  35.  
  36. '***BYTE STRING FUNCTIONS***
  37. 'NOTE: the following subs/functions are used to manipulate 'byte strings',
  38. 'i.e. byte arrays that replaced normal strings to increase speed.
  39. 'NOTE: generally you must differ between 1) GETBYTESTRINGLENGTH() and 2) UBound().
  40. '1) returns 'how much is used' of the maximal possible byte string length, and
  41. '2) returns the maximal possible byte string length (important to avoid crashing program with CopyMemory()).
  42.  
  43. Public Sub DefineByteUCaseTable()
  44.     'on error Resume Next
  45.     Dim Temp As Long
  46.     ByteUCaseTableDefinedFlag = True
  47.     For Temp = 0 To 255
  48.         ByteUCaseTable(Temp) = Asc(UCase$(Chr$(Temp)))
  49.     Next Temp
  50. End Sub
  51.  
  52. Public Sub DefineByteLCaseTable()
  53.     'on error Resume Next
  54.     Dim Temp As Long
  55.     ByteLCaseTableDefinedFlag = True
  56.     For Temp = 0 To 255
  57.         ByteLCaseTable(Temp) = Asc(LCase$(Chr$(Temp)))
  58.     Next Temp
  59. End Sub
  60.  
  61. '************************************COPY FUNCTIONS************************************
  62.  
  63. Public Sub BYTESTRINGCOPY(ByRef TargetByteString() As Byte, ByRef SourceByteString() As Byte)
  64.     'on error resume next
  65.     Dim SourceByteStringLength As Long
  66.     'preset
  67.     SourceByteStringLength = UBound(SourceByteString())
  68.     'begin
  69.     If (SourceByteStringLength > 0&) Then 'verify
  70.         ReDim TargetByteString(1 To SourceByteStringLength) As Byte
  71.         Call CopyMemory(TargetByteString(1), SourceByteString(1), SourceByteStringLength)
  72.     Else
  73.         ReDim TargetByteString(1 To 1) As Byte
  74.     End If
  75. End Sub
  76.  
  77. Public Sub BYTESTRINGCOPYEX(ByRef TargetByteString() As Byte, ByRef SourceByteString() As Byte, ByVal SourceByteStringLength As Long)
  78.     'on error resume next
  79.     If (SourceByteStringLength > 0&) Then 'verify
  80.         ReDim TargetByteString(1 To SourceByteStringLength) As Byte
  81.         Call CopyMemory(TargetByteString(1), SourceByteString(1), SourceByteStringLength)
  82.     Else
  83.         ReDim TargetByteString(1 To 1) As Byte
  84.     End If
  85. End Sub
  86.  
  87. Public Sub BYTESTRINGCOPYFIXED(ByRef TargetByteString() As Byte, ByRef SourceByteString() As Byte)
  88.     'on error resume next 'does not resize target byte string, does not clear target byte string
  89.     Call CopyMemory(TargetByteString(1), SourceByteString(1), BS_MIN(UBound(SourceByteString()), UBound(TargetByteString())))
  90. End Sub
  91.  
  92. '********************************END OF COPY FUNCTIONS*********************************
  93. '*********************************CONVERSION FUNCTIONS*********************************
  94. 'NOTE: the following subs/functions are used to create byte strings out of string and vice versa.
  95.  
  96. Public Sub GETBYTESTRINGFROMSTRING(ByVal ByteStringLengthTotal As Long, ByRef ByteString() As Byte, ByVal NormalString As String)
  97.     'on error Resume Next 'redims the passed ByteString() array
  98.     ReDim ByteString(1 To ByteStringLengthTotal) As Byte
  99.     Call CopyMemory(ByteString(1), ByVal NormalString, BS_MIN(ByteStringLengthTotal, Len(NormalString)))
  100. End Sub
  101.  
  102. Public Sub GETFIXEDBYTESTRINGFROMSTRING(ByVal ByteStringLengthTotal As Long, ByRef ByteString() As Byte, ByVal NormalString As String)
  103.     'on error Resume Next 'does NOT redim the passed ByteString() array
  104.     Call CopyMemory(ByteString(1), ByVal NormalString, BS_MIN(ByteStringLengthTotal, Len(NormalString)))
  105. End Sub
  106.  
  107. Public Sub GETSTRINGFROMBYTESTRING(ByRef ByteString() As Byte, ByRef NormalString As String)
  108.     'on error Resume Next
  109.     Dim ByteStringLength As Long
  110.     ByteStringLength = GETBYTESTRINGLENGTH(ByteString())
  111.     NormalString = String$(ByteStringLength, Chr$(0))
  112.     Call CopyMemory(ByVal NormalString, ByteString(1), ByteStringLength)
  113. End Sub
  114.  
  115. Public Function GETRETURNSTRINGFROMBYTESTRING(ByRef ByteString() As Byte) As String
  116.     'on error Resume Next
  117.     Dim ByteStringLength As Long
  118.     Dim Tempstr$
  119.     ByteStringLength = GETBYTESTRINGLENGTH(ByteString())
  120.     Tempstr$ = String$(ByteStringLength, Chr$(0))
  121.     Call CopyMemory(ByVal Tempstr$, ByteString(1), ByteStringLength)
  122.     GETRETURNSTRINGFROMBYTESTRING = Tempstr$
  123. End Function
  124.  
  125. '*****************************END OF CONVERSION FUNCTIONS******************************
  126. '*********************************INFORMATION FUNCTIONS********************************
  127. 'NOTE: the following subs/functions ar used to gain misc information about byte strings.
  128. 'The information functions should be optimized for speed.
  129.  
  130. Public Function GETBYTESTRINGLENGTH(ByRef ByteString() As Byte) As Long
  131.     'on error Resume Next 'returns appearence of first Chr$(0) in ByteString() or UBound(ByteString()); a special algorithm is used that increases the checking speed compared to a simple loop
  132.     ByteStringLengthMax = UBound(ByteString())
  133.     For TempGlobal = 1& To ByteStringLengthMax Step 2&
  134.         If ByteString(TempGlobal) = 0& Then
  135.             If Not (TempGlobal = 1&) Then
  136.                 If ByteString(TempGlobal - 1) = 0& Then
  137.                     GETBYTESTRINGLENGTH = (TempGlobal - 2&)
  138.                     Exit Function
  139.                 Else
  140.                     GETBYTESTRINGLENGTH = (TempGlobal - 1&)
  141.                     Exit Function
  142.                 End If
  143.             Else
  144.                 GETBYTESTRINGLENGTH = (TempGlobal - 1&)
  145.                 Exit Function
  146.             End If
  147.         End If
  148.     Next TempGlobal
  149.     If ByteString(ByteStringLengthMax) = 0& Then
  150.         GETBYTESTRINGLENGTH = ByteStringLengthMax - 1&
  151.     Else
  152.         GETBYTESTRINGLENGTH = ByteStringLengthMax
  153.     End If
  154.     Exit Function
  155. End Function
  156.  
  157. Public Function GETBYTESTRINGLENGTHMAX(ByRef ByteString() As Byte) As Long
  158.     'on error resume next 'professional-looking UBound()
  159.     GETBYTESTRINGLENGTHMAX = UBound(ByteString()) 'ByteString() must have been Dim-ed already
  160. End Function
  161.  
  162. Public Function BYTESTRINGISEQUAL(ByRef ByteString1() As Byte, ByRef ByteString2() As Byte, ByVal IgnoreCapitalizationFlag As Boolean) As Boolean
  163.     'on error Resume Next 'returns True if data (!) in the two passed byte strings is equal
  164.     Dim ByteString1LengthGlobal As Long
  165.     Dim ByteString2LengthGlobal As Long
  166.     Dim TempGlobal As Long
  167.     '
  168.     'NOTE: when using large loops to check byte strings for equalness,
  169.     'first check if (ByteString1(1) = ByteString2(1)) = True before calling
  170.     'this function.
  171.     '
  172.     ByteString1LengthGlobal = GETBYTESTRINGLENGTH(ByteString1())
  173.     ByteString2LengthGlobal = GETBYTESTRINGLENGTH(ByteString2())
  174.     If Not (ByteString1LengthGlobal = ByteString2LengthGlobal) Then
  175.         BYTESTRINGISEQUAL = False
  176.         Exit Function
  177.     Else
  178.         If IgnoreCapitalizationFlag = False Then
  179.             For TempGlobal = 1& To ByteString1LengthGlobal 'or ByteString2LengthGlobal
  180.                 If Not (ByteString1(TempGlobal) = ByteString2(TempGlobal)) Then
  181.                     BYTESTRINGISEQUAL = False
  182.                     Exit Function
  183.                 End If
  184.             Next TempGlobal
  185.         Else
  186.             For TempGlobal = 1& To ByteString1LengthGlobal 'or ByteString2LengthGlobal
  187.                 If Not (BYTEUCASE(ByteString1(TempGlobal)) = BYTEUCASE(ByteString2(TempGlobal))) Then
  188.                     BYTESTRINGISEQUAL = False
  189.                     Exit Function
  190.                 End If
  191.             Next TempGlobal
  192.         End If
  193.     End If
  194.     BYTESTRINGISEQUAL = True
  195.     Exit Function
  196. End Function
  197.  
  198. Public Function BYTESTRINGISEQUAL3(ByRef ByteString1() As Byte, ByRef ByteString2() As Byte, ByVal IgnoreCapitalizationFlag As Boolean) As Boolean
  199.     'on error Resume Next 'returns True if data (!) in the two passed byte strings is equal
  200.     '
  201.     'NOTE: use this function instead of BYTESTRINGISEQUAL3() if both passed byte
  202.     'strings have an UBound >= 3. For this case this faster function here can be used.
  203.     '
  204.     If IgnoreCapitalizationFlag = False Then
  205.         If ByteString1(1) = ByteString2(1) Then
  206.             If ByteString1(2) = ByteString2(2) Then
  207.                 If ByteString1(3) = ByteString2(3) Then
  208.                     'continue below
  209.                 Else
  210.                     GoTo NotEqual:
  211.                 End If
  212.             Else
  213.                 GoTo NotEqual:
  214.             End If
  215.         Else
  216.             GoTo NotEqual:
  217.         End If
  218.     Else
  219.         If BYTEUCASE(ByteString1(1)) = BYTEUCASE(ByteString2(1)) Then
  220.             If BYTEUCASE(ByteString1(2)) = BYTEUCASE(ByteString2(2)) Then
  221.                 If BYTEUCASE(ByteString1(3)) = BYTEUCASE(ByteString2(3)) Then
  222.                     'continue below
  223.                 Else
  224.                     GoTo NotEqual:
  225.                 End If
  226.             Else
  227.                 GoTo NotEqual:
  228.             End If
  229.         Else
  230.             GoTo NotEqual:
  231.         End If
  232.     End If
  233.     '
  234.     ByteString1LengthGlobal = GETBYTESTRINGLENGTH(ByteString1())
  235.     ByteString2LengthGlobal = GETBYTESTRINGLENGTH(ByteString2())
  236.     If Not (ByteString1LengthGlobal = ByteString2LengthGlobal) Then
  237.         BYTESTRINGISEQUAL3 = False
  238.         Exit Function
  239.     Else
  240.         If IgnoreCapitalizationFlag = False Then
  241.             For TempGlobal = 1& To ByteString1LengthGlobal 'or ByteString2LengthGlobal
  242.                 If Not (ByteString1(TempGlobal) = ByteString2(TempGlobal)) Then
  243.                     BYTESTRINGISEQUAL3 = False
  244.                     Exit Function
  245.                 End If
  246.             Next TempGlobal
  247.         Else
  248.             For TempGlobal = 1& To ByteString1LengthGlobal 'or ByteString2LengthGlobal
  249.                 If Not (BYTEUCASE(ByteString1(TempGlobal)) = BYTEUCASE(ByteString2(TempGlobal))) Then
  250.                     BYTESTRINGISEQUAL3 = False
  251.                     Exit Function
  252.                 End If
  253.             Next TempGlobal
  254.         End If
  255.     End If
  256.     BYTESTRINGISEQUAL3 = True
  257.     Exit Function
  258. NotEqual:
  259.     BYTESTRINGISEQUAL3 = False
  260.     Exit Function
  261. End Function
  262.  
  263. Public Sub BYTESTRINGISEQUALFIXED_SETLENGTH(ByVal ByteStringLengthFixedPassed As Long)
  264.     'on error resume next
  265.     ByteStringLengthFixed = ByteStringLengthFixedPassed
  266. End Sub
  267.  
  268. Public Function BYTESTRINGISEQUALFIXED(ByRef ByteString1() As Byte, ByRef ByteString2() As Byte, ByVal IgnoreCapitalizationFlag As Boolean) As Boolean
  269.     'on error Resume Next 'returns True if data (!) in the two passed byte strings is equal (both byte strings msut have a fixed length that was previously passed to BYTESTRINGISEQUALFIXED_SETLENGTH())
  270.     Dim TempGlobal As Long
  271.     '
  272.     'NOTE: when using large loops to check byte strings for equalness,
  273.     'first check if (ByteString1(1) = ByteString2(1)) = True before calling
  274.     'this function.
  275.     '
  276.     If IgnoreCapitalizationFlag = False Then
  277.         For TempGlobal = 1& To ByteStringLengthFixed
  278.             If Not (ByteString1(TempGlobal) = ByteString2(TempGlobal)) Then
  279.                 BYTESTRINGISEQUALFIXED = False
  280.                 Exit Function
  281.             End If
  282.         Next TempGlobal
  283.     Else
  284.         For TempGlobal = 1& To ByteStringLengthFixed
  285.             If Not (BYTEUCASE(ByteString1(TempGlobal)) = BYTEUCASE(ByteString2(TempGlobal))) Then
  286.                 BYTESTRINGISEQUALFIXED = False
  287.                 Exit Function
  288.             End If
  289.         Next TempGlobal
  290.     End If
  291.     BYTESTRINGISEQUALFIXED = True
  292.     Exit Function
  293. End Function
  294.  
  295. 'NOTE: the following function was not really faster than the original BYTESTRINGISEQUAL() function.
  296. 'Public Function BYTESTRINGISEQUAL2(ByRef ByteString1() As Byte, ByRef ByteString2() As Byte, ByVal IgnoreCapitalizationFlag As Boolean, ByVal ByteString1LengthMax As Long, ByVal ByteString2LengthMax As Long) As Boolean
  297. '    'on error resume next
  298. '    Dim Temp As Long
  299. '    '
  300. '    'NOTE: this function is faster than BYTESTRINGISEQUAL().
  301. '    'Use this function if the maximal byte string length is known
  302. '    '(this function saves GETBYTESTRINGLENGTH() calls).
  303. '    '
  304. '    'preset
  305. '    'begin
  306. '    If IgnoreCapitalizationFlag = False Then
  307. '        For Temp = 1 To BS_MIN(ByteString1LengthMax, ByteString2LengthMax)
  308. '            If ByteString1(Temp) = ByteString2(Temp) Then
  309. '                'ok
  310. '            Else
  311. '                BYTESTRINGISEQUAL2 = False
  312. '                Exit Function
  313. '            End If
  314. '        Next Temp
  315. '        If ByteString1LengthMax > ByteString2LengthMax Then
  316. '            For Temp = (ByteString2LengthMax + 1&) To ByteString1LengthMax
  317. '                If ByteString1(Temp) = 0& Then
  318. '                    Exit For 'end of string
  319. '                Else
  320. '                    BYTESTRINGISEQUAL2 = False
  321. '                    Exit Function
  322. '                End If
  323. '            Next Temp
  324. '        Else
  325. '            For Temp = (ByteString1LengthMax + 1&) To ByteString2LengthMax
  326. '                If ByteString2(Temp) = 0& Then
  327. '                    Exit For 'end of string
  328. '                Else
  329. '                    BYTESTRINGISEQUAL2 = False
  330. '                    Exit Function
  331. '                End If
  332. '            Next Temp
  333. '        End If
  334. '    Else
  335. '        For Temp = 1 To BS_MIN(ByteString1LengthMax, ByteString2LengthMax)
  336. '            If BYTEUCASE(ByteString1(Temp)) = BYTEUCASE(ByteString2(Temp)) Then
  337. '                'ok
  338. '            Else
  339. '                BYTESTRINGISEQUAL2 = False
  340. '                Exit Function
  341. '            End If
  342. '        Next Temp
  343. '        If ByteString1LengthMax > ByteString2LengthMax Then
  344. '            For Temp = (ByteString2LengthMax + 1&) To ByteString1LengthMax
  345. '                If ByteString1(Temp) = 0& Then
  346. '                    Exit For 'end of string
  347. '                Else
  348. '                    BYTESTRINGISEQUAL2 = False
  349. '                    Exit Function
  350. '                End If
  351. '            Next Temp
  352. '        Else
  353. '            For Temp = (ByteString1LengthMax + 1&) To ByteString2LengthMax
  354. '                If ByteString2(Temp) = 0& Then
  355. '                    Exit For 'end of string
  356. '                Else
  357. '                    BYTESTRINGISEQUAL2 = False
  358. '                    Exit Function
  359. '                End If
  360. '            Next Temp
  361. '        End If
  362. '    End If
  363. '    BYTESTRINGISEQUAL2 = True 'if not quit before
  364. '    Exit Function
  365. 'End Function
  366.  
  367. Public Function InStrByte(ByVal StartPos As Long, ByRef ByteString1() As Byte, ByRef ByteString2() As Byte, ByVal CompareMethod As Integer) As Long
  368.     'on error Resume Next
  369.     Dim ByteString2Pos As Long
  370.     Dim ByteString2Length As Long
  371.     Dim Temp As Long
  372.     'verify
  373.     If StartPos < 1& Then
  374.         InStrByte = 0&
  375.         Exit Function
  376.     End If
  377.     'preset
  378.     ByteString2Pos = 1&
  379.     If ByteString2Pos > UBound(ByteString2()) Then
  380.         InStrByte = 0& 'error
  381.         Exit Function 'verify
  382.     End If
  383.     ByteString2Length = GETBYTESTRINGLENGTH(ByteString2())
  384.     'begin
  385.     Select Case CompareMethod
  386.     Case vbBinaryCompare
  387.         For Temp = StartPos To GETBYTESTRINGLENGTH(ByteString1())
  388.             If ByteString1(Temp) = ByteString2(ByteString2Pos) Then
  389.                 ByteString2Pos = ByteString2Pos + 1&
  390.                 If ByteString2Pos > ByteString2Length Then
  391.                     InStrByte = Temp - ByteString2Pos + 2& 'ok
  392.                     Exit Function
  393.                 End If
  394.             Else
  395.                 ByteString2Pos = 1& 'reset (important)
  396.             End If
  397.         Next Temp
  398.     Case Else 'i.e. vbTextCompare
  399.         For Temp = StartPos To GETBYTESTRINGLENGTH(ByteString1())
  400.             If BYTEUCASE(ByteString1(Temp)) = BYTEUCASE(ByteString2(ByteString2Pos)) Then
  401.                 ByteString2Pos = ByteString2Pos + 1&
  402.                 If ByteString2Pos > ByteString2Length Then
  403.                     InStrByte = Temp - ByteString2Pos + 2& 'ok
  404.                     Exit Function
  405.                 End If
  406.             Else
  407.                 ByteString2Pos = 1& 'reset (important)
  408.             End If
  409.         Next Temp
  410.     End Select
  411.     InStrByte = 0& 'error
  412.     Exit Function
  413. End Function
  414.  
  415. 'NOTE: the following function was not faster than the original InStrByte() function.
  416. 'Public Function InStrByte2(ByVal StartPos As Long, ByRef ByteString1() As Byte, ByRef ByteString2() As Byte, ByVal CompareMethod As Integer, ByVal ByteString1LengthMax As Long, ByVal ByteString2LengthMax As Long) As Long
  417. '    'on error resume next
  418. '    Dim ByteString2Pos As Long
  419. '    Dim ByteString2LengthMaxMinusOne As Long
  420. '    Dim Temp As Long
  421. '    'verify
  422. '    If StartPos < 1& Then
  423. '        InStrByte2 = 0&
  424. '        Exit Function
  425. '    End If
  426. '    If (ByteString2(1) = 0&) Or (ByteString2LengthMax = 0) Then
  427. '        InStrByte2 = 0&
  428. '        Exit Function
  429. '    End If
  430. '    'preset
  431. '    ByteString2LengthMaxMinusOne = ByteString2LengthMax - 1&
  432. '    'begin
  433. '    Select Case CompareMethod
  434. '    Case vbBinaryCompare
  435. '        For Temp = StartPos To ByteString1LengthMax
  436. '            If (ByteString2Pos) > ByteString2LengthMaxMinusOne Then
  437. '                InStrByte2 = (Temp - ByteString2Pos)
  438. '                Exit Function
  439. '            End If
  440. '            If ByteString2(1& + ByteString2Pos) = 0& Then
  441. '                InStrByte2 = (Temp - ByteString2Pos)
  442. '                Exit Function
  443. '            End If
  444. '            If ByteString1(Temp) = ByteString2(1& + ByteString2Pos) Then
  445. '                ByteString2Pos = ByteString2Pos + 1&
  446. '            Else
  447. '                ByteString2Pos = 0& 'reset
  448. '            End If
  449. '        Next Temp
  450. '        If (ByteString2Pos) Then
  451. '            InStrByte2 = (Temp - ByteString2Pos)
  452. '        Else
  453. '            InStrByte2 = 0&
  454. '        End If
  455. '    Case vbTextCompare
  456. '        For Temp = StartPos To ByteString1LengthMax
  457. '            If (ByteString2Pos) > ByteString2LengthMaxMinusOne Then
  458. '                InStrByte2 = (Temp - ByteString2Pos)
  459. '                Exit Function
  460. '            End If
  461. '            If ByteString2(1& + ByteString2Pos) = 0& Then
  462. '                InStrByte2 = (Temp - ByteString2Pos)
  463. '                Exit Function
  464. '            End If
  465. '            If BYTEUCASE(ByteString1(Temp)) = BYTEUCASE(ByteString2(1& + ByteString2Pos)) Then
  466. '                ByteString2Pos = ByteString2Pos + 1&
  467. '            Else
  468. '                ByteString2Pos = 0& 'reset
  469. '            End If
  470. '        Next Temp
  471. '        If (ByteString2Pos) Then
  472. '            InStrByte2 = (Temp - ByteString2Pos)
  473. '        Else
  474. '            InStrByte2 = 0&
  475. '        End If
  476. '    End Select
  477. '    Exit Function
  478. 'End Function
  479.  
  480. Public Sub DISPLAYBYTESTRING(ByRef ByteString() As Byte)
  481.     'on error Resume Next 'use for debugging
  482.     Dim Tempstr$
  483.     Call GETSTRINGFROMBYTESTRING(ByteString(), Tempstr$)
  484.     Debug.Print Tempstr$
  485. End Sub
  486.  
  487. Public Sub DISPLAYBYTESTRINGDEC(ByRef ByteString() As Byte, Optional ByVal ByteStringLength As Long = -1&)
  488.     'on error resume next 'displays byte string data like in a hex editor, but in decimal
  489.     Dim CharFor As Long
  490.     'preset
  491.     If ByteStringLength = -1& Then ByteStringLength = UBound(ByteString())
  492.     'begin
  493.     For CharFor = 1 To ByteStringLength
  494.         If ByteString(CharFor) < 100 Then
  495.             If ByteString(CharFor) < 10 Then
  496.                 Debug.Print "00" + CStr(ByteString(CharFor)) + " ";
  497.             Else
  498.                 Debug.Print "0" + CStr(ByteString(CharFor)) + " ";
  499.             End If
  500.         Else
  501.             Debug.Print CStr(ByteString(CharFor)) + " ";
  502.         End If
  503.     Next CharFor
  504.     Debug.Print ""
  505. End Sub
  506.  
  507. '*****************************END OF INFORMATION FUNCTIONS*****************************
  508. '********************************MANIPULATION FUNCTIONS********************************
  509. 'NOTE: the following subs/functions are used to manipulate byte strings.
  510. 'The manipulation function should be optimized for speed.
  511.  
  512. Public Sub BYTESTRINGSIZE(ByRef ByteString() As Byte, ByVal ByteStringLengthMaxNew As Long)
  513.     'on error resume next 'use instead of ReDim x (looks more professional)
  514.     ReDim ByteString(1 To BS_MAX(1, ByteStringLengthMaxNew)) As Byte
  515. End Sub
  516.  
  517. Public Sub BYTESTRINGRESIZE(ByRef ByteString() As Byte, ByVal ByteStringLengthMaxNew As Long)
  518.     'on error resume next 'use instead of ReDim Preserve x (looks more professional)
  519.     ReDim Preserve ByteString(1 To BS_MAX(1, ByteStringLengthMaxNew)) As Byte
  520. End Sub
  521.  
  522. Public Sub BYTESTRINGCLEAR(ByRef ByteString() As Byte)
  523.     'on error resume next
  524.     Call BYTESTRINGLEFT(ByteString(), 0&)
  525. End Sub
  526.  
  527. Public Sub BYTESTRINGLEFT(ByRef ByteString() As Byte, ByVal RetainCharNumber As Long)
  528.     'on error Resume Next 'retains left part of ByteString() and sets the rest to 0
  529.     Dim ByteStringLBound As Long
  530.     Dim Temp As Long
  531.     'preset
  532.     ByteStringLBound = LBound(ByteString())
  533.     'begin
  534.     For Temp = (RetainCharNumber + 1&) To UBound(ByteString())
  535.         If Not (Temp < ByteStringLBound) Then 'verify (important)
  536.             ByteString(Temp) = 0 'reset
  537.         End If
  538.     Next Temp
  539. End Sub
  540.     
  541. Public Sub BYTESTRINGMID(ByRef TargetByteString() As Byte, ByRef SourceByteString() As Byte, ByVal CopyStartPos As Long, ByVal CopyLength As Long)
  542.     'on error Resume Next 'like '[...] = Mid$([...])'
  543.     Dim SourceByteStringLength As Long
  544.     'preset
  545.     SourceByteStringLength = GETBYTESTRINGLENGTH(SourceByteString())
  546.     If (CopyStartPos < 1&) Or (CopyStartPos > SourceByteStringLength) Then GoTo Error: 'verify
  547.     If (CopyStartPos + CopyLength - 1&) > SourceByteStringLength Then CopyLength = SourceByteStringLength - CopyStartPos + 1&
  548.     'begin
  549.     If Not (CopyLength < 1&) Then 'verify
  550.         ReDim TargetByteString(1 To CopyLength) As Byte
  551.         Call CopyMemory(TargetByteString(1), SourceByteString(CopyStartPos), CopyLength)
  552.     Else
  553.         GoTo Error:
  554.     End If
  555.     Exit Sub
  556. Error:
  557.     ReDim TargetByteString(1 To 1) As Byte 'verify UBound() etc. will not fail in further actions
  558.     TargetByteString(1) = 0 'reset
  559.     Exit Sub
  560. End Sub
  561.     
  562. Public Sub BYTESTRINGRIGHT(ByRef ByteString() As Byte, ByVal RetainCharNumber As Long)
  563.     'on error Resume Next 'retains left part of ByteString() and sets the rest to 0
  564.     Dim ByteStringLBound As Long
  565.     Dim Temp As Long
  566.     'preset
  567.     ByteStringLBound = LBound(ByteString())
  568.     'begin
  569.     For Temp = 1& To (GETBYTESTRINGLENGTH(ByteString()) - RetainCharNumber)
  570.         If Not (Temp < ByteStringLBound) Then 'verify (important)
  571.             ByteString(Temp) = 0 'reset
  572.         End If
  573.     Next Temp
  574. End Sub
  575.  
  576. Public Sub BYTESTRINGTRIM(ByRef ByteString() As Byte)
  577.     'on error Resume Next
  578.     Dim ByteStringLength As Long
  579.     Dim Temp As Long
  580.     'preset
  581.     ByteStringLength = GETBYTESTRINGLENGTH(ByteString())
  582.     'cut left spaces
  583.     For Temp = 1& To ByteStringLength
  584.         If Not (ByteString(Temp) = 32&) Then
  585.             If (Temp > 1&) Then
  586.                 Call BYTESTRINGCUT(ByteString(), 1, (Temp - 1), 0)
  587.                 ByteStringLength = GETBYTESTRINGLENGTH(ByteString()) 'refresh (important)
  588.             End If
  589.             Exit For
  590.         End If
  591.     Next Temp
  592.     'cut right spaces
  593.     For Temp = ByteStringLength To 1& Step (-1&)
  594.         If Not (ByteString(Temp) = 32&) Then
  595.             If (Temp < ByteStringLength) Then
  596.                 Call BYTESTRINGCUT(ByteString(), (Temp + 1), (ByteStringLength - Temp), 0)
  597.             End If
  598.             Exit For
  599.         End If
  600.     Next Temp
  601. End Sub
  602.  
  603. Public Sub BYTESTRINGREMOVESPACE(ByRef ByteString() As Byte)
  604.     'on error Resume Next 'removes all (!) spaces in ByteString()
  605.     Dim ByteStringWritePos As Long
  606.     Dim ByteStringReadPos As Long
  607.     Dim ByteStringLength As Long
  608.     'preset
  609.     ByteStringLength = GETBYTESTRINGLENGTH(ByteString())
  610.     'begin
  611.     For ByteStringReadPos = 1& To ByteStringLength
  612.         If Not (ByteString(ByteStringReadPos) = 32&) Then
  613.             ByteStringWritePos = ByteStringWritePos + 1&
  614.             ByteString(ByteStringWritePos) = ByteString(ByteStringReadPos) 'is moved at left only (using one byte string is possible)
  615.         End If
  616.     Next ByteStringReadPos
  617.     For ByteStringReadPos = (ByteStringWritePos + 1&) To ByteStringLength
  618.         ByteString(ByteStringReadPos) = 0 'reset
  619.     Next ByteStringReadPos
  620. End Sub
  621.  
  622. Public Function BYTEUCASE(ByRef ByteChar As Byte) As Byte
  623.     'on error Resume Next
  624.     #If TargetProjectDefinesByteUCaseTableFlag = False Then
  625.         If ByteUCaseTableDefinedFlag = False Then Call DefineByteUCaseTable
  626.     #End If
  627.     BYTEUCASE = ByteUCaseTable(ByteChar)
  628. End Function
  629.  
  630. Public Sub BYTESTRINGUCASE(ByRef ByteString() As Byte, ByVal ByteStringLengthMax As Long)
  631.     'on error resume next
  632.     Dim Temp As Long
  633.     'preset
  634.     #If TargetProjectDefinesByteUCaseTableFlag = False Then
  635.         If ByteUCaseTableDefinedFlag = False Then Call DefineByteUCaseTable
  636.     #End If
  637.     'begin
  638.     For Temp = 1& To ByteStringLengthMax
  639.         ByteString(Temp) = ByteUCaseTable(ByteString(Temp))
  640.     Next Temp
  641. End Sub
  642.  
  643. Public Function BYTELCASE(ByRef ByteChar As Byte) As Byte
  644.     'on error Resume Next
  645.     #If TargetProjectDefinesByteLCaseTableFlag = False Then
  646.         If ByteLCaseTableDefinedFlag = False Then Call DefineByteLCaseTable
  647.     #End If
  648.     BYTELCASE = ByteLCaseTable(ByteChar)
  649. End Function
  650.  
  651. Public Sub BYTESTRINGLCASE(ByRef ByteString() As Byte, ByVal ByteStringLengthMax As Long)
  652.     'on error resume next
  653.     Dim Temp As Long
  654.     'preset
  655.     #If TargetProjectDefinesByteLCaseTableFlag = False Then
  656.         If ByteLCaseTableDefinedFlag = False Then Call DefineByteLCaseTable
  657.     #End If
  658.     'begin
  659.     For Temp = 1& To ByteStringLengthMax
  660.         ByteString(Temp) = ByteLCaseTable(ByteString(Temp))
  661.     Next Temp
  662. End Sub
  663.  
  664. Public Function BYTESTRINGVAL(ByRef ByteString() As Byte) As Double
  665.     'on error Resume Next 'does not check for Double overflow
  666.     Dim ByteStringLengthMax As Long
  667.     Dim NumberEndIndex As Long 'where number before comma ends
  668.     Dim ReturnValue As Double
  669.     Dim Temp As Long
  670.     'preset
  671.     ByteStringLengthMax = UBound(ByteString())
  672.     NumberEndIndex = ByteStringLengthMax
  673.     'begin
  674.     For Temp = 1 To ByteStringLengthMax
  675.         Select Case ByteString(Temp)
  676.         Case 48 '0
  677.         Case 49 '1
  678.         Case 50 '2
  679.         Case 51 '3
  680.         Case 52 '4
  681.         Case 53 '5
  682.         Case 54 '6
  683.         Case 55 '7
  684.         Case 56 '8
  685.         Case 57 '9
  686.         Case 46 '.
  687.             NumberEndIndex = (Temp - 1)
  688.             Exit For
  689.         Case Else
  690.             NumberEndIndex = (Temp - 1)
  691.             Exit For
  692.         End Select
  693.     Next Temp
  694.     For Temp = 1 To ByteStringLengthMax
  695.         Select Case ByteString(Temp)
  696.         Case 48 '0
  697.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  698.         Case 49 '1
  699.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  700.         Case 50 '2
  701.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  702.         Case 51 '3
  703.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  704.         Case 52 '4
  705.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  706.         Case 53 '5
  707.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  708.         Case 54 '6
  709.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  710.         Case 55 '7
  711.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  712.         Case 56 '8
  713.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  714.         Case 57 '9
  715.             ReturnValue = ReturnValue + (ByteString(Temp) - 48) * (10& ^ (NumberEndIndex - Temp))
  716.         Case 46 '.
  717.             NumberEndIndex = NumberEndIndex + 1 '10 ^ (-1) will be used for next number
  718.         Case Else
  719.             Exit For
  720.         End Select
  721.     Next Temp
  722.     BYTESTRINGVAL = ReturnValue
  723. End Function
  724.  
  725. Public Function BYTESTRINGVALLONG(ByRef ByteString() As Byte) As Long
  726.     'on error Resume Next 'save return value in a var of the type Long
  727.     Dim ByteStringLength As Long
  728.     Dim UseCharNumber As Long 'how many chars of ByteString() are used to get number
  729.     Dim Temp As Long
  730.     'preset
  731.     ByteStringLength = GETBYTESTRINGLENGTH(ByteString())
  732.     UseCharNumber = ByteStringLength 'preset
  733.     'begin
  734.     For Temp = 1& To ByteStringLength
  735.         If (ByteString(Temp) < 48&) Or (ByteString(Temp) > 57&) Then
  736.             UseCharNumber = (Temp - 1&)
  737.             Exit For
  738.         End If
  739.     Next Temp
  740.     For Temp = 1& To UseCharNumber
  741.         BYTESTRINGVALLONG = BYTESTRINGVALLONG + 10& ^ (UseCharNumber - Temp) * (ByteString(Temp) - 48)
  742.     Next Temp
  743. End Function
  744.  
  745. Public Sub BYTESTRINGCUT(ByRef ByteString() As Byte, ByVal CutStartPos As Long, ByVal CutLength As Long, Optional ByVal RightEndReplaceAsc As Byte = 0, Optional ByVal ByteStringLengthFixedFlag As Boolean = True)
  746.     'on error Resume Next 'removes data in byte string leftwards and deltes 'right end' of moved data through overw Case 50Eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanaaaaaaa=eCharNumber As alue = ReturnValue SthGlobal 'or Byte^ (Number0u(Temeg(1) = 0 'r'ength As Longtype smp - 1&)igthMax Then
  747. '            For Temp = (ByteString2LengthMax + 1&) To ByteString1LengthMax
  748. '            iax + 1&) To ByteString1LengthMax AAs Longtype smp - 1&)igthpIlecunction
  749. '