create procedure lib_math_int_to_base (
val_in bigint,
base_in smallint,
cap_in smallint)
returns (
strg_out varchar(63))
as
declare variable val_mod smallint;
begin
/*
convert bigint (cardinal 0..2^63-1) to base-n (n=2..16) string
cap_in (capitalisation): 0/1: lower/upper case characters in base-n string
*/
if ( (val_in is null)
or (val_in < 0)
or (base_in is null)
or (base_in < 2)
or (16 < base_in)
or (cap_in is null)
or (cap_in < 0)
or (1 < cap_in))
then
strg_out = null; /* or: raise exception 'invalid parameter' */
else
begin
strg_out = '';
while (val_in <> 0) do
begin
execute procedure lib_math_div_mod :val_in, :base_in returning_values :val_in, :val_mod;
if (val_mod = 10) then strg_out = 'a' || strg_out;
else if (val_mod = 11) then strg_out = 'b' || strg_out;
else if (val_mod = 12) then strg_out = 'c' || strg_out;
else if (val_mod = 13) then strg_out = 'd' || strg_out;
else if (val_mod = 14) then strg_out = 'e' || strg_out;
else if (val_mod = 15) then strg_out = 'f' || strg_out;
else strg_out = val_mod || strg_out;
end
if (strg_out = '')
then
strg_out = '0';
if (cap_in = 1)
then
strg_out = upper( strg_out);
end
suspend;
end