IDENTIFICATION DIVISION. PROGRAM-ID. POPULAR-WORDS. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FREQUENT-WORDS ASSIGN TO "" STATUS IS FILE-STATUS. SELECT SORT-FILE ASSIGN TO "". DATA DIVISION. FILE SECTION. FD FREQUENT-WORDS VALUE OF ID IS TRANSLATED-NAME RECORD IS VARYING IN SIZE FROM 1 TO 256 DEPENDING ON CUR-SIZE. 01 FREQUENT-WORD PIC X(256). SD SORT-FILE. 01 SORT-RECORD. 02 SIZED-WORD PIC X(32). 02 WORD-SIZE PIC 99. / WORKING-STORAGE SECTION. 01 xtime pic 9(8). 01 FILE-STATUS VALUE SPACE PIC XX. 88 END-FILE VALUE "10" "13" "16". 01 X PIC S9(4) COMP. 01 L PIC S9(4) COMP. 01 I PIC S9(4) COMP. 01 U PIC S9(4) COMP. 01 CURRENT-SIZE PIC 99. 01 CUR-SIZE PIC 9(4) COMP. 01 BOUNDARY-TABLE. 02 BOUNDARY-TABLE-ENTRY OCCURS 32 TIMES. 03 START-ADDRESS PIC S9(4) COMP. 03 WORD-COUNT PIC S9(4) COMP. 01 PREVIOUS-WORD PIC X(32). * WORD-ARRAY is EXTERNAL so it will be Demand Zero pages. * If not Demand Zero, it is initialized to spaces by * the compiler. Hence it takes space in the .EXE file * and gobbles real virtual memory at run time. 01 WORD-ARRAY EXTERNAL PIC X(65534). 01 INITIALIZED-SWITCH VALUE "F" PIC X. 88 INITIALIZED VALUE "T". 01 WORD-STATUS PIC S9(9) COMP. 88 WORD-FOUND VALUE 1. 88 NOT-FOUND VALUE 0. / 01 TRANSLATED-NAME PIC X(255). 01 ITEM-LIST. 02 LNM-MAX-INDEX. 03 FILLER VALUE 4 PIC S9(4) COMP. 03 FILLER VALUE EXTERNAL LNM$_MAX_INDEX PIC S9(4) COMP. 03 FILLER VALUE REFERENCE MAX-INDEX USAGE IS POINTER. 03 FILLER VALUE REFERENCE MAX-INDEX-SIZE USAGE IS POINTER. 02 LNM-INDEX. 03 FILLER VALUE 4 PIC S9(4) COMP. 03 FILLER VALUE EXTERNAL LNM$_INDEX PIC S9(4) COMP. 03 FILLER VALUE REFERENCE THIS-INDEX USAGE IS POINTER. 03 FILLER VALUE REFERENCE THIS-INDEX-SIZE USAGE IS POINTER. 02 LNM-STRING. 03 FILLER VALUE 255 PIC S9(4) COMP. 03 FILLER VALUE EXTERNAL LNM$_STRING PIC S9(4) COMP. 03 FILLER VALUE REFERENCE TRANSLATED-NAME USAGE IS POINTER. 03 FILLER VALUE REFERENCE TRANSLATED-NAME-SIZE USAGE IS POINTER. 02 FILLER VALUE 0 PIC S9(9) COMP. 01 MAX-INDEX PIC S9(9) COMP. 01 MAX-INDEX-SIZE PIC S9(9) COMP. 01 THIS-INDEX PIC S9(9) COMP. 01 THIS-INDEX-SIZE PIC S9(9) COMP. 01 TRANSLATED-NAME-SIZE PIC S9(9) COMP. 01 RETURN-STATUS PIC S9(9) COMP. 01 X-MAX-TABLE. 02 LNM-STRING. 03 FILLER VALUE 42 PIC S9(4) COMP. 03 FILLER VALUE EXTERNAL LNM$_STRING PIC S9(4) COMP. 03 FILLER VALUE REFERENCE X-MAX-TEXT USAGE IS POINTER. 03 FILLER VALUE REFERENCE TRANSLATED-NAME-SIZE USAGE IS POINTER. 03 FILLER VALUE 0 PIC S9(4) COMP. 01 X-MAX-TEXT. 02 FILLER VALUE "Used " PIC X(6). 02 X-MAX PIC ZZ,ZZ9. 02 FILLER VALUE " of 65534 bytes, " PIC X(17). 02 X-WORDS PIC ZZ,ZZ9. 02 FILLER VALUE " words." PIC X(7). 01 TOTAL-WORD-COUNT PIC 9(4) COMP. 01 ACCESS-MODE VALUE EXTERNAL PSL$C_SUPER PIC S9(4) COMP. LINKAGE SECTION. 01 WORD-TO-TEST PIC X(32). 01 TEST-WORD-SIZE PIC S9(4) COMP. / PROCEDURE DIVISION USING WORD-TO-TEST TEST-WORD-SIZE GIVING WORD-STATUS. DECLARATIVES. MISSING-FREQUENT-WORDS SECTION. USE AFTER STANDARD ERROR PROCEDURE ON FREQUENT-WORDS. MISSED-WORDS. IF FILE-STATUS = "97" DISPLAY "Popular word file " TRANSLATED-NAME (1:TRANSLATED-NAME-SIZE) " not found." MOVE "13" TO FILE-STATUS END-IF. END DECLARATIVES. MAIN SECTION. MAIN-ENTRY. IF NOT INITIALIZED * accept xtime from time * display "strt pop " xtime PERFORM LOAD-WORDS * accept xtime from time * display "end pop " xtime SET INITIALIZED TO TRUE END-IF SET NOT-FOUND TO TRUE MOVE TEST-WORD-SIZE TO CUR-SIZE MOVE 1 TO L MOVE WORD-COUNT (CUR-SIZE) TO U PERFORM BINARY-SEARCH UNTIL L > U. EXIT PROGRAM. BINARY-SEARCH. COMPUTE I = (L + U)/2 COMPUTE X = (CUR-SIZE * I) + START-ADDRESS (CUR-SIZE) * DISPLAY WORD-TO-TEST (1:CUR-SIZE) * " I:" I CONVERSION " L:" L CONVERSION " U:" U CONVERSION * " PROBE=" WORD-ARRAY (X:CUR-SIZE) IF WORD-TO-TEST (1:CUR-SIZE) < WORD-ARRAY (X:CUR-SIZE) SUBTRACT 1 FROM I GIVING U ELSE IF WORD-TO-TEST (1:CUR-SIZE) > WORD-ARRAY (X:CUR-SIZE) ADD 1 I GIVING L ELSE SET WORD-FOUND TO TRUE MOVE ZERO TO U END-IF END-IF. / LOAD-WORDS SECTION. SORT-INPUT. SORT SORT-FILE ON ASCENDING KEY WORD-SIZE SIZED-WORD INPUT PROCEDURE IS RELEASE-INPUT OUTPUT PROCEDURE IS RETURN-OUTPUT. RELEASE-INPUT SECTION. RELEAS-IN. PERFORM LOAD-ONE-FILE UNTIL THIS-INDEX > MAX-INDEX. INPUT-PROCS SECTION. LOAD-ONE-FILE. MOVE SPACES TO TRANSLATED-NAME CALL "SYS$TRNLNM" USING OMITTED BY DESCRIPTOR "LNM$FILE_DEV" "POPULAR_WORDS" OMITTED BY REFERENCE ITEM-LIST GIVING RETURN-STATUS OPEN INPUT FREQUENT-WORDS IF NOT END-FILE READ FREQUENT-WORDS AT END CONTINUE END-READ END-IF PERFORM PROCESS-INPUT-TEXT UNTIL END-FILE CLOSE FREQUENT-WORDS ADD 1 TO THIS-INDEX. PROCESS-INPUT-TEXT. MOVE 1 TO X PERFORM UNTIL FREQUENT-WORD (X:1) = SPACE OR X > CUR-SIZE ADD 1 TO X END-PERFORM SUBTRACT 1 FROM X GIVING WORD-SIZE IF WORD-SIZE NOT ZERO MOVE FREQUENT-WORD (1:WORD-SIZE) TO SIZED-WORD RELEASE SORT-RECORD END-IF READ FREQUENT-WORDS AT END CONTINUE END-READ. / RETURN-OUTPUT SECTION. RETURN-OUT. RETURN SORT-FILE AT END CONTINUE END-RETURN MOVE 1 TO CUR-SIZE PERFORM UNTIL CUR-SIZE > 32 * ZERO THE TABLE - FOR DOCUMENTATION ONLY, PROBABLY MOVE ZERO TO WORD-COUNT (CUR-SIZE) START-ADDRESS (CUR-SIZE) ADD 1 TO CUR-SIZE END-PERFORM MOVE ZERO TO CURRENT-SIZE MOVE 1 TO X PERFORM RETURN-SORTED-RECORDS UNTIL END-FILE MOVE X TO X-MAX MOVE TOTAL-WORD-COUNT TO X-WORDS CALL "SYS$CRELNM" USING OMITTED BY DESCRIPTOR "LNM$PROCESS" "SPEL_POPULAR_WORDS_SIZE" BY REFERENCE ACCESS-MODE X-MAX-TABLE GIVING RETURN-STATUS MOVE 1 TO CUR-SIZE PERFORM UNTIL CUR-SIZE > 32 * OFFSET START ADDRESS BY ENTRY SIZE IF WORD-COUNT (CUR-SIZE) NOT ZERO SUBTRACT CUR-SIZE FROM START-ADDRESS (CUR-SIZE) END-IF ADD 1 TO CUR-SIZE END-PERFORM. OUTPUT-PROCS SECTION. RETURN-SORTED-RECORDS. IF WORD-SIZE > CURRENT-SIZE MOVE WORD-SIZE TO CURRENT-SIZE CUR-SIZE MOVE X TO START-ADDRESS (CUR-SIZE) MOVE SPACES TO PREVIOUS-WORD END-IF IF X + CUR-SIZE > 65000 STOP "Popular word table overflow - reduce size and rerun." END-IF IF SIZED-WORD (1:CUR-SIZE) NOT = PREVIOUS-WORD * TEST TO ELIMINATE DUPLICATES. MOVE SIZED-WORD (1:CUR-SIZE) TO WORD-ARRAY (X:CUR-SIZE) PREVIOUS-WORD ADD CUR-SIZE TO X ADD 1 TO WORD-COUNT (CUR-SIZE) ADD 1 TO TOTAL-WORD-COUNT END-IF RETURN SORT-FILE AT END SET END-FILE TO TRUE END-RETURN. END PROGRAM POPULAR-WORDS.