xref: /aosp_15_r20/external/capstone/bindings/vb6/mMisc.bas (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf EbrahimiAttribute VB_Name = "mMisc"
2*9a0e4156SSadaf EbrahimiOption Explicit
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi'These are old library functions
5*9a0e4156SSadaf Ebrahimi
6*9a0e4156SSadaf EbrahimiPrivate Type Bit64Currency
7*9a0e4156SSadaf Ebrahimi  value As Currency
8*9a0e4156SSadaf EbrahimiEnd Type
9*9a0e4156SSadaf Ebrahimi
10*9a0e4156SSadaf EbrahimiPrivate Type Bit64Integer
11*9a0e4156SSadaf Ebrahimi  LowValue As Long
12*9a0e4156SSadaf Ebrahimi  HighValue As Long
13*9a0e4156SSadaf EbrahimiEnd Type
14*9a0e4156SSadaf Ebrahimi
15*9a0e4156SSadaf EbrahimiGlobal Const LANG_US = &H409
16*9a0e4156SSadaf Ebrahimi
17*9a0e4156SSadaf EbrahimiPublic Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
18*9a0e4156SSadaf EbrahimiPublic Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
19*9a0e4156SSadaf EbrahimiPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
20*9a0e4156SSadaf EbrahimiPublic Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
21*9a0e4156SSadaf EbrahimiPublic Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
22*9a0e4156SSadaf EbrahimiPublic Declare Function SetDllDirectory Lib "kernel32" Alias "SetDllDirectoryA" (ByVal lpPathName As String) As Long
23*9a0e4156SSadaf Ebrahimi
24*9a0e4156SSadaf EbrahimiFunction makeCur(high As Long, low As Long) As Currency
25*9a0e4156SSadaf Ebrahimi  Dim c As Bit64Currency
26*9a0e4156SSadaf Ebrahimi  Dim dl As Bit64Integer
27*9a0e4156SSadaf Ebrahimi  dl.LowValue = low
28*9a0e4156SSadaf Ebrahimi  dl.HighValue = high
29*9a0e4156SSadaf Ebrahimi  LSet c = dl
30*9a0e4156SSadaf Ebrahimi  makeCur = c.value
31*9a0e4156SSadaf EbrahimiEnd Function
32*9a0e4156SSadaf Ebrahimi
33*9a0e4156SSadaf EbrahimiFunction lng2Cur(v As Long) As Currency
34*9a0e4156SSadaf Ebrahimi  Dim c As Bit64Currency
35*9a0e4156SSadaf Ebrahimi  Dim dl As Bit64Integer
36*9a0e4156SSadaf Ebrahimi  dl.LowValue = v
37*9a0e4156SSadaf Ebrahimi  dl.HighValue = 0
38*9a0e4156SSadaf Ebrahimi  LSet c = dl
39*9a0e4156SSadaf Ebrahimi  lng2Cur = c.value
40*9a0e4156SSadaf EbrahimiEnd Function
41*9a0e4156SSadaf Ebrahimi
42*9a0e4156SSadaf EbrahimiFunction cur2str(v As Currency) As String
43*9a0e4156SSadaf Ebrahimi    Dim c As Bit64Currency
44*9a0e4156SSadaf Ebrahimi    Dim dl As Bit64Integer
45*9a0e4156SSadaf Ebrahimi    c.value = v
46*9a0e4156SSadaf Ebrahimi    LSet dl = c
47*9a0e4156SSadaf Ebrahimi    If dl.HighValue = 0 Then
48*9a0e4156SSadaf Ebrahimi        cur2str = Right("00000000" & Hex(dl.LowValue), 8)
49*9a0e4156SSadaf Ebrahimi    Else
50*9a0e4156SSadaf Ebrahimi        cur2str = Right("00000000" & Hex(dl.HighValue), 8) & "`" & Right("00000000" & Hex(dl.LowValue), 8)
51*9a0e4156SSadaf Ebrahimi    End If
52*9a0e4156SSadaf EbrahimiEnd Function
53*9a0e4156SSadaf Ebrahimi
54*9a0e4156SSadaf EbrahimiFunction x64StrToCur(ByVal str As String) As Currency
55*9a0e4156SSadaf Ebrahimi
56*9a0e4156SSadaf Ebrahimi    str = Replace(Trim(str), "0x", "")
57*9a0e4156SSadaf Ebrahimi    str = Replace(str, " ", "")
58*9a0e4156SSadaf Ebrahimi    str = Replace(str, "`", "")
59*9a0e4156SSadaf Ebrahimi
60*9a0e4156SSadaf Ebrahimi    Dim low As String, high As String
61*9a0e4156SSadaf Ebrahimi    Dim c As Bit64Currency
62*9a0e4156SSadaf Ebrahimi    Dim dl As Bit64Integer
63*9a0e4156SSadaf Ebrahimi
64*9a0e4156SSadaf Ebrahimi    low = VBA.Right(str, 8)
65*9a0e4156SSadaf Ebrahimi    dl.LowValue = CLng("&h" & low)
66*9a0e4156SSadaf Ebrahimi
67*9a0e4156SSadaf Ebrahimi    If Len(str) > 8 Then
68*9a0e4156SSadaf Ebrahimi        high = Mid(str, 1, Len(str) - 8)
69*9a0e4156SSadaf Ebrahimi        dl.HighValue = CLng("&h" & high)
70*9a0e4156SSadaf Ebrahimi    End If
71*9a0e4156SSadaf Ebrahimi
72*9a0e4156SSadaf Ebrahimi    LSet c = dl
73*9a0e4156SSadaf Ebrahimi    x64StrToCur = c.value
74*9a0e4156SSadaf Ebrahimi
75*9a0e4156SSadaf EbrahimiEnd Function
76*9a0e4156SSadaf Ebrahimi
77*9a0e4156SSadaf EbrahimiFunction cur2lng(v As Currency) As Long
78*9a0e4156SSadaf Ebrahimi  Dim c As Bit64Currency
79*9a0e4156SSadaf Ebrahimi  Dim dl As Bit64Integer
80*9a0e4156SSadaf Ebrahimi  c.value = v
81*9a0e4156SSadaf Ebrahimi  LSet dl = c
82*9a0e4156SSadaf Ebrahimi  cur2lng = dl.LowValue
83*9a0e4156SSadaf EbrahimiEnd Function
84*9a0e4156SSadaf Ebrahimi
85*9a0e4156SSadaf EbrahimiFunction readLng(offset As Long) As Long
86*9a0e4156SSadaf Ebrahimi    Dim tmp As Long
87*9a0e4156SSadaf Ebrahimi    CopyMemory ByVal VarPtr(tmp), ByVal offset, 4
88*9a0e4156SSadaf Ebrahimi    readLng = tmp
89*9a0e4156SSadaf EbrahimiEnd Function
90*9a0e4156SSadaf Ebrahimi
91*9a0e4156SSadaf EbrahimiFunction readByte(offset As Long) As Byte
92*9a0e4156SSadaf Ebrahimi    Dim tmp As Byte
93*9a0e4156SSadaf Ebrahimi    CopyMemory ByVal VarPtr(tmp), ByVal offset, 1
94*9a0e4156SSadaf Ebrahimi    readByte = tmp
95*9a0e4156SSadaf EbrahimiEnd Function
96*9a0e4156SSadaf Ebrahimi
97*9a0e4156SSadaf EbrahimiFunction readCur(offset As Long) As Currency
98*9a0e4156SSadaf Ebrahimi    Dim tmp As Currency
99*9a0e4156SSadaf Ebrahimi    CopyMemory ByVal VarPtr(tmp), ByVal offset, 8
100*9a0e4156SSadaf Ebrahimi    readCur = tmp
101*9a0e4156SSadaf EbrahimiEnd Function
102*9a0e4156SSadaf Ebrahimi
103*9a0e4156SSadaf EbrahimiFunction col2Str(c As Collection, Optional emptyVal = "") As String
104*9a0e4156SSadaf Ebrahimi    Dim v, tmp As String
105*9a0e4156SSadaf Ebrahimi
106*9a0e4156SSadaf Ebrahimi    If c.count = 0 Then
107*9a0e4156SSadaf Ebrahimi        col2Str = emptyVal
108*9a0e4156SSadaf Ebrahimi    Else
109*9a0e4156SSadaf Ebrahimi        For Each v In c
110*9a0e4156SSadaf Ebrahimi            col2Str = col2Str & hhex(v) & ", "
111*9a0e4156SSadaf Ebrahimi        Next
112*9a0e4156SSadaf Ebrahimi        col2Str = Mid(col2Str, 1, Len(col2Str) - 2)
113*9a0e4156SSadaf Ebrahimi    End If
114*9a0e4156SSadaf Ebrahimi
115*9a0e4156SSadaf EbrahimiEnd Function
116*9a0e4156SSadaf Ebrahimi
117*9a0e4156SSadaf EbrahimiFunction regCol2Str(hEngine As Long, c As Collection) As String
118*9a0e4156SSadaf Ebrahimi    Dim v, tmp As String
119*9a0e4156SSadaf Ebrahimi
120*9a0e4156SSadaf Ebrahimi    If c.count = 0 Then Exit Function
121*9a0e4156SSadaf Ebrahimi
122*9a0e4156SSadaf Ebrahimi    For Each v In c
123*9a0e4156SSadaf Ebrahimi        regCol2Str = regCol2Str & regName(hEngine, CLng(v)) & ", "
124*9a0e4156SSadaf Ebrahimi    Next
125*9a0e4156SSadaf Ebrahimi    regCol2Str = Mid(regCol2Str, 1, Len(regCol2Str) - 2)
126*9a0e4156SSadaf Ebrahimi
127*9a0e4156SSadaf EbrahimiEnd Function
128*9a0e4156SSadaf Ebrahimi
129*9a0e4156SSadaf Ebrahimi
130*9a0e4156SSadaf Ebrahimi
131*9a0e4156SSadaf EbrahimiFunction b2Str(b() As Byte) As String
132*9a0e4156SSadaf Ebrahimi    Dim i As Long
133*9a0e4156SSadaf Ebrahimi
134*9a0e4156SSadaf Ebrahimi    If AryIsEmpty(b) Then
135*9a0e4156SSadaf Ebrahimi         b2Str = "Empty"
136*9a0e4156SSadaf Ebrahimi    Else
137*9a0e4156SSadaf Ebrahimi        For i = 0 To UBound(b)
138*9a0e4156SSadaf Ebrahimi             b2Str = b2Str & hhex(b(i)) & " "
139*9a0e4156SSadaf Ebrahimi        Next
140*9a0e4156SSadaf Ebrahimi        b2Str = Trim(b2Str)
141*9a0e4156SSadaf Ebrahimi    End If
142*9a0e4156SSadaf Ebrahimi
143*9a0e4156SSadaf EbrahimiEnd Function
144*9a0e4156SSadaf Ebrahimi
145*9a0e4156SSadaf Ebrahimi
146*9a0e4156SSadaf Ebrahimi
147*9a0e4156SSadaf EbrahimiFunction AryIsEmpty(ary) As Boolean
148*9a0e4156SSadaf Ebrahimi  Dim i As Long
149*9a0e4156SSadaf Ebrahimi
150*9a0e4156SSadaf Ebrahimi  On Error GoTo oops
151*9a0e4156SSadaf Ebrahimi    i = UBound(ary)  '<- throws error if not initalized
152*9a0e4156SSadaf Ebrahimi    AryIsEmpty = False
153*9a0e4156SSadaf Ebrahimi  Exit Function
154*9a0e4156SSadaf Ebrahimioops: AryIsEmpty = True
155*9a0e4156SSadaf EbrahimiEnd Function
156*9a0e4156SSadaf Ebrahimi
157*9a0e4156SSadaf EbrahimiPublic Function toBytes(ByVal hexstr, Optional strRet As Boolean = False)
158*9a0e4156SSadaf Ebrahimi
159*9a0e4156SSadaf Ebrahimi'supports:
160*9a0e4156SSadaf Ebrahimi'11 22 33 44   spaced hex chars
161*9a0e4156SSadaf Ebrahimi'11223344      run together hex strings
162*9a0e4156SSadaf Ebrahimi'11,22,33,44   csv hex
163*9a0e4156SSadaf Ebrahimi'\x11,0x22     misc C source rips
164*9a0e4156SSadaf Ebrahimi'
165*9a0e4156SSadaf Ebrahimi'ignores common C source prefixes, operators, delimiters, and whitespace
166*9a0e4156SSadaf Ebrahimi'
167*9a0e4156SSadaf Ebrahimi'not supported
168*9a0e4156SSadaf Ebrahimi'1,2,3,4        all hex chars are must have two chars even if delimited
169*9a0e4156SSadaf Ebrahimi'
170*9a0e4156SSadaf Ebrahimi'a version which supports more formats is here:
171*9a0e4156SSadaf Ebrahimi'  https://github.com/dzzie/libs/blob/master/dzrt/globals.cls
172*9a0e4156SSadaf Ebrahimi
173*9a0e4156SSadaf Ebrahimi    Dim ret As String, x As String, str As String
174*9a0e4156SSadaf Ebrahimi    Dim r() As Byte, b As Byte, b1 As Byte
175*9a0e4156SSadaf Ebrahimi    Dim foundDecimal As Boolean, tmp, i, a, a2
176*9a0e4156SSadaf Ebrahimi    Dim pos As Long, marker As String
177*9a0e4156SSadaf Ebrahimi
178*9a0e4156SSadaf Ebrahimi    On Error GoTo nope
179*9a0e4156SSadaf Ebrahimi
180*9a0e4156SSadaf Ebrahimi    str = Replace(hexstr, vbCr, Empty)
181*9a0e4156SSadaf Ebrahimi    str = Replace(str, vbLf, Empty)
182*9a0e4156SSadaf Ebrahimi    str = Replace(str, vbTab, Empty)
183*9a0e4156SSadaf Ebrahimi    str = Replace(str, Chr(0), Empty)
184*9a0e4156SSadaf Ebrahimi    str = Replace(str, "{", Empty)
185*9a0e4156SSadaf Ebrahimi    str = Replace(str, "}", Empty)
186*9a0e4156SSadaf Ebrahimi    str = Replace(str, ";", Empty)
187*9a0e4156SSadaf Ebrahimi    str = Replace(str, "+", Empty)
188*9a0e4156SSadaf Ebrahimi    str = Replace(str, """""", Empty)
189*9a0e4156SSadaf Ebrahimi    str = Replace(str, "'", Empty)
190*9a0e4156SSadaf Ebrahimi    str = Replace(str, " ", Empty)
191*9a0e4156SSadaf Ebrahimi    str = Replace(str, "0x", Empty)
192*9a0e4156SSadaf Ebrahimi    str = Replace(str, "\x", Empty)
193*9a0e4156SSadaf Ebrahimi    str = Replace(str, ",", Empty)
194*9a0e4156SSadaf Ebrahimi
195*9a0e4156SSadaf Ebrahimi    For i = 1 To Len(str) Step 2
196*9a0e4156SSadaf Ebrahimi        x = Mid(str, i, 2)
197*9a0e4156SSadaf Ebrahimi        If Not isHexChar(x, b) Then Exit Function
198*9a0e4156SSadaf Ebrahimi        bpush r(), b
199*9a0e4156SSadaf Ebrahimi    Next
200*9a0e4156SSadaf Ebrahimi
201*9a0e4156SSadaf Ebrahimi    If strRet Then
202*9a0e4156SSadaf Ebrahimi        toBytes = StrConv(r, vbUnicode, LANG_US)
203*9a0e4156SSadaf Ebrahimi    Else
204*9a0e4156SSadaf Ebrahimi        toBytes = r
205*9a0e4156SSadaf Ebrahimi    End If
206*9a0e4156SSadaf Ebrahimi
207*9a0e4156SSadaf Ebrahiminope:
208*9a0e4156SSadaf EbrahimiEnd Function
209*9a0e4156SSadaf Ebrahimi
210*9a0e4156SSadaf EbrahimiPrivate Sub bpush(bAry() As Byte, b As Byte) 'this modifies parent ary object
211*9a0e4156SSadaf Ebrahimi    On Error GoTo init
212*9a0e4156SSadaf Ebrahimi    Dim x As Long
213*9a0e4156SSadaf Ebrahimi
214*9a0e4156SSadaf Ebrahimi    x = UBound(bAry) '<-throws Error If Not initalized
215*9a0e4156SSadaf Ebrahimi    ReDim Preserve bAry(UBound(bAry) + 1)
216*9a0e4156SSadaf Ebrahimi    bAry(UBound(bAry)) = b
217*9a0e4156SSadaf Ebrahimi
218*9a0e4156SSadaf Ebrahimi    Exit Sub
219*9a0e4156SSadaf Ebrahimi
220*9a0e4156SSadaf Ebrahimiinit:
221*9a0e4156SSadaf Ebrahimi    ReDim bAry(0)
222*9a0e4156SSadaf Ebrahimi    bAry(0) = b
223*9a0e4156SSadaf Ebrahimi
224*9a0e4156SSadaf EbrahimiEnd Sub
225*9a0e4156SSadaf Ebrahimi
226*9a0e4156SSadaf EbrahimiSub push(ary, value) 'this modifies parent ary object
227*9a0e4156SSadaf Ebrahimi    On Error GoTo init
228*9a0e4156SSadaf Ebrahimi    Dim x
229*9a0e4156SSadaf Ebrahimi
230*9a0e4156SSadaf Ebrahimi    x = UBound(ary)
231*9a0e4156SSadaf Ebrahimi    ReDim Preserve ary(x + 1)
232*9a0e4156SSadaf Ebrahimi
233*9a0e4156SSadaf Ebrahimi    If IsObject(value) Then
234*9a0e4156SSadaf Ebrahimi        Set ary(x + 1) = value
235*9a0e4156SSadaf Ebrahimi    Else
236*9a0e4156SSadaf Ebrahimi        ary(x + 1) = value
237*9a0e4156SSadaf Ebrahimi    End If
238*9a0e4156SSadaf Ebrahimi
239*9a0e4156SSadaf Ebrahimi    Exit Sub
240*9a0e4156SSadaf Ebrahimiinit:
241*9a0e4156SSadaf Ebrahimi    ReDim ary(0)
242*9a0e4156SSadaf Ebrahimi    If IsObject(value) Then
243*9a0e4156SSadaf Ebrahimi        Set ary(0) = value
244*9a0e4156SSadaf Ebrahimi    Else
245*9a0e4156SSadaf Ebrahimi        ary(0) = value
246*9a0e4156SSadaf Ebrahimi    End If
247*9a0e4156SSadaf EbrahimiEnd Sub
248*9a0e4156SSadaf Ebrahimi
249*9a0e4156SSadaf Ebrahimi
250*9a0e4156SSadaf EbrahimiPublic Function isHexChar(hexValue As String, Optional b As Byte) As Boolean
251*9a0e4156SSadaf Ebrahimi    On Error Resume Next
252*9a0e4156SSadaf Ebrahimi    Dim v As Long
253*9a0e4156SSadaf Ebrahimi
254*9a0e4156SSadaf Ebrahimi    If Len(hexValue) = 0 Then GoTo nope
255*9a0e4156SSadaf Ebrahimi    If Len(hexValue) > 2 Then GoTo nope 'expecting hex char code like FF or 90
256*9a0e4156SSadaf Ebrahimi
257*9a0e4156SSadaf Ebrahimi    v = CLng("&h" & hexValue)
258*9a0e4156SSadaf Ebrahimi    If Err.Number <> 0 Then GoTo nope 'invalid hex code
259*9a0e4156SSadaf Ebrahimi
260*9a0e4156SSadaf Ebrahimi    b = CByte(v)
261*9a0e4156SSadaf Ebrahimi    If Err.Number <> 0 Then GoTo nope  'shouldnt happen.. > 255 cant be with len() <=2 ?
262*9a0e4156SSadaf Ebrahimi
263*9a0e4156SSadaf Ebrahimi    isHexChar = True
264*9a0e4156SSadaf Ebrahimi
265*9a0e4156SSadaf Ebrahimi    Exit Function
266*9a0e4156SSadaf Ebrahiminope:
267*9a0e4156SSadaf Ebrahimi    Err.Clear
268*9a0e4156SSadaf Ebrahimi    isHexChar = False
269*9a0e4156SSadaf EbrahimiEnd Function
270*9a0e4156SSadaf Ebrahimi
271*9a0e4156SSadaf EbrahimiFunction hhex(b) As String
272*9a0e4156SSadaf Ebrahimi    hhex = Right("00" & Hex(b), 2)
273*9a0e4156SSadaf EbrahimiEnd Function
274*9a0e4156SSadaf Ebrahimi
275*9a0e4156SSadaf EbrahimiFunction rpad(x, i, Optional c = " ")
276*9a0e4156SSadaf Ebrahimi    rpad = Left(x & String(i, c), i)
277*9a0e4156SSadaf EbrahimiEnd Function
278*9a0e4156SSadaf Ebrahimi
279*9a0e4156SSadaf EbrahimiFunction HexDump(bAryOrStrData, Optional hexOnly = 0, Optional ByVal startAt As Long = 1, Optional ByVal length As Long = -1) As String
280*9a0e4156SSadaf Ebrahimi    Dim s() As String, chars As String, tmp As String
281*9a0e4156SSadaf Ebrahimi    On Error Resume Next
282*9a0e4156SSadaf Ebrahimi    Dim ary() As Byte
283*9a0e4156SSadaf Ebrahimi    Dim offset As Long
284*9a0e4156SSadaf Ebrahimi    Const LANG_US = &H409
285*9a0e4156SSadaf Ebrahimi    Dim i As Long, tt, h, x
286*9a0e4156SSadaf Ebrahimi
287*9a0e4156SSadaf Ebrahimi    offset = 0
288*9a0e4156SSadaf Ebrahimi
289*9a0e4156SSadaf Ebrahimi    If TypeName(bAryOrStrData) = "Byte()" Then
290*9a0e4156SSadaf Ebrahimi        ary() = bAryOrStrData
291*9a0e4156SSadaf Ebrahimi    Else
292*9a0e4156SSadaf Ebrahimi        ary = StrConv(CStr(bAryOrStrData), vbFromUnicode, LANG_US)
293*9a0e4156SSadaf Ebrahimi    End If
294*9a0e4156SSadaf Ebrahimi
295*9a0e4156SSadaf Ebrahimi    If startAt < 1 Then startAt = 1
296*9a0e4156SSadaf Ebrahimi    If length < 1 Then length = -1
297*9a0e4156SSadaf Ebrahimi
298*9a0e4156SSadaf Ebrahimi    While startAt Mod 16 <> 0
299*9a0e4156SSadaf Ebrahimi        startAt = startAt - 1
300*9a0e4156SSadaf Ebrahimi    Wend
301*9a0e4156SSadaf Ebrahimi
302*9a0e4156SSadaf Ebrahimi    startAt = startAt + 1
303*9a0e4156SSadaf Ebrahimi
304*9a0e4156SSadaf Ebrahimi    chars = "   "
305*9a0e4156SSadaf Ebrahimi    For i = startAt To UBound(ary) + 1
306*9a0e4156SSadaf Ebrahimi        tt = Hex(ary(i - 1))
307*9a0e4156SSadaf Ebrahimi        If Len(tt) = 1 Then tt = "0" & tt
308*9a0e4156SSadaf Ebrahimi        tmp = tmp & tt & " "
309*9a0e4156SSadaf Ebrahimi        x = ary(i - 1)
310*9a0e4156SSadaf Ebrahimi        'chars = chars & IIf((x > 32 And x < 127) Or x > 191, Chr(x), ".") 'x > 191 causes \x0 problems on non us systems... asc(chr(x)) = 0
311*9a0e4156SSadaf Ebrahimi        chars = chars & IIf((x > 32 And x < 127), Chr(x), ".")
312*9a0e4156SSadaf Ebrahimi        If i > 1 And i Mod 16 = 0 Then
313*9a0e4156SSadaf Ebrahimi            h = Hex(offset)
314*9a0e4156SSadaf Ebrahimi            While Len(h) < 6: h = "0" & h: Wend
315*9a0e4156SSadaf Ebrahimi            If hexOnly = 0 Then
316*9a0e4156SSadaf Ebrahimi                push s, h & "   " & tmp & chars
317*9a0e4156SSadaf Ebrahimi            Else
318*9a0e4156SSadaf Ebrahimi                push s, tmp
319*9a0e4156SSadaf Ebrahimi            End If
320*9a0e4156SSadaf Ebrahimi            offset = offset + 16
321*9a0e4156SSadaf Ebrahimi            tmp = Empty
322*9a0e4156SSadaf Ebrahimi            chars = "   "
323*9a0e4156SSadaf Ebrahimi        End If
324*9a0e4156SSadaf Ebrahimi        If length <> -1 Then
325*9a0e4156SSadaf Ebrahimi            length = length - 1
326*9a0e4156SSadaf Ebrahimi            If length = 0 Then Exit For
327*9a0e4156SSadaf Ebrahimi        End If
328*9a0e4156SSadaf Ebrahimi    Next
329*9a0e4156SSadaf Ebrahimi
330*9a0e4156SSadaf Ebrahimi    'if read length was not mod 16=0 then
331*9a0e4156SSadaf Ebrahimi    'we have part of line to account for
332*9a0e4156SSadaf Ebrahimi    If tmp <> Empty Then
333*9a0e4156SSadaf Ebrahimi        If hexOnly = 0 Then
334*9a0e4156SSadaf Ebrahimi            h = Hex(offset)
335*9a0e4156SSadaf Ebrahimi            While Len(h) < 6: h = "0" & h: Wend
336*9a0e4156SSadaf Ebrahimi            h = h & "   " & tmp
337*9a0e4156SSadaf Ebrahimi            While Len(h) <= 56: h = h & " ": Wend
338*9a0e4156SSadaf Ebrahimi            push s, h & chars
339*9a0e4156SSadaf Ebrahimi        Else
340*9a0e4156SSadaf Ebrahimi            push s, tmp
341*9a0e4156SSadaf Ebrahimi        End If
342*9a0e4156SSadaf Ebrahimi    End If
343*9a0e4156SSadaf Ebrahimi
344*9a0e4156SSadaf Ebrahimi    HexDump = Join(s, vbCrLf)
345*9a0e4156SSadaf Ebrahimi
346*9a0e4156SSadaf Ebrahimi    If hexOnly <> 0 Then
347*9a0e4156SSadaf Ebrahimi        HexDump = Replace(HexDump, " ", "")
348*9a0e4156SSadaf Ebrahimi        HexDump = Replace(HexDump, vbCrLf, "")
349*9a0e4156SSadaf Ebrahimi    End If
350*9a0e4156SSadaf Ebrahimi
351*9a0e4156SSadaf EbrahimiEnd Function
352*9a0e4156SSadaf Ebrahimi
353*9a0e4156SSadaf Ebrahimi
354*9a0e4156SSadaf Ebrahimi
355*9a0e4156SSadaf EbrahimiFunction FileExists(path As String) As Boolean
356*9a0e4156SSadaf Ebrahimi  On Error GoTo hell
357*9a0e4156SSadaf Ebrahimi
358*9a0e4156SSadaf Ebrahimi  If Len(path) = 0 Then Exit Function
359*9a0e4156SSadaf Ebrahimi  If Right(path, 1) = "\" Then Exit Function
360*9a0e4156SSadaf Ebrahimi  If Dir(path, vbHidden Or vbNormal Or vbReadOnly Or vbSystem) <> "" Then FileExists = True
361*9a0e4156SSadaf Ebrahimi
362*9a0e4156SSadaf Ebrahimi  Exit Function
363*9a0e4156SSadaf Ebrahimihell: FileExists = False
364*9a0e4156SSadaf EbrahimiEnd Function
365*9a0e4156SSadaf Ebrahimi
366*9a0e4156SSadaf EbrahimiSub WriteFile(path, it)
367*9a0e4156SSadaf Ebrahimi    Dim f
368*9a0e4156SSadaf Ebrahimi    f = FreeFile
369*9a0e4156SSadaf Ebrahimi    Open path For Output As #f
370*9a0e4156SSadaf Ebrahimi    Print #f, it
371*9a0e4156SSadaf Ebrahimi    Close f
372*9a0e4156SSadaf EbrahimiEnd Sub
373*9a0e4156SSadaf Ebrahimi
374*9a0e4156SSadaf EbrahimiFunction GetParentFolder(path) As String
375*9a0e4156SSadaf Ebrahimi    Dim tmp() As String, ub As Long
376*9a0e4156SSadaf Ebrahimi    On Error Resume Next
377*9a0e4156SSadaf Ebrahimi    tmp = Split(path, "\")
378*9a0e4156SSadaf Ebrahimi    ub = tmp(UBound(tmp))
379*9a0e4156SSadaf Ebrahimi    If Err.Number = 0 Then
380*9a0e4156SSadaf Ebrahimi        GetParentFolder = Replace(Join(tmp, "\"), "\" & ub, "")
381*9a0e4156SSadaf Ebrahimi    Else
382*9a0e4156SSadaf Ebrahimi        GetParentFolder = path
383*9a0e4156SSadaf Ebrahimi    End If
384*9a0e4156SSadaf EbrahimiEnd Function
385*9a0e4156SSadaf Ebrahimi
386