I knocked this up which may work:
Code: Select all
Procedure.s Multiply(string.s, mult.l, power.l)
answer.s = string
If power < 0
answer = "Power too small"
ElseIf mult < 1 Or mult > 10
answer = "Multiplier out of range"
ElseIf mult = 10
ext.s = Space(power)
ReplaceString(ext, " ", "0", 2)
answer = string + ext
ElseIf mult > 1 And power <> 0
For powloop = 1 To power
answer = ""
lenstr.l = Len(string)
carry.l = 0
For loopy = lenstr To 1 Step -1
value.l = Val(Mid(string, loopy, 1))
value * mult
value + carry
carry = value / 10
answer = Str(value % 10) + answer
Next
If carry <> 0
answer = Str(carry) + answer
EndIf
string = answer
Next
EndIf
ProcedureReturn answer
EndProcedure
Procedure.s Addition(str1.s, str2.s)
answer.s = ""
len1.l = Len(str1)
len2.l = Len(str2)
If len1 > len2
prefix.s = Space(len1-len2)
ReplaceString(prefix, " ", "0", 2)
str2 = prefix + str2
ElseIf len1 < len2
prefix.s = Space(len2-len1)
ReplaceString(prefix, " ", "0", 2)
str1 = prefix + str1
EndIf
carry.l = 0
For loopy = Len(str1) To 1 Step -1
value.l = Val(Mid(str1, loopy, 1)) + Val(Mid(str2, loopy, 1)) + carry
carry = value / 10
answer = Str(value % 10) + answer
Next
If carry <> 0
answer = Str(carry) + answer
EndIf
ProcedureReturn answer
EndProcedure
Procedure.s MemToStr(*mem, lenbytes.l)
string.s = "0"
For loopy = 0 To lenbytes - 1
value.l = PeekB(*mem + loopy) & $FF
string = Addition(string, Multiply(Str(value), 2, 8 * loopy))
Next
ProcedureReturn string
EndProcedure
#INVALID_FILE_SIZE = $FFFFFFFF
Procedure GetFileSize64(file$, *fs.LARGE_INTEGER)
hfile.l = CreateFile_(file$, 0, 0, #NULL, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NULL)
If hfile<>#INVALID_HANDLE_VALUE
*fs\lowpart = GetFileSize_(hfile, @*fs\highpart)
CloseHandle_(hfile)
ProcedureReturn *fs\lowpart
Else
ProcedureReturn #INVALID_FILE_SIZE
EndIf
EndProcedure
filename.s = OpenFileRequester("", "", "", 0)
If filename <> ""
GetFileSize64(filename, @fs.LARGE_INTEGER)
Debug(MemToStr(@fs, SizeOf(LARGE_INTEGER)))
EndIf
It's very inefficient and only briefly tested but it seems ok!