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 L<F OR L>72 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
770  GOTO 820
780  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 
