# 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