A coworker, from a past programming life, called me up last week and asked about Trim Functions in COBOL. I sent her these PEFORMed "functions", which I've had lying about and without any professional opportunity to use them.
It's been my experience that most Cobologists working within their shop standard don't twiddle with CALLing real subroutines. Instead they PERFORM COPYed code, and refer to it as a subroutine. As such, I don't try to fight the tide.
Can anyone offer up any improvements? I know there are Intrinsic TRIM, TRIML, and TRIMR functions in some flavours of COBOL. However, I do not believe IBM Z-series Mainframe COBOL has these, so this is intended to be platform independent.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STR-VALUE-IN PIC X(1000).
01 STR-LENGTH-IN PIC 9(05) BINARY.
01 STR-VALUE-OUT PIC X(1000).
01 STR-LENGTH-OUT PIC 9(05) BINARY.
01 STR-HANDLING-COUNTERS.
05 STR-SUB01 PIC 9(05) BINARY.
05 STR-TRAILING-SPACES PIC 9(05) BINARY.
05 STR-LEADING-SPACES PIC 9(05) BINARY.
05 STR-START PIC 9(05) BINARY.
01 STR-HANDLING-SWITCHES.
05 GRAPH-FOUND-SW PIC X(01).
88 GRAPH-FOUND VALUE '1'.
88 GRAPH-NOT-FOUND VALUE '2'.
PROCEDURE DIVISION.
MOVE Whatever
TO STR-VALUE-IN.
MOVE FUNCTION LENGTH (Whatever)
TO STR-LENGTH-IN.
PERFORM 5200-RTRIM.
MOVE STR-VALUE-OUT (1:STR-LENGTH-OUT)
TO Wherever.
MOVE Whatever
TO STR-VALUE-IN.
MOVE FUNCTION LENGTH (Whatever)
TO STR-LENGTH-IN.
PERFORM 5100-LTRIM.
MOVE STR-VALUE-OUT (1:STR-LENGTH-OUT)
TO Wherever.
MOVE Whatever
TO STR-VALUE-IN.
MOVE FUNCTION LENGTH (Whatever)
TO STR-LENGTH-IN.
PERFORM 5300-TRIM.
MOVE STR-VALUE-OUT (1:STR-LENGTH-OUT)
TO Wherever.
5100-LTRIM.
* This resembles the VB function LTrim
* It removes any leading value less than or equal to space
* ASCII decimal 0 (Null) through ASCII decimal 32 (Space)
PERFORM 5910-COMMON-TRIM-BEGIN.
PERFORM 5930-TRIM-LEADING-SPACES.
PERFORM 5990-COMMON-TRIM-END.
5200-RTRIM.
* This resembles the VB function RTrim
* It removes any trailing value less than or equal to space
* ASCII decimal 0 (Null) through ASCII decimal 32 (Space)
PERFORM 5910-COMMON-TRIM-BEGIN.
PERFORM 5950-TRIM-TRAILING-SPACES.
PERFORM 5990-COMMON-TRIM-END.
5300-TRIM.
* This resembles the VB function Trim
* It removes any leading or trailing value less than or equal to space
* ASCII decimal 0 (Null) through ASCII decimal 32 (Space)
PERFORM 5910-COMMON-TRIM-BEGIN.
PERFORM 5930-TRIM-LEADING-SPACES.
PERFORM 5950-TRIM-TRAILING-SPACES.
PERFORM 5990-COMMON-TRIM-END.
5910-COMMON-TRIM-BEGIN.
MOVE LOW-VALUES
TO STR-HANDLING-COUNTERS.
MOVE SPACES
TO STR-HANDLING-SWITCHES.
MOVE 1
TO STR-START.
MOVE STR-LENGTH-IN
TO STR-LENGTH-OUT.
5930-TRIM-LEADING-SPACES.
SET GRAPH-NOT-FOUND TO TRUE.
PERFORM
VARYING STR-SUB01 FROM 1 BY 1
UNTIL STR-SUB01 > STR-LENGTH-IN
OR GRAPH-FOUND
IF (STR-VALUE-IN (STR-SUB01:1) > SPACES)
MOVE STR-SUB01
TO STR-START
SUBTRACT 1 FROM STR-SUB01
GIVING STR-LEADING-SPACES
SUBTRACT STR-LEADING-SPACES
FROM STR-LENGTH-OUT
SET GRAPH-FOUND TO TRUE
END-IF
END-PERFORM
5950-TRIM-TRAILING-SPACES.
SET GRAPH-NOT-FOUND TO TRUE.
PERFORM
VARYING STR-SUB01 FROM STR-LENGTH-IN BY -1
UNTIL STR-SUB01 < 1
OR GRAPH-FOUND
IF (STR-VALUE-IN (STR-SUB01:1) > SPACES)
SUBTRACT STR-SUB01 FROM STR-LENGTH-IN
GIVING STR-TRAILING-SPACES
SUBTRACT STR-TRAILING-SPACES
FROM STR-LENGTH-OUT
SET GRAPH-FOUND TO TRUE
END-IF
END-PERFORM
5990-COMMON-TRIM-END.
MOVE STR-VALUE-IN (STR-START:STR-LENGTH-OUT)
TO STR-VALUE-OUT.