1000 !-----------------------------------------------!
1010 ! PROGRAM TO MAINTAIN THE WORDS FOR HANG5.BAS !
1020 !-----------------------------------------------!
1030
2000 REM ...... MAP DEFINITIONS
2020 MAP1 RECSIZ,F,6,16 ! RECORD SIZE IN WORDS.DAT FILE
2021 MAP1 FWORD$,S,16
2025 MAP1 NWORD$,S,16
2027 MAP1 LWORD$,S,16
2028 MAP1 CODE$ ,S,16
2030 MAP1 RECNUM,F,6 ! RECORD NUMBER COUNTER
2040 MAP1 LOCK$ ,S,1,"Y" ! "Y" IF LOCKS ARE TO BE USED (LOAD XLOCK.SBR)
2050 MAP1 COMD$ ,S,25
2060 MAP1 BS$ ,S,50
2070 MAP1 FNAME$ ,S,10
2080 MAP1 BUFWORD$,S,50
2090
2300 REM ...... XLOCK MAPS
2320 MAP1 MODE,B,2
2330 MAP1 L1 ,B,2,100
2340 MAP1 L2 ,B,2,1
2390
2400 REM ...... PARAMETER RECORDS
2420 MAP1 RECORD'ZERO
2430 MAP2 URECS,B,2
2440 MAP2 TBLOX,B,2
2450 MAP2 BPREC,B,2
2460 MAP2 INDEX,B,2
2490
2500 REM ...... ONE-TIME INITIALIZATION
2520 FOR I=1 TO 50 : BS$=BS$+CHR(8) : NEXT I
2530 MODE=2 : XCALL XLOCK,MODE,L1,L2
2540 PRINT TAB(-1,0);
2590
3000 MAIN:
3020 PRINT
3025 COMD$="HELP"
3030 INPUT "ENTER NEXT COMMAND (OR 'HELP' FOR AID) : ", COMD$
3040 IF(LEN(COMD$) < 2) THEN ? "ERROR---COMMAND < 2 LETTERS" : GO TO MAIN
3090
3100 REM ...... COMMANDS
3120 IF(INSTR(1,"INITIALIZE",COMD$)=1) THEN GO TO INITIALIZE'COMMAND
3130 IF(INSTR(1,"ADD" ,COMD$)=1) THEN GO TO ADD'COMMAND
3140 IF(INSTR(1,"DELETE" ,COMD$)=1) THEN GO TO DELETE'COMMAND
3150 IF(INSTR(1,"DISPLAY" ,COMD$)=1) THEN GO TO DISPLAY'COMMAND
3160 IF(INSTR(1,"DUMP" ,COMD$)=1) THEN GO TO DUMP'COMMAND
3170 IF(INSTR(1,"BUILD" ,COMD$)=1) THEN GO TO BUILD'COMMAND
3180 IF(INSTR(1,"HELP" ,COMD$)=1) THEN GO TO HELP'COMMAND
3190
3200 REM ...... OTHER ENTRIES
3220 IF(INSTR(1,"END" ,COMD$)=1) THEN GO TO END'PROG
3250 PRINT "ERROR---ILLEGAL COMMAND"
3260 GO TO MAIN
3290
3470
3480
3490
3500 INITIALIZE'COMMAND:
3520 LOOKUP "WORDS.DAT", THERE
3530 IF(THERE <> 0) THEN ? "ERROR---WORDS FILE ALREADY EXISTS" : GO TO MAIN
3590
3600 ENTER'MAX:
3620 INPUT "ENTER MAXIMUM NUMBER OF WORDS ALLOWED IN WORDS FILE : ", MWORDS
3630 IF(MWORDS < 5) THEN ? "HEY --- ARE YOU SERIOUS, MAN ?":GO TO END'COMMANDS
3640 IF(MWORDS > 10000) THEN ? "ERROR--- > 10000 WORDS" : GO TO END'COMMANDS
3650 RPB=INT(512/RECSIZ)
3660 TBLOX=INT(MWORDS/RPB + .99999)
3690
3700 REM ...... ALLOCATE FILE
3720 ALLOCATE "WORDS.DAT", TBLOX
3730 OPEN #1, "WORDS.DAT", RANDOM, RECSIZ, RECNUM
3740 RECNUM=0
3742 URECS=1 : BPREC=RECSIZ : INDEX=0
3750 WRITE #1, RECORD'ZERO
3790
3900 REM ...... FINISH
3950 GO TO END'CLOSE
3970
3980
3990
4000 ADD'COMMAND:
4020 ACTION$="L" : GOSUB FILE : IF(NERR > 0) THEN GO TO END'COMMANDS
4021 PRINT " KEEP ENTERING WORDS --- TO FINISH, ENTER A CARRIAGE RETURN"
4023 ADD'LOOP:
4025 IF(FRECS=0) THEN ? " [WARNING---WORD FILE FULL]" : GO TO END'CLOSE
4030 PRINT " ENTER NEW WORD : <"; SPACE$(RECSIZ); ">"; BS$[1,RECSIZ+1];
4035 BUFWORD$=""
4040 INPUT "" BUFWORD$
4041 IF(BUFWORD$="") THEN GO TO END'CLOSE
4042 IF(LEN(BUFWORD$) > RECSIZ) THEN ? "ERROR---TOO LARGE" : GO TO END'CLOSE
4043 NWORD$=BUFWORD$
4045 IF(NWORD$="*") THEN ? "[NOT ADDED]" : GO TO ADD'LOOP
4050 CODE$=NWORD$
4060 GOSUB FIND'WORD
4070 IF(FOUND > 0) THEN PRINT "ERROR---ALREADY IN FILE" : GO TO END'CLOSE
4090
4100 REM ...... MOVE FOLLOWING WORDS IN
4120 IF(-FOUND=URECS) THEN GO TO ADD'WORD
4130 FOR REC=URECS-1 TO -FOUND STEP -1
4140 RECNUM=REC
4150 READ #1, FWORD$
4160 RECNUM=REC+1
4170 WRITE #1, FWORD$
4180 NEXT REC
4190
4200 ADD'WORD:
4220 RECNUM=-FOUND
4230 WRITE #1, NWORD$
4290
4400 REM ...... UPDATE FILE PARAMETERS
4420 RECNUM=0
4425 URECS=URECS+1
4430 WRITE #1, URECS
4440 GO TO ADD'LOOP
4470
4480
4490
5000 DELETE'COMMAND:
5020 ACTION$="L" : GOSUB FILE : IF(NERR > 0) THEN GO TO END'COMMANDS
5030 ? " ENTER WORD TO DELETE : <"; SPACE$(RECSIZ); ">"; BS$[1,RECSIZ+1];
5040 INPUT "" NWORD$
5042 FILLER=RECSIZ-LEN(NWORD$)
5045 IF(FILLER < 0) THEN PRINT "ERROR---WORD TOO LONG" : GO TO END'COMMANDS
5050 CODE$=NWORD$
5060 GOSUB FIND'WORD
5070 IF(FOUND < 0) THEN PRINT "ERROR---WORD NOT FOUND" : GO TO END'CLOSE
5090
5100 REM ...... MOVE FOLLOWING WORDS IN
5110 PRINT TAB(-1,7); "DELETING WORD .... ";
5120 IF(FOUND=URECS) THEN GO TO END'DELETE
5130 FOR REC=FOUND TO URECS-1
5140 RECNUM=REC+1
5150 READ #1, FWORD$
5160 RECNUM=REC
5170 WRITE #1, FWORD$
5180 NEXT REC
5190
5400 END'DELETE:
5420 RECNUM=0
5425 URECS=URECS-1
5430 WRITE #1, URECS
5440 GO TO END'UPDATE
5470
5480
5490
6000 DISPLAY'COMMAND:
6050 ACTION$="O" : GOSUB FILE : IF(NERR > 0) THEN GO TO END'COMMANDS
6090
6100 REM ...... DETERMINE DISPLAY RANGE
6120 FREC=1
6130 LREC=URECS-1
6140 P=0
6190
6200 REM ...... PRINT TITLES
6290
6300 REM ...... DO OUTPUT
6310 IF(FREC > LREC) THEN ? " [WORD FILE EMPTY]" : GO TO FINISH'DISPLAY
6315 PRINT " ";
6320 FOR RECNUM=FREC TO LREC
6330 READ #1, FWORD$
6340 PRINT #P, FWORD$; SPACE$(RECSIZ+1-LEN(FWORD$));
6350 IF(RECNUM/4=INT(RECNUM/4) AND RECNUM<>LREC) THEN PRINT : PRINT " ";
6360 NEXT RECNUM
6370 PRINT #P
6375 FINISH'DISPLAY:
6380 PRINT #P, "WORDS DISPLAYED :"; LREC-FREC+1;
6385 PRINT #P, " WORDS IN FILE :"; URECS-1;
6387 PRINT #P, " VACANCIES :"; FRECS
6390
6400 END'DISPLAY:
6450 GO TO END'CLOSE
6470
6480
6490
6500 DUMP'COMMAND:
6520 ACTION$="L" : GOSUB FILE : IF(NERR > 0) THEN GO TO END'COMMANDS
6530 FNAME$="WORDS.SEQ"
6540 INPUT "ENTER NAME OF SEQUENTIAL FILE (DEFAULT IS 'WORDS.SEQ') : ", FNAME$
6550 LOOKUP FNAME$, THERE
6560 IF(THERE <> 0) THEN ? "ERROR---FILE ALREADY EXISTS" : GO TO END'CLOSE
6590
6600 REM ...... OPEN FILE & DO DUMP
6610 PRINT " DUMPING .... ";
6620 OPEN #2, FNAME$, OUTPUT
6630 FOR RECNUM=1 TO URECS-1
6640 READ #1, NWORD$
6650 PRINT #2, NWORD$; ","; SPACE$(RECSIZ-LEN(NWORD$));
6660 IF(RECNUM/4=INT(RECNUM/4) AND RECNUM<>URECS-1) THEN PRINT #2
6680 NEXT RECNUM
6685 PRINT #2
6690
6900 END'DUMP:
6910 PRINT "FINISHED"
6920 CLOSE #2
6950 GO TO END'CLOSE
6970
6980
6990
7000 BUILD'COMMAND:
7020 ACTION$="L" : GOSUB FILE : IF(NERR > 0) THEN GO TO END'COMMANDS
7030 IF(URECS > 1) THEN ? "WARNING---ALREADY"; URECS-1; "WORDS IN WORD FILE"
7040 FNAME$="WORDS.SEQ"
7050 INPUT "ENTER NAME OF INPUT WORD FILE (DEFAULT IS 'WORDS.SEQ') : ", FNAME$
7060 LOOKUP FNAME$, THERE
7070 IF(THERE=0) THEN ? "ERROR---FILE NOT FOUND" : GO TO END'CLOSE
7080 OPEN #2, FNAME$, INPUT
7090
7100 REM ...... SET UP LOOP
7120 RECNUM=URECS-1
7130 IF(URECS=1) THEN LWORD$="" ELSE READ #1, LWORD$
7140 PRINT " NOW INSERTING WORD : ";
7190
7200 BUILD'LOOP:
7210 PRINT : PRINT " "; TAB(-1,3); TAB(-1,9);
7220 INPUT #2, BUFWORD$
7230 IF(EOF(2)=1) THEN GO TO END'BUILD
7235 PRINT BUFWORD$; " ";
7237 IF(LEN(BUFWORD$) > RECSIZ) THEN ? "ERROR---TOO BIG" : GO TO BUILD'LOOP
7238 NWORD$=BUFWORD$
7240 IF(NWORD$="*") THEN PRINT "[NOT ADDED]" : GO TO BUILD'LOOP
7245 IF(FRECS=0) THEN PRINT "ERROR---WORD FILE FULL" : GO TO END'BUILD
7247 IF(NWORD$>LWORD$) THEN FOUND=-URECS : LWORD$=NWORD$ : GO TO BUILD'INSERT
7250 CODE$=NWORD$
7260 GOSUB FIND'WORD
7270 IF(FOUND > 0) THEN ? "ERROR---WORD ALREADY IN FILE" : GO TO BUILD'LOOP
7290
7300 REM ...... MOVE FOLLOWING WORDS "OUT"
7320 FOR REC=URECS-1 TO -FOUND STEP -1
7330 RECNUM=REC
7340 READ #1, FWORD$
7350 RECNUM=REC+1
7360 WRITE #1, FWORD$
7380 NEXT REC
7390
7400 BUILD'INSERT:
7420 RECNUM=-FOUND
7430 WRITE #1, NWORD$
7440 RECNUM=0
7450 URECS=URECS+1
7455 FRECS=FRECS-1
7460 WRITE #1, RECORD'ZERO
7480 GO TO BUILD'LOOP
7490
7900 END'BUILD:
7940 CLOSE #2
7950 PRINT "[FINISHED BUILDING]"
7960 GO TO END'CLOSE
7970
7980
7990
9000 HELP'COMMAND:
9020 PRINT
9030 PRINT "FOLLOWING COMMANDS ARE AVAILABLE :"
9090
9100 REM ......
9120 PRINT " 'INitialize' START A BRAND NEW WORDS.DAT FILE"
9130 PRINT " 'ADd' ADD A NEW WORD TO THE WORDS FILE"
9140 PRINT " 'DElete' DELETE AN OLD WORD FROM THE WORDS FILE"
9150 PRINT " 'DIsplay' DISPLAY THE WORDS ON THE CRT"
9160 PRINT " 'DUmp' DUMP THE WORDS INTO A SEQUENTIAL FILE"
9170 PRINT " 'BUild' RE-BUILD THE WORDS FILE FROMA SEQUENTIAL FILE"
9180 PRINT " 'help' DISPLAY THIS EXPLANATION AGAIN"
9190 PRINT " 'ENd' EXIT FROM THIS PROGRAM"
9195
9200 REM ...... STATUS OF FILE
9230 PRINT "WORD DATA FILE (WORDS.DAT)";
9240 LOOKUP "WORDS.DAT", THERE
9250 IF(THERE=0) THEN ? " HAS NOT BEEN INITIALIZED YET." : GO TO END'COMMANDS
9260 ACTION$="O" : GOSUB FILE : IF(NERR > 0) THEN GO TO END'COMMANDS
9270 PRINT " HAS"; URECS-1; "WORDS";
9280 PRINT ", & ROOM FOR"; FRECS; "MORE WORDS."
9290
9400 REM ...... FINISH
9450 GO TO END'CLOSE
9470
9480
9490
9500 END'UPDATE:
9520 ACTION$="C" : GOSUB FILE
9530 PRINT "FINISHED"; TAB(-1,8); " "
9540 GO TO END'COMMANDS
9590
9600 END'CLOSE:
9650 ACTION$="C" : GOSUB FILE
9690
9700 END'COMMANDS:
9750 GO TO MAIN
9970
9980
9990
21000 !--------------------------!
21010 ! WORD LOOKUP SUBROUTINE !
21020 !--------------------------!
21030
21040 REM INPUT : CODE$ = WORD TO LOOK UP IN WORDS FILE
21050 REM OUTPUT : FOUND = +N IF WORD FOUND AT RECORD # N
21060 REM = -N IF WORD PRECEEDS RECORD # N
21090
21100 FIND'WORD:
21120
21130 LOREC=0
21140 HIREC=URECS
21190
21200 FW'LOOP:
21210 IF(LOREC+1=HIREC) THEN FOUND=-HIREC : LOREC=-HIREC : GO TO END'FW
21220
21230 REM ...... SPLIT SEARCH RANGE IN HALF
21240 RECNUM=INT( (HIREC+LOREC)/2 )
21250 READ #1, FWORD$
21260 IF(CODE$ <= FWORD$) THEN HIREC=RECNUM
21265 IF(CODE$ >= FWORD$) THEN LOREC=RECNUM
21270 FOUND=HIREC
21275 IF(LOREC <> HIREC) THEN GO TO FW'LOOP
21290
21400 END'FW:
21450 RETURN
21470
21480
21490
28000 !------------------------------------!
28010 ! FILES OPEN/CLOSE/LOCK SUBROUTINE !
28020 !------------------------------------!
28030
28040 REM INPUT : ACTION$ = O(PEN),L(OCK),C(LOSE)
28045 REM LOCKS$ = "Y" IF LOCKS USED , "N" IF NOT USED
28050 REM OUTPUT : NERR = +N IF N ERRORS FOUND
28090
28200 FILE:
28220 NERR=1
28230 IF(ACTION$="L") THEN GO TO LOCK'FILE
28240 IF(ACTION$="O") THEN GO TO OPEN'FILE
28250 IF(ACTION$="C") THEN GO TO CLOSE'FILE
28280 PRINT "ERROR---ILLEGAL ACTION CODE" : GO TO END'FILE
28290
28300 LOCK'FILE:
28320 IF(LOCK$="N") THEN GO TO OPEN'FILE
28330 IF(LOCK$<>"Y") THEN PRINT "ERROR---ILLEGAL LOCK CODE" : GO TO END'FILE
28340 MODE=0
28350 XCALL XLOCK,MODE,L1,L2
28360 IF(MODE=0) THEN GO TO OPEN'FILE
28370 PRINT "ERROR---JOB #"; MODE; "USING FILE" : GO TO END'FILE
28390
28400 OPEN'FILE:
28420 LOOKUP "WORDS.DAT", THERE
28430 IF(THERE=0) THEN PRINT "ERROR---WORDS.DAT NOT FOUND" : GO TO UNLOCK
28440 IF(THERE>0) THEN ? "ERROR---WORDS.DAT IS SEQUENTIAL" : GO TO UNLOCK
28450 OPEN #1, "WORDS.DAT", RANDOM, RECSIZ, RECNUM
28490
28500 REM ...... READ IN PARAMETERS & CHECK
28520 RECNUM=0
28530 READ #1, RECORD'ZERO
28540 IF(TBLOX<>-THERE) THEN ? "ERROR---BAD TBLOX VALUE" : GO TO CLOSE'FILE
28550 IF(BPREC<>RECSIZ) THEN ? "ERROR---BAD BPREC VALUE" : GO TO CLOSE'FILE
28560 FRECS=INT(512/BPREC)*TBLOX-URECS
28570 IF(FRECS<0) THEN PRINT "ERROR---BAD URECS VALUE" : GO TO CLOSE'FILE
28580 NERR=0 : GO TO END'FILE
28590
28700 CLOSE'FILE:
28710 CLOSE #1
28770 NERR=0
28790
28800 UNLOCK:
28820 MODE=2
28830 IF(LOCK$="Y") THEN XCALL XLOCK,MODE,L1,L2
28890
28900 END'FILE:
28950 RETURN
28970
28980
28990
29000 END'PROG:
29020 PRINT
29030 PRINT "[EXIT FROM WORDS MAINTENANCE PROGRAM]"
29050 END