1  DIM C$[72],S$[72],J$[72]
20  DIM A$[72],B$[72],D$[72],F$[72],K$[72],R$[72],T$[72],Y$[72]
30  DIM W$[72]
40  DIM P[2],S[100],D[2000]
45  REM EDITOR, HP 36749A, 6/74
50  PRINT "FILENAME";
60  INPUT S$
70  FILES *,DEL,*
80  ASSIGN S$,1,A
90  LET D$=S$
100  LET D$[1+LEN(D$)]="D"
110  ASSIGN D$,3,A
120  K$="0123456789"
130  J$=" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
140  READ #1,1
150  GOTO TYP(-1) OF 370,160,160,160
160  REM***************INITIALIZE*******
170  MAT P=ZER
180  MAT S=ZER
190  MAT D=ZER
200  PRINT "MAX# OF PHYSICAL RECORDS";
210  INPUT P[1]
220  PRINT "NUMBER OF LOGICALS PER PHYSICAL";
230  INPUT P[2]
240  IF P[2]>6 THEN 270
250  PRINT " MUST BE AT LEAST 7 LOGICAL PER PHYSICALS"
260  GOTO 220
270  PRINT "MAX STRING SIZE IS"INT(((P[2]-256)/P[2])*2)
280  MAT  PRINT #1,1;P,S
290  FOR S=1 TO P[1]-1
300  READ #1,S+1
310  FOR S1=1 TO P[2]
320  PRINT #1;""
330  NEXT S1
340  NEXT S
350  READ #3,1
360  MAT  PRINT #3;D
370  REM**************INPUT AREA***********
380  READ #3,1
390  MAT  READ #3;D
400  MAT  READ #1,1;P
410  READ #1,1
420  INPUT A$
430  GOSUB 1230
440  IF N=0 THEN 620
450  GOSUB 470
460  GOTO 420
470  REM**************ADD ROUTINE*********
480  IF N>(P[1]-1)*P[2] OR N<1 THEN 520
490  GOSUB 580
500  GOSUB 1890
510  RETURN 
520  PRINT "LINE NO. MUST BE GREATER THAN 0 AND LESS THEN";(P[1]-1)*P[2]
530  GOTO 510
540  REM***************DELETE
550  LET A$=""
560  GOSUB 470
570  RETURN 
580  REM****************READ ROUTINE*******
590  GOSUB 1530
600  GOSUB 1800
610  RETURN 
620  REM******************COMMAND LIST****************
630  READ #3,1
640  MAT  PRINT #3;D
650  IF A$="LIST SORTED" THEN 3840
660  IF A$[1,3]="LIS" THEN 1130
670  IF A$="FILE" THEN 50
680  IF A$="CHANGE" THEN 2090
690  IF A$="POSTFIX" THEN 2700
700  IF A$="PREFIX" THEN 2700
710  IF A$="LOCATE" THEN 2700
720  IF A$="DELETE LINES" THEN 2660
730  IF A$="DELETE CHARACTERS" THEN 2640
740  IF A$="INSERT LINE" THEN 2450
750  IF A$="INSERT CHARACTERS" THEN 2680
760  IF A$="RENUMBER" THEN 3190
770  IF A$="DONE" THEN 1090
780  IF A$="END" THEN 1090
790  IF A$="STOP" THEN 1090
800  IF A$="BYE" THEN 1090
810  IF A$="HELP" THEN 860
820  IF A$="FIND" THEN 3840
830  IF A$="GENERATE TEST FILE" THEN 3520
840  PRINT "BAD COMMAND"
850  GOTO 420
860  PRINT "LEGAL COMMANDS ARE: LIS,LIST,LIST SORTED"
870  PRINT "                    FILE (TO CHANGE THE FILE YOU ARE WORKING ON"
880  PRINT "                      DELETE LINES, DELETE CHARACTERS"
890  PRINT "                      INSERT LINES , INSERT CHARACTERS"
900  PRINT "                      LOCATE (KEYWORD SEARCH)"
910  PRINT "                      FIND (FAST LOOKUP)"
920  PRINT "                     POSTFIX,PREFIX"
930  PRINT "                     RENUMBER"
940  PRINT "                     GENERATE TEST FILE"
950  PRINT "                     HELP"
960  PRINT "                     END,STOP,DONE,BYE"
970  PRINT "ALL LINES ARE ADDED AND DELETED BY MEANS OF LINE NUMBERS"
980  PRINT "JUST LIKE IN WRITING A BASIC PROGRAM"
990  PRINT "A DIRECTORY FILE MUST BE OPENED 20 BLOCKS LONG HAVING THE"
1000  PRINT " THE SAME NAME AS THE FILE YOU WISH TO CREATE"
1010  PRINT "FOLLOWED BY A 'D'. A FILE CALLED 'DEL' IS NEEDED FOR SCRATCH SPACE"
1020  PRINT "IT NEEDS JUST THREE BLOCKS"
1030  PRINT "THEREFORE TO USE THE FILE  'WORK'  :"
1040  PRINT "CRE-WORK,20"
1050  PRINT "CRE-WORKD,20"
1060  PRINT "CRE-DEL,3"
1070  PRINT "THAT SHOULD PUT YOU IN BUSINESS!!!!"
1080  PRINT "F,L?  MEANS FIRST TO LAST LINE NUMBERS TO BE AFFECTED"
1090  GOTO 420
1130  REM*****************LIST COMMAND******
1140  PRINT "F,L";
1150  INPUT F1,L1
1160  FOR N=F1 MAX 1 TO L1 MIN (P[1]-1)*P[2]
1170  GOSUB 580
1180  IF R$="" THEN 1200
1190  PRINT N;R$
1200  NEXT N
1210  PRINT "LIST DONE"
1220  GOTO 420
1230  REM*************STRING TO NO. CONVERSION***********
1240  LET B$=""
1250  LET N=0
1260  LET R$=A$
1270  GOSUB 1300
1280  GOTO 1350
1290  REMOVE LEADING BLANKS
1300  FOR S=1 TO LEN(R$)
1310  IF R$[S,S]#" " THEN 1330
1320  NEXT S
1330  LET R$=R$[S]
1340  RETURN 
1350  FOR S=1 TO LEN(R$)
1360  IF R$[S,S]>"9" THEN 1420
1370  IF R$[S,S]<"0" THEN 1420
1380  LET B$[1+LEN(B$)]=R$[S,S]
1390  NEXT S
1400  LET A$=""
1410  GOTO 1450
1420  LET R$=R$[S]
1430  GOSUB 1300
1440  LET A$=R$
1450  FOR S=LEN(B$) TO 1 STEP -1
1460  FOR S1=1 TO LEN(K$)
1470  IF B$[S,S]=K$[S1,S1] THEN 1510
1480  NEXT S1
1490  NEXT S
1500  RETURN 
1510  LET N=N+(S1-1)*10^(LEN(B$)-S)
1520  GOTO 1490
1530  REM**************DERIVE R1 AND R2**********
1540  LET N=N MAX 1
1550  LET N=N MIN (P[1]-1)*P[2]
1560  O=1
1570  R1=(N/P[2])+1
1580  IF R1=INT(R1) THEN 1630
1590  R1=INT(R1)
1600  R2=P[2]-((R1*P[2])-N)
1610  R1=R1+O
1620  RETURN 
1630  R1=R1-1
1640  R2=P[2]
1650  R1=R1+O
1660  RETURN 
1670  PRINT "LINE NUMBER EXCEEDS FILE CAPACITY"
1680  LET R1=R2=0
1690  GOTO 1610
1700  REM********HASH FUNCTION
1710  N1=0
1720  FOR S3=1 TO LEN(A$) MIN 6
1730  FOR S4=1 TO LEN(J$)
1740  IF A$[S3,S3]=J$[S4,S4] THEN 1780
1750  NEXT S4
1760  NEXT S3
1770  RETURN 
1780  N1=N1+((S4-1)/LEN(J$)^(S3))
1790  GOTO 1760
1800  REM*******READ RECORD
1810  READ #1,R1
1820  READ #2,1
1830  FOR L=1 TO R2-1
1840  READ #1;R$
1850  PRINT #2;R$
1860  NEXT L
1870  READ #1;R$
1880  RETURN 
1890  REM******PRINT RECORD
1900  PRINT #2;A$
1910  FOR L=R2+1 TO P[2]
1920  READ #1;R$
1930  PRINT #2;R$
1940  NEXT L
1950  READ #1,R1
1960  READ #2,1
1970  FOR L=1 TO P[2]
1980  READ #2;R$
1990  PRINT #1;R$
2000  NEXT L
2010  REM***POST HASH
2020  IF A$="" THEN 2060
2030  GOSUB 1700
2040  D[N MIN 2000]=N1
2050  RETURN 
2060  LET N1=0
2070  GOTO 2040
2080  REM*****CHANGE FUNCTION*******
2090  PRINT "VERIFY";
2100  INPUT Y$
2110  PRINT "CHANGE FROM:";
2120  INPUT F$
2130  PRINT "         TO:";
2140  INPUT T$
2150  PRINT "F,L"
2160  INPUT F1,L1
2170  FOR N=F1 MAX 1 TO L1 MIN (P[1]-1)*P[2]
2180  LET B=1
2190  GOSUB 580
2200  IF R$="" THEN 2260
2210  LET D$=""
2220  LET W4=LEN(F$)-1
2230  FOR S=B TO LEN(R$)-W4
2240  IF R$[S,S+W4]=F$ THEN 2290
2250  NEXT S
2260  NEXT N
2270  PRINT "CHANGE DONE"
2280  GOTO 420
2290  IF S=1 THEN 2310
2300  LET D$=R$[1,S-1]
2310  LET D$[1+LEN(D$)]=T$
2320  LET D$[1+LEN(D$)]=R$[S+LEN(F$)]
2330  IF Y$[1,1]="Y" THEN 2380
2340  LET A$=D$
2350  GOSUB 1890
2360  LET B=S+LEN(T$)
2370  GOTO 2190
2380  PRINT "OLD";N;R$
2390  PRINT "NEW";N;D$
2400  PRINT "CHANGE";
2410  INPUT C$
2420  IF C$[1,1]="Y" THEN 2340
2430  LET D$=""
2440  GOTO 2250
2450  REM***************INSERT LINE*********
2460  PRINT "INSERT AFTER LINE #: ";
2470  INPUT N
2480  PRINT "ENTER LINE: ";
2490  INPUT A$
2500  LET N=N+1
2510  IF N>(P[1]-1)*P[2] THEN 2580
2520  GOSUB 580
2530  LET T$=R$
2540  IF R$="" THEN 2600
2550  GOSUB 1890
2560  LET A$=T$
2570  GOTO 2500
2580  PRINT "LINE NO. OUT OF RANGE"
2590  GOTO 2460
2600  GOSUB 1890
2610  PRINT "LINE INSERT DONE"
2620  GOTO 420
2630  REM***PREFIX/POSTFIX/INSERT/LOCATE/DELETE CHAR*****
2640  PRINT "FROM CHAR#,TO CHAR#";
2650  INPUT P1,P2
2660  LET C$=A$
2670  GOTO 2730
2680  PRINT "AFTER POSITION#";
2690  INPUT P
2700  LET C$=A$
2710  PRINT "STRING";
2720  INPUT B$
2730  PRINT "F,L";
2740  INPUT F1,L1
2750  FOR N=F1 MAX 1 TO L1 MIN (P[1]-1)*P[2]
2760  LET D$=""
2770  GOSUB 580
2780  IF R$="" THEN 3160
2790  IF C$="DELETE CHARACTERS" THEN 2920
2800  IF C$="PREFIX" THEN 3120
2810  IF C$="POSTFIX" THEN 3090
2820  IF C$="INSERT CHARACTERS" THEN 3000
2830  IF C$="LOCATE" THEN 2850
2840  IF C$="DELETE LINES" THEN 3070
2850  LET W4=LEN(B$)-1
2860  FOR S=1 TO LEN(R$)-W4
2870  IF R$[S,S+W4]=B$ THEN 2900
2880  NEXT S
2890  GOTO 3160
2900  PRINT N,R$
2910  GOTO 3160
2920  LET A$=""
2930  IF P1>LEN(R$) THEN 3160
2940  IF P1=1 THEN 2960
2950  LET A$=R$[1,P1-1 MAX 1]
2960  IF P2=LEN(R$) OR P2>LEN(R$) THEN 2980
2970  LET A$[1+LEN(A$)]=R$[P2+1 MIN LEN(R$)]
2980  GOSUB 1890
2990  GOTO 3160
3000  IF LEN(R$)<P THEN 3160
3010  LET A$=""
3020  IF P=0 THEN 3040
3030  LET A$=R$[1,P]
3040  LET A$[1+LEN(A$)]=B$
3050  LET A$[1+LEN(A$)]=R$[P+1,LEN(R$)]
3060  GOTO 3150
3070  GOSUB 540
3080  GOTO 3160
3090  LET R$[1+LEN(R$)]=B$
3100  LET A$=R$
3110  GOTO 3150
3120  LET D$=B$
3130  LET D$[1+LEN(D$)]=R$
3140  LET A$=D$
3150  GOSUB 1890
3160  NEXT N
3170  PRINT "DONE"
3180  GOTO 420
3190  REM***************RENUMBER ROUTINE******
3200  LET V=V1=X1=(P[1]-1)*P[2]
3210  LET X2=1
3220  LET X3=X5=-1
3230  GOSUB 3390
3240  LET V2=V-V1
3250  PRINT V;"TOTAL";V1;"EMPTY";V2;"FULL"
3260  PRINT "START REC#,INTERVAL";
3270  INPUT X4,X5
3280  IF (X4+(X5*V2))<V THEN 3310
3290  PRINT "INTERVAL/STARTING REC# TOO LARGE"
3300  GOTO 3260
3310  LET X1=V1
3320  LET X2=V
3330  LET X3=1
3340  LET V1=X4
3350  GOSUB 3390
3360  PRINT "RE-NUMBER DONE"
3370  GOTO 420
3380  REM**********RESEQUENCE ROUTINE********
3390  FOR N=X1 TO X2 STEP X3
3400  GOSUB 580
3410  IF R$="" THEN 3500
3420  LET W$=R$
3430  GOSUB 540
3440  N5=N
3450  LET N=V1
3460  LET A$=W$
3470  GOSUB 470
3480  N=N5
3490  LET V1=V1+X5
3500  NEXT N
3510  RETURN 
3520  REM******GENERATE TEST FILE******
3530  PRINT "1-ALPHA,2-NUMERIC,3-ALPHANUMERIC,4-SPECIAL";
3540  INPUT N
3550  GOTO N OF 3560,3580,3600,3620
3560  LET W$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
3570  GOTO 3640
3580  LET W$="012345679"
3590  GOTO 3640
3600  LET W$="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
3610  GOTO 3640
3620  PRINT "ENTER SPECIAL CHARACTERS"
3630  INPUT W$
3640  PRINT "NO. OF CHARACTERS IN RECORD";
3650  INPUT L
3660  LET X=L
3670  LET L1=LEN(W$)
3680  FOR N=1 TO (P[1]-1)*P[2]
3690  IF N/10#INT(N/10) THEN 3710
3700  PRINT N;
3710  LET R$=""
3720  GOSUB 3780
3730  A$=R$
3740  GOSUB 490
3750  NEXT N
3760  PRINT "TEST FILE FULL"
3770  GOTO 420
3780  FOR S=1 TO L
3790  N4=INT(RND(X)*L1)
3800  N4=(N4 MAX 1) MIN L1
3810  R$[1+LEN(R$)]=W$[N4,N4]
3820  NEXT S
3830  RETURN 
3840  REM*****LIST SORTED****
3850  LET V=2000
3860  V=V-1
3870  IF V=0 THEN 3890
3880  IF D[V]=0 THEN 3860
3890  IF A$="FIND" THEN 4150
3900  N1=99999.
3910  FOR N2=1 TO V MAX 1
3920  IF D[N2]=0 OR D[N2]<0 THEN 4030
3930  IF N1#D[N2] THEN 4000
3940  N=N3
3950  GOSUB 580
3960  A$=R$
3970  N=N2
3980  GOSUB 580
3990  IF A$<R$ THEN 4030
4000  LET N1=N1 MIN D[N2]
4010  IF N1#D[N2] THEN 4030
4020  LET N3=N2
4030  NEXT N2
4040  IF N1=99999. THEN 4100
4050  N=N3
4060  D[N3]=D[N3]*-1
4070  GOSUB 580
4080  PRINT N;R$
4090  GOTO 3890
4100  MAT D=(-1)*D
4110  PRINT #3,1
4120  MAT  PRINT #3;D
4130  PRINT "LIST SORTED DONE"
4140  GOTO 420
4150  REM******FIND *********
4160  PRINT "KEY";
4170  INPUT A$
4180  IF A$="END" THEN 4460
4190  IF A$="DONE" THEN 4460
4200  IF A$="STOP" THEN 4460
4210  IF A$="BYE" THEN 4460
4220  B$=A$
4230  GOSUB 1700
4240  N2=N3=N1
4250  IF LEN(A$)>4 THEN 4360
4260  A1=LEN(A$)
4270  J1=LEN(J$)
4280  FOR S=1 TO J1
4290  IF A$[A1,A1]=J$[S,S] THEN 4310
4300  NEXT S
4310  A$[A1,A1]=J$[S+1 MIN J1,S+1 MIN J1]
4320  GOSUB 1700
4330  N3=N1
4340  N1=N2
4350  A$=B$
4360  FOR N=1 TO V MAX 1
4370  IF D[N]=N1 THEN 4410
4380  IF D[N]>N2 AND D[N]<N3 THEN 4410
4390  NEXT N
4400  GOTO 4160
4410  GOSUB 580
4420  IF A$=R$[1,LEN(A$) MIN LEN(R$)] THEN 4440
4430  GOTO 4390
4440  PRINT N;R$
4450  GOTO 4390
4460  PRINT "EXITED FROM FIND MODE"
4470  GOTO 420
4480  END 
