For a school project I've created a database program in COBOL and now that I'm finished, I have to write a report on the project.
As one aspect of the report, we have to discuss whether the product (the program) achieved all of the "success criteria" we created earlier in the process. One of my success criteria was code style and readability. More specifically: "The source code of the final product must be easily readable, clear, and logical."
I wanted to get an outside opinion on this so I've come to this website.
IDENTIFICATION DIVISION.
PROGRAM-ID. COBDB.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OPTIONAL DB-FILE
ASSIGN USING DB-FILE-NAME
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD DB-FILE.
01 CHAR PIC X(1).
WORKING-STORAGE SECTION.
01 PARSING-DATA.
05 DB-FILE-NAME-INDEX PIC 9(3) USAGE IS
COMPUTATIONAL.
05 PARSING-DONE PIC 9(1).
05 NUM-RECORDS-PARSING-START PIC 9(1).
05 NUM-RECORDS-PARSING-STARTED PIC 9(1).
05 NUM-RECORDS-PARSING-INDEX PIC 9(2).
05 DB-FILE-NAME PIC X(500).
01 DATA-REGISTERS.
05 DATA-REGISTER PIC X(4096).
05 LENGTH-REGISTER PIC 9(4) USAGE IS
DISPLAY.
01 HEADER-DATA.
05 ROW-NUM USAGE IS COMP-2.
05 FILE-INITIALIZED PIC 9(1).
05 FILE-EMPTY PIC 9(1).
05 HEADER-PARSE-STARTED PIC 9(1).
05 NUM-RECORDS PIC 9(18).
05 COL-VALS OCCURS 1 TO 4096 TIMES
DEPENDING ON ROW-NUM INDEXED
BY COL-VALS-INDEX.
10 COL-VAL PIC 9(1) USAGE IS COMP-3.
01 INITIALIZATION-DATA.
05 INPUT-COL-VALS-INDEX PIC 9(4).
05 INITIALIZATION-STARTED PIC 9(1).
05 INITIALIZATION-FAILED PIC 9(1).
01 MISC-DATA.
05 EOF PIC 9(1).
05 INPUT-DATA PIC X(4096).
05 DATA-MODE PIC 9(1).
05 DIVIDER PIC X(80).
05 COMMAND PIC X(10).
01 WRITE-PARSING-DATA.
05 WRITE-PARSING-INDEX PIC 9(4).
05 WRITE-PARSING-STARTED PIC 9(1).
05 WRITE-PARSING-FAILED PIC 9(1).
05 WRITE-PARSING-LEN PIC 9(4).
05 WRITE-PARSING-LEN-INDEX PIC 9(1).
05 WRITE-PARSING-VALS-CURRENTLY PIC 9(1).
05 WRITE-PARSING-LEN-CURRENTLY PIC 9(1).
05 WRITE-PARSING-CHAR PIC X(1).
05 WRITE-PARSING-CHAR-AS-INT
REDEFINES WRITE-PARSING-CHAR PIC 9(1).
05 FINAL-CHARACTER-INDEX PIC 9(4).
01 READ-DEL-PARSING-DATA.
05 SEARCH-KEY PIC 9(18).
05 COLS-INDEX PIC 9(4).
05 READING-LEN-INDEX PIC 9(1).
05 SEARCH-FAILED PIC 9(1).
05 SEARCH-DONE PIC 9(1).
05 READING-LEN PIC 9(1).
05 READDEL-VAL PIC 9(1).
05 REGISTER-INDEX PIC 9(4).
05 PARSING-DELED-REC PIC 9(1).
PROCEDURE DIVISION.
MAIN.
PERFORM INIT-DATA.
PERFORM GET-INPUT.
PERFORM OPEN-FILE.
INITIALIZE COMMAND.
DISPLAY "Please enter command"
ACCEPT COMMAND.
IF COMMAND = "INITIALIZE"
DISPLAY "Please enter input"
PERFORM INITIALIZE-FILE
ELSE IF COMMAND = "WRITE "
DISPLAY "Please enter input"
PERFORM WRITE-REC
ELSE IF COMMAND = "READ "
DISPLAY "Please enter input"
PERFORM READ-REC
ELSE IF COMMAND = "DELETE "
DISPLAY "Please enter input"
PERFORM DELETE-REC
ELSE
DISPLAY "Error: Invalid command"
END-IF.
STOP RUN.
INIT-DATA.
INITIALIZE PARSING-DATA.
INITIALIZE DATA-REGISTERS.
INITIALIZE HEADER-DATA.
INITIALIZE MISC-DATA.
INITIALIZE INITIALIZATION-DATA.
INITIALIZE WRITE-PARSING-DATA.
INITIALIZE READ-DEL-PARSING-DATA.
GET-INPUT.
ACCEPT DB-FILE-NAME FROM COMMAND-LINE.
MOVE 501 TO DB-FILE-NAME-INDEX.
PERFORM UNTIL PARSING-DONE = 1
SUBTRACT 1 FROM DB-FILE-NAME-INDEX
IF NOT DB-FILE-NAME (DB-FILE-NAME-INDEX : 1) = ' '
MOVE 1 TO PARSING-DONE
END-IF
END-PERFORM.
OPEN-FILE.
SET COL-VALS-INDEX TO 1.
MOVE 1 TO FILE-EMPTY
MOVE 1 TO NUM-RECORDS-PARSING-INDEX
OPEN INPUT DB-FILE.
PERFORM UNTIL FILE-INITIALIZED = '1' OR EOF = '1' OR
CHAR = '$'
READ DB-FILE
AT END
MOVE '1' TO EOF
IF (FILE-EMPTY = 0) AND
(FILE-INITIALIZED = 0) AND
(NUM-RECORDS-PARSING-STARTED = 0)
DISPLAY "File is corrupted. Please ensur
- "e that you are inputting a proper cobDB
- " file or an empty/non existant file. Ex
- "iting...1"
CLOSE DB-FILE
EXIT PROGRAM
END-IF
NOT AT END
IF FILE-EMPTY = 1
MOVE 0 TO FILE-EMPTY
END-IF
IF HEADER-PARSE-STARTED = 0
IF CHAR = '@'
MOVE 1 TO HEADER-PARSE-STARTED
ELSE
DISPLAY "File is corrupted. Please en
- "sure that you are inputting a proper
- " cobDB file or an empty/non existant
- " file. Exiting...2"
CLOSE DB-FILE
EXIT PROGRAM
END-IF
ELSE IF NUM-RECORDS-PARSING-START = 1
IF CHAR IS NUMERIC
MOVE CHAR TO NUM-RECORDS
(NUM-RECORDS-PARSING-INDEX : 1)
ADD 1 TO NUM-RECORDS-PARSING-INDEX
IF NUM-RECORDS-PARSING-STARTED = 0
MOVE 1 TO
NUM-RECORDS-PARSING-STARTED
END-IF
ELSE IF CHAR = '$'
CONTINUE
ELSE
DISPLAY "0"
CLOSE DB-FILE
EXIT PROGRAM
END-IF
ELSE
IF CHAR IS NUMERIC
MOVE CHAR TO COL-VALS
(COL-VALS-INDEX)
SET COL-VALS-INDEX UP BY 1
ELSE IF CHAR = '#'
MOVE 1 TO NUM-RECORDS-PARSING-START
ELSE
DISPLAY "File is corrupted. Please en
- "sure that you are inputting a proper
- " cobDB file or an empty/non existant
- " file. Exiting...3"
CLOSE DB-FILE
EXIT PROGRAM
END-IF
END-IF
END-READ
END-PERFORM.
CLOSE DB-FILE.
INITIALIZE-FILE.
ACCEPT INPUT-DATA.
MOVE 0 TO INITIALIZATION-STARTED.
OPEN OUTPUT DB-FILE.
MOVE '@' TO CHAR.
WRITE CHAR END-WRITE.
PERFORM VARYING INPUT-COL-VALS-INDEX FROM 1 BY 1 UNTIL
INPUT-COL-VALS-INDEX IS GREATER THAN 4096
EVALUATE INPUT-DATA (INPUT-COL-VALS-INDEX : 1)
WHEN 'I'
MOVE '1' TO CHAR
WRITE CHAR END-WRITE
IF INITIALIZATION-STARTED = 0
MOVE 1 TO INITIALIZATION-STARTED
END-IF
WHEN 'F'
MOVE '2' TO CHAR
WRITE CHAR END-WRITE
IF INITIALIZATION-STARTED = 0
MOVE 1 TO INITIALIZATION-STARTED
END-IF
WHEN 'S'
MOVE '3' TO CHAR
WRITE CHAR END-WRITE
IF INITIALIZATION-STARTED = 0
MOVE 1 TO INITIALIZATION-STARTED
END-IF
WHEN ' '
IF INITIALIZATION-STARTED = 0
DISPLAY "Error: Initialization failed. In
- "itialization string was not properly for
- "matted."
MOVE 1 TO INITIALIZATION-FAILED
END-IF
NEXT SENTENCE
WHEN OTHER
DISPLAY "Error: Initialization failed. Initia
- "lization string was not properly formatted."
MOVE 1 TO INITIALIZATION-FAILED
CLOSE DB-FILE
NEXT SENTENCE
END-EVALUATE
END-PERFORM.
IF INITIALIZATION-FAILED = 0
MOVE '#' TO CHAR
WRITE CHAR END-WRITE
MOVE 0 TO NUM-RECORDS
PERFORM 18 TIMES
MOVE '0' TO CHAR
WRITE CHAR END-WRITE
END-PERFORM
MOVE '$' TO CHAR
WRITE CHAR END-WRITE
END-IF.
CLOSE DB-FILE.
WRITE-REC.
ACCEPT INPUT-DATA.
IF INITIALIZATION-FAILED = 1
DISPLAY "Error"
END-IF.
MOVE 0 TO WRITE-PARSING-STARTED.
MOVE 0 to WRITE-PARSING-FAILED.
MOVE 0 TO WRITE-PARSING-LEN-INDEX.
MOVE 0 TO WRITE-PARSING-VALS-CURRENTLY.
MOVE 0 TO WRITE-PARSING-LEN-CURRENTLY.
PERFORM VARYING WRITE-PARSING-INDEX FROM 1 BY 1 UNTIL
WRITE-PARSING-INDEX IS GREATER THAN 4096
MOVE INPUT-DATA (WRITE-PARSING-INDEX : 1) TO
WRITE-PARSING-CHAR
IF WRITE-PARSING-STARTED = 0
IF WRITE-PARSING-CHAR IS NUMERIC
ADD 1 TO WRITE-PARSING-LEN-INDEX
MOVE WRITE-PARSING-CHAR-AS-INT TO
WRITE-PARSING-LEN (WRITE-PARSING-LEN-INDEX : 1)
MOVE 0 TO WRITE-PARSING-VALS-CURRENTLY
MOVE 1 TO WRITE-PARSING-LEN-CURRENTLY
MOVE 1 TO WRITE-PARSING-STARTED
ELSE
MOVE 1 TO WRITE-PARSING-FAILED
DISPLAY "2"
NEXT SENTENCE
END-IF
ELSE
IF WRITE-PARSING-LEN-CURRENTLY = 1
IF WRITE-PARSING-CHAR IS NUMERIC
ADD 1 TO WRITE-PARSING-LEN-INDEX
MOVE WRITE-PARSING-CHAR-AS-INT TO
WRITE-PARSING-LEN (WRITE-PARSING-LEN-INDEX :
1)
IF WRITE-PARSING-LEN-INDEX = 4
MOVE 0 TO WRITE-PARSING-LEN-CURRENTLY
MOVE 1 TO WRITE-PARSING-VALS-CURRENTLY
MOVE 0 TO WRITE-PARSING-LEN-INDEX
END-IF
ELSE
MOVE 1 TO WRITE-PARSING-FAILED
DISPLAY "3"
NEXT SENTENCE
END-IF
ELSE IF WRITE-PARSING-VALS-CURRENTLY = 1
SUBTRACT 1 FROM WRITE-PARSING-LEN
IF WRITE-PARSING-LEN = 0
MOVE 0 TO WRITE-PARSING-VALS-CURRENTLY
END-IF
ELSE
IF WRITE-PARSING-CHAR IS NUMERIC
ADD 1 TO WRITE-PARSING-LEN-INDEX
MOVE WRITE-PARSING-CHAR-AS-INT TO
WRITE-PARSING-LEN (WRITE-PARSING-LEN-INDEX :
1)
MOVE 1 TO WRITE-PARSING-LEN-CURRENTLY
ELSE IF WRITE-PARSING-CHAR = ' '
MOVE WRITE-PARSING-INDEX TO
FINAL-CHARACTER-INDEX
NEXT SENTENCE
ELSE
MOVE 1 TO WRITE-PARSING-FAILED
DISPLAY "4"
NEXT SENTENCE
END-IF
END-IF
END-IF
END-PERFORM.
IF WRITE-PARSING-FAILED = 0
OPEN EXTEND DB-FILE
PERFORM VARYING WRITE-PARSING-INDEX FROM 1 BY 1 UNTIL
WRITE-PARSING-INDEX = FINAL-CHARACTER-INDEX
MOVE INPUT-DATA (WRITE-PARSING-INDEX : 1) TO CHAR
WRITE CHAR END-WRITE
END-PERFORM
CLOSE DB-FILE
ADD 1 TO NUM-RECORDS
OPEN I-O DB-FILE
PERFORM UNTIL CHAR = '#'
READ DB-FILE
END-PERFORM
PERFORM VARYING WRITE-PARSING-INDEX FROM 1 BY 1
UNTIL WRITE-PARSING-INDEX IS GREATER THAN 18
READ DB-FILE END-READ
MOVE NUM-RECORDS (WRITE-PARSING-INDEX : 1) TO
CHAR
REWRITE CHAR
END-PERFORM
CLOSE DB-FILE
END-IF.
READ-REC.
MOVE ALL '_' TO DIVIDER (1 : 80).
MOVE 0 TO SEARCH-FAILED.
MOVE 0 TO SEARCH-DONE.
MOVE 1 TO READING-LEN.
MOVE 1 TO READING-LEN-INDEX.
MOVE 0 TO READDEL-VAL.
MOVE 1 TO REGISTER-INDEX.
MOVE 0 TO PARSING-DELED-REC.
MOVE COL-VALS-INDEX TO COLS-INDEX.
SUBTRACT 1 FROM COLS-INDEX.
MOVE ' ' TO CHAR.
ACCEPT SEARCH-KEY.
IF SEARCH-KEY IS GREATER THAN (NUM-RECORDS - 1)
DISPLAY "6"
EXIT
END-IF.
OPEN INPUT DB-FILE.
PERFORM UNTIL CHAR = '$'
READ DB-FILE
END-PERFORM
PERFORM UNTIL (SEARCH-DONE = 1) OR (SEARCH-FAILED = 1)
READ DB-FILE
IF PARSING-DELED-REC = 1
IF CHAR = '^'
MOVE 0 TO PARSING-DELED-REC
MOVE 1 TO READING-LEN
MOVE 0 TO READDEL-VAL
MOVE 1 TO READING-LEN-INDEX
END-IF
ELSE IF READING-LEN = 1
IF CHAR IS NUMERIC
IF CHAR = '9'
IF READING-LEN-INDEX = 1
MOVE 1 TO PARSING-DELED-REC
END-IF
END-IF
MOVE CHAR TO LENGTH-REGISTER
(READING-LEN-INDEX : 1)
ADD 1 TO READING-LEN-INDEX
IF READING-LEN-INDEX = 5
MOVE 1 TO READING-LEN-INDEX
MOVE 0 TO READING-LEN
MOVE 1 TO READDEL-VAL
IF DATA-MODE = 1
DISPLAY LENGTH-REGISTER
END-IF
END-IF
ELSE
DISPLAY "7"
MOVE 1 TO SEARCH-FAILED
END-IF
ELSE IF READDEL-VAL = 1
IF SEARCH-KEY IS GREATER THAN 0
SUBTRACT 1 FROM LENGTH-REGISTER
IF LENGTH-REGISTER = 0
MOVE 1 TO READING-LEN
MOVE 0 TO READDEL-VAL
SUBTRACT 1 FROM COLS-INDEX
IF COLS-INDEX = 0
MOVE COL-VALS-INDEX TO COLS-INDEX
SUBTRACT 1 FROM COLS-INDEX
SUBTRACT 1 FROM SEARCH-KEY
END-IF
END-IF
ELSE
MOVE CHAR TO DATA-REGISTER (REGISTER-INDEX :
1)
SUBTRACT 1 FROM LENGTH-REGISTER
ADD 1 TO REGISTER-INDEX
IF LENGTH-REGISTER = 0
MOVE 1 TO READING-LEN
MOVE 0 TO READDEL-VAL
SUBTRACT 1 FROM COLS-INDEX
DISPLAY DATA-REGISTER (1 :
REGISTER-INDEX)
MOVE 1 TO REGISTER-INDEX
MOVE ALL ' ' TO DATA-REGISTER (1 : 4096)
IF DATA-MODE = 0
DISPLAY DIVIDER
END-IF
IF COLS-INDEX = 0
MOVE 1 TO SEARCH-DONE
END-IF
END-IF
END-IF
END-PERFORM.
CLOSE DB-FILE.
DELETE-REC.
MOVE 0 TO SEARCH-FAILED.
MOVE 0 TO SEARCH-DONE.
MOVE 1 TO READING-LEN.
MOVE 1 TO READING-LEN-INDEX.
MOVE 0 TO READDEL-VAL.
MOVE COL-VALS-INDEX TO COLS-INDEX.
SUBTRACT 1 FROM COLS-INDEX.
MOVE ' ' TO CHAR.
ACCEPT SEARCH-KEY.
IF SEARCH-KEY IS GREATER THAN (NUM-RECORDS - 1)
DISPLAY "6"
EXIT
END-IF.
OPEN I-O DB-FILE.
PERFORM UNTIL CHAR = '$'
READ DB-FILE
END-PERFORM.
PERFORM UNTIL (SEARCH-DONE = 1) OR (SEARCH-FAILED = 1)
READ DB-FILE
IF READING-LEN = 1
IF CHAR IS NUMERIC
MOVE CHAR TO LENGTH-REGISTER
(READING-LEN-INDEX : 1)
ADD 1 TO READING-LEN-INDEX
IF READING-LEN-INDEX = 5
MOVE 1 TO READING-LEN-INDEX
MOVE 0 TO READING-LEN
MOVE 1 TO READDEL-VAL
IF DATA-MODE = 1
DISPLAY LENGTH-REGISTER
END-IF
END-IF
IF SEARCH-KEY = 0
MOVE '9' TO CHAR
REWRITE CHAR END-REWRITE
END-IF
ELSE
DISPLAY "7"
MOVE 1 TO SEARCH-FAILED
END-IF
ELSE IF READDEL-VAL = 1
IF SEARCH-KEY IS GREATER THAN 0
SUBTRACT 1 FROM LENGTH-REGISTER
IF LENGTH-REGISTER = 0
MOVE 1 TO READING-LEN
MOVE 0 TO READDEL-VAL
SUBTRACT 1 FROM COLS-INDEX
IF COLS-INDEX = 0
MOVE COL-VALS-INDEX TO COLS-INDEX
SUBTRACT 1 FROM COLS-INDEX
SUBTRACT 1 FROM SEARCH-KEY
END-IF
END-IF
ELSE
SUBTRACT 1 FROM LENGTH-REGISTER
IF LENGTH-REGISTER = 0
MOVE '^' TO CHAR
REWRITE CHAR END-REWRITE
MOVE 1 TO READING-LEN
MOVE 0 TO READDEL-VAL
SUBTRACT 1 FROM COLS-INDEX
IF COLS-INDEX = 0
MOVE 1 TO SEARCH-DONE
END-IF
ELSE
MOVE ' ' TO CHAR
REWRITE CHAR END-REWRITE
END-IF
END-IF
END-IF
END-PERFORM.
CLOSE DB-FILE.