63 lines
1.7 KiB
Text
63 lines
1.7 KiB
Text
100 REM CUSIP
|
|
110 DECLARE EXTERNAL SUB PrintVerdict
|
|
120 DECLARE EXTERNAL FUNCTION CusipCheckDigit
|
|
130 DECLARE EXTERNAL FUNCTION IsValidCusip
|
|
140 PRINT "CUSIP Verdict"
|
|
150 CALL PrintVerdict("037833100")
|
|
160 CALL PrintVerdict("17275R102")
|
|
170 CALL PrintVerdict("38259P508")
|
|
180 CALL PrintVerdict("594918104")
|
|
190 CALL PrintVerdict("68389X106")
|
|
200 CALL PrintVerdict("68389X105")
|
|
210 END
|
|
220 REM **
|
|
230 EXTERNAL FUNCTION CusipCheckDigit(Cusip$)
|
|
240 LET I = 1
|
|
250 LET Sum = 0
|
|
260 LET L = LEN(Cusip$)
|
|
270 DO WHILE I < L
|
|
280 LET C$ = Cusip$(I:I)
|
|
290 IF ("0" <= C$) AND (C$ <= "9") THEN
|
|
300 LET V = VAL(C$)
|
|
310 ELSEIF ("A" <= C$) AND (C$ <= "Z") THEN
|
|
320 LET V = ORD(C$) - 65 + 10
|
|
330 ELSEIF C$ = "*" THEN
|
|
340 LET V = 36
|
|
350 ELSEIF C$ = "@" THEN
|
|
360 LET V = 37
|
|
370 ELSEIF C$ = "#" THEN
|
|
380 LET V = 38
|
|
390 ELSE
|
|
400 LET CusipCheckDigit = -1
|
|
410 EXIT FUNCTION
|
|
420 END IF
|
|
430 IF MOD(I - 1, 2) = 1 THEN LET V = 2 * V
|
|
440 IF I <= 8 THEN LET Sum = Sum + INT(V / 10) + MOD(V, 10)
|
|
450 LET I = I + 1
|
|
460 LOOP
|
|
470 IF I <> 9 THEN
|
|
480 LET CusipCheckDigit = -1
|
|
490 ELSE
|
|
500 LET CusipCheckDigit = MOD(10 - MOD(Sum, 10), 10)
|
|
510 END IF
|
|
520 END FUNCTION
|
|
530 REM **
|
|
540 EXTERNAL FUNCTION IsValidCusip (Cusip$)
|
|
550 LET Check = CusipCheckDigit(Cusip$)
|
|
560 IF Check < 0 THEN
|
|
570 LET IsValidCusip = 0
|
|
580 ELSEIF Cusip$(9:9) = CHR$(48 + Check) THEN
|
|
590 LET IsValidCusip = -1
|
|
600 ELSE
|
|
610 LET IsValidCusip = 0
|
|
620 END IF
|
|
630 END FUNCTION
|
|
640 REM **
|
|
650 EXTERNAL SUB PrintVerdict (Cusip$)
|
|
660 PRINT Cusip$;
|
|
670 IF IsValidCusip(Cusip$) <>0 THEN
|
|
680 PRINT " : Valid"
|
|
690 ELSE
|
|
700 PRINT " : Invalid"
|
|
710 END IF
|
|
720 END SUB
|