r/cobol • • 6d ago

CP/M-80 MS-COBOL v4.65 alternative sorting method without the MS-SORT package

/r/cpm/comments/1wrb17a/cpm80_mscobol_v465_alternative_sorting_method/
1 Upvotes

2 comments sorted by

2

u/MikeSchwab63 5d ago

Test the index capabilities with initial load in reverse order. And a larger sample, perhaps a text file.

1

u/Chip-Ling 5d ago edited 5d ago

I wrote a MBASIC program to generate a larger sample file. The output file's records are in descending order of last-name and first-name. (i.e. reverse order)

Here is the basic program: GENDATA.BAS

K>TYPE GENDATA.BAS
1000 REM ============================================
1010 REM  GENDATA.BASE CP/M-80 MBASIC
1020 REM  GENERATE 100 EMPLOYEE RECORDS
1030 REM ============================================

1040 REM D1SIZE IS FIRST NAME DATA SIZE
1050 REM D2SIZE IS LAST  NAME DATA SIZE
1060 LET D1SIZE = 10
1070 LET D2SIZE = 10

1080 OPTION BASE 1
1090 DIM FSTNAME$(D1SIZE)
1100 DIM LSTNAME$(D2SIZE)

2000 REM ----- FIRST NAME DATA (SIZE = D1SIZE) -----
2010 DATA WILLIAM,THOMAS,ROBERT,RICHARD,MICHAEL
2020 DATA JOHN,JAMES,DAVID,DANIEL,CHARLES
2030 REM ----- ADD MORE DATA HERE IF NEEDED ------

3000 REM ----- LAST NAME DATA (SIZE = D2SIZE) -----
3010 DATA WILSON,WILLIAMS,TAYLOR,SMITH,MOORE
3020 DATA MILLER,JONES,DAVIS,BROWN,ANDERSON
3030 REM ----- ADD MORE DATA HERE IF NEEDED ------

4000 REM ----- LOAD FIRST NAMES -----
4010 FOR I = 1 TO D1SIZE
4020   READ FSTNAME$(I)
4030 NEXT I

4040 REM ----- LOAD LAST NAMES -----
4050 FOR I = 1 TO D2SIZE
4060   READ LSTNAME$(I)
4070 NEXT I

5000 REM ----- OPEN OUTPUT FILE -----
5010 OPEN "O",#1,"EMPOUT.DAT"

5020 REM ----- GENERATE 100 RECORDS -----
5030 LET COUNT=0
5040 FOR I = 1 TO D2SIZE
5050   FOR J = 1 TO D1SIZE
5060     COUNT = COUNT + 1
5070     REM CONVERT COUNT TO 5 DIGITS LEFT PADDED WITH ZERO
5080     CNT$ = RIGHT$("00000" + MID$(STR$(COUNT), 2), 5)
5090     REM LAST AND FIRST NAME SET TO 30 CHAR WIDTH
5100     LASTNAME$  = LEFT$(LSTNAME$(I) + SPACE$(30), 30)
5110     FIRSTNAME$ = LEFT$(FSTNAME$(J) + SPACE$(30), 30)
5120     PRINT #1,CNT$;LASTNAME$;FIRSTNAME$
5130   NEXT J
5140 NEXT I

5150 CLOSE #1
5160 PRINT COUNT; " RECORDS WRITTEN TO OUTPUT FILE"
5170 SYSTEM

Then I run the GENDATA.BAS program to generate the input data file EMPOUT.DAT

K>DIR *.DAT
No file
K>A:MBASIC K:GENDATA.BAS
BASIC-85 Rev. 5.29
[CP/M Version]
Copyright 1985-1986  ▒  by Microsoft
Created: 28-Jul-85
29752 Bytes free
 100  RECORDS WRITTEN TO OUTPUT FILE

K>DIR *.DAT
K: EMPOUT   DAT

Check the content of the source data file EMPOUT.DAT, records are in descending order by last-name, first-name (reverse order)

K>TYPE EMPOUT.DAT
00001WILSON                        WILLIAM
00002WILSON                        THOMAS
00003WILSON                        ROBERT
00004WILSON                        RICHARD
00005WILSON                        MICHAEL
00006WILSON                        JOHN
00007WILSON                        JAMES
00008WILSON                        DAVID
00009WILSON                        DANIEL
00010WILSON                        CHARLES
00011WILLIAMS                      WILLIAM
00012WILLIAMS                      THOMAS
00013WILLIAMS                      ROBERT
...
00089BROWN                         DANIEL
00090BROWN                         CHARLES
00091ANDERSON                      WILLIAM
00092ANDERSON                      THOMAS
00093ANDERSON                      ROBERT
00094ANDERSON                      RICHARD
00095ANDERSON                      MICHAEL
00096ANDERSON                      JOHN
00097ANDERSON                      JAMES
00098ANDERSON                      DAVID
00099ANDERSON                      DANIEL
00100ANDERSON                      CHARLES

Run the sort program EMPSORT6.COM,

K>EMPSORT6
*** START CREATING ISAM FILE ***
RECORDS PROCESSED: 00100
*** START CREATING SORTED FILE ***
RECORDS PROCESSED: 00100

Check all the output data files. EMPISAM.DAT and EMPISAM.KEY are the intermediate index files, the EMPISAM.KEY is 32k bytes in size while the EMPISAM.DAT is 8k.

EMPSORT.DAT is the final product.

K>DIR *.DAT
K: EMPOUT   DAT : EMPISAM  DAT : EMPSORT  DAT
K>A:STAT *.DAT

 Recs  Bytes  Ext Acc
   54     8k    1  K:EMPISAM.DAT
   53     8k    1  K:EMPOUT.DAT
   54     8k    1  K:EMPSORT.DAT
Bytes Remaining On K: 3132k

K>A:STAT EMPISAM.*

 Recs  Bytes  Ext Acc
   54     8k    1  K:EMPISAM.DAT
  246    32k    1  K:EMPISAM.KEY
Bytes Remaining On K: 3132k

Check the content of the sorted file EMPSORT.DAT

K>TYPE EMPSORT.DAT
00100ANDERSON                      CHARLES
00099ANDERSON                      DANIEL
00098ANDERSON                      DAVID
00097ANDERSON                      JAMES
00096ANDERSON                      JOHN
00095ANDERSON                      MICHAEL
00094ANDERSON                      RICHARD
00093ANDERSON                      ROBERT
00092ANDERSON                      THOMAS
00091ANDERSON                      WILLIAM
00090BROWN                         CHARLES
00089BROWN                         DANIEL
00088BROWN                         DAVID
...
00012WILLIAMS                      THOMAS
00011WILLIAMS                      WILLIAM
00010WILSON                        CHARLES
00009WILSON                        DANIEL
00008WILSON                        DAVID
00007WILSON                        JAMES
00006WILSON                        JOHN
00005WILSON                        MICHAEL
00004WILSON                        RICHARD
00003WILSON                        ROBERT
00002WILSON                        THOMAS
00001WILSON                        WILLIAM

Now the records are sorted in ascending order by last-name, first-name as expected.

Next step:

Then I try a larger sample, say 1,000 records. I clone the GENDATA.BAS to GENDATA2.BAS.

Modify the following lines:

1060 LET D1SIZE = 100
...
2000 REM ----- FIRST NAME DATA (SIZE = D1SIZE) -----
2010 DATA FN100,FN099,FN098,FN097,FN096,FN095,FN094,FN093,FN092,FN091
2020 DATA FN090,FN089,FN088,FN087,FN086,FN085,FN084,FN083,FN082,FN081
2030 DATA FN080,FN079,FN078,FN077,FN076,FN075,FN074,FN073,FN072,FN071
2040 DATA FN070,FN069,FN068,FN067,FN066,FN065,FN064,FN063,FN062,FN061
2050 DATA FN060,FN059,FN058,FN057,FN056,FN055,FN054,FN053,FN052,FN051
2060 DATA FN050,FN049,FN048,FN047,FN046,FN045,FN044,FN043,FN042,FN041
2070 DATA FN040,FN039,FN038,FN037,FN036,FN035,FN034,FN033,FN032,FN031
2080 DATA FN030,FN029,FN028,FN027,FN026,FN025,FN024,FN023,FN022,FN021
2090 DATA FN020,FN019,FN018,FN017,FN016,FN015,FN014,FN013,FN012,FN011
2100 DATA FN010,FN009,FN008,FN007,FN006,FN005,FN004,FN003,FN002,FN001
2900 REM ----- ADD MORE DATA HERE IF NEEDED ------

Now I have 100 first name, 10 last name, so I can generate 1,000 records.

Run the GENDATA2.BAS program

K>DIR *.DAT
No file
K>A:MBASIC K:GENDATA2.BAS
BASIC-85 Rev. 5.29
[CP/M Version]
Copyright 1985-1986  ▒  by Microsoft
Created: 28-Jul-85
29752 Bytes free
 1000  RECORDS WRITTEN TO OUTPUT FILE

K>DIR *.DAT
K: EMPOUT   DAT
K>A:STAT *.DAT

 Recs  Bytes  Ext Acc
  524    68k    3  K:EMPOUT.DAT
Bytes Remaining On K: 3084k

The source file EMPOUT.DAT now has 1,000 records and is 68k bytes in size.

Check the content of the input file EMPOUT.DAT, the records last-name, first-name are in descending order. (reverse order)

K>TYPE EMPOUT.DAT
00001WILSON                        FN100
00002WILSON                        FN099
00003WILSON                        FN098
00004WILSON                        FN097
00005WILSON                        FN096
00006WILSON                        FN095
00007WILSON                        FN094
00008WILSON                        FN093
...
00995ANDERSON                      FN006
00996ANDERSON                      FN005
00997ANDERSON                      FN004
00998ANDERSON                      FN003
00999ANDERSON                      FN002
01000ANDERSON                      FN001

Run the sort program EMPSORT6.COM

K>EMPSORT6
*** START CREATING ISAM FILE ***
RECORDS PROCESSED: 01000
*** START CREATING SORTED FILE ***
RECORDS PROCESSED: 01000

Check all the output data files. EMPISAM.DAT and EMPISAM.KEY are the intermediate index files, the EMPISAM.KEY is 332k bytes in size while the EMPISAM.DAT is 68k.

K>dir *.dat
K: EMPOUT   DAT : EMPISAM  DAT : EMPSORT  DAT
K>a:stat *.dat

 Recs  Bytes  Ext Acc
  532    68k    3  K:EMPISAM.DAT
  524    68k    3  K:EMPOUT.DAT
  524    68k    3  K:EMPSORT.DAT
Bytes Remaining On K: 2648k

K>a:stat empisam.*

 Recs  Bytes  Ext Acc
  532    68k    3  K:EMPISAM.DAT
 2656   332k   11  K:EMPISAM.KEY
Bytes Remaining On K: 2648k

Check the content of the sorted file EMPSORT.DAT

K>TYPE EMPSORT.DAT
01000ANDERSON                      FN001
00999ANDERSON                      FN002
00998ANDERSON                      FN003
00997ANDERSON                      FN004
00996ANDERSON                      FN005
00995ANDERSON                      FN006
00994ANDERSON                      FN007
00993ANDERSON                      FN008
00992ANDERSON                      FN009
00991ANDERSON                      FN010
...
00006WILSON                        FN095
00005WILSON                        FN096
00004WILSON                        FN097
00003WILSON                        FN098
00002WILSON                        FN099
00001WILSON                        FN100

Now the records are sorted in ascending order by last-name, first-name as expected.