1  REM  ****  HP BASIC PROGRAM LIBRARY  *******************************
2  REM
3  REM        FILES:   FILE MANIPULATION PROGRAM
4  REM
5  REM        36645 REV  A   10/73
6  REM
7  REM  ****  CONTRIBUTED PROGRAM  ************************************
10  FILES *,*,*
11  ASSIGN "SWAP",3,Z9
12  IF Z9=0 THEN 20
13  PRINT LIN(1);"WORK FILE IN USE, ENTER NAME OF 2 RECORD WORK FILE";
14  INPUT A$
15  ASSIGN A$,3,Z9
16  IF Z9=0 THEN 20
17  GOTO 13
20  DIM A$[72],B$[72],D$[6],C$[6],E$[72],F$[72],G$[72],H$[72],I$[72]
21  PRINT LIN(1)"instructions ";
22  INPUT A$
23  IF A$[1,1]="N" THEN 150
30  PRINT "1)...CREATE A FILE"
40  PRINT "2)...SORT A FILE"
50  PRINT "3)...LIST A FILE"
60  PRINT "4)...COPY A FILE"
70  PRINT "5)...X-PUNCH A FILE"
80  PRINT "6)...LIST THE FILE FORMAT"
90  PRINT "7)...UPDATE A RECORD IN A FILE"
100  PRINT "8)...ADD A FIELD TO A RECORD"
110  PRINT "9)...DELETE A FIELD FROM A RECORD"
120  PRINT "10)..CHANGE FROM A RANDOM FILE TO A SERIAL FILE"
130  PRINT "11)..CHANGE FROM A SERIAL FILE TO A RANDOM FILE"
140  PRINT "12)..END THE PROGRAM"
150  PRINT LIN(1)"ENTER THE NUMBER OF THE ROUTINE TO BE RUN"
160  PRINT LIN(1)"YOUR CHOICE";
170  ASSIGN "*",1,A
180  ASSIGN "*",2,A
190  INPUT A
210  GOTO A OF 240,1510,3430,3680,3990,4200,5360,7140,7160,7180,7440,220
211  GOTO 160
220  STOP 
230  REM** FILE BUILD SUBROUTINE **
240  A$=""
250  GOSUB 4880
260  DIM M[5]
270  A2=A3=0
280  MAT M=ZER
290  PRINT LIN(1)"RECORD FORMAT = ";
300  INPUT B$
310  FOR X=1 TO LEN(B$)
320  IF B$[X,X]="$" THEN 700
330  IF B$[X,X]="#" THEN 700
340  IF B$[X,X]="C" THEN 370
350  PRINT LIN(1);B$[X,X];" IS AN INVALID FORMAT CHARACTER"
360  GOTO 270
370  X=X+1
380  IF X <= LEN(B$) THEN 410
390  PRINT LIN(1)"LAST CHARACTER IN FORMAT WORD MUST NOT BE 'C'"
400  GOTO 270
410  IF B$[X,X]="$" THEN 530
420  IF B$[X,X]="#" THEN 440
430  GOTO 350
440  A2=A2+1
450  IF A2<6 THEN 480
460  PRINT LIN(1)"ONLY 5 NUMBER CONSTANTS ALLOWED"
470  GOTO 270
480  PRINT 
490  PRINT  USING 500;A2
500  IMAGE#,"# CONSTANT ",D," = "
510  INPUT M[A2]
520  GOTO 700
530  A3=A3+1
540  IF A3<6 THEN 570
550  PRINT LIN(1)"ONLY 5 STRING CONSTANTS ALLOWED"
560  GOTO 270
570  PRINT 
580  PRINT  USING 590;A3
590  IMAGE#,"$ CONSTANT ",D," = "
600  GOTO A3 OF 610,630,650,670,690
610  INPUT E$
620  GOTO 700
630  INPUT F$
640  GOTO 700
650  INPUT G$
660  GOTO 700
670  INPUT H$
680  GOTO 700
690  INPUT I$
700  NEXT X
710  IF  END #2 THEN 1400
720  FOR Z=1 TO 10000
730  READ #2,Z
740  A2=A3=A4=A5=0
750  PRINT LIN(1)"** RECORD ";
760  PRINT  USING 770;Z
770  IMAGE#,3D," ?"
780  D$=""
790  ENTER 255,S,D$
800  IF S=-256 THEN 790
810  PRINT 
820  IF D$='92 THEN 1430
830  C=0
840  FOR X=1 TO LEN(B$)
850  IF B$[X,X]="$" THEN 1210
860  IF B$[X,X]="#" THEN 1300
870  X=X+1
880  IF B$[X,X]="$" THEN 940
890  A2=A2+1
900  C=C+2
910  IF C>256 THEN 1420
920  PRINT #2;M[A2]
930  GOTO 1370
940  A3=A3+1
950  GOTO A3 OF 960,1010,1060,1110,1160
960  D=LEN(E$)
970  GOSUB 1450
980  IF C>256 THEN 1420
990  PRINT #2;E$
1000  GOTO 1370
1010  D=LEN(F$)
1020  GOSUB 1450
1030  IF C>256 THEN 1420
1040  PRINT #2;F$
1050  GOTO 1370
1060  D=LEN(G$)
1070  GOSUB 1450
1080  IF C>256 THEN 1420
1090  PRINT #2;G$
1100  GOTO 1370
1110  D=LEN(H$)
1120  GOSUB 1450
1130  IF C>256 THEN 1420
1140  PRINT #2;H$
1150  GOTO 1370
1160  D=LEN(I$)
1170  GOSUB 1450
1180  IF C>256 THEN 1420
1190  PRINT #2;I$
1200  GOTO 1370
1210  A4=A4+1
1220  PRINT  USING 1230;A4
1230  IMAGE#,"$ ",DD," = "
1240  INPUT A$
1250  D=LEN(A$)
1260  GOSUB 1450
1270  IF C>256 THEN 1420
1280  PRINT #2;A$
1290  GOTO 1370
1300  A5=A5+1
1310  PRINT  USING 1320;A5
1320  IMAGE#,"# ",DD," = "
1330  INPUT A
1340  C=C+2
1350  IF C>256 THEN 1420
1360  PRINT #2;A
1370  NEXT X
1380  NEXT Z
1390  GOTO 150
1400  PRINT LIN(1)"OUTPUT FILE IS FULL"
1410  GOTO 150
1420  PRINT LIN(1)"MORE THAN 256 WORDS OF STORAGE ARE REQUIRED FOR THIS RECORD"
1430  PRINT #2,Z; END 
1440  GOTO 150
1450  IF D/2=INT(D/2) THEN 1480
1460  C=C+(1+((D+1)/2))
1470  GOTO 1490
1480  C=C+(1+(D/2))
1490  RETURN 
1500  REM ** FILE SORT SUBROUTINE **
1510  GOSUB 4670
1520  GOSUB 4880
1530  GOSUB 5120
1540  A1=A2=0
1550  PRINT LIN(1)"SORT ON FIELD #";
1560  INPUT F
1570  IF F<1 THEN 1550
1580  PRINT 
1590  PRINT  USING 1600;F
1600  IMAGE#,"IS FIELD #",DD," A CHARACTER STRING"
1610  INPUT A$
1620  IF A$[1,1]="N" THEN 1670
1630  PRINT LIN(1)"ENTER THE CHARACTER STRING STARTING AND ENDING CHARACTER POSITIONS"
1640  PRINT "OR ENTER 0,0 TO USE THE ENTIRE STRING";
1650  INPUT A1,A2
1660  IF A1>A2 OR (A1=0 AND A2#0) THEN 1790
1670  PRINT LIN(1)"ASCENDING OR DESCENDING SEQUENCE (0 OR 1)";
1680  INPUT G
1690  IF G<0 OR G>1 THEN 1670
1700  IF  END #2 THEN 1750
1710  IF  END #1 THEN 3390
1720  PRINT #2,1; END 
1730  Z=1
1740  GOTO 1870
1750  PRINT LIN(1)"SORT OUTPUT FILE TOO SMALL"
1760  PRINT LIN(1)"LAST RECORD PROCESSED =";
1770  PRINT  USING "XDDD";R
1780  GOTO 150
1790  PRINT LIN(1)"STARTING CHARACTER POSITION IS LARGER THAN ENDING OR 0"
1800  GOTO 1630
1810  PRINT 
1820  PRINT  USING 1830;LEN(A$)
1830  IMAGE"THE STRING BEING SORTED ON IS ONLY ",DD," CHARACTERS LONG, THE"
1840  PRINT "SPECIFIED STARTING CHARACTER POSITION IS BEYOND THE"
1850  PRINT "LIMITS OF THE STRING"
1860  GOTO 150
1870  FOR R=L1 TO L2
1880  READ #1,R
1890  IF TYP(-1)=3 THEN 3390
1900  FOR F1=1 TO F
1910  GOTO TYP(-1) OF 1920,1950,1990,1990
1920  READ #1;A
1930  C=1
1940  GOTO 1970
1950  READ #1;A$
1960  C=2
1970  NEXT F1
1980  GOTO 2030
1990  PRINT 
2000  PRINT  USING 2010;F1
2010  IMAGE"SORT INPUT FILE HAS ONLY ";,3D," FIELDS PER RECORD "
2020  GOTO 150
2030  Z1=0
2040  Z2=Z
2050  Z3=INT(((Z2-Z1)/2)+Z1)
2060  IF Z3>0 THEN 2080
2070  Z3=1
2080  READ #2,Z3
2090  FOR F1=1 TO F
2100  GOTO TYP(-2) OF 2110,2140,2690
2110  READ #2;B
2120  D=1
2130  GOTO 2160
2140  READ #2;B$
2150  D=2
2160  NEXT F1
2170  IF D=C THEN 2200
2180  PRINT LIN(1)"ALL RECORDS IN SORT INPUT FILE ARE NOT THE SAME FORMAT"
2190  GOTO 150
2200  GOTO G+1 OF 2210,2460
2210  GOTO D OF 2220,2280
2220  IF B>A THEN 2260
2230  Z1=Z3
2240  IF Z2-Z1=1 THEN 2690
2250  GOTO 2050
2260  Z2=Z3
2270  GOTO 2240
2280  IF A1#0 THEN 2330
2290  A3=B3=1
2300  A4=LEN(A$)
2310  B4=LEN(B$)
2320  GOTO 2440
2330  IF A1>LEN(A$) OR A1>LEN(B$) THEN 1810
2340  A3=B3=A1
2350  IF A2>LEN(A$) AND A2>LEN(B$) THEN 2300
2360  IF A2>LEN(A$) THEN 2400
2370  IF A2>LEN(B$) THEN 2430
2380  A4=B4=A2
2390  GOTO 2440
2400  A4=LEN(A$)
2410  B4=A2
2420  GOTO 2440
2430  A4=B4=A2
2440  IF B$[B3,B4]>A$[A3,A4] THEN 2260
2450  GOTO 2230
2460  GOTO D OF 2470,2490
2470  IF B>A THEN 2230
2480  GOTO 2260
2490  IF A1#0 THEN 2550
2500  A3=B3=1
2510  A4=LEN(A$)
2520  B4=LEN(B$)
2540  GOTO 2670
2550  IF A1>LEN(A$) OR A1>LEN(B$) THEN 1810
2560  A3=B3=A1
2570  IF A2>LEN(A$) AND A2>LEN(B$) THEN 2510
2580  IF A2>LEN(A$) THEN 2620
2590  IF A2>LEN(B$) THEN 2650
2600  A4=B4=A2
2610  GOTO 2670
2620  A4=LEN(A$)
2630  B4=A2
2640  GOTO 2670
2650  A4=A2
2660  GOTO 2520
2670  IF B$[B3,B4]>A$[A3,A4] THEN 2230
2680  GOTO 2260
2690  X1=2
2700  X2=Z2
2710  X3=3
2720  X4=1
2730  GOSUB 3270
2740  IF X5=1 THEN 3050
2750  X1=1
2760  X2=R
2770  X3=2
2780  X4=Z2
2790  GOSUB 3270
2800  Z2=Z2+1
2810  X1=2
2820  X2=Z2
2830  X3=3
2840  X4=2
2850  GOSUB 3270
2860  IF X5=1 THEN 3110
2870  X1=3
2880  X2=1
2890  X3=2
2900  X4=Z2
2910  GOSUB 3270
2920  Z2=Z2+1
2930  X1=2
2940  X2=Z2
2950  X3=3
2960  X4=1
2970  GOSUB 3270
2980  IF X5=1 THEN 3170
2990  X1=3
3000  X2=2
3010  X3=2
3020  X4=Z2
3030  GOSUB 3270
3040  GOTO 2800
3050  X1=1
3060  X2=R
3070  X3=2
3080  X4=Z2
3090  GOSUB 3270
3100  GOTO 3220
3110  X1=3
3120  X2=1
3130  X3=2
3140  X4=Z2
3150  GOSUB 3270
3160  GOTO 3220
3170  X1=3
3180  X2=2
3190  X3=2
3200  X4=Z2
3210  GOSUB 3270
3220  Z=Z+1
3230  PRINT #2,Z; END 
3240  NEXT R
3250  R=R-1
3260  GOTO 3390
3270  X5=0
3280  READ #X1,X2
3290  READ #X3,X4
3300  GOTO TYP(-X1) OF 3310,3340,3370,3380
3310  READ #X1;A
3320  PRINT #X3;A
3330  GOTO 3300
3340  READ #X1;A$
3350  PRINT #X3;A$
3360  GOTO 3300
3370  X5=1
3380  RETURN 
3390  PRINT 
3400  PRINT  USING 3410;R-L1
3410  IMAGE3D," RECORDS SORTED "
3420  GOTO 150
3430  REM** FILE LIST SUBROUTINE **
3440  GOSUB 4670
3450  GOSUB 5120
3460  PRINT LIN(1)"*** LINE PRINTER?";
3470  ENTER 255,A,B
3480  IF A=-256 THEN 3470
3490  PRINT 
3500  FOR X=L1 TO L2
3510  PRINT 
3520  PRINT  USING 3530;X
3530  IMAGE"*** RECORD ",3D
3540  READ #1,X
3550  GOTO TYP(-1) OF 3560,3590,3650,3620
3560  READ #1;A
3570  PRINT "#";A
3580  GOTO 3550
3590  READ #1;A$
3600  PRINT A$
3610  GOTO 3550
3620  PRINT "EOR"
3630  NEXT X
3640  GOTO 3660
3650  PRINT "EOF"
3660  PRINT 
3665  ADVANCE #1;1,R
3670  GOTO 3550
3680  REM** COPY FILE SUBROUTINE **
3690  GOSUB 4670
3700  GOSUB 4880
3710  GOSUB 5120
3720  GOSUB 5250
3730  L4=L3
3740  FOR X=L1 TO L2
3750  IF  END #2 THEN 3950
3760  READ #1,X
3770  READ #2,L3
3780  L4=L4+1
3790  GOTO TYP(-1) OF 3800,3830,3890,3860
3800  READ #1;A
3810  PRINT #2;A
3820  GOTO 3790
3830  READ #1;A$
3840  PRINT #2;A$
3850  GOTO 3790
3860  L3=L3+1
3870  NEXT X
3880  X=X-1
3890  IF  END #2 THEN 3910
3900  PRINT #2,L3+(L4-L3); END 
3910  PRINT  USING 3920;1+(X-L1)
3920  IMAGE3D," RECORDS TRANSFERED"
3930  PRINT 
3940  GOTO 150
3950  PRINT LIN(1)"FILE BEING WRITTEN IS TOO SMALL.";
3960  PRINT  USING 3970;X-L1
3970  IMAGE" ONLY ",3D," RECORDS TRANSFERED"
3980  GOTO 150
3990  REM** X-PUNCH FILE SUBROUTINE **
4000  GOSUB 4670
4010  GOSUB 5120
4020  IF  END #1 THEN 4160
4030  PRINT LIN(1)"YOU HAVE 10 SECONDS TO MAKE THE TAPE PUNCH READY"
4040  ENTER 10,A,B
4050  FOR X=L1 TO L2
4060  READ #1,X
4070  GOTO TYP(-1) OF 4080,4110,4160,4140
4080  READ #1;A
4090  PRINT A;""
4100  GOTO 4070
4110  READ #1;A$
4120  PRINT A$;""
4130  GOTO 4070
4140  NEXT X
4150  X=X-1
4160  PRINT 
4170  PRINT  USING 4180;1+(X-L1)
4180  IMAGE3D," RECORDS PUNCHED"
4190  GOTO 150
4200  REM** FIND THE LAST RECORD SUBROUTINE **
4210  GOSUB 4670
4220  D=R=F=0
4230  A$="DATAEND OF RECORDEND OF FILE"
4240  B$="TO"
4250  IF  END #1 THEN 4630
4260  FOR X=1 TO 10000
4270  READ #1,X
4280  GOTO TYP(-1) OF 4290,4290,4330,4370
4290  IF D THEN 4400
4300  GOSUB 4410
4310  D=X
4320  GOTO 4400
4330  IF F THEN 4400
4340  GOSUB 4410
4350  F=X
4360  GOTO 4400
4370  IF R THEN 4400
4380  GOSUB 4410
4390  R=X
4400  NEXT X
4410  IF R THEN 4510
4420  IF F THEN 4570
4430  IF D THEN 4450
4440  GOTO 4620
4450  IF D=X-1 THEN 4480
4460  PRINT  USING "3DX,AAX,3DX,4A";D,B$,X-1,A$[1,4]
4470  GOTO 4490
4480  PRINT  USING "7X3DX,4A";X-1,A$[1,4]
4490  D=0
4500  GOTO 4620
4510  IF R=X-1 THEN 4540
4520  PRINT  USING "3DX,AAX,3DX,13A";R,B$,X-1,A$[5,17]
4530  GOTO 4550
4540  PRINT  USING "7X3DX,13A";X-1,A$[5,17]
4550  R=0
4560  GOTO 4620
4570  IF F=X-1 THEN 4600
4580  PRINT  USING "3DX,AAX,3DX,11A";F,B$,X-1,A$[18,28]
4590  GOTO 4610
4600  PRINT  USING "7X3D,X11A";X-1,A$[18,28]
4610  F=0
4620  RETURN 
4630  GOSUB 4410
4640  PRINT  USING 4650;X-1
4650  IMAGE7X3DX,"PHYSICAL END OF FILE"
4660  GOTO 150
4670  REM** ASSIGN INPUT FILE SUBROUTINE **
4680  PRINT LIN(1)"INPUT FILE NAME ";
4690  INPUT A$
4700  IF LEN(A$)<12 THEN 4730
4710  PRINT "MAX 12 CHRS"
4720  GOTO 4680
4730  PRINT LIN(1)"FILE USE A MASK";
4740  INPUT B$
4750  IF B$="Y" THEN 4800
4760  ASSIGN A$,1,A
4770  IF A<1 THEN 4870
4780  PRINT LIN(1)"FILE '";A$;"' IS UNAVAILABLE. TRY AGAIN."
4790  GOTO 4680
4800  PRINT LIN(1)"WHAT IS THE MASK ";
4810  INPUT B$
4820  IF LEN(B$)<7 THEN 4850
4830  PRINT LIN(1)"ONLY 6 CHARACTERS ALLOWED"
4840  GOTO 4800
4850  ASSIGN A$,1,A,B$
4860  GOTO 4770
4870  RETURN 
4880  REM** ASSIGN OUTPUT FILE SUBROUTINE **
4890  PRINT LIN(1)"OUTPUT FILE NAME ";
4900  INPUT C$
4910  IF LEN(C$)<7 THEN 4940
4920  PRINT LIN(1)"ONLY 6 CHARACTERS ALLOWED"
4930  GOTO 4890
4940  IF C$#A$ THEN 4970
4950  PRINT LIN(1)"INPUT AND OUTPUT CANNOT BE THE SAME FILE"
4960  GOTO 4890
4970  PRINT LIN(1)"FILE USE A MASK";
4980  INPUT D$
4990  IF D$[1,1]="Y" THEN 5040
5000  ASSIGN C$,2,A
5010  IF A<1 THEN 5110
5020  PRINT LIN(1)"OUTPUT FILE NOT AVAILABLE FOR WRITING"
5030  GOTO 4890
5040  PRINT LIN(1)"WHAT IS THE MASK ";
5050  INPUT D$
5060  IF LEN(D$)<7 THEN 5090
5070  PRINT LIN(1)"ONLY 6 CHARACTERS ALLOWED"
5080  GOTO 5040
5090  ASSIGN C$,2,A,D$
5100  GOTO 5010
5110  RETURN 
5120  REM ** INPUT FILE UPPER AND LOWER LIMITS SUBROUTINE **
5130  PRINT LIN(1)"INPUT FILE STARTING AND ENDING RECORD #";
5140  INPUT L1,L2
5150  IF L1<1 THEN 5130
5160  IF L2 >= L1 THEN 5190
5170  PRINT LIN(1)"UPPER LIMIT LESS THAN LOWER LIMIT"
5180  GOTO 5130
5190  IF  END #1 THEN 5220
5200  READ #1,L1
5210  GOTO 5240
5220  PRINT LIN(1)"LOWER LIMIT IS LARGER THAN THE FILE"
5230  GOTO 5130
5240  RETURN 
5250  REM ** ASSIGN OUTPUT STARTING RECORD
5260  PRINT LIN(1)"OUTPUT FILE STARTING RECORD #";
5270  L8=0
5280  INPUT L3
5290  IF L3<1 THEN 5260
5300  IF  END #2 THEN 5330
5310  READ #2,L3
5320  GOTO 5350
5330  PRINT LIN(1)"STARTING RECORD LARGER THAN OUTPUT FILE"
5340  GOTO 5260
5350  RETURN 
5360  REM ** UPDATE A RECORD SUBROUTINE
5370  Q=Y=1
5380  GOSUB 4880
5390  W=0
5400  IF Q=1 THEN 5500
5410  PRINT LIN(1)"STARTING AND ENDING RECORD #";
5420  INPUT L1,L2
5430  IF Q=1 AND L1=0 THEN 150
5440  IF  END #2 THEN 5470
5450  READ #2,L1
5460  GOTO 5490
5470  PRINT LIN(1)"STARTING RECORD BEYOND THE FILE LIMITS"
5480  GOTO 5410
5490  GOTO Q OF 5500,5770,5790
5500  PRINT LIN(1)"ENTER RECORD #, FIELD #, NUMBER (0) OR STRING (1)";
5510  GOTO Y OF 5520,5540
5520  Y=2
5530  PRINT "(ENTER 0,0,0 TO END THE UPDATE ROUTINE)";
5540  INPUT L1,F,T
5550  IF L1=0 THEN 150
5560  IF  END #2 THEN 5590
5570  READ #2,L1
5580  GOTO 5630
5590  PRINT 
5600  PRINT  USING 5610;L1
5610  IMAGE"RECORD #",3D," IS BEYOND THE FILE LIMITS"
5620  GOTO 5500
5630  L2=L1
5640  GOSUB 5720
5650  GOSUB 5670
5660  GOTO 6010
5670  IF T=0 OR T=1 THEN 5710
5680  PRINT LIN(1)"ENTER 0 FOR A NUMBER OR 1 FOR A STRING";
5690  INPUT T
5700  GOTO 5670
5710  RETURN 
5720  IF F>0 THEN 5760
5730  PRINT LIN(1)"FIELD # MUST BE GREATER THAN 0, RE-ENTER";
5740  INPUT F
5750  GOTO 5720
5760  RETURN 
5770  PRINT LIN(1)"ADD FIELD #";
5780  GOTO 5800
5790  PRINT LIN(1)"DELETE FIELD #";
5800  INPUT F
5810  GOSUB 5720
5820  IF Q=1 AND F=0 THEN 5410
5830  IF Q#3 THEN 5860
5840  T=0
5850  GOTO 6010
5860  PRINT LIN(1)"NUMBER OR STRING (0 OR 1)";
5870  INPUT T
5880  GOSUB 5670
5890  IF Q#2 THEN 6010
5900  PRINT LIN(1)"DO YOU WANT TO USE A CONSTANT VALUE";
5910  INPUT A$
5920  IF A$[1,1]="N" THEN 6010
5930  IF A$[1,1]#"Y" THEN 5900
5940  W=1
5950  GOTO T+1 OF 5960,5990
5960  PRINT LIN(1)"ENTER THE NUMERIC CONSTANT";
5970  INPUT W1
5980  GOTO 6010
5990  PRINT LIN(1)"ENTER THE STRING CONSTANT";
6000  INPUT I$
6010  IF  END #2 THEN 6040
6020  R1=1
6030  GOTO 6070
6040  PRINT LIN(1)"LAST RECORD IN FILE UPDATED"
6050  IF Q=1 THEN 5500
6060  GOTO 150
6070  FOR R=L1 TO L2
6080  F2=0
6090  Q1=0
6100  READ #2,R
6110  READ #3,1
6120  GOTO TYP(-2) OF 6130,6170,6210,6220
6130  READ #2;A
6140  PRINT #3;A
6150  F2=F2+1
6160  GOTO 6120
6170  READ #2;A$
6180  PRINT #3;A$
6190  F2=F2+1
6200  GOTO 6120
6210  R1=0
6220  F1=0
6230  IF Q#2 THEN 6260
6240  IF F2+1 >= F THEN 6360
6250  GOTO 6280
6260  IF F2 >= F THEN 6360
6270  IF F2=0 AND TYP(-2)=3 THEN 6040
6280  PRINT LIN(1)"NOT ENOUGH FIELDS FOR THE REQUESTED ";
6290  GOTO Q OF 6300,6320,6340
6300  PRINT "UPDATE"
6310  GOTO 5500
6320  PRINT "ADD"
6330  GOTO 6350
6340  PRINT "DELETE"
6350  GOTO 150
6360  L=0
6370  READ #2,R
6380  READ #3,1
6390  GOTO TYP(-3) OF 6400,6920,7030,7030
6400  F1=F1+1
6410  IF F1#F THEN 6430
6420  GOTO T+1 OF 6480,6700
6430  L=L+2
6440  IF L>256 THEN 7120
6450  READ #3;A
6460  PRINT #2;A
6470  GOTO 6390
6480  GOTO Q OF 6490,6520,6600
6490  PRINT 
6500  PRINT  USING 6580;R,F
6510  GOTO 6600
6520  IF W=0 THEN 6550
6530  A=W1
6540  GOTO 6670
6550  PRINT 
6560  PRINT  USING 6590;R,F
6570  GOTO 6660
6580  IMAGE#,"R #",DDD,", F #",DD,", NEW NUMBER VALUE ="
6590  IMAGE#,"R #",DDD,", F #",DD,",ADD NUMBER VALUE ="
6600  GOTO TYP(-3) OF 6610,6640
6610  READ #3;A
6620  IF Q=3 THEN 6390
6630  GOTO 6660
6640  READ #3;A$
6650  IF Q=3 THEN 6390
6660  INPUT A
6670  L=L+2
6680  IF L>256 THEN 7120
6690  GOTO 6460
6700  GOTO Q OF 6780,6710
6710  IF W=0 THEN 6740
6720  A$=I$
6730  GOTO 6860
6740  PRINT 
6750  PRINT  USING 6760;R,F
6760  IMAGE#,"R #",DDD,", F #",DD,", ADD STRING VALUE ="
6770  GOTO 6850
6780  PRINT 
6790  PRINT  USING 6800;R,F
6800  IMAGE#,"R #",DDD,", F #",DD,", NEW STRING VALUE ="
6810  GOTO TYP(-3) OF 6820,6840
6820  READ #3;A
6830  GOTO 6850
6840  READ #3;A$
6850  INPUT A$
6860  IF LEN(A$)/2#INT(LEN(A$)/2) THEN 6890
6870  L=L+(LEN(A$)/2)
6880  GOTO 6900
6890  L=L+((LEN(A$)+1)/2)
6900  IF L>256 THEN 7120
6910  GOTO 7010
6920  F1=F1+1
6930  IF F1#F THEN 6950
6940  GOTO T+1 OF 6480,6700
6950  READ #3;A$
6960  IF LEN(A$)/2#INT(LEN(A$)/2) THEN 6990
6970  L=L+(LEN(A$)/2)
6980  GOTO 7000
6990  L=L+((LEN(A$)+1)/2)
7000  IF L>256 THEN 7120
7010  PRINT #2;A$
7020  GOTO 6390
7030  IF Q1=1 THEN 7060
7040  Q1=1
7050  IF Q=2 AND F1+1=F THEN 6420
7060  GOTO R1+1 OF 7070,7080
7070  R=L2+1
7080  NEXT R
7090  IF Q=1 AND R1=0 THEN 6040
7100  IF Q=1 THEN 5500
7110  GOTO R1+1 OF 6040,150
7120  PRINT LIN(1)"TOO MANY CHARACTERS FOR THIS RECORD"
7130  GOTO 150
7140  Q=2
7150  GOTO 5380
7160  Q=3
7170  GOTO 5380
7180  REM ** RANDOM TO SERIAL CONVERSION SUBROUTINE **
7190  GOSUB 4670
7200  GOSUB 4880
7210  GOSUB 5120
7220  GOSUB 5250
7230  READ #2,L3
7240  IF  END #2 THEN 7260
7250  GOTO 7290
7260  PRINT  USING 7270;1+(X-L1)
7270  IMAGE"OUTPUT FILE TOO SMALL, ONLY ",DDD," RECORDS CONVERTED"
7280  GOTO 150
7290  FOR X=L1 TO L2
7300  READ #1,X
7310  GOTO TYP(-1) OF 7320,7350,7400,7380
7320  READ #1;A
7330  PRINT #2;A, END 
7340  GOTO 7310
7350  READ #1;A$
7360  PRINT #2;A$, END 
7370  GOTO 7310
7380  NEXT X
7390  X=X-1
7400  PRINT 
7410  PRINT  USING 7420;1+(X-L1)
7420  IMAGE3D," RECORDS CONVERTED FROM RANDOM TO SERIAL FORMAT"
7430  GOTO 150
7440  REM ** SERIAL TO RANDOM CONVERSION SUB ROUTINE **
7450  GOSUB 4670
7460  GOSUB 4880
7470  PRINT LIN(1)"INPUT FILE STARTING RECORD #";
7480  INPUT L1
7490  IF  END #1 THEN 7520
7500  READ #1,L1
7510  GOTO 7540
7520  PRINT LIN(1)"STARTING RECORD BEYOND FILE LIMITS"
7530  GOTO 7470
7540  GOSUB 5250
7550  IF  END #2 THEN 7570
7560  GOTO 7610
7570  PRINT 
7580  PRINT  USING 7590;X-L3
7590  IMAGE"OUTPUT FILE TOO SMALL, ONLY ",DDD," RECORDS CREATED"
7600  GOTO 150
7610  PRINT LIN(1)"HOW MANY FIELDS IN ONE LOGICAL RECORD ";
7620  INPUT F
7630  FOR X=L3 TO 1.E+07
7640  L=F1=0
7650  READ #2,X
7660  GOTO TYP(-1) OF 7670,7740,7870,7841
7670  F1=F1+1
7680  L=L+2
7690  IF L>256 THEN 7930
7700  READ #1;A
7710  PRINT #2;A
7720  IF F1=F THEN 7850
7730  GOTO 7660
7740  READ #1;A$
7750  F1=F1+1
7760  IF LEN(A$)/2=INT(LEN(A$)/2) THEN 7800
7770  L=L+((LEN(A$)+1)/2)
7780  IF L>256 THEN 7930
7790  GOTO 7820
7800  L=L+(LEN(A$)/2)
7810  GOTO 7780
7820  PRINT #2;A$
7830  IF F1=F THEN 7850
7840  GOTO 7660
7841  L1=L1+1
7842  READ #1,L1
7843  GOTO 7660
7850  NEXT X
7860  X=X-1
7870  IF  END #2 THEN 7890
7880  PRINT #2; END 
7890  PRINT 
7900  PRINT  USING 7910;1+(X-L3)
7910  IMAGEDDD," RECORDS CREATED"
7920  GOTO 150
7930  PRINT LIN(1)"TOO MANY CHARACTERS FOR ONE RECORD"
7940  GOTO 7890
7950  END 
