(phixonline)-->
sequence cch = {}
function CusipCheckDigit(string cusip)
integer s = 0, c, v
if length(cch)=0 then
cch = repeat(-1,256)
for i='0' to '9' do
cch[i] = i-'0'
end for
for i='A' to 'Z' do
cch[i] = i-55
end for
cch['*'] = 36
cch['@'] = 37
cch['#'] = 38
end if
if length(cusip)!=9 or find('\0',cusip) then return 0 end if
for i=1 to 8 do
c := cusip[i]
v := cch[c]
if v=-1 then return 0 end if
if remainder(i,2)=0 then
v *= 2
end if
s += floor(v/10)+mod(v,10)
end for
return cusip[9]=mod(10-mod(s,10),10)+'0'
end function
sequence tests = {"037833100", -- Apple Incorporated
"17275R102", -- Cisco Systems
"38259P508", -- Google Incorporated
"594918104", -- Microsoft Corporation
"68389X106", -- Oracle Corporation (incorrect)
"68389X105"} -- Oracle Corporation
for i=1 to length(tests) do
string ti = tests[i]
printf(1,"%s : %s\n",{ti,{"invalid","valid"}[CusipCheckDigit(ti)+1]})
end for