RosettaCodeData/Task/Range-expansion/COBOL/range-expansion.cobol
2015-02-20 00:35:01 -05:00

93 lines
2.5 KiB
COBOL

>>SOURCE FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. expand-range.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 comma-pos PIC 99 COMP VALUE 1.
01 dash-pos PIC 99 COMP.
01 end-num PIC S9(3).
01 Max-Part-Len CONSTANT 10.
01 num PIC S9(3).
01 edited-num PIC -(3)9.
01 part PIC X(10).
01 part-flag PIC X.
88 last-part VALUE "Y".
01 range-str PIC X(80).
01 Range-Str-Len CONSTANT 80.
01 start-pos PIC 99 COMP.
01 start-num PIC S9(3).
PROCEDURE DIVISION.
ACCEPT range-str
PERFORM WITH TEST AFTER UNTIL last-part
UNSTRING range-str DELIMITED BY "," INTO part WITH POINTER comma-pos
PERFORM check-if-last
PERFORM find-range-dash
IF dash-pos > Max-Part-Len
PERFORM display-num
ELSE
PERFORM display-range
END-IF
END-PERFORM
DISPLAY SPACES
GOBACK
.
check-if-last SECTION.
IF comma-pos > Range-Str-Len
SET last-part TO TRUE
END-IF
.
find-range-dash SECTION.
IF part (1:1) <> "-"
MOVE 1 TO start-pos
ELSE
MOVE 2 TO start-pos
END-IF
MOVE 1 TO dash-pos
INSPECT part (start-pos:) TALLYING dash-pos FOR CHARACTERS BEFORE "-"
COMPUTE dash-pos = dash-pos + start-pos - 1
.
display-num SECTION.
MOVE part TO edited-num
CALL "display-edited-num" USING CONTENT part-flag, edited-num
.
display-range SECTION.
MOVE part (1:dash-pos - 1) TO start-num
MOVE part (dash-pos + 1:) TO end-num
PERFORM VARYING num FROM start-num BY 1 UNTIL num = end-num
MOVE num TO edited-num
CALL "display-edited-num" USING CONTENT "N", edited-num
END-PERFORM
MOVE end-num TO edited-num
CALL "display-edited-num" USING CONTENT part-flag, edited-num
.
END PROGRAM expand-range.
IDENTIFICATION DIVISION.
PROGRAM-ID. display-edited-num.
DATA DIVISION.
LINKAGE SECTION.
01 hide-comma-flag PIC X.
88 hide-comma VALUE "Y".
01 edited-num PIC -(3)9.
PROCEDURE DIVISION USING hide-comma-flag, edited-num.
DISPLAY FUNCTION TRIM(edited-num) NO ADVANCING
IF NOT hide-comma
DISPLAY ", " NO ADVANCING
END-IF
.
END PROGRAM display-edited-num.