library BaseConversion initializer Init requires StringLib globals private constant string CHARACTER_SET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" private integer SetSize = StringLength(CHARACTER_SET) private string array Char private hashtable Values endglobals function ConvertFromDec takes integer number, integer toBase returns string local string s = "" local integer quo local integer div = number if toBase > SetSize then debug call BJDebugMsg(SCOPE_PREFIX+"ConvertFromDec: toBase > SetSize.") return "" endif if toBase <= 0 then debug call BJDebugMsg(SCOPE_PREFIX+"ConvertFromDec: toBase <= 0.") return "" endif if HaveSavedString(Values, toBase, number) then return LoadStr(Values, toBase, number) endif loop set quo = div/toBase set s = Char[div - quo * toBase] + s exitwhen quo == 0 set div = quo endloop call SaveStr(Values, toBase, number, s) return s endfunction function ConvertToDec takes string number, integer fromBase returns integer local string s local integer hash = StringHashCS(number) local integer i = 0 local integer dec = 0 if fromBase > SetSize then debug call BJDebugMsg(SCOPE_PREFIX+"ConvertToDec: fromBase > SetSize.") return 0 endif if fromBase <= 0 then debug call BJDebugMsg(SCOPE_PREFIX+"ConvertToDec: fromBase <= 0.") return 0 endif if HaveSavedInteger(Values, fromBase, hash) then return LoadInteger(Values, fromBase, hash) endif loop set s = SubString(number, i, i+1) exitwhen s == "" set dec = dec*fromBase + LoadInteger(Values, 0, StringHashCS(s)) set i = i+1 endloop call SaveInteger(Values, fromBase, hash, dec) return dec endfunction private function Init takes nothing returns nothing local integer i = 0 local string s set Values = InitHashtable() loop exitwhen i == SetSize set s = SubString(CHARACTER_SET, i, i+1) set Char[i] = s call SaveInteger(Values, 0, StringHashCS(s), i) set i = i+1 endloop endfunction endlibrary