79 lines
2.3 KiB
COBOL
79 lines
2.3 KiB
COBOL
>>SOURCE FREE
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. sedol.
|
|
|
|
ENVIRONMENT DIVISION.
|
|
INPUT-OUTPUT SECTION.
|
|
FILE-CONTROL.
|
|
SELECT sedol-file ASSIGN "sedol.txt"
|
|
ORGANIZATION LINE SEQUENTIAL
|
|
FILE STATUS sedol-file-status.
|
|
|
|
DATA DIVISION.
|
|
FILE SECTION.
|
|
FD sedol-file.
|
|
01 sedol PIC X(6).
|
|
|
|
WORKING-STORAGE SECTION.
|
|
01 sedol-file-status PIC XX.
|
|
88 sedol-file-ok VALUE "00".
|
|
|
|
01 digit-num PIC 9 COMP.
|
|
|
|
01 digit-weights-area VALUE "1317391".
|
|
03 digit-weights PIC 9 OCCURS 7 TIMES.
|
|
|
|
01 weighted-sum-parts-area.
|
|
03 weighted-sum-parts PIC 9(3) COMP OCCURS 6 TIMES.
|
|
|
|
01 weighted-sum PIC 9(3) COMP.
|
|
|
|
01 check-digit PIC 9.
|
|
|
|
PROCEDURE DIVISION.
|
|
OPEN INPUT sedol-file
|
|
PERFORM UNTIL NOT sedol-file-ok
|
|
READ sedol-file
|
|
AT END
|
|
EXIT PERFORM
|
|
END-READ
|
|
|
|
MOVE FUNCTION UPPER-CASE(sedol) TO sedol
|
|
|
|
PERFORM VARYING digit-num FROM 1 BY 1 UNTIL digit-num > 6
|
|
EVALUATE TRUE
|
|
WHEN sedol (digit-num:1) IS ALPHABETIC-UPPER
|
|
IF sedol (digit-num:1) = "A" OR "E" OR "I" OR "O" OR "U"
|
|
DISPLAY "Invalid SEDOL: " sedol
|
|
EXIT PERFORM CYCLE
|
|
END-IF
|
|
|
|
COMPUTE weighted-sum-parts (digit-num) =
|
|
(FUNCTION ORD(sedol (digit-num:1)) - FUNCTION ORD("A")
|
|
+ 10) * digit-weights (digit-num)
|
|
|
|
WHEN sedol (digit-num:1) IS NUMERIC
|
|
MULTIPLY FUNCTION NUMVAL(sedol (digit-num:1))
|
|
BY digit-weights (digit-num)
|
|
GIVING weighted-sum-parts (digit-num)
|
|
|
|
WHEN OTHER
|
|
DISPLAY "Invalid SEDOL: " sedol
|
|
EXIT PERFORM CYCLE
|
|
END-EVALUATE
|
|
END-PERFORM
|
|
|
|
INITIALIZE weighted-sum
|
|
PERFORM VARYING digit-num FROM 1 BY 1 UNTIL digit-num > 6
|
|
ADD weighted-sum-parts (digit-num) TO weighted-sum
|
|
END-PERFORM
|
|
|
|
COMPUTE check-digit =
|
|
FUNCTION MOD(10 - FUNCTION MOD(weighted-sum, 10), 10)
|
|
|
|
DISPLAY sedol check-digit
|
|
END-PERFORM
|
|
|
|
CLOSE sedol-file
|
|
.
|
|
END PROGRAM sedol.
|