10  REM* ALLOWS GENERALIZED ENQUIRY BY EVERBODY, UPON XREF INDEX.
20  REM* PROTECTED PROGRAM, IN A000 LIBRARY.
30  REM*AUTHOR:  MR. W. DODDS,  APRIL/74, VSB.
40  REM* VERSION # 0.
50  REM********************
60  REM   DOCUMENTATION.
70  REM********************
80  REM* FIXED SIZE RECORD LAYOUTS (NOT PROTECTED.  IN A000 LIBRARY.).
90  REM* DESCRIPT/CAT:  INDEXF- F$,D,C(1)...C(X)./ INDEXC- C$,D.
100  REM*** VARIABLES.
110  REM*   C-CODES,D-DATE,S-SERVICE,V-VALID CODES,E-ERROR FLAG(1=YES).
120  REM*   T-THRESHOLD DATE,F-FOUND FLAG(1=YES,M-MAX CATEGORIES.
130  REM* X-MAX CATEGORY CODES PER INDEX ENTRY,K-LOOP ETC COUNTER.
140  REM*   N$-NAME,D$-DESCRIPT,F$-N$+D$,C$-CATEGORY,R$REPLY,R-SEARCH.
150  REM*******************
160  REM*** INTIALIZE.
170  REM*******************
180  FILES *,*
190  ASSIGN "$INDEXF",1,Z,"DESCRP"
200  ASSIGN "$INDEXC",2,Z,"CATGRY"
210  DIM V[999],C[10],R[10]
220  LET X=10
230  LET M=380
240  DIM F$[70],N$[6],D$[64],R$[40],C$[20]
241  LET Y=0
242  PRINT "DO YOU WANT INSTRUCTIONS";
243  INPUT R$
244  IF R$[1,1]="Y" THEN 247
245  IF R$[1,1]#"N" THEN 242
246  GOTO 248
247  LET Y=1
248  IF Y=0 THEN 380
250  PRINT "FROM CATEGORY CODES, RELEVANT PROGRAMS IN $LIBRARY CAN BE FOUND."
260  PRINT 
270  PRINT "MOST PROGRAMS SELF EXPLAIN WHEN RUN OR ELSE LISTED.  IF NOT, THEN"
280  PRINT "REFERENCES(ON HOW TO USE EACH OF THE PROGRAMS) CAN BE"
290  PRINT "SEEN BY VISITING THE COMPUTER CENTRE; OR ONE COPY PER"
300  PRINT "TEACHER WILL BE SENT TO SCHOOL, ON REQUEST, IF"
310  PRINT "POSSIBLE.  PHONE 327-7300 FOR DETAILS, RESERVATIONS, ETC."
320  PRINT 
330  PRINT "THE INDEX IS ALWAYS BEING IMPROVED."
340  PRINT "IF YOU WISH TO PROPOSE CHANGES/NEW DESCRIPTIONS,CODES,CATEGORIES,"
350  PRINT "OR PROGRAMS; THEN GET-$FORMDX, RUN,& FILL IT IN, SEND TO,"
360  PRINT "COMPUTER CENTRE, ROOM 219, JOHN OLIVER SEC. SCHOOL.  PLEASE USE"
370  PRINT "STANDARD FORMAT, SUBMITTED PROGRAMS: GET-$FORMAL & RUN (EXAMPLE)."
380  PRINT LIN(2)"PAUSES OF ONE MINUTE MAY OCCUR WHILE INDEX IS BEING SEARCHED."
390  LET K=0
400  IF  END #1 THEN 460
410  READ #1;F$,D
420  MAT  READ #1;C
430  IF F$[1,1]=" " THEN 410
440  LET K=K+1
450  GOTO 410
460  PRINT "TOTAL NUMBER OF PROGRAMS IN THE INDEX IS NOW";K
470  PRINT LIN(1)
475  IF Y=0 THEN 560
480  PRINT "SERVICES:"
490  PRINT " 1 - LIST WHOLE SET OF CATEGORIES AND CODES."
500  PRINT " 2 - DO PARTIAL LIST OF CATEGORIES AND CODES."
510  PRINT " 3 - LIST XREF INDEX (PARTIAL).  EXAMPLE: WHAT IS UNDER 'MATH' ?"
520  PRINT " 4 - SEARCH INDEX FOR SPECIFIC CODES. EG: WHAT IS UNDER 'ALGEBRA' ?"
530  PRINT " 5 - GET DESCRIPTION AND CODES FOR A SPECIFIED PROGRAM NAME."
540  PRINT " 6 - LIST ALL PROGRAMS CHANGED/NEW AS OF DATE SPECIFIED."
550  PRINT " 7 - END INDEX PROGRAM."
560  MAT V=ZER
570  LET K=1
580  IF  END #2 THEN 665
590  READ #2;C$,D
600  IF C$[1,1]=" " THEN 640
610  IF C$[1,1]="*" THEN 640
620  LET V[K]=1
630  GOTO 650
640  LET V[K]=0
650  LET K=K+1
660  GOTO 590
665  IF Y=0 THEN 730
670  PRINT "FOR SERVICES 1 TO 4, YOU WILL BE ASKED IF YOU WANT"
680  PRINT "TO OBTAIN ONLY CHANGED/NEW ITEMS, SPECIFY OLDEST DATE"
690  PRINT "DESIRED.  USE YYDDD FORMAT.  THUS: 74158 (DAY 158, 1974)."
700  REM**************************************************************
710  REM *** M A I N   L O G I C .
720  REM**************************************************************
730  PRINT LIN(1)"WHAT SERVICE NUMBER(1TO7) DO YOU WANT";
740  INPUT S
750  IF S<1 OR S>7 OR S#INT(S) THEN 780
760  GOSUB S OF 850,900,1350,1650,1800,2050,3560
770  GOTO 730
780  PRINT "INVALID."
790  GOTO 730
800  REM**************************************************************
810  REM *** R O U T I N E S .
820  REM**************************************************************
830  REM
840  REM*******************
850  REM *** LIST CATEGORIES & CODES.
860  REM*******************
870  LET C0=1
880  LET C9=M
890  GOTO 910
900  GOSUB 2260
910  GOSUB 2560
920  PRINT LIN(3)
930  PRINT "      CATEGORIES","JULIAN DATE:";TIM(2);TIM(3)+1900
940  PRINT LIN(1)
950  PRINT "CODES     CLASSIFICATIONS"
960  PRINT "=======   ==============="
970  PRINT LIN(2)
980  LET C=0
990  READ #2,1
1000  LET F=0
1010  IF  END #2 THEN 1260
1020  READ #2;C$,D
1030  LET C=C+1
1040  IF C<C0 OR C>C9 THEN 1020
1050  IF D<T THEN 1020
1060  IF C$[1,1]=" " THEN 1020
1070  IF C$[1,1]#"*" THEN 1190
1080  PRINT LIN(2)
1090  REM "690 PRINT C;" IF CONTROL PERSON NEEDS TO KNOW CODE.
1100  PRINT "**";
1110  FOR K=1 TO 20
1120  IF C$[K]#" " THEN 1140
1130  PRINT " ";
1140  PRINT C$[K,K];" ";
1150  NEXT K
1160  PRINT "***"
1170  PRINT 
1180  GOTO 1020
1190  IF C$[1,1]="-" THEN 1220
1200  PRINT 
1210  GOTO 1230
1220  PRINT " ";
1230  PRINT C;"    ";C$
1240  LET F=1
1250  GOTO 1020
1260  IF F#0 THEN 1290
1270  PRINT "NO CHANGES/NEW SINCE DATE:";T
1280  GOTO 1320
1290  PRINT LIN(3)
1300  PRINT "CATEGORIES WITHOUT LEFT HYPHEN ARE FOR MISCELLANEOUS."
1310  PRINT "THEY DO NOT CAUSE THOSE BELOW, WITH HYPHENS, TO BE LISTED."
1320  PRINT LIN(3)
1330  RETURN 
1340  REM******************
1350  REM*** LIST XREF INDEX.
1360  REM******************
1370  GOSUB 2260
1380  GOSUB 2560
1390  PRINT LIN(3);TAB(10);"LIST OF XREF'D INDEX, FROM CODE"C0"TO"C9"AFTER DATE"T
1400  GOSUB 2660
1410  FOR K=2 TO X
1420  LET R[K]=0
1430  NEXT K
1440  IF  END #2 THEN 1630
1450  READ #2,1
1460  FOR K=1 TO C0-1
1470  READ #2;C$,D
1480  NEXT K
1490  FOR C=C0 TO C9
1500  READ #2;C$,D
1510  IF C$[1,1]=" " THEN 1620
1520  IF C$[1,1]="*" THEN 1620
1530  PRINT LIN(1)"*********************************"
1540  IMAGE #,DDDXX
1550  PRINT "**  ";
1560  PRINT  USING 1540;C
1570  PRINT C$;TAB(31);"**"
1580  PRINT "*********************************"
1590  PRINT 
1600  LET R[1]=C
1610  GOSUB 2770
1620  NEXT C
1630  RETURN 
1640  REM******************
1650  REM*** DO SPECIAL SEARCH.
1660  REM******************
1670  GOSUB 3210
1680  GOSUB 2560
1690  PRINT LIN(2)"SEARCH OF INDEX, FOR SPECIFIED CODES:"
1700  FOR K=1 TO X
1710  IF R[K]=0 THEN 1730
1720  PRINT R[K];
1730  NEXT K
1740  PRINT "AFTER DATE"T
1750  GOSUB 2660
1760  PRINT 
1770  GOSUB 2770
1780  RETURN 
1790  REM******************
1800  REM*** LIST DESCRIPT/CODES, SPECIFIED PROGRAM NAME.
1810  REM******************
1820  PRINT "WHAT IS NAME OF PROGRAM";
1830  INPUT R$
1840  IF R$[1,1]="*" THEN 1990
1850  IF R$[1,1]#"$" THEN 1870
1860  LET R$=R$[2,LEN(R$)]
1870  IF LEN(R$)>6 THEN 1990
1880  LET N$="      "
1890  LET N$[1,LEN(R$)]=R$
1900  IF  END #1 THEN 2010
1910  READ #1,1
1920  READ #1;F$,D
1930  MAT  READ #1;C
1940  IF F$[1,6]#N$ THEN 1920
1950  PRINT LIN(2);"DESCRIPTION & CODES ";
1960  GOSUB 2660
1970  GOSUB 3060
1980  GOTO 2020
1990  PRINT "INVALID.  ";
2000  GOTO 1820
2010  PRINT "NAME NOT FOUND IN INDEX."
2020  PRINT 
2030  RETURN 
2040  REM******************
2050  REM ***LIST ALL PROGRAMS CHANGED/NEW AS OF DATE SPECIFIED.
2060  REM******************
2070  GOSUB 2560
2080  PRINT LIN(3)
2090  PRINT " ","LIST OF ALL PROGRAMS CHANGED/NEW AS OF DATE";T
2100  GOSUB 2660
2110  PRINT 
2120  IF  END #1 THEN 2190
2130  READ #1,1
2140  READ #1;F$,D
2150  MAT  READ #1;C
2160  IF D<T THEN 2140
2170  GOSUB 3060
2180  GOTO 2140
2190  RETURN 
2200  STOP 
2210  REM**************************************************************
2220  REM*** S U B R O U T I N E S .
2230  REM**************************************************************
2240  REM
2250  REM******************
2260  REM*** GET START, END CODES.
2270  REM******************
2280  PRINT "WHAT START CODE";
2290  INPUT C0
2300  LET C=C0
2310  GOSUB 2450
2320  IF E=0 THEN 2340
2330  GOTO 2280
2340  PRINT "WHAT END CODE";
2350  INPUT C9
2360  IF C9 >= C0 THEN 2390
2370  PRINT "INVALID.  ";
2380  GOTO 2340
2390  LET C=C9
2400  GOSUB 2450
2410  IF E=0 THEN 2430
2420  GOTO 2340
2430  RETURN 
2440  REM******************
2450  REM*** CHECK VALIDITY OF CODE C.
2460  REM******************
2470  FOR Z=1 TO M
2480  IF C=Z AND V[Z]=1 THEN 2530
2490  NEXT Z
2500  PRINT "INVALID.  ";
2510  LET E=1
2520  GOTO 2540
2530  LET E=0
2540  RETURN 
2550  REM******************
2560  REM*** ASK IF CUTOFF DATE DESIRED.
2570  REM******************
2580  REM
2590  PRINT "WHAT IS OLDEST DATE DESIRED (REPLY 0 IF ALL DATES)";
2600  INPUT T
2610  IF (T>74110. AND T<(TIM(3)*1000+TIM(2)) AND T=INT(T)) OR T=0 THEN 2640
2620  PRINT "INVALID."
2630  GOTO 2590
2640  RETURN 
2650  REM******************
2660  REM***PRINT TITLES, FOR INDEX LISTS.
2670  REM******************
2680  PRINT TAB(20)"UP TO DATE OF:"TIM(2);TIM(3)+1900
2690  PRINT LIN(2)"$ NAME    DESCRIPTION OF PROGRAM";
2700  PRINT "   ";
2710  PRINT "      CATEGORY CODES THAT APPLY"
2720  PRINT "======    ======================";
2730  PRINT "   ";
2740  PRINT "      ========================="
2750  RETURN 
2760  REM******************
2770  REM*** LIST INDEX ENTRIES THAT MATCH R(K), K=1 TO X; IF D>=T
2780  REM******************
2790  LET F=0
2800  IF  END #1 THEN 3010
2810  READ #1,1
2820  READ #1;F$,D
2830  MAT  READ #1;C
2840  IF D<T THEN 2820
2850  LET K1=K2=0
2860  FOR K3=1 TO X
2870  IF R[K3]=0 THEN 2950
2880  LET K2=K2+1
2890  FOR K4=1 TO X
2900  IF C[K4]=0 THEN 2950
2910  IF C[K4]#R[K3] THEN 2940
2920  LET K1=K1+1
2930  GOTO 2950
2940  NEXT K4
2950  NEXT K3
2960  IF K1=K2 THEN 2980
2970  GOTO 2820
2980  GOSUB 3060
2990  LET F=1
3000  GOTO 2820
3010  IF F#0 THEN 3040
3020  PRINT LIN(1)"NO PROGRAMS EXIST FOR CODES/DATES YOU REQUESTED."
3030  PRINT LIN(2)
3040  RETURN 
3050  REM******************
3060  REM*** PRINT PROGRAM NAME, DESCRIPT, CODES.
3070  REM******************
3080  PRINT F$[1,6];"  ";F$[7,38];
3090  IMAGE #,XDDD
3100  FOR K=1 TO 10
3110  IF C[K]=0 THEN 3150
3120  PRINT  USING 3090;C[K]
3130  NEXT K
3140  IF K >= 10 THEN 3160
3150  PRINT 
3160  IF F$[39,70]="                                " THEN 3180
3170  PRINT "        ";F$[39,70]
3180  PRINT 
3190  RETURN 
3200  REM******************
3210  REM*** GET CODES FOR SPECIAL SEARCH.
3220  REM******************
3230  PRINT "WHICH COMBINATION OF UP TO TEN CATEGORY CODE NUMBERS DO"
3240  PRINT "YOU WANT, ALL OF WHICH MUST BE MATCHED, FOR SELECTIVELY"
3250  PRINT "LISTING AN INDEX ITEM.  SPECIFY 0 TO INDICATE NO MORE."
3255  PRINT "JUST ONE CODE AT A TIME."
3260  MAT R=ZER
3270  PRINT 
3280  FOR K=1 TO X
3290  IF K=1 THEN 3310
3300  PRINT "NEXT ";
3310  PRINT "CODE";
3320  INPUT R[K]
3330  IF R[K]=0 AND K>1 THEN 3370
3340  GOSUB 3390
3350  IF E=1 THEN 3310
3360  NEXT K
3370  RETURN 
3380  REM******************
3390  REM*** VALIDITY CHECK ALL X CODES SPECIFIED, R(K).
3400  REM******************
3410  IF K=1 AND R[K]=0 THEN 3530
3420  IF R[K]#INT(R[K]) THEN 3530
3430  IF R[K]<0 OR R[K]>M THEN 3530
3440  LET K3=0
3450  FOR K1=1 TO X
3460  IF R[K1]#R[K] THEN 3480
3470  LET K3=K3+1
3480  NEXT K1
3490  IF K3>1 THEN 3530
3500  LET C=R[K]
3510  GOSUB 2450
3520  IF E=0 THEN 3550
3530  PRINT "INVALID.  ";
3540  LET E=1
3550  RETURN 
3560  END 
