10  COM X$[7],Y$[7],G$[7],S,U1
17  REM FINDAD, HP 36867A, 6/74
20  DIM E[99],I[121],J[121],R[16],I$[72],O$[72]
30  DIM A$[72],B$[72],C$[52],D$[10],E$[72],F$[72],H$[72]
40  C$="etoanirshdlcwumfygpbvkxqjzETOANIRSHDLCWUMFYGPBVKXQJZ"
50  D$="0123456789"
55  K=N1=Y9=1
60  FILES *,*,*,*,*
61  PRINT "CONVERT OLD FILE TO FINDIT FILE."
62  GOSUB 7500
65  PRINT "FINDIT FILE NAME? ";
70  ENTER #S
80  GOSUB 1480
90  GOTO A1 OF 62,65,65
100  S=S+1
110  ASSIGN A$,1,X
115  ASSIGN A$,3,X
120  IF X<3 THEN 160
130  PRINT 
140  PRINT "**NO SUCH FILE."
150  GOTO 50
160  IF LEN(A$)<7 THEN 170
162  IF LEN(A$)>7 THEN 168
164  IF A$[1,1]="$" THEN 170
166  IF A$[1,1]="*" THEN 170
168  PRINT "**INVALID NAME."
169  GOTO 50
170  B$=A$
180  READ #1,2
182  IF TYP(-1)=2 THEN 188
183  PRINT 
184  PRINT "**YOU MUST RUN THE 'CREATE' PROGRAM TO INITIALIZE THE FILE."
186  GOTO 9999
188  READ #1;Y$,G$
190  ASSIGN Y$,2,X
200  IF X<3 THEN 230
210  PRINT "**OPEN '"Y$"' TO 32 RECORDS."
220  STOP 
230  ASSIGN G$,4,X
240  IF X<3 THEN 270
250  PRINT "**OPEN '"G$"' TO 4 RECORDS."
260  STOP 
270  GOSUB 7554
280  IF  NOT A1 THEN 500
290  PRINT 
300  GOTO 65
500  MAT  READ #1,1;R
510  A3=L2=0
520  Y9=1
530  U=0
540  GOTO 3050
1480  REM--INPUT ROUTINE
1490  A1=0
1500  T1=255
1510  ENTER T1,Y,A$
1520  PRINT 
1530  IF Y#-256 THEN 1575
1540  IF T1=15 THEN 9990
1550  PRINT '7'7'7"**ARE YOU STILL THERE?";
1560  T1=15
1570  GOTO 1510
1575  IF T1=15 THEN 2020
1580  IF A$="" THEN 2380
1610  FOR Z=1 TO LEN(A$)
1620  IF A$[Z,Z]>" " THEN 1700
1630  IF Z#1 THEN 1655
1640  A$=A$[2]
1650  GOTO 1610
1655  IF A$[Z,Z]<" " THEN 1670
1660  IF A$[Z+1,Z+1]>" " THEN 1700
1670  IF Z>LEN(A$) THEN 1700
1680  A$[Z]=A$[Z+1]
1690  GOTO 1620
1700  IF A$[Z,Z] <= "^" THEN 1760
1710  FOR Z1=1 TO 26
1720  IF A$[Z,Z]#C$[Z1,Z1] THEN 1750
1730  A$[Z,Z]=C$[Z1+26,Z1+26]
1740  GOTO 1760
1750  NEXT Z1
1760  NEXT Z
1765  IF LEN(A$)=0 THEN 2400
1770  IF A$[LEN(A$),LEN(A$)]>" " THEN 1820
1780  A$=A$[1,LEN(A$)-1]
1820  IF A$[1,2]="//" THEN 1830
1825  RETURN 
1830  IF A$[3,4]#"ER" THEN 1900
1840  IF K>N1 THEN 1870
1850  A1=1
1860  RETURN 
1870  PRINT "//ER WAS ENCOUNTERED."
1880  A1=3
1890  RETURN 
1900  IF A$[3,4]="ST" THEN 9990
1902  IF Y9 THEN 1910
1904  PRINT "//XXX... ENCOUNTERED AND TREATED AS DATA."
1906  RETURN 
1910  IF A$[3,4]#"HE" THEN 2040
1930  GOSUB 6460
1940  GOTO 2020
1970  PRINT 
1990  GOSUB 6460
2020  A1=2
2030  RETURN 
2040  PRINT "**INVALID COMMAND."
2050  GOTO 2020
2380  A1=5
2400  IF Y9 THEN 2404
2401  PRINT "BLANK OR EMPTY ELEMENT."
2402  GOTO 2405
2404  PRINT "**SUPPLY A VALUE."
2405  A1=2
2410  RETURN 
2770  REM--SET FILE BUSY FLAG.
2780  ASSIGN G$,4,X
2800  IF X THEN 2860
2810  READ #4,1
2820  IF TYP(-4)<3 THEN 2900
2830  PRINT #4,1;S
2840  READ #4,2
2850  RETURN 
2855  REM--WAIT TWO SECONDS IF FILE BUSY.
2860  ASSIGN Y$,4,X
2870  ENTER 2,Z,Z
2890  GOTO 2780
2900  READ #4;Z
2910  PRINT "**PORT #"Z"USED THE BREAK KEY DURING UPDATE. SEE YOUR FILE MANAGER."
2920  STOP 
2930  RETURN 
2950  PRINT #4,1; END 
2960  ASSIGN Y$,4,X
2970  RETURN 
2980  L3=LEN(A$)
2990  L4=L4+(1+INT((L3+1)/2))
3000  IF L4 <= 252 THEN 3040
3004  PRINT "**RECORD TOO LONG."
3030  A2=1
3040  RETURN 
3050  REM--**ADD ROUTINE**
3054  Y9=0
3060  A3=R=0
3070  Y9=0
3080  MAT  READ #1,1;R
3082  U=0
3084  K=R[4]-R[1]
3086  IF K >= 0 THEN 3120
3088  GOSUB 6060
3090  IF (I2+K) >= 0 THEN 3120
3100  PRINT '7'7'7"NO MORE FILE SPACE. SEE FILE MANAGER.";LIN(-2)
3110  GOTO 9990
3120  U=2
3130  K=S2=1
3140  N1=0
3150  PRINT #2,S
3160  READ #3,3
3170  A2=L2=L4=0
3180  FOR I=1 TO R[3]
3190  IF I=1 THEN 3210
3200  K=2
3210  READ #3;E$
3214  GOSUB 7600
3215  IF A1#0 THEN 8000
3216  IF  NOT Y7 THEN 3270
3217  PRINT E$": "A$
3270  GOTO A1+1 OF 3290,8000,8000,8000
3290  GOSUB 2980
3300  IF A2 THEN 8000
3310  IF I#1 THEN 3380
3320  IF A$<"0" THEN 3340
3330  IF A$[1,1]<":" THEN 3360
3340  PRINT "**ILLEGAL ID NUMBER."
3352  GOTO 8000
3360  GOSUB 4640
3370  IF A1#2 THEN 3375
3372  PRINT "RECORD BYPASSED"LIN(1)
3373  GOTO 3120
3375  I$=A$
3380  IF I#R[16] THEN 3400
3390  O$=A$
3400  PRINT #2;A$
3410  NEXT I
3415  GOSUB 2780
3416  MAT  READ #1,1;R
3418  K=R[4]-R[1]
3420  GOSUB 6060
3422  IF  NOT A1 THEN 3430
3424  GOSUB 2950
3426  GOTO 3100
3430  R=F2
3450  IF R[5] THEN 3600
3460  Z1=Z2=0
3470  R1=R
3480  READ #2,S
3490  GOSUB 4040
3500  PRINT #1,7;0,R
3510  PRINT #1,9;0,R
3520  R[5]=1
3530  MAT  PRINT #1,1;R
3540  GOTO 3950
3600  I0=B0
3605  A$=I$
3610  GOSUB 4650
3620  GOSUB 5680
3630  A$=O$
3640  GOSUB 4670
3670  READ #2,S
3680  IF K3 OR B>9 THEN 3740
3690  F5=0
3700  MAT  READ #1,1;R
3710  R[2]=R
3720  MAT  PRINT #1,1;R
3730  GOTO 3780
3740  F5=I[K3]
3750  IF K3<K5 OR F THEN 3780
3760  F4=0
3770  GOTO 3790
3780  IF K3<K5 THEN 3784
3782  READ #1,F;Z,I[K3+1]
3784  F4=I[K3+1]
3790  PRINT #1,R;F4,F5
3800  GOSUB 4110
3805  GOSUB 5680
3820  IF F5 THEN 3850
3830  R1=I[K3+1]
3840  GOTO 3920
3850  R1=I[K3]
3860  GOSUB 3980
3870  R2=Z1
3880  Z1=R
3890  GOSUB 4010
3900  R1=R2
3910  IF  NOT F4 THEN 3950
3920  GOSUB 3980
3930  Z2=R
3940  GOSUB 4010
3950  GOSUB 2950
3952  IF Y7 THEN 3958
3954  PRINT H$
3956  GOTO 3080
3958  PRINT 
3959  GOTO 3080
3980  REM--SETS POINTERS
3990  READ #1,R1;Z1,Z2
4000  RETURN 
4005  REM--COPY #1 TO #2 AND BACKWARDS.
4010  PRINT #2,S;Z1,Z2
4020  GOSUB 4080
4030  READ #2,S;Z1,Z2
4040  PRINT #1,R1;Z1,Z2
4050  GOSUB 4110
4060  RETURN 
4080  N1=1
4090  N2=2
4100  GOTO 4130
4110  N2=1
4120  N1=2
4130  FOR I=1 TO R[3]
4140  READ #N1;A$
4150  PRINT #N2;A$
4160  NEXT I
4170  RETURN 
4630  REM-- SEARCH FOR ID- OR ORDERED ELEMENT ENTRY.
4640  B0=I0=7
4650  E0=1
4660  GOTO 4710
4670  B0=I0=9
4680  E0=R[16]
4710  B=K1=K4=K5=K6=K7=S1=0
4720  K2=K3=121
4730  A=LEN(A$)
4735  MAT I=ZER
4740  K7=(U=3 AND E0#1)
4760  READ #1,I0;F
4770  IF TYP(-1)#4 THEN 4830
4780  IF F THEN 5020
4790  IF U#2 THEN 5040
4800  K3=1
4810  I[1]=K5=0
4820  RETURN 
4830  READ #1;F3
4840  READ #1,F3;Z,Z
4850  GOSUB 6400
4890  GOSUB 5560
4900  GOTO S1 OF 5040,5000
4920  IF E0=1 THEN 5500
4930  IF K7 THEN 5210
4935  B=I0
4940  K3=1
4950  GOTO 5080
5000  B=B0=I0
5010  IF F=0 THEN 5040
5020  I0=F
5030  GOTO 4760
5040  IF K7 THEN 5210
5045  IF B THEN 5080
5050  B=I0
5070  K3=0
5080  GOSUB 5085
5082  GOTO 5150
5085  READ #1,B;F
5090  FOR K2=1 TO 121
5100  K5=K2
5110  READ #1;I[K2]
5112  IF  NOT K7 THEN 5120
5114  IF I[K2]#R THEN 5120
5116  K6=K2
5120  IF TYP(-1)=4 THEN 5140
5130  NEXT K2
5140  K2=K2+1
5145  RETURN 
5150  IF  NOT K3 THEN 5550
5160  K3=INT((K2-K1)/2)+K1
5180  IF (K3-K4)#0 THEN 5330
5190  GOTO 5550
5200  IF E0=1 THEN 5310
5210  B=B+9* NOT B
5220  GOSUB 5085
5230  IF K6 THEN 5260
5240  B=F
5250  GOTO (B#0)+1 OF 5520,5220
5260  K3=K6
5270  RETURN 
5310  PRINT "**NO SUCH ID NUMBER."
5320  GOTO 5520
5330  READ #1,I[K3];Z3,Z4
5340  GOSUB 6400
5390  GOSUB 5560
5410  GOTO S1+1 OF 5490,5430,5450
5430  K2=K3
5440  GOTO 5460
5450  K1=K3
5460  K4=K3
5470  GOTO 5160
5490  IF E0#1 THEN 5550
5500  PRINT "**DUPLICATE ID."
5510  PRINT 
5520  A1=2
5530  RETURN 
5540  R=I[K3]
5550  RETURN 
5555  REM-- COMPARE TWO STRINGS-INPUT AND FILE STRING.
5560  D=D1=0
5562  IF A$[1,1]>"9" THEN 5590
5564  IF A$="-" THEN 5590
5566  IF A$[1,1]#"-" THEN 5570
5568  D=1
5570  IF B$[1,1]#"-" THEN 5574
5572  D1=1
5574  D2=LEN(A$)-D
5576  D3=LEN(B$)-D1
5578  IF D2<D3 THEN 5630
5580  IF D2>D3 THEN 5650
5590  IF A$<B$ THEN 5630
5600  IF A$>B$ THEN 5650
5610  S1=0
5620  RETURN 
5630  S1=1+D1
5640  RETURN 
5650  S1=2-D
5660  RETURN 
5670  REM--INSERT ID- OR ORDERED ELEMENT POINTER INTO POINTER RECORD.
5680  Y2=0
5690  IF B THEN 5720
5700  M0=I0
5710  GOTO 5740
5720  M0=B
5740  Y2=K5>119
5800  IF Y2 THEN 5830
5810  READ #1,M0;F2
5820  GOTO 5890
5830  GOSUB 6060
5890  PRINT #1,M0;F2
5900  FOR I1=1 TO K5
5920  IF K3 OR I1>1 THEN 5940
5930  PRINT #1;R
5940  PRINT #1;I[I1]
5950  IF  NOT Y2 OR I1#60 THEN 5990
5960  PRINT #1,F2;F
5980  Y2=0
5990  IF I1#K3 THEN 6010
6000  PRINT #1;R
6010  NEXT I1
6034  RETURN 
6050  REM--GET AN EMPTY RECORD FROM THE EMPTY RECORD POINTERS.
6060  M1=8
6070  READ #1,M1;F2
6080  IF  NOT F2 THEN 6102
6082  IF U THEN 6090
6084  I2=2
6086  RETURN 
6090  B1=M1
6095  M1=F2
6100  GOTO 6070
6102  GOSUB 6110
6104  GOTO 6150
6110  FOR I2=1 TO 121
6120  IF TYP(-1)=4 THEN 6142
6130  READ #1;J[I2]
6140  NEXT I2
6142  I2=I2-1
6145  RETURN 
6146  FOR I3=1 TO I2
6147  PRINT #1;J[I3]
6148  NEXT I3
6149  RETURN 
6150  IF  NOT U THEN 6176
6152  IF U=2 THEN 6200
6160  IF I2<120 THEN 6180
6162  PRINT #1,R[1];0,R
6164  PRINT #1,M1;R[1]
6168  GOSUB 6146
6170  R[1]=R[1]+1
6175  MAT  PRINT #1,1;R
6176  RETURN 
6180  PRINT #1;R
6190  RETURN 
6200  IF  NOT I2 THEN 6262
6220  PRINT #1,M1;F2
6225  F2=J[I2]
6230  I2=I2-1
6240  GOSUB 6146
6250  I2=I3
6260  GOTO 6330
6262  IF M1=8 THEN 6280
6264  F2=M1
6265  READ #1,B1;Z
6266  GOSUB 6110
6267  PRINT #1,B1;0
6270  GOSUB 6146
6280  IF K<0 THEN 6330
6290  F2=R[1]
6300  R[1]=R[1]+1
6310  MAT  PRINT #1,1;R
6330  I=K+I2
6335  IF I>100 THEN 6360
6340  IF I>10 AND I/10#INT(I/10) THEN 6360
6345  GOTO I+2 OF 5520,6360
6350  GOSUB 7200
6352  PRINT LIN(-1);"WARNING - ONLY "A$" RECORD";
6354  IF A$="1" THEN 6358
6356  PRINT "S";
6358  PRINT " LEFT."
6360  RETURN 
6370  REM--READ ID-/ ORDERED ELEMENT.
6400  IF E0=1 THEN 6442
6405  READ #1;E$
6410  FOR J0=2 TO E0
6420  READ #1;B$
6430  NEXT J0
6440  RETURN 
6442  READ #1;B$
6444  RETURN 
6450  REM--HELP PRINTOUT.
6460  PRINT 
6470  PRINT "NO HELP AT THIS POINT."
6480  RETURN 
7200  REM--NUM-STR
7210  A$=""
7220  J=I/10
7230  I=INT(J)
7235  J=10*(J-I)
7240  A$[1,1]=D$[J+1,J+1]
7250  A$[2]=A$
7260  IF I THEN 7220
7270  A$=A$[2]
7280  RETURN 
7500  REM--ADD FROM FILE.
7512  PRINT LIN(1),"OLD FILE NAME? ";
7514  GOSUB 1480
7515  GOTO A1+1 OF 7516,9999,7512,7512
7516  ASSIGN A$,5,X
7518  IF X<3 THEN 7530
7520  PRINT "** NO SUCH FILE.";LIN(1)
7522  GOTO 7512
7530  IF LEN(A$)<7 THEN 7550
7532  IF LEN(A$)>7 THEN 7540
7534  IF A$[1,1]="$" THEN 7550
7536  IF A$[1,1]="*" THEN 7550
7540  PRINT "**INVALID FILE NAME."
7542  GOTO 7530
7550  Y8=0
7552  IF  END #5 THEN 7700
7553  RETURN 
7554  PRINT "PRINTED REPORT (Y/N)? ";
7556  GOSUB 1480
7557  GOTO A1 OF 7582,7554,7554
7558  IF A$[1,1]="Y" THEN 7570
7560  IF A$[1,1]="N" THEN 7580
7562  GOTO 7554
7570  Y7=1
7572  RETURN 
7580  Y7=0
7582  RETURN 
7600  REM--READ DATA FROM FILE.
7602  A1=0
7604  IF I#1 THEN 7610
7606  Y8=Y8+1
7607  PRINT Y8
7608  READ #5,Y8
7610  GOTO TYP(-5) OF 7612,7622,7700,7655
7612  READ #5;I0
7614  GOSUB 9000
7620  GOTO 7626
7622  READ #5;A$
7624  GOSUB 1580
7626  IF I#1 THEN 7640
7628  IF Y7 THEN 7640
7629  H$=A$
7630  PRINT H$;"  -  ";
7640  RETURN 
7655  PRINT "NOT ENOUGH ELEMENTS."
7656  A1=2
7657  RETURN 
7700  REM--EOF
7704  PRINT LIN(3),"END OF SOURCE FILE"
7705  STOP 
8000  PRINT "RECORD BYPASSED."
8002  PRINT 
8004  GOTO 3080
9000  REM- NUM-STR
9010  D1=I0
9020  D=N0=0
9025  K=.000003
9030  IF ABS(INT(I0))<ABS(I0+K*I0) AND ABS(INT(I0))>ABS(I0-K*I0) THEN 9070
9040  D=D+1
9050  I0=I0*10
9060  GOTO 9030
9070  IF I0 >= 0 THEN 9100
9080  N0=1
9090  I0=-I0
9100  A$=""
9110  J=I0/10
9120  I0=INT(J)
9130  J=10*(J-I0)
9140  A$[1,1]=D$[J+1,J+1]
9150  A$[2]=A$
9160  IF I0 THEN 9110
9170  A$=A$[2]
9180  I2=LEN(A$)-D
9190  IF I2 >= 0 THEN 9280
9200  B$="."
9210  IF I2=0 THEN 9250
9220  B$[LEN(B$)+1]="0"
9230  I2=I2+1
9240  GOTO 9210
9250  B$[LEN(B$)+1]=A$
9260  A$=B$
9270  GOTO 9310
9280  B$=A$[I2+1]
9290  A$[I2+1]="."
9300  A$[LEN(A$)+1]=B$
9310  IF N0=0 OR D1=0 THEN 9350
9320  B$=A$
9330  A$="-"
9340  A$[2]=B$
9350  IF A$[LEN(A$),LEN(A$)]#"." THEN 9370
9360  A$=A$[1,LEN(A$)-1]
9370  RETURN 
9990  REM
9999  END 
