41 lines
988 B
Plaintext
41 lines
988 B
Plaintext
# cusip.icn -- Committee on Uniform Security Identification Procedures
|
|
|
|
procedure main()
|
|
local code, codes
|
|
codes := ["037833100", "17275R102", "38259P508",
|
|
"594918104", "68389X106", "68389X105"]
|
|
while code := pop(codes) do {
|
|
writes(code, " : ")
|
|
if check_code(code) then
|
|
write("valid.")
|
|
else write("not valid.")
|
|
}
|
|
end
|
|
|
|
procedure check_code(c)
|
|
local p, sum, value
|
|
static codetable
|
|
initial codetable := buildtable()
|
|
|
|
sum := 0
|
|
value := 0
|
|
every p := 1 to 8 do {
|
|
if p % 2 = 1 then # odd position
|
|
value := codetable[c[p]]
|
|
else # even position
|
|
value := 2 * codetable[c[p]]
|
|
sum +:= (value / 10) + (value % 10)
|
|
}
|
|
sum := (10 - (sum % 10)) % 10
|
|
if sum = c[9] then return else fail
|
|
end
|
|
|
|
procedure buildtable()
|
|
local chars, n, t
|
|
t := table()
|
|
chars := &digits || &ucase || "*@#"
|
|
every n := 1 to *chars do
|
|
t[chars[n]] := (n - 1)
|
|
return t
|
|
end
|