1 REM **** HP TIME-SHARED BASIC PROGRAM LIBRARY ********************* 2 REM 3 REM SORT: FILE SERIAL STRING SORT 4 REM 5 REM 36122 REV A 3/72 6 REM 7 REM **** CONTRIBUTED PROGRAM ************************************** 10 REM NAME: SORT 12 REM 14 REM REVISION: A 11-1-71 20 REM 30 REM DESCRIPTION: THIS PROGRAM WILL SORT ANY SERIAL FILE OF 40 REM STRINGS IN ASSENDING OR DECENDING ORDER. 50 REM THE SORT CAN BE MADE ON THE ENTIRE STRING OR 60 REM ANY SUB FIELD (SUB STRING). 70 REM NO WORK FILE NEED BE PROVIDED SINCE THE SORT IS 80 REM DONE TOTALLY IN THE SINGLE FILE. 90 REM 100 REM METHOD: THE BUBBLE(RIPPLE) METHOD IS USED. 110 REM SINCE TSB DOES NOT ALLOW PARTIAL FILE RECORD WRITE 120 REM BUBBLE UP THE FILE IS PROVIDED ON A RECORD BASES. 130 REM 140 REM CONSIDERATIONS: TO USE FOR 2000A OR B REMOVE THE ASSIGN 150 REM STATEMENTS AND SET UP THE FILE STATEMENT 160 REM TO HAVE TWO POINTERS TO THE SAME FILE. 170 REM 180 REM TO USE: JUST RUN AND ANSEWER THE QUESTIONS OF 190 REM FILE NAME?,ASSENDING OR DECENDING?, AND SUB FIELDS?. 191 REM 192 REM NAMES: I=ELEMENT COUNT 193 REM B=RECORD COUNT 194 REM P=PASS COUNT 195 REM E=EXCHANGE OR NOT 196 REM S=ELEMENT TO END PASS AT 197 REM A=ASCENDING OR DESCENDING 198 REM F=FIRST CHARACTER 199 REM L=LAST CHARACTER 200 REM 201 REM 210 REM 220 REM 230 DIM C$[72],N$[72] 240 REM GET FILE NAME (IF 2000A OR B USE FILES NAME,NAME) 250 FILES *,* 260 PRINT "FILE"; 270 INPUT C$ 280 ASSIGN C$,1,Z9 290 ASSIGN C$,2,Z9 300 REM 310 REM GET ORDER OF SORT 320 A=1 330 PRINT "ASCENDING OR DESCENDING ORDER"; 340 INPUT C$ 350 IF C$[1,1]="A" THEN 410 360 IF C$[1,1]="D" THEN 380 370 GOTO 330 380 A=0 390 REM 400 REM SET UP SUB FIELDS 1 TO 72 OR AS REQUIRED" 410 PRINT "BY SUB FIELDS(Y OR N)"; 420 INPUT C$ 430 F=1 440 L=72 450 IF C$[1,1]="N" THEN 510 460 IF C$[1,1]#"Y" THEN 410 470 PRINT "FIRST,LAST"; 480 INPUT F,L 490 IF F<1 OR L72 THEN 470 500 REM 510 X=T=P=0 520 IF TYP(+1)=3 THEN 1030 530 IF END #1 THEN 850 540 REM BEGIN PASS OF FILE HERE 550 I=E=1 560 B=0 570 S=T-P 580 P=P+1 590 READ #1,1;C$ 600 READ #2,1 610 REM READ NEXT ITEM AND COMPAIR WITH CURRENT. 620 REM EXCHANGE IF THEY ARE OUT OF ORDER. 630 REM 640 REM IF END RECORD CHECK IF DEEP ENOUGH TO END PASS 650 IF TYP(-1)#4 THEN 710 660 B=B+1 670 IF S>I OR S=0 THEN 710 680 REM YES DEEP ENOUGH 690 PRINT #2;C$ 700 GOTO 950 710 READ #1;N$ 720 I=I+1 730 REM 740 REM PICK ASSENDING OR DECENDING TEST 750 IF A THEN 780 760 IF C$[F,L]N$[F,L] THEN 845 820 PRINT #2;C$ 830 C$=N$ 840 GOTO 650 845 E=0 846 PRINT #2;N$ 847 GOTO 650 850 REM 860 REM END OF FILE REACHED STORE LAST ITEM. 870 IF X THEN 900 880 X=1 890 T=I 900 PRINT #2;C$, END 910 REM 920 REM SORT FINISHED IF: 930 REM NO EXCHANGES WERE MADE. 940 REM N-1 PASSES WERE MADE 950 IF E THEN 1030 960 IF S=2 THEN 1030 970 IF P=1 THEN 1000 980 IF B>1 THEN 540 990 REM SPECIAL CASE--- FORCE WRITE ON FILE IF IN FIRST RECORD. 1000 READ #1,2 1010 READ #2,2 1020 GOTO 540 1030 PRINT T;"ITEMS SORTED ";P;"PASSES" 1040 END