create procedure lib_math_base_to_int ( strg_in varchar(63), base_in smallint) returns ( val_out bigint) as declare variable strg_len smallint; declare variable strg_pos smallint; declare variable strg_chr varchar(1); declare variable val_add smallint; begin /* convert base-n (n=2..16) string to bigint (cardinal 0..2^63-1) */ if ( (strg_in is null) or (strg_in = '') or (base_in is null) or (base_in < 2) or (16 < base_in)) then val_out = null; /* or: raise exception 'invalid parameter' */ else begin val_out = 0; strg_in = upper( strg_in); execute procedure lib_string_len :strg_in returning_values :strg_len; strg_pos = 1; while (strg_pos <= strg_len) do begin execute procedure lib_string_sub :strg_in, :strg_pos, 1 returning_values :strg_chr; if ( (strg_chr = '0') or (strg_chr = '1') or (strg_chr = '2') or (strg_chr = '3') or (strg_chr = '4') or (strg_chr = '5') or (strg_chr = '6') or (strg_chr = '7') or (strg_chr = '8') or (strg_chr = '9')) then val_add = cast( strg_chr as smallint); else if ( strg_chr = 'A') then val_add = 10; else if ( strg_chr = 'B') then val_add = 11; else if ( strg_chr = 'C') then val_add = 12; else if ( strg_chr = 'D') then val_add = 13; else if ( strg_chr = 'E') then val_add = 14; else if ( strg_chr = 'F') then val_add = 15; else val_add = null; /* or: raise exception 'invalid base-n character' */ if (val_add < base_in) then val_out = (val_out * base_in) + val_add; else val_out = null; /* or: raise exception 'invalid base-n character' */ strg_pos = strg_pos + 1; end end suspend; end