00010 TRONB : REM ALLOW USER TO STOP PROGRAM 00020 REM PROGRAM CATLA.BAS, CREATES LBR/ARK/ARC CATALOG 00030 REM 00040 REM WRITTEN BY SAUL G. LEVY, TUCSON, ARIZONA, 12/20/87 00050 REM LAST CHANGED 5/5/88 00060 REM COPYRIGHT (C) SAUL G. LEVY 1988 00070 REM 00080 REM SEE CATLA.DOC AND THE MENU INFORMATION BELOW. 00090 REM LBR MEMBERS WERE 1ST GIVEN BY SD114 (OR SO) AND ARK/ARC BY SD125 00100 REM 00110 REM 00120 REM FOR ADD ENTRIES (SORTED) PLUS SECTION OF MASTLA.CAT, 00130 REM OR ONE LIST PAGE (37+1 BYTES EACH) 00140 CLEAR 4560 : REM 4560 MINIMUM, 24K (24576) IN .COM 00150 NumIndex=MEM/38 : REM # OF ENTRIES 00160 REM 00170 REM DIMENSIONS 00180 DIM TEXT$, 40 DUM$, 10 FDIR$, 13 FPT$ 00190 DIM 12 FCAT$, FTMP$, FBAK$, MemberNAME$, DISKNAME$, LBRARKNAME$ 00200 DIM 11 DISKNAME2$, 3 DISKNAME3$, Point(57) 00210 REM 00220 REM FILES 00230 FDIR$="B:DISK.DIR" : FCAT$="A:MASTLA.CAT" : FTMP$="A:MASTLA.TMP" 00240 FBAK$="A:MASTLA.BAK" : FPT$="A:POINTER.FIL" 00250 REM 00260 REM TURN OFF ERROR HANDLING SINCE WE DON'T KNOW THE NUMBER OF RECORDS 00270 ON ERROR GOSUB 65535 00280 REM 00290 SIZE=12 : REM TEXT$ POINTER 00300 PtOffset=33 : REM ASCII POINTER OFFSET (!=0, Z=57) 00310 REM 00320 REM MAIN MENU 00330 CLS 00340 PRINT "Program CATLA, creates MASTLA.CAT from DISK.DIR files" 00350 PRINT 00360 PRINT 00370 PRINT "Only LBR/ARK/ARC and the member files will be cataloged! Super" 00380 PRINT "Directory's DISK.DIR files are the input. Run SD on each logged-" 00390 PRINT "in, default drive disk (SD $AFL). SD ? for help" 00400 PRINT 00410 PRINT "The -DISKNAM.nnn must also exist and be in DISK.DIR! It will" 00420 PRINT "have an entry too" 00430 PRINT 00440 PRINT "MASTLA.CAT must be on drive A:, DISK.DIRs on B:" 00450 PRINT 00460 PRINT 00470 PRINT "[A]dd/Update [D]elete" 00480 PRINT "[L]ist Options Submenu [P]ointer Create" 00490 PRINT 00500 INPUT "Choose one (CR=Quit): ";DUM$ 00510 IF LEN(DUM$)=0 THEN END 00520 DUM$=UCASE$(DUM$) 00530 IF DUM$="A" THEN "ADD" 00540 IF DUM$="D" THEN "DELETE" 00550 IF DUM$="P" THEN "POINTER" 00560 IF DUM$<>"L" THEN RUN : REM RESTART PROGRAM 00570 PRINT 00580 PRINT 00590 PRINT 00600 PRINT "List Options Submenu:" 00610 PRINT 00620 PRINT "[D]isk Names [L]BR/ARK/ARC Names [S]elected" 00630 PRINT 00640 INPUT "Choose one (CR=Entire File): ";DUM$ 00650 DUM$=UCASE$(DUM$) 00660 DISKNAME$="" : DISKNAME2$="" : DISKNAME3$="" : DUM=0 : DUM1=0 : START=-1 00670 IF DUM$="D" THEN DISKNAME$="DISKNAME" : START=26 : GOTO "PRINTER" 00680 LONG IF DUM$="L" 00690 DISKNAME$="LBR" : DISKNAME2$="ARK" : DISKNAME3$="ARC" : START=10 00700 ENDIF 00710 LONG IF DUM$="S" 00720 START=0 00730 INPUT "Enter ONE character for START (!-Z): ";DISKNAME$ 00740 IF LEN(DISKNAME$)<>1 THEN 730 00750 DISKNAME$=UCASE$(DISKNAME$) 00760 PRINT "Enter ONE character for STOP (";DISKNAME$; 00770 INPUT "-Z): ";DISKNAME2$ 00780 IF LEN(DISKNAME2$)<>1 THEN 760 00790 DISKNAME2$=UCASE$(DISKNAME2$) 00800 DUM=ASC(DISKNAME$) : DUM1=ASC(DISKNAME2$) 00810 IF DUM>DUM1 THEN PRINT "EQUAL or GREATER!" : GOTO 760 00820 ENDIF 00830 IF LEN(DUM$)>0 AND START<0 THEN 640 00840 REM 00850 "PRINTER" 00860 REM 00870 PRINT 00880 INPUT "Printer output (Y, CR=N): ";DUM$ 00890 DUM$=UCASE$(DUM$) 00900 Device=0 : Page=46 : REM TO TERMINAL, ENTRIES/PAGE 00910 IF DUM$="Y" THEN Device=128 : REM TO PRINTER? 00920 PRINT 00930 ROUTE Device : REM SET OUTPUT 00940 LONG IF START<=0 : REM 2 COLUMNS 00950 IF Device THEN Page=120 00960 GOTO "LIST" 00970 XELSE 00980 Page=69 : REM TO TERMINAL, 3 COLUMNS 00990 IF Device THEN Page=180 01000 GOTO "SPECIAL LIST" 01010 ENDIF 01020 REM 01030 REM 01040 "ADD" : REM ADD/UPDATE ROUTINE 01050 REM 01060 REM 01070 REM OPEN DISK.DIR 01080 OPEN "I",1,FDIR$ 01090 IF ERROR=259 THEN ERROR=0 : GOTO "FILE ERROR" 01100 REM 01110 N=0 : REM # OF INDEX$ RECORDS FROM DISK.DIR 01120 Done=0 : REM EOF FLAG 01130 DISKNAME$="" : DISKNAME2$="" 01140 REM 01150 "READ DISK.DIR" 01160 REM 01170 REM READ HEADER RECORDS (HEADER AT END IF - 1ST CHARACTER) 01180 LINEINPUT#1,TEXT$ 01190 LONG IF ERROR=257 01200 ERROR=0 01210 DUM=INSTR(1,TEXT$,CHR$(26)) : REM REMOVE EOF AT END OF DISK.DIR 01220 IF DUM>0 THEN TEXT$=LEFT$(TEXT$,DUM-1) 01230 CLOSE 01240 Done=1 01250 ENDIF 01260 PRINT TEXT$ 01270 IF Done THEN "MASTLA CREATE" 01280 REM 01290 REM IF -DISKNAM, SAVE IT 01300 IF INSTR(1,TEXT$,"-") THEN DISKNAME$=LEFT$(TEXT$,SIZE) : GOSUB "DISK NAME" 01310 REM 01320 REM FIND 1ST LBR/ARK/ARC FILE 01330 IF INSTR(1,TEXT$,"Library directory") THEN "SAVE FILENAME" 01340 IF INSTR(1,TEXT$,"Archive directory") THEN "SAVE FILENAME" 01350 GOTO "READ DISK.DIR" 01360 REM 01370 "SAVE FILENAME" 01380 REM 01390 REM -DISKNAME EXISTS? 01400 IF DISKNAME$="" THEN "FILE ERROR" 01410 REM 01420 REM PUT LBR/ARK/ARC FILE NAME IN INDEX$ 01430 START=INSTR(1,TEXT$,".") 01440 LBRARKNAME$=MID$(TEXT$,START-8,SIZE) 01450 DUM$=LBRARKNAME$+","+DISKNAME2$+","+LBRARKNAME$ 01460 GOSUB "INDEX$ INSERT" 01470 REM 01480 "READ ENTRIES" 01490 REM 01500 START=1 : REM TEXT$ POINTER 01510 LINEINPUT#1,TEXT$ 01520 IF ERROR=257 THEN ERROR=0 : CLOSE : GOTO "MASTLA CREATE" 01530 PRINT TEXT$ 01540 IF TEXT$="" THEN "READ DISK.DIR" 01550 DUM=INSTR(1,TEXT$,"++ Not a lib") : DUM1=INSTR(1,TEXT$,"++ Not an ar") 01560 IF DUM OR DUM1 THEN "READ DISK.DIR" 01570 REM 01580 "SAVE ENTRIES" 01590 REM 01600 MemberNAME$=MID$(TEXT$,START,SIZE) 01610 DUM$=MemberNAME$+","+DISKNAME2$+","+LBRARKNAME$ 01620 GOSUB "INDEX$ INSERT" 01630 REM 01640 REM ANOTHER MEMBER? 01650 START=INSTR(START,TEXT$,":") 01660 IF START=0 THEN "READ ENTRIES" 01670 START=START+2 01680 GOTO "SAVE ENTRIES" 01690 REM 01700 "MASTLA CREATE" 01710 REM 01720 REM 01730 REM -DISKNAME EXISTS? 01740 IF DISKNAME$="" THEN "FILE ERROR" 01750 REM 01760 REM ON DRIVE A:? 01770 CLOSE : REM DISK.DIR/CREATION DONE 01780 PRINT 01790 PRINT "Reading MASTLA.CAT" 01800 OPEN "I",1,FCAT$ 01810 IF ERROR=0 THEN "OPEN OUTPUT" : REM EXISTS 01820 ERROR=0 01830 REM 01840 REM NOT FOUND, CREATE IT 01850 OPEN "O",1,FCAT$ 01860 PRINT#1,"()"+SPACE$(35) : REM FIXED LENGTH 01870 GOTO "MASTLA CREATE" 01880 REM 01890 "OPEN OUTPUT" 01900 REM 01910 REM OPEN OUTPUT FILE 01920 OPEN "O",2,FTMP$ 01930 REM 01940 REM KEEP () 1ST RECORD 1ST 01950 LINEINPUT#1,TEXT$ : PRINT#2,TEXT$ 01960 N1=1 : REM INDEX$ POINTER 01970 Done=0 : REM EOF FLAG 01980 REM 01990 "READ LOOP" 02000 REM 02010 J=0 : REM # OF MASTLA.CAT ENTRIES IN INDEX$ (AFTER N DISK.DIR ONES) 02020 PRINT "Reading..." 02030 REM 02040 "READ MASTLA" 02050 REM 02060 REM READ RECORD 02070 LINEINPUT#1,TEXT$ 02080 IF ERROR=257 THEN ERROR=0 : Done=1 : GOTO "WRITE LOOP" 02090 REM 02100 REM PUT IN INDEX$ IF NOT OLD ENTRY WITH SAME DISKNAM.NNN 02110 DUM$=MID$(TEXT$,14,SIZE-1) 02120 IF DUM$<>DISKNAME2$ THEN J=J+1 : INDEX$(J+N)=TEXT$ : GOTO 2140 02130 PRINT "Del: ";TEXT$ 02140 IF J+NN : REM NO NEW ENTRIES LEFT 02250 PRINT#2,TEXT$ 02260 IF ERROR=514 THEN ERROR=0 : GOTO "FILE ERROR2" 02270 GOTO 2420 02280 ENDIF 02290 LONG IF TEXT$=INDEX$(N1) : REM ADD NEW ENTRIES (IF = TOO) 02340 PRINT#2,INDEX$(N1) 02350 IF ERROR=514 THEN ERROR=0 : GOTO "FILE ERROR2" 02360 PRINT "Add: ";INDEX$(N1) 02370 N1=N1+1 02380 WEND 02390 IF TEXT$>INDEX$(N1-1) THEN PRINT#2,TEXT$ : REM SAVE OLD ENTRY 02400 IF ERROR=514 THEN ERROR=0 : GOTO "FILE ERROR2" 02410 ENDIF 02420 NEXT I 02430 IF Done=0 THEN "READ LOOP" 02440 ENDIF 02450 REM 02460 REM ANY NEW ENTRIES TO ADD? 02470 WHILE N1<=N 02480 PRINT#2,INDEX$(N1) 02490 IF ERROR=514 THEN ERROR=0 : GOTO "FILE ERROR2" 02500 PRINT "Add: ";INDEX$(N1) 02510 N1=N1+1 02520 WEND 02530 REM 02540 "RENAMING FILES" 02550 REM 02560 PRINT 02570 PRINT "Renaming files" 02580 CLOSE 02590 REM 02600 REM RENAME FILES, KILL OLD POINTER.FIL IF ANY ADD/DELETE 02610 KILL FBAK$ : ERROR=0 02620 RENAME FCAT$,FBAK$ 02630 RENAME FTMP$,FCAT$ 02640 IF N THEN KILL FPT$ : ERROR=0 02650 REM 02660 RUN : REM RESTART PROGRAM 02670 REM 02680 REM 02690 "DELETE" : REM DELETE ROUTINE 02700 REM 02710 REM 02720 CLS 02730 PRINT "You can DELETE anything within the MASTLA.CAT file (in the FILE" 02740 PRINT "NAME, DISK NAME, or LBR/ARK/ARC NAME fields)!" 02750 PRINT 02760 PRINT "To delete a DISK NAME, enter .nnn rather than just the nnn" 02770 PRINT "number. If you enter just a PERIOD or COMMA, EVERYTHING WILL BE" 02780 PRINT "DELETED! Entering only blanks won't be accepted!" 02790 PRINT 02800 PRINT "Manual deletions are only needed if you change a DISK NAME, or" 02810 PRINT "totally erase a disk and don't reuse the DISK NAME (including the" 02820 PRINT ".nnn number!). Updates TOTALLY REMOVE any OLD DATA with the same" 02830 PRINT "-DISKNAM.nnn. Other things must match EXACTLY what is in the" 02840 PRINT "MASTLA.CAT file!" 02850 PRINT 02860 LINEINPUT "What do you wish to DELETE (CR=Quit): ";DUM$ 02870 IF LEN(DUM$)=0 THEN RUN : REM RESTART PROGRAM 02880 DUM=LEN(DUM$) 02890 TEXT$=SPACE$(DUM) 02900 IF DUM$=TEXT$ THEN 2860 02910 PRINT 02920 REM 02930 REM OPEN FILES 02940 OPEN "I",1,FCAT$ : OPEN "O",2,FTMP$ 02950 REM 02960 REM KEEP 1ST () RECORD 1ST 02970 LINEINPUT#1,TEXT$ : PRINT#2,TEXT$ 02980 REM 02990 Done=0 : REM EOF FLAG 03000 N=0 : REM # OF DELETIONS 03010 REM 03020 "READ LOOP2" 03030 REM 03040 I=0 : REM # OF ENTRIES IN INDEX$ 03050 PRINT "Reading..." 03060 REM 03070 "READ MASTLA2" 03080 REM 03090 REM READ RECORD 03100 LINEINPUT#1,TEXT$ 03110 IF ERROR=257 THEN ERROR=0 : Done=1 : GOTO "WRITE LOOP2" 03120 REM 03130 REM INSERT INTO INDEX$ 03140 I=I+1 03150 INDEX$(I)=TEXT$ 03160 IF IDUM THEN Point(DUM1-PtOffset)=RecNUM+1 : DUM=DUM1 03580 GOTO "READ MASTLA3" 03590 REM 03600 "SAVE POINTER" 03610 REM 03620 FOR I= 0 TO 57 03630 WRITE#2,Point(I) 03640 IF ERROR=514 THEN ERROR=0 : GOTO "FILE ERROR2" 03650 NEXT I 03660 CLOSE 03670 RUN : REM RESTART PROGRAM 03680 REM 03690 REM 03700 "SPECIAL LIST" : REM -DISKNAMES OR LBR/ARK/ARC NAMES 03710 REM 03720 REM 03730 REM OPEN INPUT FILE 03740 Done=0 : REM EOF FLAG 03750 N=0 : N1=0 : N2=0 : N3=0 : REM COUNTERS 03760 OPEN "I",1,FCAT$ 03770 REM 03780 IF Page<100 THEN CLS : PRINT " Working...";CHR$(13); 03790 I=0 : REM # OF INDEX$ RECORDS 03800 REM 03810 "READ MASTLA4" 03820 REM 03830 REM FINISHED WITH PAGE? 03840 IF I=Page THEN "SPECIAL LIST PAGE" 03850 REM 03860 REM READ RECORD 03870 LINEINPUT#1,TEXT$ 03880 IF ERROR=257 THEN ERROR=0 : Done=1 : GOTO "SPECIAL LIST PAGE" 03890 N=N+1 03900 REM 03910 REM STORE OUTPUT IN INDEX$, FOR DISKNAME OR LBR 03920 DUM=INSTR(START,TEXT$,DISKNAME$) 03930 IF START=10 AND DUM>10 THEN "CHECK ARK" : REM NOT LBR 03940 LONG IF DUM>0 03950 N1=N1+1 03960 I=I+1 03970 INDEX$(I)=LEFT$(TEXT$,2*SIZE) 03980 GOTO "READ MASTLA4" 03990 ENDIF 04000 IF START=10 THEN "CHECK ARK" 04010 REM 04020 REM NO DISKNAMES AFTER MINUS FILES 04030 IF START=26 AND (INSTR(1,TEXT$,"-")=1 OR N1=0) THEN "READ MASTLA4" ELSE Done=1 : GOTO "SPECIAL LIST PAGE" 04040 REM 04050 "CHECK ARK" 04060 REM 04070 DUM=INSTR(START,TEXT$,DISKNAME2$) 04080 IF DUM>10 THEN "CHECK ARC" 04090 LONG IF DUM>0 04100 N2=N2+1 04110 I=I+1 04120 INDEX$(I)=LEFT$(TEXT$,2*SIZE) 04130 GOTO "READ MASTLA4" 04140 ENDIF 04150 REM 04160 "CHECK ARC" 04170 REM 04180 DUM=INSTR(START,TEXT$,DISKNAME3$) 04190 IF DUM>10 THEN "READ MASTLA4" 04200 LONG IF DUM>0 04210 N3=N3+1 04220 I=I+1 04230 INDEX$(I)=LEFT$(TEXT$,2*SIZE) 04240 ENDIF 04250 GOTO "READ MASTLA4" 04260 REM 04270 "SPECIAL LIST PAGE" 04280 REM 04290 WHILE I 04300 INDEX$(I+1)=" " : INDEX$(I+2)=" " : REM BLANK RECORDS FOR LAST PAGE 04310 IF FRAC(I/3.)>0 THEN I=I+1 : REM LAST PAGE FIX IF REMAINDER IS 1/3 04320 FOR J= 1 TO INT(I/3.+.7) 04330 PRINT INDEX$(J);" | ";INDEX$(J+INT(I/3.+.7));" | "; INDEX$(J+INT(2.*I/3.+.7)) 04340 NEXT J 04350 I=0 04360 WEND 04370 LONG IF Page<100 AND Done=0 04380 INPUT "Hit RETURN to continue ";DUM$ 04390 CLS : PRINT " Working...";CHR$(13); 04400 XELSE 04410 IF Done=0 THEN PRINT CHR$(12); 04420 ENDIF 04430 IF Done=0 THEN "READ MASTLA4" 04440 PRINT 04450 LONG IF START=26 04460 PRINT "DISK NAMES on file:";N1 04470 XELSE 04480 PRINT "Total FILES in catalog:";N-1 04490 PRINT "Total .LBR/.ARK/.ARCs:";N1+N2+N3 04500 PRINT "On file:";N1;".LBRs, ";N2;".ARKs, ";N3;".ARCs" 04510 ENDIF 04520 IF Page>100 THEN PRINT CHR$(12); 04530 ROUTE 0 04540 INPUT "Hit RETURN to continue ";DUM$ 04550 RUN : REM RESTART PROGRAM 04560 REM 04570 REM 04580 "LIST" : REM SELECTED LIST OR ENTIRE FILE 04590 REM 04600 REM 04610 IF Page<100 THEN CLS : PRINT " Working...";CHR$(13); 04620 REM 04630 REM READ POINTER FILE (SELECTED LIST) 04640 LONG IF DUM 04650 OPEN "I",1,FPT$ 04660 LONG IF ERROR=259 04670 ERROR=0 04680 PRINT "No POINTER.FIL file available!" 04690 INPUT "Hit RETURN to continue ";DUM$ 04700 RUN : REM RESTART PROGRAM 04710 ENDIF 04720 FOR I= 0 TO 57 04730 READ#1,Point(I) 04740 NEXT I 04750 CLOSE 04760 ENDIF 04770 REM 04780 REM OPEN INPUT FILE, SKIP 1ST RECORD () 04790 Done=0 : REM EOF FLAG 04800 OPEN "I",1,FCAT$,39 : REM FIXED LENGTH 04810 LINEINPUT#1,TEXT$ 04820 REM 04830 REM IF SELECTED LIST, SET 1ST RECORD POINTER (NEVER 0) 04840 LONG IF DUM 04850 LONG IF Point(DUM-PtOffset)>0 04860 RECORD #1,Point(DUM-PtOffset) 04870 XELSE 04880 Done=1 04890 GOTO "LIST PAGE" 04900 ENDIF 04910 ENDIF 04920 REM 04930 N=0 : REM # OF INDEX$ RECORDS 04940 REM 04950 "READ MASTLA5" 04960 REM 04970 REM READ RECORD 04980 LINEINPUT#1,TEXT$ 04990 IF ERROR=257 THEN ERROR=0 : Done=1 : GOTO "LIST PAGE" 05000 REM 05010 REM IF SELECTED LIST, IS RECORD PAST OUR RANGE? 05020 LONG IF DUM 05030 DUM2=ASC(TEXT$) 05040 IF DUM2>DUM1 THEN Done=1 : GOTO "LIST PAGE" 05050 ENDIF 05060 REM 05070 REM STORE IN INDEX$ 05080 N=N+1 05090 INDEX$(N)=TEXT$ 05100 REM 05110 REM FINISHED WITH PAGE? 05120 IF N0 05770 FOR I= 1 TO N 05780 IF INDEX$(I)