1 ! QXEQ V29 CH/RSL 1977.10.31 ! V29: 1977.10/31/RSL: FIX SPOOKY .IF. BUG FOR HALLOWE'EN. ! V28: 1977.10.25/RSL: FIX FLOATING-POINT COMPARISONS. ! V27: 1977.10.19/RSL: FIX .FORALL. IN NO ASSOCIATION CASE. ! V26: 1977.09.16/RSL: ADD .REJECTS. COMMAND STUFF. ! V25: 1977.07.21/RSL: CHANGE TEMP FILE NAMES AND K$ TO K8$ ! V24: 1977.06.13/RSL: CHANGE TO LOGICAL DIRECTORY NAMES ! V23: 1977.05.24/RSL: INTERFACE TO V6B LOGGER ! V22: 1977.04.06/RSL: CLEAN UP FROM ERRORS, .PRINT. FIX ! V21: 1977.03.25/RSL: .EACH. ! V20: 1977.03.24/RSL: GENERAL CLEAN-UP FOR QUERY.V20 ! V19, V18: < < < WITHDRAWN > > > 2 ! V17: 1977.01.05/RSL: LOG QUERY MESSAGES ! V16: 1977.01.04/RSL: FIX TOO-LONG-FORMAT BUG ! LAST MODIFIED 23 SEPT 1976 BY R. LAMSON ! LAST MODIFIED 12 NOV 1976 BY R. LAMSON 3 ! ! REQUIRES THE LEADS FUNCTION PACKAGES: ! 'FNA', 'FNB', 'FNC', 'FND' ! 4 ! ! DOES NOT USE: FNO2%, FNP2$, FNA1%, FNI1$ ! 5 ! ! SECOND PART OF INFORMATION RETRIEVAL LANGUAGE ! 6 ! ! REQUIRES THE LEADS FUNCTION PACKAGES: ! 'FNA', 'FNB', 'FNC', 'FND' ! 7 ! ! DOES NOT USE: FNO2%, FNP2$, FNA1%, FNI1$, FNT1$ ! 8 ! ! THE LEADS PROGRAM "QUERY" MUST RESIDE IN THE SYSTEM LIBRARY ! FOR "QXEQ" TO FUNCTION PROPERLY. ! 9 ! ! A SOFTWARE PRODUCT OF: ! PROJECT LEADS AND THE LEXINGTON PUBLIC SCHOOLS ! 10000 DEF FNQ$(Q$)=Q$ + MID(NUM$(100%+ASCII(SYS(CHR$(6%)+CHR$(-3%)))/2%),3%,2%) + '.TMP' : I8$=SYS(CHR$(6%)+CHR$(-7%)) : C0$=CHR$(0%) 10020 DIM #12%, B6%(7%,50%), B7%(12%,12%), B7$(12%)=32%, C%(200%), L$(64%)=64%, C$(16%)=256%, K0$(1%)=64%, F%(10%), C6%(12%,20%), C6$(12%,20%)=64% 10025 OPEN FNQ$('QXEQ') FOR INPUT AS FILE #12% : B9%(I8%,I9%)=B7%(I8%,I9%) FOR I9%=1% TO 12% FOR I8%=1% TO 12% : C0%=C%(0%) : C8%=F%(4%) : C9%=F%(5%) : B8%(I8%,I9%)=B6%(I8%,I9%) FOR I8%=0% TO 7% FOR I9%=0% TO B6%(0%,0%) 10045 ! ! OPEN ALL THE NECESSARY FILES ! 10050 FOR I8%=1% TO 11% : GOTO 10070 IF B7$(I8%)='' 10055 IF B9%(9%,I8%)<=0% THEN OPEN B7$(I8%) AS FILE I8% ELSE C8%(I8%,I9%)=C6%(I8%,I9%) FOR I9%=1% TO B9%(11%,I8%) : C8$(I8%,I9%)=C6$(I8%,I9%) FOR I9%=1% TO B9%(11%,I8%) : OPEN B7$(I8%) FOR INPUT AS FILE I8%, MODE 1% 10060 IF I8%>1% THEN GET #I8%, RECORD 1% : UNLOCK #I8% 10065 ! ! SET THINGS UP, PROCESS THE COMMAND, PRINT THE RESULT ! 10070 NEXT I8% : K8$(I8%,I9%)=K0$(I9%) FOR I9%=0% TO 1% FOR I8%=1% TO 12% : P%,L%=0% : I8$=FNV$ : B7% (0%, 0%) = 0% : PRINT '** ';FND$(I8$,T%);' **' 10115 ! ! SAVE THE CHANGES IN THE CONTROL BLOCKS ! 10120 B9%(7%,I8%)=0% FOR I8%=1% TO 12% : CLOSE #12% 10125 ! ! AND RETURN TO 'QUERY' ! 10130 I8%=FNC2%(0%) : I8$ = SYS (CHR$ (6%)+CHR$(22%)+CHR$(-1%)+CHR$(0%)+ 'SYSLOG' + STRING$ (10%,0%) + CVT%$ (33%) + 'QUERY: ' + 'REAL TIME:' + NUM$ (TIME(0%)-T0) + 'CPU TIME:' + NUM$ ((TIME(1%)-T1)*.1)) 10140 CHAIN 'LEADS:QUERY.BAC' 20000% 15000 ! ! F N V $ ! ! PROCESS A COMMAND OR SUBCOMMAND ! 15010 DEF FNV$ : X1%=0% : P%=P%+2% : X2%=C%(P%-1%) : ON C%(P%) GOTO 15030,15020,15170,15030,15160,15170,15180,15190,15200,15210,15213 15015 ! ! .IF. COMMAND: SET UP POINTER FILE FOR OUTPUT ! 15020 X1%=FNO1%(0%,-8%,FNQ$('PTRQ'),0%) : R1%=0% : R1%=FNO1%(0%,-8%,FNQ$('REJQ'),0%) IF B7%(0%,1%) 15025 ! ! SET UP A SOURCE OF RECORDS FOR THE COMMAND ! 15030 L%=L%+1% : P%=P%+2% : X1%(L%)=P% : X2%(L%)=X1% : C%,C%(P%)=C%(P%)+256%*C%(P%-1%) : C%(P%-1%)=0% : C%(P%),C%=FNA%(C%(X1%(L%-1%)),L$(-C%)) IF C%<0% : I8%=FNI%(C%) : ON X2%-10% GOTO 15040,15060,15080,15100,15130 15035 ! ! .ALL. ! 15040 IF FNN% THEN FNV$=CHR$(-1%) ELSE IF ASCII(FNV$) THEN 15040 ELSE FNV$=C0$ 15050 GOTO 15150 15055 ! ! .ANY. ! 15060 IF FNN% THEN FNV$=C0$ ELSE IF ASCII(FNV$) THEN FNV$=CHR$(-1%) ELSE 15060 15070 GOTO 15150 15075 ! ! .COUNT. ! 15080 IF FNN% THEN FNV$=CVT%$(X2%(L%)) : T%=3% : GOTO 15150 15090 X2%(L%)=X2%(L%)+1% IF ASCII(FNV$) : GOTO 15080 15095 ! ! .IF.; STORE FILE INTO WHICH IT POINTS ! 15100 IF NOT FNN% THEN 15120 ELSE I8=FNN1(X2%(L%)) : T%=4% : FNV$=CVTF$(I8) : I8%,F%(0%)=(I8<>0.) : I8$=SYS(CHR$(8%)+FNQ$('PTRQ')) IF I8% : I8%=C%(X1%(L%)) : I9%=15% AND I8%/64% : IF (I8% AND 48%)=0% THEN B7$(I9%)='' : B7%(I8%,I9%)=0% FOR I8%=0% TO 12% 15105 B7% (0%, 0%) = 0% : KILL FNQ$('PT1Q') 15110 GO TO 15150 15115 ! ! SET THE POINTER FOR THE APPROPRIATE RECORDS ! 15120 I8%=ASCII(FNV$) : X2%=R1% : X2%=X2%(L%) IF I8% : GO TO 15100 UNLESS X2% : FIELD #X2%, FNE1%(X2%)+B9%(3%,X2%)-5% AS I8$, 5% AS I8$ : I8%=C%(X1%(L%)) AND 15% : LSET I8$=CVT%$(B9%(9%,I8%))+FNP$(I8%) : GOTO 15100 15125 ! ! .PRINT. ! 15130 IF FNN% THEN FNV$=CVTF$(X2%(L%)) : T%=4%+5%*(L%<>1%) : CLOSE #1% IF L%=1% : P%=C0% : GOTO 15150 15140 UNTIL P%>=C0% : T%=0% : P%=P%+2% IF C%(P%+2%)<8% : I8$=FNV$ : PRINT #1%, ' '; IF POS(1%) UNLESS T%<0% IF T%<>6% : PRINT #1%, FND$(I8$,T%); UNLESS T% < 0% : NEXT : X2%(L%)=X2%(L%)+1% : GOTO 15130 15145 ! ! EXIT FROM CMMAND WHICH HAD A SOURCE OF RECORDS ! 15150 L%=L%-1% : GOTO 15300 15155 ! ! .NOT. ! 15160 FNV$=CHR$(NOT ASCII(FNV$)) : GOTO 15300 15165 ! ! LOGICAL AND COMPARISON OPERATORS: ! 15170 ON X2% GOSUB 15220,15230,15240,15250,15260,15270,15275,15280,15290 : T%=7% : GOTO 15300 15175 ! ! , ! 15180 I8$=FNV$ : I8$ = FND$ (I8$, T%) IF T% >= 0% : FNV$=FNV$ : GOTO 15300 15185 ! ! GET CONTENTS OF A FIELD ! 15190 FNV$=FNK1$(FNG2$(X2%),X2%) : T%=B8%(6%,X2%) : GOTO 15300 15195 ! ! LITERAL ! 15200 FNV$=L$(X2%) : T%=0% : GOTO 15300 15205 ! ! UNQUOTED LITERAL ! 15210 L$(X2%),FNV$=FNC$(L$(X2%),T%) : C%(P%)=9% : GOTO 15300 15212 ! ! .USING. ! 15213 L0$=L$(X2%) : FNV$="" : T%=-1% : GO TO 15300 15215 ! ! >= .GE. ! 15220 I8$=FNV$ \ IF T%=4% THEN FNV$ = CHR$ (CVT$F(I8$) >= FNV) : RETURN 15222 FNV$=CHR$(I8$>=FNV$) : RETURN 15225 ! ! = .EQ. ! 15230 I8$=FNV$ \ IF T%=4% THEN FNV$ = CHR$ (CVT$F(I8$) = FNV) : RETURN 15232 FNV$=CHR$(I8$=FNV$) : RETURN 15235 ! ! > .GT. ! 15240 I8$=FNV$ \ IF T%=4% THEN FNV$ = CHR$ (CVT$F(I8$) > FNV) : RETURN 15242 FNV$=CHR$(I8$>FNV$) : RETURN 15245 ! ! < .LT. ! 15250 I8$=FNV$ \ IF T%=4% THEN FNV$ = CHR$ (CVT$F(I8$) < FNV) : RETURN 15252 FNV$=CHR$(I8$ .NE. ! 15260 I8$=FNV$ \ IF T%=4% THEN FNV$ = CHR$ (CVT$F(I8$) <> FNV) : RETURN 15262 FNV$=CHR$(I8$<>FNV$) : RETURN 15265 ! ! <= .LE. ! 15270 I8$=FNV$ \ IF T%=4% THEN FNV$ = CHR$ (CVT$F(I8$) <= FNV) : RETURN 15272 FNV$=CHR$(I8$<=FNV$) : RETURN 15274 ! ! .INCLUDES. ! 15275 FNV$=CHR$(INSTR(1%,FNV$,FNV$)<>0%) : RETURN 15279 ! ! .AND. ! 15280 FNV$=CHR$(ASCII(FNV$) AND ASCII(FNV$)) : RETURN 15285 ! ! .OR. ! 15290 FNV$=CHR$(ASCII(FNV$) OR ASCII(FNV$)) : RETURN 15300 FNEND 15305 ! ! F N N % ! ! GET NEXT RECORD FROM A SOURCE ! 15310 DEF FNN% : IF FNX%(C%(X1%(L%))) THEN FNN%=-1% ELSE P%=X1%(L%) : FNN%=0% 15320 FNEND 15998 ! ! F N D $ ! ! CHANGE A STRING INTO READABLE FORM ! 16000 DEF FND$(F$,T%) : IF T% >= 0% THEN ON T%+1% GOTO 16010,16075,16020,16030,16040,16080,16110,16050,16070 ELSE GO TO 16140 16005 ! ! NO CONVERSION ! 16010 FND$=F$ : GOTO 16140 16015 ! ! $BYTE ! 16020 FND$=FND0$(ASCII(F$),3%) : GOTO 16140 16025 ! ! $INTEGR ! 16030 FND$=FND0$(CVT$%(F$),6%) : GOTO 16140 16035 ! ! $FLOAT ! 16040 IF LEN(L0$)=0 THEN FND$=NUM1$(CVT$F(F$)) : GOTO 16140 16042 PRINT #1%, USING L0$, CVT$F(F$); : L0$,FND$="" : GO TO 16140 16045 ! ! $FLAG ! 16050 FND$ = "FALSE" : FND$ = "TRUE " IF ASCII (F$) : GO TO 16140 16065 ! ! $DATE ! 16070 FND$=FND1$(F$) : GOTO 16140 16072 ! ! $SP ! 16075 FND$=CVT$$(F$,156%) : GOTO 16140 16077 ! ! $TIME ! 16080 FND$=TIME$(1440%-CVT$%(F$)) : GOTO 16140 16105 ! ! $POINTR ! 16110 I8%=FNG1%(B8%(7%,X2%),CVT$%(F$),ASCII(RIGHT(F$,3%))) : FND$='' : GOTO 16140 16140 FNEND 16145 ! ! RIGHT JUSTIFY A VARIABLE LENGTH STRING ! 16150 DEF FND0$ (F%, L%) : I8$ = SPACE$ (L%) : RSET I8$ = CVT$$ (NUM$ (F%), 2%) : FND0$ = I8$ : FNEND 16155 ! ! CONVERT A READABLE STRING TO INTERNAL FORMAT ! 16160 DEF FNC$ (F$, T%) : ON T%+1% GO TO 16240, 16240, 16170, 16180, 16190, 16220, 16240, 16200, 16210 16165 ! ! $BYTE ! 16170 F$=CHR$(VAL(F$)) : GOTO 16240 16175 ! ! $INTEGR ! 16180 F$=CVT%$(VAL(F$)) : GOTO 16240 16185 ! ! $FLOAT ! 16190 F$=CVTF$(VAL(F$)) : GOTO 16240 16195 ! ! $FLAG ! 16200 F$ = CHR$ (F$ > 'OOPS') + ' ' : GO TO 16240 16205 ! ! $DATE ! 16210 F$=FND2$(F$) : GOTO 16240 16215 ! ! $TIME ! 16220 F$=FNT2$(F$) : GOTO 16240 16240 FNC$=F$ 16250 FNEND 17000 DEF FNV = CVT$F (FNV$) 19999 ! ! ENTRY POINT FROM "QUERY" ! 20000 T0 = TIME (0%) : T1 = TIME (1) : GOTO 1000 29010 IF ERR = 5% AND ERL = 15105% THEN RESUME 15110 29020 IF ERR = 28% THEN PRINT 'RECOVERY IN PROGRESS -- PLEASE WAIT' : RESUME 10120 29030 IF ERR = 5% AND ERL = 10130% THEN RESUME 10140 29955 ! ! FAIL GRACEFULLY ON DBMS ERRORS ! 29960 E8%=0% : GOTO 10120 32767 END