61 lines
1.5 KiB
Text
61 lines
1.5 KiB
Text
' CUSIP
|
|
DECLARE SUB PrintVerdict (Cusip$)
|
|
DECLARE FUNCTION CusipCheckDigit% (Cusip$)
|
|
DECLARE FUNCTION IsValidCusip% (Cusip$)
|
|
CONST TRUE% = -1, FALSE% = 0
|
|
PRINT "CUSIP Verdict"
|
|
PrintVerdict "037833100"
|
|
PrintVerdict "17275R102"
|
|
PrintVerdict "38259P508"
|
|
PrintVerdict "594918104"
|
|
PrintVerdict "68389X106"
|
|
PrintVerdict "68389X105"
|
|
END
|
|
|
|
FUNCTION CusipCheckDigit% (Cusip$)
|
|
I% = 1
|
|
Sum% = 0
|
|
L% = LEN(Cusip$)
|
|
DO WHILE I% < L%
|
|
IF ("0" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "9") THEN
|
|
V% = ASC(MID$(Cusip$, I%, 1)) - 48 ' 0
|
|
ELSEIF ("A" <= MID$(Cusip$, I%, 1)) AND (MID$(Cusip$, I%, 1) <= "Z") THEN
|
|
V% = ASC(MID$(Cusip$, I%, 1)) - 65 + 10
|
|
ELSEIF MID$(Cusip$, I%, 1) = "*" THEN
|
|
V% = 36
|
|
ELSEIF MID$(Cusip$, I%, 1) = "@" THEN
|
|
V% = 37
|
|
ELSEIF MID$(Cusip$, I%, 1) = "#" THEN
|
|
V% = 38
|
|
ELSE
|
|
CusipCheckDigit% = -1
|
|
EXIT FUNCTION
|
|
END IF
|
|
IF (I% - 1) MOD 2 = 1 THEN V% = 2 * V%
|
|
IF I% <= 8 THEN Sum% = Sum% + (V% \ 10) + (V% MOD 10)
|
|
I% = I% + 1
|
|
LOOP
|
|
IF I% <> 9 THEN
|
|
CusipCheckDigit% = -1
|
|
ELSE
|
|
CusipCheckDigit% = (10 - (Sum% MOD 10)) MOD 10
|
|
END IF
|
|
END FUNCTION
|
|
|
|
FUNCTION IsValidCusip% (Cusip$)
|
|
Check% = CusipCheckDigit%(Cusip$)
|
|
IF Check% < 0 THEN
|
|
IsValidCusip% = FALSE
|
|
ELSE
|
|
IsValidCusip% = (MID$(Cusip$, 9, 1) = CHR$(48 + Check%))
|
|
END IF
|
|
END FUNCTION
|
|
|
|
SUB PrintVerdict (Cusip$)
|
|
PRINT Cusip$;
|
|
IF IsValidCusip%(Cusip$) THEN
|
|
PRINT " : Valid"
|
|
ELSE
|
|
PRINT " : Invalid"
|
|
END IF
|
|
END SUB
|