1 ' DATA FILER & EDITOR --- DATFL.BAS --- by Dr Russell Langley
2 GOTO 400
4 '<UNK! {000A}>--- Press Enter ---
5 IF PR THEN RETURN ELSE PRINT TAB(40);:PRINT "Press <Enter> to continue.";:IN$=INKEY$:WHILE INKEY$<>CHR$(13):WEND:LOCATE,40:PRINT SPACE$(26):RETURN
6 PRINT TAB(14);:PRINT "Press <Enter> to continue, or `/' to end viewing.";:IN$=INKEY$:WHILE IN$<>CHR$(13) AND IN$<>"/":IN$=INKEY$:WEND:LOCATE,14:PRINT SPACE$(50):IF IN$="/" THEN I=N:RETURN ELSE RETURN
7 '<UNK! {000A}><UNK! {000A}>--- Redirect to Block ---
9 ON QB GOTO 403,429,434,503,30:STOP'=start,menu,edit-prompt,print,quit.<UNK! {000A}><UNK! {000A}>--- Another go? ---
10 DO$="run this program again now":GOSUB 20:IF Z$="Y" THEN 2 ELSE 30
11 PRINT "Have you FILED the present data";:GOSUB 21:IF Z$="Y" THEN 10 ELSE QB=2:GOTO 9
19 '<UNK! {000A}>--- Yes/No? ---
20 PRINT:PRINT"Do you want to "+DO$;
21 INPUT" (Y/N)";Z$:IF Z$="" THEN Z$="N":RETURN ELSE Z$=CHR$(ASC(Z$) AND 95):IF Z$="Y" OR Z$="N" THEN RETURN ELSE PRINT"WHAT? ";:GOTO 21
29 '<UNK! {000A}>--- Errors & End ---
30 IF ERR THEN BEEP ELSE RUN "MENU"
31 IF ERR=70 THEN INPUT"Can't write to that disk. Remove its Write-Protect tab, then press <Enter>.";Z$:RESUME
32 IF ERR=71 THEN INPUT"That drive is empty or its gate is open. Fix, then press <Enter>.";Z$:RESUME
39 ON ERROR GOTO 0:END'<UNK! {000A}><UNK! {000A}>--- Messages ---
40 BEEP:PRINT "---> Sorry, that entry is illegal.":RETURN
41 BEEP:PRINT "---> Sorry, double quotes are not allowed here.":RETURN
42 BEEP:PRINT"* * * Can't Do That.":QB=3:GOTO 9
43 BEEP:PRINT"You can't use '"L$"' with Upper Triangular matrices.":QB=3:GOTO 9
44 BEEP:PRINT"No, use REMAKE program to Delete rows of Upper Triangular matrices.":QB=3:GOTO 9
49 '<UNK! {000A}>*** Vetted Decoding of FF X(I,J) from X$ ***<UNK! {000A}> Needs OP$, I, M, Q(0) from #96 or #256, & UT>0 if UT matrix.
50 L=M:IF OP$="XC" THEN K=J ELSE K=1:IF UT>0 THEN L=M-I+1
51 KX=0:FOR J=K TO L:Y$=SPACE$(10):KY=0
52 KX=KX+1:IF KX>LEN(X$) THEN IF J=L THEN 54 ELSE 57
53 Z$=MID$(X$,KX,1):IF INSTR("-.0123456789",Z$) THEN KY=KY+1:MID$(Y$,KY,1)=Z$:GOTO 52 ELSE IF Z$<>" " THEN 58 ELSE IF KY=0 THEN 52
54 IF Q(0) THEN Q(J)=VAL(Y$) ELSE X(I,J)=VAL(Y$)
55 NEXT J:IF KX>=LEN(X$) THEN 60
56 PLAY"L8O3CO2C":PRINT"Only the first"L"values have been read in that line. Re-do it";:GOSUB 21:IF Z$="Y" THEN 59 ELSE 60
57 PLAY"L32O4CEG>C":PRINT"Not enough values in the line above. Please re-do whole line.":GOTO 59
58 PLAY"L16O3CEL4>B":PRINT"That line contains a `non-numeric' entry. Please re-do whole line."
59 PRINT"Row"STR$(I);:INPUT X$:IF RIGHT$(X$,1)<>"/" THEN 51 ELSE X$=LEFT$(X$,LEN(X$)-1):N=I+(X$=""):IF X$>"" THEN 51
60 RETURN
69 '<UNK! {000A}>--- K/b input of all X(I,J) in FF. Counts N. ---<UNK! {000A}> Needs first I, M, & if UT matrix UT>0.
70 PRINT"Enter data from keyboard, ";:IF M=1 THEN PRINT "pressing <Enter> after each number.":GOTO 72
71 PRINT"in Free Format, pressing <Enter> at end of each row.":IF UT>0 THEN 73
72 PRINT"Null entry duplicates previous row. Signal `end-of-data' by entering a `/'"
73 PRINT"Row"STR$(I);:INPUT X$:IF UT>0 AND I=M THEN N=M:GOTO 75 ELSE IF X$="" THEN IF I>1 THEN FOR J=1 TO M:X(I,J)=X(I-1,J):NEXT J:I=I+1:LOCATE CSRLIN-1,POS(0)+9:PRINT"Ditto":GOTO 73
74 IF RIGHT$(X$,1)="/" THEN X$=LEFT$(X$,LEN(X$)-1):N=I+(X$=""):IF X$="" THEN 76
75 GOSUB 50:IF N=0 THEN IF I<MXR THEN I=I+1:GOTO 73 ELSE N=MXR
76 RETURN
79 '<UNK! {000A}>--- Disk Input of X(I,J), N, M, etc ---<UNK! {000A}> Needs MNR, MNC. Also ZZ$="UTOK" if UT is acceptable.
80 QD=1:IO$="I":GOSUB 110:CLS:PRINT "Loading data from disk.":INPUT #1,FL$,VR$
81 IF LEFT$(VR$,4)<>"(RL," THEN BEEP:PRINT "Unreadable file --- not made by our Data Filer/Editor program.":GOTO 86
83 IF UT>0 THEN IF ZZ$<>"UTOK" THEN PRINT "This file is an upper triangular matrix, which this program can't use!":GOTO 86
84 PRINT"File has"N"rows of data. ";:IF N<MNR THEN PRINT "--- Not enough!":GOTO 86 ELSE IF N>MXR THEN PRINT"--- Too many!":GOTO 86
85 PRINT:PRINT"File has"M"column variables. ";:IF M<MNC THEN PRINT "--- Not enough!" ELSE IF M>MXC THEN PRINT"Too many!" ELSE 88
86 CLOSE:BEEP:GOSUB 5:ERROR 210
87 ' Select variables
88 PRINT:IF VN$="N" THEN PRINT "The"M"variables are not named.":GOTO 90
89 PRINT "Variables in file are:":FOR J=1 TO M:INPUT #1,VN$(J):PRINT J;VN$(J),:NEXT J:PRINT
90 IF M=MNC OR UT>0 THEN 100 ELSE PRINT
91 PRINT"How many filed column variables are to be IGNORED (0-"MID$(STR$(M-MNC),2)")";:INPUT ND:IF ND<0 OR ND>M-MNC THEN 91 ELSE IF ND=0 THEN 100
92 '
93 '
94 IF ND=1 THEN PRINT "Number of the variable to be IGNORED (1-"MID$(STR$(M),2)")";:INPUT X$:Q(1)=VAL(X$):IF Q(1)<1 OR Q(1)>M THEN GOSUB 40:GOTO 94 ELSE 97
95 PRINT MID$(STR$(ND),2)" numbers of variables to be IGNORED (in ascending order & Free Format):":INPUT X$:IF VAL(X$)<1 THEN GOSUB 40:GOTO 95
96 Q(0)=1:MM=M:M=ND:GOSUB 50:Q(0)=0:M=MM
97 KK=1:L=1:FOR J=1 TO M:IF J=Q(KK) THEN KK=KK+1 ELSE VN$(L)=VN$(J):L=L+1
98 NEXT J
99 ' Now read numerical data from disk
100 PRINT:COLOR 23,0:PRINT"Loading numbers";:COLOR 7,0:FOR I=1 TO N:KK=1:LL=1:IF UT<=0 THEN L=M ELSE L=M-I+1
101 FOR J=1 TO L:INPUT #1,Z
102 IF J=Q(KK) THEN KK=KK+1 ELSE X(I,LL)=Z:LL=LL+1
103 NEXT J:NEXT I:CLOSE:LOCATE,1:PRINT SPACE$(15):M=M-ND:RETURN
104 I=0:MM=M:M=ND:GOSUB 50:FOR J=1 TO ND:Q(J)=X(0,J):NEXT J:M=MM
105 KK=1:L=1:FOR J=1 TO M:IF J=Q(KK) THEN KK=KK+1 ELSE VN$(L)=VN$(J):L=L+1
106 NEXT J
109 '<UNK! {000A}>--- Get Filespec ---
110 IF IO$="O" AND FL$>"" THEN PRINT "Will you file this data under the name "FL$;:GOSUB 21:IF Z$="Y" THEN 115
111 LINE INPUT "Filename (I will add .DAT extension)? ";FL$:IF FL$="" THEN 111 ELSE IF MID$(FL$,2,1)=":" THEN DR$=LEFT$(FL$,1):FL$=MID$(FL$,3)
112 ER=0:FOR I=1 TO LEN(FL$):Z$=MID$(FL$,I,1):IF INSTR(" .,/\|?*:;[]+="+CHR$(34),Z$) THEN ER=1
113 NEXT I
114 IF ER=0 AND FL$>"" AND LEN(FL$)<9 THEN FL$=FL$+".DAT" ELSE BEEP:PRINT "Invalid filename. Will you try again";:GOSUB 21:IF Z$="Y" THEN 111 ELSE 2
115 INPUT "Which drive (A,B,C,D)";DR$:IF DR$="" THEN 115
116 DR$=CHR$(ASC(DR$) AND 95):IF INSTR("ABCD",DR$)=0 THEN 115
117 INPUT "Which directory (e.g. WORK, MYDATA, or Null Entry if root) ";DR2$:IF DR2$="" THEN DR$=DR$+":" ELSE DR$=DR$+":\"+DR2$+"\"
129 '<UNK! {000A}>--- Open File, IO$= "I" or "O" ---
130 IF IO$="I" THEN 134 ELSE ON ERROR GOTO 132:OPEN DR$+FL$ FOR INPUT AS #1
131 CLOSE:DO$="<OVERWRITE> existing "+FL$:GOSUB 20:IF Z$="N" THEN 110 ELSE 133
132 RESUME 133 'OK to start new file, since FL$ not present.
133 ON ERROR GOTO 30:OPEN DR$+FL$ FOR OUTPUT AS #1:RETURN 'print #1,Q$A$Q$Q$B$Q$:close
134 ON ERROR GOTO 136:OPEN DR$+FL$ FOR INPUT AS #1 'for input
420 PRINT"No. of variables (columns, 1-"MID$(STR$(MXC),2)")";:INPUT M:IF M<1 OR M>MXC THEN GOSUB 40:GOTO 420 ELSE IF M=1 THEN 423
421 DO$="enter an Upper Triangular matrix":GOSUB 20:IF Z$="N" THEN 423
422 PRINT "Based on how many persons ("MID$(STR$(M+2),2)" or more)";:INPUT UT:IF UT<M+2 THEN PRINT "Not enough!":GOTO 422'<UNK! {000A}> ---> Note: UT holds # persons since matrix N=M
423 VN$="Y":PRINT"Variable Names (1-10 letters each) 1 per line, or Null Entry if no names:":FOR J=1 TO M
424 PRINT "Var"J"? ";:LINE INPUT VN$(J):IF VN$(1)="" THEN VN$="N":J=M:GOTO 426
425 IF INSTR(VN$(J),Q$) THEN GOSUB 41:GOTO 424 ELSE VN$(J)=LEFT$(VN$(J),10)
426 NEXT J:IF OP$="V" THEN 434
427 I=1:GOSUB 70
428 ' Menu
429 CLS:LOCATE,,0:PRINT TAB(26)"EDITING MENU":PRINT:PRINT"Indicate your Editing requirements as follows ---":K=12
430 PRINT"<UNK! {000A}>"TAB(K)"F = File data now<UNK! {000A}>"TAB(K)"V = Variable names to be changed or added<UNK! {000A}>"TAB(K)"SV = Show variable names<UNK! {000A}>"TAB(K)"SA = Show all data";
431 PRINT"<UNK! {000A}>"TAB(K)"S# = Show row # (e.g. S4 shows row 4)<UNK! {000A}>"TAB(K)"C# = Change row #";:IF UT>0 THEN 433
432 PRINT"<UNK! {000A}>"TAB(K)"I# = Insert row #<UNK! {000A}>"TAB(K)"D# or D#-# = Delete row or range-of-rows (work up if multiple)<UNK! {000A}>"TAB(K)"XR = Extra rows to be added (from keyboard)<UNK! {000A}>"TAB(K)"XC = Extra cols to be added (from keyboard)";
433 PRINT"<UNK! {000A}>"TAB(K)"P = Print datafile on printer<UNK! {000A}>"TAB(K)"Q = Quit or Re-run":LOCATE,,1
434 QB=2:CLOSE:PRINT:PRINT"====> Option (F, V, SV, SA, S#, C#,";:IF UT<=0 THEN PRINT" I#, D#, XR, XC,";
435 PRINT" P, Q, Null=Menu)";
436 INPUT OP$:IF OP$="" THEN 429 ELSE PRINT
437 IF OP$="F" OR OP$="f" THEN 488 ELSE IF OP$="V" OR OP$="v" THEN 441 ELSE IF OP$="SV" OR OP$="sv" THEN 447 ELSE IF OP$="SA" OR OP$="sa" THEN 450 ELSE IF OP$="P" OR OP$="p" THEN 490 ELSE IF OP$="Q" OR OP$="q" THEN 11
438 L$=CHR$(ASC(OP$) AND 95):IF INSTR("SCIDX",L$)=0 OR LEN(OP$)=1 THEN 42
439 IF L$="S" OR L$="C" THEN 460 ELSE IF L$="I" THEN 467 ELSE IF L$="D" THEN 471 ELSE IF L$="X" THEN 476
440 ' Edit Varnames
441 IF VN$="N" THEN QR=1 ELSE 448
442 INPUT"# of variable to be renamed (Null=Menu)";Z$:IF Z$="" THEN 429 ELSE J=VAL(Z$):IF J<1 OR J>M THEN 442 ELSE IF VN$(J)="" THEN VN$(J)="<blank> "
443 PRINT"Present name of Var"J"is: "VN$(J);
444 LINE INPUT" New name? ";VN$(J):IF VN$(J)="" THEN 442
445 IF INSTR(VN$(J),Q$) THEN GOSUB 41:GOTO 444 ELSE VN$(J)=LEFT$(VN$(J),10):VN$="Y":GOTO 442
446 ' Show Varnames
447 IF VN$="N" THEN PRINT"Variables not named.":GOTO 434
448 FOR J=1 TO M:PRINT J;VN$(J),:NEXT J:PRINT:IF OP$="V" OR OP$="v" THEN 442 ELSE 434
449 ' Show Data
450 IF OP$="XR" OR OP$="xr" THEN PRINT:PRINT"Extra rows are---":II=N1:GOTO 453
451 II=1:PRINT"Filename: "FL$
452 PRINT:IF QR=0 THEN PRINT"Data read was---" ELSE PRINT"Revised data is---"
453 LN=0:FOR I=II TO N:LN=LN+1
454 IF UT<=0 THEN L=M ELSE L=M-I+1
455 IF LN=21 THEN LN=1:GOSUB 6:IF IN$="/" THEN 457
456 PRINT"Row";STR$(I);": ";:FOR J=1 TO L:PRINT X(I,J);:NEXT J:PRINT:IF LN=0 THEN RETURN
457 NEXT I:IF IN$="/" THEN 434 ELSE GOSUB 5
458 IF OP$="XR" OR OP$="xr" THEN 434 ELSE 447
459 ' Show a Row
460 I=VAL(MID$(OP$,2)):IF I<1 OR I>N THEN 42 ELSE LN=0:GOSUB 454:IF L$="S" THEN 434
461 ' Change Datum
462 QR=1:IF M=1 THEN J=1:GOTO 464 ELSE IF UT<=0 THEN L=M ELSE L=M-I+1
463 PRINT "Change which variable # (1-"MID$(STR$(L),2)")";:INPUT Z$:J=VAL(Z$):IF J<1 OR J>L THEN BEEP:GOTO 463
464 PRINT "Old value ="X(I,J);TAB(28)"New value";:INPUT Z$:FOR K=1 TO LEN(Z$):IF INSTR("-.0123456789",MID$(Z$,K,1))THEN NEXT K:X(I,J)=VAL(Z$) ELSE PLAY"L16O3CEL4>B":PRINT"That contains a `non-numeric' entry. Please re-do.":GOTO 464
465 PRINT "Revised Row"STR$(I)": ";:FOR J=1 TO L:PRINT X(I,J);:NEXT J:PRINT:IF M=1 THEN 434 ELSE DO$="change that row again":GOSUB 20:IF Z$="Y" THEN 463 ELSE 434
466 ' Insert a Row
467 IF UT>0 THEN 43 ELSE KR=CSRLIN:PRINT "Working";:LOCATE KR,1,0
468 II=VAL(MID$(OP$,2)):IF II<1 OR II>N OR N=MXR THEN 42 ELSE QR=1:N=N+1:FOR I=N TO II+1 STEP -1:FOR J=1 TO M:X(I,J)=X(I-1,J):NEXT:NEXT
471 IF UT>0 THEN 44 ELSE KR=CSRLIN:COLOR 23,0:PRINT "Working";:LOCATE KR,1,0:COLOR 7,0
472 J=INSTR(OP$,"-"):IF J=0 THEN I=VAL(MID$(OP$,2)):Q=1 ELSE I=VAL(MID$(OP$,2,J-1)):II=VAL(MID$(OP$,J+1)):Q=ABS(I-II)+1
473 IF I<1 OR I>N THEN 42 ELSE IF Q>1 THEN IF II<1 OR II>N THEN 42 ELSE IF I>II THEN SWAP I,II
474 QR=1:N=N-Q:FOR K=I TO N:FOR J=1 TO M:X(K,J)=X(K+Q,J):NEXT:NEXT:PRINT "OK, done.":GOTO 434
475 ' Extra Rows
476 IF UT>0 THEN 43 ELSE R$=CHR$(ASC(RIGHT$(OP$,1)) AND 95):IF R$="C" THEN 480 ELSE IF R$<>"R" OR N=MXR THEN 42
477 PRINT"You can append up to"MXR-N"extra rows (each with"M"variables).":N1=N+1:I=N1:N=0:QR=1:Q=1
478 GOSUB 70:DO$="view those extra rows":GOSUB 20:IF Z$="Y" THEN 450 ELSE 429
479 ' Extra Cols
480 OP$="XC":IF M=MXC THEN PRINT"This file already has the maximum number of variables,"MXC:GOTO 42 ELSE PRINT"No. of extra variables per row (max"STR$(MXC-M)")";:INPUT MM:IF MM<1 OR M+MM>MXC THEN 42
481 IF VN$="N" THEN 485 ELSE PRINT "Names of extra variables (1-10 letters each), 1 per line --":FOR J=M+1 TO M+MM
482 PRINT"Var"J"? ";:LINE INPUT VN$(J)
483 IF INSTR(VN$(J),Q$) THEN GOSUB 41:GOTO 482 ELSE VN$(J)=LEFT$(VN$(J),10)
484 NEXT J
485 PRINT"Enter extra variables in Free Format --":FOR I=1 TO N:PRINT"Row"STR$(I)":";:FOR J=1 TO M:PRINT X(I,J);:NEXT J