1  COM F$[7],R1,R2,E,T,S,O,P,G$[7],N,A[10],B[10]
10  FILES *,*,*
20  DIM A$[72],B$[72]
30  PRINT "ARE YOU AN EXPERT WITH THIS PROGRAM";
40  INPUT A$
50  IF A$[1,1]="Y" THEN 90
60  IF A$[1,1]="N" THEN 110
70  PRINT "TYPE YES OR NO."
80  GOTO 30
90  Q=1
100  GOTO 120
110  Q=2
120  PRINT 
130  GOTO Q OF 140,160
140  PRINT "FILENAME";
150  GOTO 170
160  PRINT "WHAT FILE DO YOU WANT TO SORT";
170  INPUT A$
180  IF LEN(A$)>7 THEN 220
190  F$=A$
200  ASSIGN F$,1,A
210  IF A#3 THEN 240
220  PRINT "THIS FILE IS EITHER MISSING OR UNAVAILABLE TO THIS PROGRAM."
230  GOTO 130
240  PRINT 
250  GOTO Q OF 260,280
260  PRINT "ALL RECORDS";
270  GOTO 290
280  PRINT "DO YOU WANT TO SORT ON ALL RECORDS";
290  INPUT A$
300  IF A$[1,1]="Y" THEN 340
310  IF A$[1,1]="N" THEN 390
320  PRINT "TYPE YES OR NO."
330  GOTO 250
340  F1=1
350  GOSUB 4000
360  R1=1
370  R2=I1
380  GOTO 590
390  GOTO Q OF 400,420
400  PRINT "  START";
410  GOTO 430
420  PRINT "  ON WHAT RECORD DO YOU WANT TO START THE SORT";
430  INPUT R
440  GOSUB 5000
450  IF F=1 THEN 390
460  R1=R
470  GOTO Q OF 480,500
480  PRINT "  END";
490  GOTO 510
500  PRINT "  ON WHAT RECORD DO YOU WANT TO END THE SORT";
510  INPUT R
520  GOSUB 5000
530  IF F=1 THEN 470
540  IF R >= R1 THEN 580
550  PRINT "  YOUR SORT MUST END ON A RECORD AT LEAST AS LARGE"
560  PRINT "  AS THE STARTING RECORD."
570  GOTO 470
580  R2=R
590  PRINT 
600  GOTO Q OF 610,630
610  PRINT "ELEMENT";
620  GOTO 640
630  PRINT "ON WHICH ELEMENT OF EACH RECORD DO YOU WANT TO SORT";
640  INPUT E
650  IF E>0 AND E=INT(E) THEN 680
660  PRINT "TYPE A POSITIVE INTEGER."
670  GOTO 600
680  PRINT 
690  GOTO Q OF 700,720
700  PRINT "N OR S";
710  GOTO 730
720  PRINT "IS THIS ELEMENT A NUMBER OR A STRING IN EACH RECORD OF THE FILE";
730  INPUT A$
740  IF A$[1,1]="N" THEN 780
750  IF A$[1,1]="S" THEN 800
760  PRINT "TYPE NUMBER OR STRING."
770  GOTO 690
780  T=1
790  GOTO 810
800  T=2
810  PRINT 
820  GOTO Q OF 830,850
830  PRINT "A OR D";
840  GOTO 860
850  PRINT "DO YOU WANT THE SORT IN ASCENDING OR DESCENDING ORDER";
860  INPUT A$
870  IF A$[1,1]="A" THEN 910
880  IF A$[1,1]="D" THEN 930
890  PRINT "TYPE ASCENDING OR DESCENDING."
900  GOTO 820
910  S=1
920  GOTO 940
930  S=2
940  PRINT 
950  GOTO Q OF 960,980
960  PRINT "1-5";
970  GOTO 1070
980  PRINT "SPECIFY YOUR OUTPUT:"
990  PRINT 
1000  PRINT "  1 = SORTED ITEM"
1010  PRINT "  2 = RECORD NUMBER"
1020  PRINT "  3 = SORTED ITEM AND RECORD NUMBER"
1030  PRINT "  4 = FULL RECORD CONTENTS"
1040  PRINT "  5 = FORMATTED OUTPUT"
1050  PRINT 
1060  PRINT "OUTPUT DESIRED (1-5)";
1070  INPUT O
1080  IF O>0 AND O<6 AND O=INT(O) THEN 1110
1090  PRINT "TYPE 1, 2, 3, 4, OR 5."
1100  GOTO 1060
1110  IF O#5 THEN 1390
1120  P=1
1130  N=0
1140  N1=-1
1150  GOTO Q OF 1200,1160
1160  PRINT "TYPE THE LIST OF ITEMS YOU WANT PRINTED,"
1170  PRINT "EACH FOLLOWED BY THE COLUMN YOU WANT IT TO BEGIN IN."
1180  PRINT "TO END THE LIST, TYPE '0,0'."
1190  PRINT 
1200  GOTO Q OF 1210,1230
1210  PRINT "I,C";
1220  GOTO 1240
1230  PRINT "ITEM NUMBER, COLUMN";
1240  INPUT I,C
1250  IF I=0 AND C=0 THEN 1760
1260  IF I>0 AND I=INT(I) AND C>0 AND C=INT(C) THEN 1290
1270  PRINT "THE ITEM NUMBER AND COLUMN MUST BOTH BE POSITIVE INTEGERS."
1280  GOTO 1200
1290  IF C>N1+1 THEN 1320
1300  PRINT "THIS COLUMN HEADING MUST BE AT LEAST"N1+2
1310  GOTO 1200
1320  IF C <= 72 THEN 1350
1330  PRINT "MAXIMUM COLUMN HEADING IS 72."
1340  GOTO 1200
1350  N=N+1
1360  A[N]=I
1370  B[N]=N1=C
1380  IF N#10 THEN 1200
1390  PRINT 
1400  GOTO Q OF 1410,1430
1410  PRINT "T OR F";
1420  GOTO 1440
1430  PRINT "DO YOU WANT THE SORT PRINTED ON YOUR TERMINAL, OR ON A FILE";
1440  INPUT A$
1450  IF A$[1,1]="T" THEN 1490
1460  IF A$[1,1]="F" THEN 1510
1470  PRINT "TYPE TERMINAL OR FILE."
1480  GOTO 1400
1490  P=1
1500  GOTO 1760
1510  P=2
1520  PRINT 
1530  PRINT "FILENAME";
1540  INPUT A$
1550  IF LEN(A$)>7 THEN 1630
1560  G$=A$
1570  ASSIGN G$,2,A
1580  IF G$#F$ THEN 1610
1590  PRINT "THE OUTPUT FILE MUST BE DIFFERENT FROM THE FILE TO BE SORTED."
1600  GOTO 1530
1610  ASSIGN G$,2,A
1620  IF A=0 THEN 1650
1630  PRINT "THIS FILE IS EITHER MISSING OR UNAVAILABLE FOR YOUR EXCLUSIVE USE."
1640  GOTO 1530
1650  F1=2
1660  GOSUB 4000
1670  PRINT #2,1
1680  GOTO 0 OF 1690,1690,1710,1730
1690  IF I1*128>R2-R1+1 THEN 1760
1700  GOTO 1740
1710  IF I1*64>R2-R1+1 THEN 1760
1720  GOTO 1740
1730  IF I1>R2-R1+1 THEN 1760
1740  PRINT "FILE "G$" IS TOO SMALL TO HOLD THE ENTIRE OUTPUT."
1750  GOTO 1530
1760  CHAIN "IRV1",30
4000  IF  END #F1 THEN 4070
4010  I1=1
4020  I2=32768.
4030  I3=INT((I1+I2)/2)
4040  READ #F1,I3
4050  I1=I3
4060  GOTO 4080
4070  I2=I3
4080  IF I2-I1>1 THEN 4030
4090  RETURN 
5000  IF R>0 AND R=INT(R) THEN 5040
5010  PRINT "  TYPE A POSITIVE INTEGER."
5020  F=1
5030  RETURN 
5040  IF  END #1 THEN 5080
5050  READ #1,R
5060  F=0
5070  RETURN 
5080  PRINT "  FILE "F$" DOES NOT HAVE THAT MANY RECORDS."
5090  F=1
5100  RETURN 
9999  END 
