1  REM  ****  HP BASIC PROGRAM LIBRARY  *******************************
2  REM
3  REM        FMS:   FILE MANAGEMENT SYSTEM
4  REM
5  REM        36648 REV  A    10/73
6  REM
7  REM  ****  CONTRIBUTED PROGRAM  ************************************
10  PRINT "ENTER FILES STATEMENT IN LINE 10"
1000  REM   PROGRAM FMS
1010  REM
1100  DIM A$[72],B$[72]
1110  REM
1180  REM   INPUT
1190  REM
1200  PRINT 
1210  PRINT "COM ";
1220  INPUT B$
1230  PRINT 
1290  IF B$[1,3]="HEL" THEN 1500
1300  IF B$[1,3]="COM" THEN 2050
1310  IF B$[1,3]="COP" THEN 3050
1320  IF B$[1,3]="DUM" THEN 4050
1330  IF B$[1,3]="LIS" THEN 5050
1340  IF B$[1,3]="REA" THEN 6050
1350  IF B$[1,3]="TRA" THEN 7050
1370  IF B$[1,3]="SUM" THEN 9050
1390  IF B$[1,3]="STO" THEN 9999
1400  PRINT "INVALID"
1410  GOTO 1210
1470  REM
1480  REM   HELP
1490  REM
1500  PRINT '10" ","FILE MANAGEMENT SYSTEM"'10'13
1530  PRINT "THIS PROGRAM PROVIDES ROUTINES FOR FILE MANIPULATION."
1540  PRINT "THESE ARE ACCESSED BY THE FOLLOWING COMMANDS:"
1550  PRINT '10"COMP:  COMPARES FILE #1 WITH FILE #2, BEGINNING AND ENDING"
1560  PRINT "       RECORDS ARE REQUESTED."
1600  PRINT '10"COPY:  COPIES FILE #1 INTO FILE #2."
1630  PRINT '10"DUMP:  DUMPS THE CONTENTS OF UP TO 4 FILES ONTO PAPER TAPE."
1660  PRINT '10"HELP:  GIVES THE COMMANDS."
1700  PRINT '10"LIST:  LISTS THE CONTENTS OF A FILE ON THE TTY."
1730  PRINT '10"READ:  RESTORES FILES FROM PAPER TAPE PREVIOUSLY DUMPED BY"
1740  PRINT "       THE 'DUMP' COMMAND."
1780  PRINT '10"STOP:  HALT EXECUTION."
1790  PRINT '10"SUMR:  SUMMARIZES THE STRUCTURE OF A FILE."
1800  PRINT '10"TRAN:  TRANSFERS SELECTED RECORDS FROM FILE #1 TO FILE #2."
1810  PRINT "       ZERO ENTRIES FOR RECORD NUMBERS RETURNS TO COMMAND."
1850  PRINT 
1900  GOTO 1200
2000  REM
2010  REM   COMPARE
2020  REM
2050  READ #1,1
2060  READ #2,1
2070  PRINT "ENTER:  B1, E1, B2 ";
2080  INPUT B1,E1,B2
2090  PRINT 
2100  IF B1 <= 0 OR E1 <= 0 OR B2 <= 0 OR E1<B1 THEN 1200
2110  IF  END #1 THEN 2900
2120  IF  END #2 THEN 2950
2130  REM
2150  FOR R=B1 TO E1
2160  READ #1,R
2170  READ #2,R-B1+B2
2180  LET E=0
2200  IF TYP(-1)#TYP(-2) THEN 2400
2210  GOTO TYP(-1) OF 2250,2300,2800,2800
2250  LET E=E+1
2260  READ #1;X
2270  READ #2;Y
2280  IF X#Y THEN 2400
2290  GOTO 2200
2300  LET E=E+1
2310  READ #1;A$
2320  READ #2;B$
2330  IF A$#B$ THEN 2400
2340  GOTO 2200
2400  PRINT "COMPARE OF RECORDS";R;"AND";R-B1+B2;"FAILED AT ITEM";E
2410  PRINT 
2420  FOR F=1 TO 2
2430  LET R1=R*(F=1)+(R-B1+B2)*(F=2)
2440  PRINT "**** FILE";F;"RECORD";R1;"****"
2450  PRINT 
2460  READ #F,R1
2500  GOTO TYP(-F) OF 2550,2600,2650,2700
2550  READ #F;X
2560  PRINT X
2570  GOTO 2500
2600  READ #F;A$
2610  PRINT A$
2620  GOTO 2500
2650  PRINT '10"**** EOF"'10'10
2670  GOTO 2770
2700  PRINT '10"**** EOR"'10'10
2770  NEXT F
2780  GOTO 2850
2800  PRINT "COMPARE OF RECORDS";R;"AND";R-B1+B2;"GOOD,";E;"ITEMS"
2850  NEXT R
2860  PRINT 
2870  GOTO 1200
2900  PRINT 
2910  PRINT "PEOF ON FILE #1 AFTER";R-1;"RECORDS"
2920  GOTO 2860
2950  PRINT 
2960  PRINT "PEOF ON FILE #2 AFTER";R-B1+B2-1;"RECORDS"
2970  GOTO 2860
3000  REM
3010  REM   COPY
3020  REM
3050  READ #1,1
3060  READ #2,1
3070  IF  END #2 THEN 3110
3080  FOR R=1 TO 9999
3090  PRINT #2,R; END 
3100  NEXT R
3110  IF  END #1 THEN 3700
3120  IF  END #2 THEN 3800
3130  REM
3150  FOR R=1 TO 9999
3160  READ #1,R
3170  PRINT #2,R
3200  GOTO TYP(-1) OF 3300,3400,3500,3600
3300  READ #1;X
3310  PRINT #2;X
3320  GOTO 3200
3400  READ #1;A$
3410  PRINT #2;A$
3420  GOTO 3200
3500  PRINT #2; END 
3600  NEXT R
3700  PRINT "COPY COMPLETED,";R-1;"RECORDS."
3710  READ #2,1
3720  GOTO 1200
3800  PRINT "FILE #2 IS TOO SMALL, COPY TERMINATED AT";R-1;"RECORDS."
3810  GOTO 3710
4000  REM
4010  REM   DUMP
4020  REM
4050  READ #1,1
4060  PRINT "HOW MANY FILES TO BE DUMPED ";
4070  INPUT F1
4080  PRINT "STOP DUMP AT FIRST EOF ";
4090  INPUT B$
4100  PRINT '10'10"TURN ON TAPE PUNCH (LEADER OK?)."
4130  FOR I=1 TO 2000
4140  LET X=ATN(78)
4150  NEXT I
4160  REM
4200  PRINT F1
4210  FOR F=1 TO F1
4220  IF  END #F THEN 4260
4230  FOR R=1 TO 9999
4240  READ #F,R
4250  NEXT R
4260  PRINT R-1
4270  NEXT F
4290  REM
4300  FOR F=1 TO F1
4310  IF  END #F THEN 4750
4320  FOR R=1 TO 9999
4330  READ #F,R
4350  GOTO TYP(-F) OF 4400,4450,4600,4650
4400  READ #F;X
4410  PRINT '21;X
4420  GOTO 4350
4450  READ #F;A$
4460  IF A$[1,1]#" " THEN 4500
4470  LET A$[1,1]='17
4500  FOR J=1 TO LEN(A$)
4510  IF A$[J,J]#'10 THEN 4540
4520  LET A$[J,J]='30
4530  GOTO 4560
4540  IF A$[J,J]#'13 THEN 4560
4550  LET A$[J,J]='31
4560  NEXT J
4570  PRINT A$
4580  GOTO 4350
4600  IF B$[1,1]="Y" THEN 4750
4610  PRINT '22"EOF"'22
4620  GOTO 4700
4650  PRINT '22"EOR"'22
4700  NEXT R
4750  PRINT '22"EOI"'22
4800  NEXT F
4850  PRINT '10'10"END OF DUMP, PUNCH OFF."
4855  PRINT '1'10;
4890  GOTO 1210
5000  REM
5010  REM   LIST
5020  REM
5050  READ #1,1
5060  PRINT "WHICH FILE TO BE LISTED ";
5070  INPUT F
5080  IF F<1 OR F>4 THEN 1200
5090  READ #F,1
5092  PRINT "ENTER: BEG & END RECORDS ";
5095  INPUT B1,E1
5100  PRINT "STOP AT FIRST EOF ";
5110  INPUT B$
5140  IF  END #F THEN 5600
5150  PRINT '10'10"    ********* BEGIN *********"'13'10
5170  REM
5200  FOR R=B1 MAX 1 TO E1
5210  READ #F,R
5220  LET I=E=0
5250  GOTO TYP(-F) OF 5300,5350,5400,5450
5300  READ #F;X
5310  PRINT X
5320  LET I=I+2
5330  LET E=E+1
5340  GOTO 5250
5350  READ #F;A$
5360  PRINT A$
5370  LET I=I+INT((LEN(A$)+1)/2)+1
5380  GOTO 5330
5400  PRINT '10;R;"***** EOF;";I;"WORDS,";E;"ITEMS *****"'10
5430  IF B$[1,1]="Y" THEN 5700
5440  GOTO 5500
5450  PRINT '10;R;"***** EOR;";I;"WORDS,";E;"ITEMS *****"'10
5500  NEXT R
5510  GOTO 5700
5600  PRINT '10"    ********* PEOF *********"'10'10'13
5650  GOTO 1200
5700  PRINT '10'10
5710  GOTO 1200
6000  REM
6010  REM   READ
6020  REM
6050  READ #1,1
6060  PRINT "HOW MANY FILES ARE AVAILABLE ";
6070  INPUT F2
6100  PRINT 
6110  PRINT "INSERT DUMPED TAPE IN READER AND TURN IT ON."
6120  PRINT 
6130  INPUT F1
6140  IF F1 <= F2 THEN 6200
6150  PRINT 
6160  PRINT "NEED";F1;"FILES, ONLY";F2;"AVAILABLE."
6170  GOTO 1200
6180  REM
6200  FOR F=1 TO F1
6210  IF  END #F THEN 6280
6220  INPUT R1
6230  FOR R=1 TO R1
6240  PRINT #F,R; END 
6250  NEXT R
6260  NEXT F
6270  GOTO 6300
6280  PRINT "FILE";F;"NEEDS";R1;"RECORDS, HAS ONLY";R-1
6290  GOTO 1200
6295  REM
6300  FOR F=1 TO F1
6305  IF  END #F THEN 6630
6310  FOR R=1 TO 9999
6320  PRINT #F,R
6330  REM
6350  INPUT A$
6360  IF A$[1,1]='21 THEN 6550
6370  IF A$[1,1]='22 THEN 6600
6380  REM
6400  IF A$[1,1]#'17 THEN 6420
6410  LET A$[1,1]=" "
6420  FOR J=1 TO LEN(A$)
6430  IF A$[J,J]#'30 THEN 6460
6440  LET A$[J,J]='10
6450  GOTO 6480
6460  IF A$[J,J]#'31 THEN 6480
6470  LET A$[J,J]='13
6480  NEXT J
6490  PRINT #F;A$
6500  GOTO 6350
6510  REM
6550  LET Z0=2
6560  GOSUB 9910
6570  PRINT #F;Z
6580  GOTO 6350
6600  IF A$#'22"EOF"'22 THEN 6650
6610  PRINT #F; END 
6620  GOTO 6700
6630  INPUT A$
6635  IF A$='22"EOI"'22 THEN 6750
6640  GOTO 6670
6650  IF A$='22"EOR"'22 THEN 6700
6660  IF A$='22"EOI"'22 THEN 6750
6670  PRINT "ERROR"
6680  READ #F,1
6690  GOTO 6800
6700  NEXT R
6750  READ #F,1
6760  NEXT F
6800  PRINT 
6810  PRINT "TURN READER OFF."
6820  FOR I=1 TO 1500
6830  LET X=ATN(78)
6840  NEXT I
6850  GOTO 1200
7000  REM
7010  REM   TRANSFER
7020  REM
7050  READ #1,1
7060  READ #2,1
7070  PRINT "ENTER:  B1, E1, B2 ";
7080  INPUT B1,E1,B2
7090  PRINT 
7100  IF B1 <= 0 OR E1 <= 0 OR B2 <= 0 OR E1<B1 THEN 1200
7110  IF  END #1 THEN 7200
7120  IF  END #2 THEN 7250
7130  FOR R=B1 TO E1
7140  READ #1,R
7150  READ #2,R-B1+B2
7160  NEXT R
7180  GOTO 7300
7200  PRINT "LAST RECORD IN FILE #1 IS";R-1
7210  PRINT 
7220  GOTO 7070
7250  PRINT "FILE #2 LACKS";E1-R+1;"RECORDS FOR TRANSFER."
7260  PRINT 
7270  GOTO 7070
7290  REM
7300  FOR R=B1 TO E1
7310  READ #1,R
7320  PRINT #2,R-B1+B2
7350  GOTO TYP(-1) OF 7400,7450,7500,7600
7400  READ #1;X
7410  PRINT #2;X
7420  GOTO 7350
7450  READ #1;A$
7460  PRINT #2;A$
7470  GOTO 7350
7500  PRINT #2; END 
7600  NEXT R
7610  READ #2,1
7620  GOTO 7070
9000  REM
9010  REM   SUMMARY
9020  REM
9050  READ #1,1
9060  PRINT "WHICH FILE TO BE SUMMARIZED ";
9070  INPUT F
9080  PRINT 
9090  READ #F,1
9100  IF  END #F THEN 9600
9110  LET I1=E1=0
9120  PRINT 
9130  LET B$="NS"
9140  REM
9150  FOR R=1 TO 9999
9160  LET I=E=0
9170  READ #F,R
9200  GOTO TYP(-F) OF 9250,9350,9400,9450
9250  LET T=1
9255  READ #F;X
9260  LET I=I+2
9270  IF E/10#INT(E/10) THEN 9300
9290  PRINT " ";
9300  PRINT B$[T,T];
9310  LET E=E+1
9320  GOTO 9200
9350  LET T=2
9355  READ #F;A$
9360  LET I=I+INT((LEN(A$)+1)/2)+1
9370  GOTO 9270
9400  PRINT 
9410  PRINT 
9420  PRINT R;"EOF; ";
9430  GOTO 9480
9450  PRINT 
9460  PRINT 
9470  PRINT R;"EOR; ";
9480  PRINT I;"WORDS,";E;"ITEMS."
9490  PRINT 
9500  LET I1=I1+I
9510  LET E1=E1+E
9550  NEXT R
9600  PRINT 
9610  PRINT "FILE CONTAINS: ";R-1;"RECORDS,";I1;"WORDS,";E1;"ITEMS."
9620  PRINT 
9630  GOTO 1200
9900  REM  ALFTOV
9908  REM
9909  DIM Z$[15]
9910  REM
9911  LET Z=Z4=Z5=0
9912  LET Z1=Z2=Z3=1
9913  LET Z$="0123456789+-.E "
9914  FOR Z9=Z0 TO LEN(A$)
9915  FOR Z8=1 TO 15
9916  IF A$[Z9,Z9]=Z$[Z8,Z8] THEN 9919
9917  NEXT Z8
9918  GOTO 9944
9919  IF Z8=15 THEN 9942
9920  IF Z8>10 THEN 9929
9921  GOTO Z2 OF 9922,9924,9926
9922  LET Z=10*Z+Z8-1
9923  GOTO 9942
9924  LET Z5=Z5+1
9925  GOTO 9922
9926  LET Z4=10*Z4+Z8-1
9927  GOTO 9942
9929  GOTO Z8-10 OF 9930,9930,9937,9940
9930  IF Z2<3 AND Z>0 THEN 9944
9931  IF Z2=3 THEN 9934
9932  LET Z1=23-2*Z8
9933  GOTO 9942
9934  IF Z4>0 THEN 9944
9935  LET Z3=23-2*Z8
9936  GOTO 9942
9937  IF Z2>1 THEN 9944
9938  LET Z2=2
9939  GOTO 9942
9940  IF Z2=3 THEN 9944
9941  LET Z2=3
9942  NEXT Z9
9944  LET Z0=Z9
9945  IF ABS(Z3*Z4-Z5)<50 THEN 9947
9946  LET Z5=Z3*(Z4-50)
9947  LET Z=Z1*Z*10^(Z3*Z4-Z5)
9948  RETURN 
9999  END 
