############################################################################
#
# File: convert.icn
#
# Subject: Procedures for various conversions
#
# Author: Ralph E. Griswold
#
# Date: March 19, 1998
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# exbase10(i, j) converts base-10 integer i to base j.
#
# inbase10(s, i) convert base-i integer s to base 10.
#
# radcon(s, i, j) convert base-i integer s to base j.
#
# There are several other procedures related to conversion that are
# not yet part of this module.
#
############################################################################
procedure exbase10(i, j) #: convert base 10 to arbitrary base
local s, d, sign
static digits
initial digits := &digits || &lcase || &ucase
if not(2 <= j <= *digits) then stop("*** base out of range")
if i = 0 then return 0
if i < 0 then {
sign := "-"
i := -i
}
else sign := ""
s := ""
while i > 0 do {
d := i % j
if d > 9 then d := digits[d + 1]
s := d || s
i /:= j
}
return sign || s
end
procedure inbase10(s, i) #: convert arbitrary base to base 10
if i > 36 then stop("*** base too large for inbase10()")
if s[1] == "-" then return "-" || integer(i || "r" || s[2:0])
else return integer(i || "r" || s)
end
procedure radcon(s, i, j) #: convert between bases
return exbase10(inbase10(s,i),j)
end
This page produced by UniDoc on 2021/04/15 @ 23:59:44.