125 lines
3.4 KiB
COBOL
125 lines
3.4 KiB
COBOL
>>SOURCE FREE
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. run-length-encoding.
|
|
|
|
ENVIRONMENT DIVISION.
|
|
CONFIGURATION SECTION.
|
|
REPOSITORY.
|
|
FUNCTION encode
|
|
FUNCTION decode
|
|
.
|
|
DATA DIVISION.
|
|
WORKING-STORAGE SECTION.
|
|
01 input-str PIC A(100).
|
|
01 encoded PIC X(200).
|
|
01 decoded PIC X(200).
|
|
|
|
PROCEDURE DIVISION.
|
|
ACCEPT input-str
|
|
MOVE encode(FUNCTION TRIM(input-str)) TO encoded
|
|
DISPLAY "Encoded: " FUNCTION TRIM(encoded)
|
|
DISPLAY "Decoded: " FUNCTION TRIM(decode(encoded))
|
|
.
|
|
END PROGRAM run-length-encoding.
|
|
|
|
|
|
IDENTIFICATION DIVISION.
|
|
FUNCTION-ID. encode.
|
|
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
01 str-len PIC 9(3) COMP.
|
|
|
|
01 i PIC 9(3) COMP.
|
|
|
|
01 current-char PIC A.
|
|
|
|
01 num-chars PIC 9(3) COMP.
|
|
01 num-chars-disp PIC Z(3).
|
|
|
|
01 encoded-pos PIC 9(3) COMP VALUE 1.
|
|
|
|
LINKAGE SECTION.
|
|
01 str PIC X ANY LENGTH.
|
|
|
|
01 encoded PIC X(200).
|
|
|
|
PROCEDURE DIVISION USING str RETURNING encoded.
|
|
MOVE FUNCTION LENGTH(str) TO str-len
|
|
MOVE str (1:1) TO current-char
|
|
MOVE 1 TO num-chars
|
|
PERFORM VARYING i FROM 2 BY 1 UNTIL i > str-len
|
|
IF str (i:1) <> current-char
|
|
CALL "add-num-chars" USING encoded, encoded-pos,
|
|
CONTENT current-char, num-chars
|
|
|
|
MOVE str (i:1) TO current-char
|
|
MOVE 1 TO num-chars
|
|
ELSE
|
|
ADD 1 TO num-chars
|
|
END-IF
|
|
END-PERFORM
|
|
|
|
CALL "add-num-chars" USING encoded, encoded-pos, CONTENT current-char,
|
|
num-chars
|
|
.
|
|
END FUNCTION encode.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. add-num-chars.
|
|
|
|
DATA DIVISION.
|
|
WORKING-STORAGE SECTION.
|
|
01 num-chars-disp PIC Z(3).
|
|
|
|
LINKAGE SECTION.
|
|
01 str PIC X(200).
|
|
|
|
01 current-pos PIC 9(3) COMP.
|
|
|
|
01 char-to-encode PIC X.
|
|
|
|
01 num-chars PIC 9(3) COMP.
|
|
|
|
PROCEDURE DIVISION USING str, current-pos, char-to-encode, num-chars.
|
|
MOVE num-chars TO num-chars-disp
|
|
MOVE FUNCTION TRIM(num-chars-disp) TO str (current-pos:3)
|
|
ADD FUNCTION LENGTH(FUNCTION TRIM(num-chars-disp)) TO current-pos
|
|
MOVE char-to-encode TO str (current-pos:1)
|
|
ADD 1 TO current-pos
|
|
.
|
|
END PROGRAM add-num-chars.
|
|
|
|
|
|
IDENTIFICATION DIVISION.
|
|
FUNCTION-ID. decode.
|
|
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
01 encoded-pos PIC 9(3) COMP VALUE 1.
|
|
01 decoded-pos PIC 9(3) COMP VALUE 1.
|
|
|
|
01 num-of-char PIC 9(3) COMP VALUE 0.
|
|
|
|
LINKAGE SECTION.
|
|
01 encoded PIC X(200).
|
|
|
|
01 decoded PIC X(100).
|
|
|
|
PROCEDURE DIVISION USING encoded RETURNING decoded.
|
|
PERFORM VARYING encoded-pos FROM 1 BY 1
|
|
UNTIL encoded (encoded-pos:2) = SPACES OR encoded-pos > 200
|
|
IF encoded (encoded-pos:1) IS NUMERIC
|
|
COMPUTE num-of-char = num-of-char * 10
|
|
+ FUNCTION NUMVAL(encoded (encoded-pos:1))
|
|
ELSE
|
|
PERFORM UNTIL num-of-char = 0
|
|
MOVE encoded (encoded-pos:1) TO decoded (decoded-pos:1)
|
|
ADD 1 TO decoded-pos
|
|
SUBTRACT 1 FROM num-of-char
|
|
END-PERFORM
|
|
END-IF
|
|
END-PERFORM
|
|
.
|
|
END FUNCTION decode.
|