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