diff --git a/id3cobol.cbl b/id3cobol.cbl index f2cb21f..49df6f9 100644 --- a/id3cobol.cbl +++ b/id3cobol.cbl @@ -1,4 +1,4 @@ - IDENTIFICATION DIVISION. +IDENTIFICATION DIVISION. PROGRAM-ID. MP3ID3INFO. ENVIRONMENT DIVISION. @@ -13,22 +13,25 @@ 01 FILE-RECORD PIC X(1). WORKING-STORAGE SECTION. - 01 RecordLength PIC 9(5) COMP-5. *> Debug flag to enable/disable debug prints 01 WS-DEBUG-MODE PIC 9 VALUE 1. 01 WS-FILENAME PIC X(255) VALUE "audio.mp3". 01 WS-EOF-FLAG PIC 9 VALUE 0. 88 WS-EOF VALUE 1. + + *> Add a stop flag for zero-length frames + 01 STOP-READING-FLAG PIC 9 VALUE 0. + 88 STOP-READING VALUE 1. - *> ID3v2 Header Structure - Use simpler types for debugging + *> ID3v2 Header Structure 01 ID3-HEADER. 05 ID3-TAG PIC X(3). *> Should be "ID3" 05 ID3-VERSION PIC X(2). *> Version (ID3v2.X) 05 ID3-FLAGS PIC X(1). *> Flags 05 ID3-SIZE PIC X(4). *> Sync-safe size - *> Frame Structure - Explicitly define each element for debugger + *> Frame Structure 01 ID3-FRAME-HEADER. 05 ID3-FRAME-ID PIC X(4). *> Frame identifier 05 ID3-FRAME-SIZE PIC X(4). *> Sync-safe frame size @@ -50,19 +53,8 @@ *> Variables for sync-safe integer conversion 01 WS-BYTE PIC X OCCURS 4. 01 WS-BYTE-VAL PIC 9(3) COMP-5 OCCURS 4. - 01 WS-SHIFT-RESULT PIC 9(9) COMP-5 OCCURS 4. - 01 WS-X-RESULT PIC 9(9) COMP-5 OCCURS 4. - 01 WS-Y-RESULT PIC 9(9). - - 01 WS-NUMBER PIC 9(5) VALUE 21154. - 01 WS-DIVIDEND PIC 9(5). - - 01 WS-BYTE-FIELD. - 05 WS-IW-BYTE-0 PIC X(1). - 05 WS-IW-BYTE-1 PIC X(1). - 05 WS-IW-BYTE-2 PIC X(1). - 05 WS-IW-BYTE-3 PIC X(1). + *> Variables for sync-safe integer conversion 01 SYNC-SAFE-INT-IN. 05 SYNC-SAFE-INT-1 PIC X(1). 05 SYNC-SAFE-INT-2 PIC X(1). @@ -71,11 +63,7 @@ 01 SYNC-SAFE-INT-OUT PIC 9(9) COMP-5. - *> Debug display variables - explicit single items for easier debugging - 01 DBG-FRAME-SIZE PIC 9(9) COMP-5. - 01 DBG-ASCII-ID PIC X(4). - 01 DBG-LOOP-COUNT PIC 9(5) COMP-5. - + *> Variables for zero-based ORD function 01 WS-TEMP-CHAR PIC X(1). 01 WS-ORD-RESULT PIC 9(5) COMP-5. @@ -83,11 +71,6 @@ 01 BYTES-BUFFER PIC X(100000). 01 WS-TEMP-BYTE PIC X(1). - 01 WS-SHIFT-21 PIC 9(7) COMP-5 VALUE 2097152. - 01 WS-SHIFT-14 PIC 9(7) COMP-5 VALUE 16384. - 01 WS-SHIFT-7 PIC 9(7) COMP-5 VALUE 128. - 01 WS-SHIFT-0 PIC 9(7) COMP-5 VALUE 1. - 01 WS-VAL PIC 9(7). 01 WS-NEW-VAL PIC 9(7). @@ -149,17 +132,17 @@ END-IF MOVE 10 TO WS-FILE-POS. *> 10 bytes read so far (header) + MOVE 0 TO STOP-READING-FLAG. *> Reset the stop reading flag *> Debug line with explicit break opportunity DISPLAY "Starting to read frames at position " WS-FILE-POS. PERFORM READ-FRAMES - UNTIL (WS-FILE-POS >= WS-TAG-SIZE + 10) OR WS-EOF. + UNTIL (WS-FILE-POS >= WS-TAG-SIZE + 10) OR + WS-EOF OR + STOP-READING. READ-FRAMES. - *> Debug counter for frame reading - ADD 1 TO DBG-LOOP-COUNT - *> Reset values MOVE LOW-VALUES TO ID3-FRAME-HEADER. MOVE 0 TO WS-FRAME-SIZE. @@ -169,6 +152,15 @@ PERFORM READ-BYTES MOVE BYTES-BUFFER(1:10) TO ID3-FRAME-HEADER + *> Check for all null bytes - this is definitely padding + IF ID3-FRAME-ID = LOW-VALUES + DISPLAY "****************************************" + DISPLAY "Found padding (all nulls) - stopping frame reading" + DISPLAY "****************************************" + MOVE 1 TO STOP-READING-FLAG + EXIT PARAGRAPH + END-IF. + *> Update file position ADD 10 TO WS-FILE-POS. DISPLAY "Current position: " WS-FILE-POS. @@ -186,8 +178,17 @@ END-IF *> Check for invalid Frame Length - IF WS-FRAME-SIZE <= 0 - DISPLAY "Invalid WS-FRAME-SIZE" WS-FRAME-SIZE + IF WS-FRAME-SIZE < 0 + DISPLAY "Invalid WS-FRAME-SIZE " WS-FRAME-SIZE + EXIT PARAGRAPH + END-IF. + + *> Check for zero Frame Length - set stop flag and exit + IF WS-FRAME-SIZE = 0 + DISPLAY "****************************************" + DISPLAY "Frame length zero - stopping frame reading" + DISPLAY "****************************************" + MOVE 1 TO STOP-READING-FLAG EXIT PARAGRAPH END-IF. @@ -231,7 +232,8 @@ END-READ MOVE WS-TEMP-BYTE TO WS-FRAME-CHAR(WS-I) ELSE - DISPLAY "WARNING: Index " WS-I " out of bounds (1-100000)" + DISPLAY "WARNING: Index " WS-I + " out of bounds (1-100000)" EXIT PERFORM END-IF END-PERFORM.