MACRO 00070002 &TAG SRCH &TREE,&A=,&K=,&Y=,&N=,&NULL=,&T=,&REL=, X00140002 &SARG=,&EQUAL=,&UNEQUAL=,&TYPE=,&KEYL= 00210002 .*A000000 Y02147 00280002 .* THE MEANINGS OF THE PARAMETERS FOR THE SRCH MACRO-INSTRUCTION ARE * 00350002 .* AS FOLLOWS: * 00420002 .*--------------------------------------------------------------------* 00490002 .* &TREE IS THE ADDRESS OF THE RADIX PARTITION TREE. * 00560002 .* IF "TREE" IS CODED, WHERE "TREE" IS A SUITABLE OPERAND FOR * 00630002 .* A LOAD ADDRESS INSTRUCTION, THE THE MAIN STORAGE LOCATION * 00700002 .* SO SPECIFIED IS PRESUMED TO CONTAIN THE ADDRESS OF THE RPT * 00770002 .* AS RETURNED BY THE STREE MACRO-INSTRUCTION. * 00840002 .* * 00910002 .* IF "(GPR)" IS CODED, THEN THE INDICATED REGISTER HAS THE * 00980002 .* ADDRESS OF THE RPT IN IT. * 01050002 .* * 01120002 .* THE TREE ADDRESS IS LOADED INTO REGISTER 1 BY THE SRCH * 01190002 .* MACRO, SO THAT IF "(1)" IS CODED NO LOAD OR LR IS * 01260002 .* GENERATED. * 01330002 .* * 01400002 .* IF THE PARAMETER IS NOT CODED, THE MNOTE "TREE PARAMETER * 01470002 .* MISSING, ASSUMED IN R1." IS GENERATED WITH SEVERITY O, AND * 01540002 .* THE ADDRESS OF THE RPT IS ASSUMED TO BE IN REGISTER 1. * 01610002 .*--------------------------------------------------------------------* 01680002 .* &T IS THE TYPE OF THE RPT. SEE THE DESCRIPTION OF THE STREE * 01750002 .* MACRO INSTRUCTION FOR THE COMPLETE LIST OF OPERATIONS * 01820002 .* AVAILABLE WITH THE DIFFERENT TYPES OF TREES. * 01890002 .* * 01960002 .* THE ONLY ALLOWED WAYS TO CODE THE T-PARAMETER ARE: * 02030002 .* T=5 FOR TYPE 5 RPT. * 02100002 .* T=8 FOR TYPE 8 RPT. * 02170002 .* IF THE T-PARAMETER IS NOT CODED A DEFAULT OF T=8 IS SUPPLIED* 02240002 .*--------------------------------------------------------------------* 02310002 .* &A SPECIFIES THE ADDRESS OF THE RECORD OR CONTROL BLOCK * 02380002 .* CONTAINING THE KEY TO BE USED IN THE SEARCH. * 02450002 .* THE A-PARAMETER, TOGETHER WITH THE K-PARAMETER, DEFINES * 02520002 .* THE SEARCH KEY. * 02590002 .* * 02660002 .* IF "A=ADDRESS" IS CODED, WHERE "ADDRESS" IS A MAIN STORAGE * 02730002 .* LOCATION, THEN THE ADDRESS OF THE FIRST BYTE OF THE RECORD * 02800002 .* IS FORMED WITH A LOAD ADDRESS INSTRUCTION. * 02870002 .* * 02940002 .* IF "A=(GPR)" IS CODED, THEN THE ADDRESS OF THE FIRST BYTE * 03010002 .* OF THE RECORD IS IN THE SPECIFIED REGISTER. * 03080002 .* * 03150002 .*--------------------------------------------------------------------* 03220002 .* &K SPECIFIES THE SEARCH KEY, WHEN TAKEN IN COMBINATION WITH * 03290002 .* THE A-PARAMETER. AT LEAST ONE OF THESE TWO PARAMETERS MUST * 03360002 .* ALWAYS BE CODED, OR THE MNOTE "A OR K MUST BE CODED." IS * 03430002 .* GENERATED, WITH A SEVERITY CODE OF 12. * 03500002 .* * 03570002 .* THE FOLLOWING COMBINATIONS ARE VALID: * 03640002 .* --- --------- ------------ --- ------ * 03710002 .* * 03780002 .* "K=(DISPLACEMENT,LENGTH)", WHERE "DISPLACEMENT" IS EITHER * 03850002 .* A RELOCATABLE EXPRESSION OR A SELF-DEFINING ABSOLUTE * 03920002 .* DECIMAL NUMBER SPECIFYING EITHER THE ADDRESS OF BYTE ZERO * 03990002 .* OF THE KEY OR THE DISPLACEMENT FROM THE ADDRESS SPECIFIED * 04060002 .* BY THE A-PARAMETER TO THE FIRST BYTE OF THE KEY. * 04130002 .* "LENGTH" IS AN ABSOLUTE EXPRESSION GIVING THE LENGTH OF * 04200002 .* THE KEY. FOR TYPE 5 RPT, "LENGTH" IS A DECIMAL NUMBER. * 04270002 .* * 04340002 .* FOR TYPE 5 RPT, THE KEY LENGTH CANNOT BE GREATER THAN 16. * 04410002 .* FOR TYPE 8 RPT, THE KEY LENGTH CANNOT BE GREATER THAN 256. * 04480002 .* * 04550002 .* IF THE A-PARAMETER IS CODED, THE ADDRESS OF THE FIRST * 04620002 .* BYTE OF THE KEY IS FORMED BY ADDING THE DISPLACEMENT TO THE* 04690002 .* ADDRESS FROM THE A-PARAMETER. THE DISPLACEMENT MUST NOT * 04760002 .* EXCEED 4095. * 04830002 .* * 04900002 .* IF THE A-PARAMETER IS CODED AND THE K-PARAMETER IS NOT * 04970002 .* CODED, THE THE K-PARAMETER IS ASSUMED TO BE THE SAME AS THE* 05040002 .* K-PARAMETER THAT WAS CODED IN THE STREE MACRO WHEN THE RPT * 05110002 .* WAS CREATED. * 05180002 .*--------------------------------------------------------------------* 05250002 .* &Y IS THE ADDRESS TO BRANCH TO IF THE SEARCH KEY IS EQUAL TO * 05320002 .* THE KEY FOUND BY THE SEARCH. * 05390002 .* IF "Y=(GPR)" IS CODED, THEN THE ADDRESS TO BRANCH TO IF * 05460002 .* THEY ARE EQUAL IS IN THE SPECIFIED GPR. * 05530002 .* IF THE Y-PARAMETER IS NOT CODED, THEN EXECUTION CONTINUES * 05600002 .* WITH THE NEXT INSTRUCTION AFTER THE SRCH MACRO. * 05670002 .*--------------------------------------------------------------------* 05740002 .* &N IS THE ADDRESS TO BRANCH TO IF THE SEARCH KEY IS NOT EQUAL * 05810002 .* TO THE KEY FOUND BY THE SEARCH. IT IS CODED THE SAME WAY * 05880002 .* THE Y-PARAMETER IS CODED. * 05950002 .* NOTE THAT IF THE RPT HAS NO ENTRIES IN IT THE SEARCH KEY * 06020002 .* IS CONSIDERED NOT EQUAL. * 06090002 .*--------------------------------------------------------------------* 06160002 .* &NULL IS THE ADDRESS TO BRANCH TO IF THERE ARE NO SINKS IN THE * 06230002 .* RPT. IT IS CODED IN THE SAME WAY AS THE N AND Y * 06300002 .* PARAMETERS. IF BOTH THE NULL AND N PARAMETERS ARE CODED * 06370002 .* AND THE RPT IS EMPTY A BRANCH TO THE NULL ADDRESS IS TAKEN.* 06440002 .* * 06510002 .*--------------------------------------------------------------------* 06580002 .* &REL IS A QUALIFIER SPECIFYING THE RELATIONSHIP BETWEEN THE * 06650002 .* SEARCH KEY AND THE KEY TO BE FOUND. * 06720002 .* * 06790002 .* THE REL PARAMETER IS CODED AS FOLLOWS: * 06860002 .* * 06930002 .* ** ** ** ** ** ** * 07000002 .* ** ** ** ** LT ** ** * 07070002 .* ** ** MAX ** ** LE ** ** * 07140002 .* ** ** ** ** EQ ** ** * 07210002 .* REL= ** ** MIN ** ,, ** -- ** ** * 07280002 .* ** ** --- ** ,, ** GE ** ** * 07350002 .* ** ** ** ,, ** GT ** ** * 07420002 .* ** ** POV ** ,, ** POV ** ** * 07490002 .* ** ** ** ,, ** ** ** * 07560002 .* ,, * 07630002 .* * 07700002 .* THUS "REL=(MAX,LE)" IMPLIES A SEARCH FOR THE LARGEST KEY * 07770002 .* THAT IS LESS THAN OR EQUAL TO THE SEARCH KEY. * 07840002 .* * 07910002 .* WHEN THE REL PARAMETER IS CODED THE KEY LENGTH MUST BE * 07980002 .* CODED EXPLICTLY IN THE K PARAMETER. * 08050002 .*--------------------------------------------------------------------* 08120002 .* WHEN "REL=(MAX/MIN,POV)" IS CODED, A SEARCH IS MADE TO FIND* 08190002 .* THE LARGEST OR SMALLEST PARTIAL ORDER VALUE. * 08260002 .* WHEN "REL=(POV,GE)" IS CODED A SEARCH TO FIND A PARTIAL * 08330002 .* ORDER VALUE THAT IS GREATER THAN OR EQUAL TO THE SEARCH * 08400002 .* KEY, BUT IS THE SMALLEST THAT CAN BE SO DETERMINED * 08470002 .* EFFICIENTLY (NOT NECESSARILY THE SMALLEST POSSIBLE). * 08540002 .*--------------------------------------------------------------------* 08610002 .* ONLY THE FOLLOWING COMBINATIONS ARE VALID: * 08680002 .* * 08750002 .* REL=(MAX,LT/LE/EQ/POV) * 08820002 .* REL=(MIN,EQ/GE/GT/POV) * 08890002 .* REL=(POV,GE) MEANS FIND MIN POV>=KEY. * 08960002 .*--------------------------------------------------------------------* 09030002 .* REL=(POV,EQ) MEANS FIND POV FOR THE SINK ADDRESSED BY THE * 09100002 .* CURRENT SETTING OF THE CURSOR. * 09170002 .*--------------------------------------------------------------------* 09240002 .* &SARG THESE ARE ONLY PRESENT FOR COMPATIBILITY WITH EARLIER * 09310002 .* &EQUAL VERSIONS, AND SHOULD NOT BE USED. * 09380002 .* &UNEQUAL * 09450002 .* &TYPE * 09520002 .* &KEYL * 09590002 GBLC &IGABLST THE BEGINNING OF THE LIST OF ENTRY POINTS FOR *09660002 THE RPT OPERATIONS. 09730002 GBLC &IGASRCH 09800002 GBLC &IGADDR THE ADDRESS OF THE MODULE IGARPTXX. 09870002 GBLC &IGARPT# THE RADIX PARTITION TREE TYPE. 09940002 GBLA &IGAPATH(16) PATH VECTOR IN BIG PARSE TREE. 10010002 GBLA &IGALEVL PATH LENGTH TO ATOM IN PARSE TREE. 10080002 GBLA &IGALEFT(256) LEFT EDGE FIELDS IN PARSE TREE. 10150002 GBLA &IGARGHT(256) RIGHT EDGE FIELDS IN PARSE TREE. 10220002 GBLA &IGAX EOP TRIPLE FOR THE BINARY PARSE TREE WITH 10290002 GBLA &IGAY SUBTRACTION INVERTIBLE EDGES GENERATED BY 10360002 GBLA &IGAZ THE MACRO-INSTRUCTION RPTDSECT. 10430002 GBLA &IGAKEYL THE LENGTH OF THE SEARCH KEY. 10500002 GBLC &IGAGPV BRANCH ENTRY OFFSET TO GET THE PARTIAL ORDER 10570002 .* VALUE FOR THE CURSOR-SELECTED SINK (TYPE 9 RPT) 10640002 GBLC &IGAPVS BRANCH ENTRY OFFSET TO THE ROUTINE IN IGARPT01 10710002 .* TO SEARCH FOR A PARTIAL ORDER VALUE THAT IS 10780002 .* GREATER THAN OR EQUAL TO THE SEARCH KEY. 10850002 GBLC &IGAEOPV THE OFFSET TO THE PATH CODE BYTE IN THE TYPE 8*10920002 RPT HEADER FOR THE PATH TO THE SINK CURRENTLY *10990002 SELECTED BY THE CURSOR. 11060002 GBLC &IGACNT5 THE OFFSET TO THE USE COUNTER IN THE TYPE 5 *11130002 RPT HEADER. 11200002 GBLC &IGAMSK5 THE OFFSET TO THE TABLE OF MASKS FOR TYPE 5 *11270002 RPT. 11340002 GBLC &IGATOP5 THE OFFSET TO THE RPT SOURCE IN THE TYPE 5 RPT*11410002 HEADER. 11480002 GBLC &IGAMAX THE OFFSET TO THE WORD CONTAINING THE MAXIMUM *11550002 PARTIAL ORDER VALUE. 11620002 GBLC &IGAKEYW THE OFFSET TO THE WORD CONTAINING THE ADDRESS *11690002 OF THE WORK AREA FOR COLLECTING KEYS. 11760002 GBLB &IGAOKAY ON IF THE PARSE IN RPTDSECT DID NOT FIND ANY *11830002 SYNTAX ERRORS IN THE R PARAMETER LIST. 11900002 LCLA &I A LOCAL VARIABLE FOR KEEPING TRACK OF THE *11970002 CURRENT ENTRY BEING SCANNED IN THE R PARAMETER*12040002 LIST. 12110002 LCLA &LNG THE LENGTH OF THE CURRENT DISPLACEMENT-LENGTH *12180002 PAIR. 12250002 LCLC &X JUST A LOCAL CHARACTER VECTOR FOR COLLECTING *12320002 OPERANDS. 12390002 LCLB &FINEQU ON IF THE EQUATE "FIN&SYSNDX EQU *" MUST BE *12460002 GENERATED AT THE END OF THE MACRO EXECUTION. 12530002 LCLB &ERROR THIS BIT IS TURNED ON WHENEVER AN MNOTE OF *12600002 SUFFICIENT SEVERITY IS GENERATED. 12670002 LCLB &KLMNOTE ON WHEN THE KEY LENGTH EXCEEDS 256 BYTES. 12740002 LCLA &DSP THIS IS USED FOR COLLECTING THE DISPLACEMENT *12810002 AS A NUMBER. 12880002 LCLC &FIELD THIS IS USED TO HOLD THE FIELD OF AN (F,L) *12950002 PAIR WHILE GETTING THE L. 13020002 LCLB &XFER ON TO GENERATE THE MOVES WHEN IT IS THE RIGHT *13090002 ITERATION THROUGH THE LOOP. 13160002 LCLA &KL KEY LENGTH ARITHMETIC VARIABLE. 13230002 LCLA &TMPA A LOCAL ARITHMETIC TEMPORARY. 13300002 LCLB &WORKEY ON IF THE KEY IS COLLECTED AT IGAWORK. 13370002 LCLB &USING THIS BIT IS TURNED ON WHEN A USING WITH *13440002 REGISTER R1 IS GENERATED. 13510002 LCLB &FIN ON IF THE FIN&SYSNDX EQU * IS TO BE GENERATED *13580002 AT THE END. 13650002 LCLC &P,&C,&S,&GOLEFT,&ITSMOP,&ITSEOP,&TREEHDR,&ARG,&EKER 13720002 LCLC &EKE,&TOOBAD,&FOUR,&O 13790002 LCLC &R1 GENERAL REGISTER 1. 13860002 LCLC &TMP A TEMPORARY LOCAL CHARACTER VECTOR. 13930002 LCLC &TMP0 A LOCAL TEMPORARY CHARACTER VARIABLE. 14000002 LCLC &TMP1 A TEMPORARY LOCAL CHARACTER VECTOR. 14070002 AIF ((K'&SARG EQ 0)AND(K'&EQUAL EQ 0)AND(K'&UNEQUAL EQ 0)AND*14140002 (K'&KEYL EQ 0)).NEW 14210002 AIF (K'&KEYL EQ 0).OLDKLZ SEE IF THE OLD KEY LENGTH IS NOT *14280002 GIVEN. 14350002 &TAG SRCH &TREE,A=&SARG,Y=&EQUAL,N=&UNEQUAL,T=&T,TYPE=&TYPE,K=(0, *14420002 &KEYL),NULL=&NULL,REL=&REL 14490002 AGO .END 14560002 .OLDKLZ ANOP 14630002 AIF (K'&SARG LE 2).OLDONE SEE IF THE SEARCH ARGUMENT IS NOT*14700002 OF THE FORM "D(GPR)". 14770002 AIF (NOT(('&SARG'(1,1) LE '9')AND('&SARG'(1,1) GE '0'))).OLD*14840002 ONE SEE IF IT NOT OF THE FORM "D(GPR)". 14910002 .********************************************************************** 14980002 .* THE OLD SEARCH ARGUMENT IS SPECIFIED AS "D(GPR)", TRANSLATE THIS * 15050002 .* INTO A GOOD NEW FORMAT VIA THE MACRO RECURSION FACILITY. * 15120002 .********************************************************************** 15190002 AIF ('&SARG'(K'&SARG,1) NE ')').OLDONE HOWEVER, FIRST CHECK*15260002 IT FOR VALIDITY. 15330002 &I SETA (1) LOOK FOR THE LEFT PARENTHESIS. 15400002 .OLDLOOP ANOP 15470002 &I SETA (&I+1) EKE THE INDEX TO THE NEXT CHARACTER. 15540002 AIF (&I GT (K'&SARG)).OLDONE SEE IF THERE ISN'T ANY LEFT *15610002 PARENTHESIS. 15680002 AIF ('&SARG'(&I,1) NE '(').OLDLOOP SEE IF IT IS STILL *15750002 GOING. 15820002 &TMP0 SETC '&SARG'(1,&I-1) PICK UP THE DISPLACEMENT FIELD. 15890002 &TMP1 SETC '&SARG'(&I,K'&SARG-(&I+1)) GET THE GPR WITH ITS *15960002 SURROUNDING PARENTHESES. 16030002 &TAG SRCH &TREE,A=&TMP1,K=(&TMP0,),Y=&EQUAL,N=&UNEQUAL,T=&T, *16100002 TYPE=&TYPE,NULL=&NULL,REL=&REL 16170002 AGO .END ALL DONE NOW. 16240002 .OLDONE ANOP 16310002 &TAG SRCH &TREE,A=&SARG,Y=&EQUAL,N=&UNEQUAL,T=&T,TYPE=&TYPE, *16380002 NULL=&NULL,REL=&REL 16450002 AGO .END ALL DONE NOW. 16520002 .NEW ANOP 16590002 .********************************************************************** 16660002 .* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS * 16730002 .* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE * 16800002 .* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE * 16870002 .* TYPE CHECKING SECTION. * 16940002 .********************************************************************** 17010002 .RPT# AIF (K'&T EQ 0).RPT#TMT SEE IF THE T PARAMETER IS CODED. 17080002 AIF (K'&TYPE EQ 0).RPT#TCK USE THE T PARAMETER IF IT IS *17150002 CODED AND THE TYPE PARAMETER IS NOT CODED. 17220002 .********************************************************************** 17290002 .* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 17360002 .* AND IF THEY ARE NOT THEN USE T. * 17430002 .********************************************************************** 17500002 AIF ('&T' EQ '&TYPE').RPT#TCK IF THEY ARE THE SAME THEN USE*17570002 T. 17640002 MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.' 17710002 .RPT#TCK ANOP 17780002 &IGARPT# SETC '&T' GET THE RPT TYPE. 17850002 AGO .RPT#CHK GO TO CHECK THE VALIDITY OF THE RADIX *17920002 PARTITION TREE TYPE. 17990002 .********************************************************************** 18060002 .* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED. * 18130002 .********************************************************************** 18200002 .RPT#TMT AIF (K'&TYPE EQ 0).RPT#8 IF BOTH ARE LEFT OUT USE TYPE 8 *18270002 RPT. 18340002 &IGARPT# SETC '&TYPE' SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *18410002 THE TYPE PARAMETER. 18480002 AGO .RPT#CHK GO CHECK IT FOR VALIDITY. 18550002 .RPT#8 ANOP 18620002 &IGARPT# SETC '8' SET THE RPT TYPE TO 8. 18690002 .RPT#CHK AIF (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*18760002 Q '4')).RPT#FIN 18830002 MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.' 18900002 &IGARPT# SETC '8' TAKE THE DEFAULT TYPE 8 RPT. 18970002 .RPT#FIN ANOP 19040002 RPTDSECT T=&IGARPT#,DS=0 DON'T GENERATE THE BIG DSECT. 19110002 .********************************************************************** 19180002 AIF (K'&TREE NE 0).CHKGPR SEE IF THE TREE ADDRESS IS CODED. 19250002 MNOTE 0,'TREE PARAMETER MISSING, ASSUMED IN R1.' 19320002 AGO .CHKTAG GO CHECK THE LABEL TO SEE IF EQU * NEEDED. 19390002 .CHKGPR ANOP 19460002 AIF (K'&TREE EQ K'&TREE(1)+2 AND N'&TREE EQ 1).LW1 19530002 &TAG L 1,&TREE LOAD ADDRESS OF PARAMETER LIST. 19600002 AGO .LW2 19670002 .LW1 ANOP 19740002 AIF ('&TREE' NE '(1)').LW1F SEE IF THE TREE ADDR IS IN GPR1 19810002 .CHKTAG ANOP 19880002 AIF (K'&TAG EQ 0).LW1B SINCE THERE IS NO LR, DOES IT HAVE 19950002 .* TO GENERATE THE LABEL EQU * ? 20020002 &TAG EQU * 20090002 .LW1B AGO .LW2 DONE WITH LABEL AND TREE. 20160002 .LW1F ANOP 20230002 &TAG LR 1,&TREE(1) 20300002 .********************************************************************** 20370002 .* THE TREE ADDRESS IS NOW IN REGISTER 1. * 20440002 .********************************************************************** 20510002 .LW2 AIF ((K'&A NE 0)OR(K'&K NE 0)).LW3 MAKE SURE THAT EITHER 20580002 .* THE A OR K PARAMETER IS CODED. 20650002 MNOTE 12,'A OR K MUST BE CODED.' 20720002 &ERROR SETB (1) SET THE ERROR FLAG ON. 20790002 .LW3 ANOP 20860002 &R1 SETC '1' REGISTER 1 FOR USING STATEMENT. 20930002 .*--------------------------------------------------------------------* 21000002 .* BRANCH OUT TO THE VARIOUS SEARCHES HERE. * 21070002 AIF ('&IGARPT#' EQ '8').SRCH8 SEE IF THIS IS A TYPE 8 RPT. 21140002 AIF ('&IGARPT#' EQ '5').SRCH5 SEE IF THIS IS A TYPE 5 RPT. 21210002 MNOTE 12,'INVALID RPT TYPE, NO TYPE &IGARPT#.' 21280002 MEXIT 21350002 .*--------------------------------------------------------------------* 21420002 .* SRCH8, USING THE SUBROUTINE IN IGARPT01. * 21490002 .* * 21560002 .* FOR SRCH8: * 21630002 .* 0. LEFT AND RIGHT INVERTIBLE EDGES, 3 BYTES LONG, EITHER OF THE * 21700002 .* SUBTRACTION OR EXCLUSIVE-OR TYPE. * 21770002 .* 1. NO SUCCESSOR PAIRING. * 21840002 .* 2. MAXIMUM OF A 256-BYTE KEY IS SUPPORTED. * 21910002 .* 3. THE FLAG BITS ARE STORED WITH THE PREDECESSOR VERTEX. * 21980002 .* 4. SCANNING FUNCTIONS ARE SUPPORTED WITH INVERTIBLE EDGES. * 22050002 .*--------------------------------------------------------------------* 22120002 .SRCH8 ANOP 22190002 .********************************************************************** 22260002 .* CHECK THE REL PARAMETER TO SEE IF A PARTIAL ORDER VALUE IS * 22330002 .* INVOLVED. * 22400002 .********************************************************************** 22470002 AIF (K'&REL NE 0).NOTPOV SEE IF THE REL PARAMETER IS NOT *22540002 CODED. 22610002 AIF (N'&REL NE 1).TWOREL SEE IF THERE ARE TWO ELEMENTS IN *22680002 THE REL PARAMETER. 22750002 AIF ('&REL(1)' EQ 'POV').POVGET SEE IS THE SEARCH IS JUST *22820002 TO GET THE POV FROM THE CURRENT CURSOR *22890002 SETTING, OR USING THE KEY (IF THERE IS ONE). 22960002 AGO .NOTPOV IT IS NOT A PARTIAL ORDER VALUE SEARCH. 23030002 .TWOREL ANOP 23100002 AIF (('&REL(1)' EQ 'POV')OR('&REL(2)' EQ 'POV')).ITSAPOV *23170002 SEE IF A PARTIAL ORDER VALUE IS INVOLVED. 23240002 .NOTPOV ANOP 23310002 .********************************************************************** 23380002 .* GENERATE THE ADDRESS OF THE SEARCH ARGUMENT IN REGISTER ZERO FOR * 23450002 .* THE SEARCH SUBROUTINE IN THE MODULE IGARPT01. * 23520002 .* IF THE K PARAMETER IS NOT CODED JUST GO DIRECTLY TO .CHKA AND USE * 23590002 .* THE ADDRESS SPECIFIED BY THE A PARAMETER. * 23660002 .* IF THE K PARAMETER IS CODED AND DEFINES A KEY CONSISTING OF MORE * 23730002 .* THAN ONE FIELD, COLLECT IT AT IGAWORK IN THE TREE HEADER. THEN PUT * 23800002 .* THE ADDRESS OF IGAWORK IN REGISTER 0 FOR THE SEARCH. * 23870002 .********************************************************************** 23940002 AIF (K'&K EQ 0).CHKA SEE IF THERE IS NO SEARCH KEY *24010002 SPECIFIED. 24080002 .********************************************************************** 24150002 .* THE K PARAMETER HAS BEEN CHECKED AT THIS POINT, AND IS NOT THE * 24220002 .* EMPTY STRING. * 24290002 .********************************************************************** 24360002 .LOOPAIR ANOP 24430002 &XFER SETB (1) FOR THE SRCH MACRO ALWAYS GENERATE THE MOVES *24500002 ON THE SINGLE PASS THROUGH THIS PART. 24570002 &IGAKEYL SETA 0 INITIALIZE THE RECORD LENGTH TO ZERO. 24640002 AIF (N'&K EQ 2).KHAS2 SEE IF THERE ARE EXACTLY TWO ELEMENTS*24710002 IN K ON PARENTHESIS LEVEL ONE. 24780002 AIF (N'&K NE 1).KMIXED SEE IF THERE ARE MORE THAN TWO *24850002 ELEMENTS, FOR IF SO THE LIST CONSISTS OF A *24920002 SERIES OF FIELD NAMES OR (D,L) PAIRS. 24990002 .********************************************************************** 25060002 .* K HAS ONLY ONE ELEMENT ON LEVEL 1. FIND OUT WHICH OF THE FOLLOWING * 25130002 .* CASES APPLIES, AND TAKE THE INDICATED ACTION: * 25200002 .* IN THE FOLLOWING DISCUSSION, )F" MEANS A FIELD NAME, "D" MEANS * 25270002 .* DISPLACEMENT, "L" MEANS LENGTH, AND "X" MEANS ANY STRING. THE D AND* 25340002 .* L FIELDS MUST BE SELF-DEFINING TERMS,. * 25410002 .* IF: THEN: * 25480002 .* K=F ENTER THE ROUTINE AT .KMIXED TO PROCESS A LIST OF PAIRS OF * 25550002 .* F'S AND (D,L) PAIRS, SINCE THIS CASE WILL BE TREATED AS A * 25620002 .* SINGLE FIELD NAME BY THAT ROUTINE. * 25690002 .* K=(F) THIS IS AN ERROR, BECAUSE OF THE POSSIBLE FUTURE USE OF THIS * 25760002 .* FORM TO INDICATE THE ADDRESS OF A LIST OF DISPLACEMENT-LENGTH* 25830002 .* PAIRS IN A REGISTER. * 25900002 .* K=L L IS THE LENGTH OF THE RECORD TO BE INSERTED. THE A PARMAETER* 25970002 .* MUST BE CODED FOR THIS TO BE VALID, BECAUSE OTHERWISE THERE * 26040002 .* IS NO WAY TO FIND OUT WHERE THE RECORD IS THAT IS TO BE * 26110002 .* INSERTED. * 26180002 .* K=(L) THIS IS AN ERROR, BECAUSE OF THE POSSIBILITY THAT IN THE * 26250002 .* FUTURE I WILL WANT TO PUT THE ADDRESS OF A LIST OF * 26320002 .* DISPLACEMENT-LENGTH PAIRS IN A REGISTER. * 26390002 .* K=((X)) ENTER THE .KMIXED ROUTINE, SINCE IT LOOKS LIKE A LIST OF * 26460002 .* DISPLACEMENT-LENGTH PAIRS WITH ONLY ONE PAIR. * 26530002 .* ANYTHING ELSE IS INVALID, AND PRODUCES THE MNOTE 12,'INVALID * 26600002 .* R-PARAMETER.' * 26670002 .********************************************************************** 26740002 AIF ('&K'(1,1) NE '(').KNOTLP SEE IF THERE ARE NO *26810002 PARENTHESES AROUND THE OPERAND. 26880002 AIF ('&K'(1,2) EQ '((').KMIXED SEE IF THIS IS THE CASE *26950002 K=((X)). 27020002 MNOTE 12,'A REGISTER CANNOT BE SPECIFIED FOR THE LIST OF DISPL*27090002 ACEMENT-LENGTH PAIRS.' 27160002 &ERROR SETB 1 SET THE ERROR FLAG ON. 27230002 AGO .KFIN END THIS PART. 27300002 .********************************************************************** 27370002 .* THIS MUST BE ONE OF THE TWO CASES K=F OR K=L. * 27440002 .********************************************************************** 27510002 .KNOTLP ANOP 27580002 AIF (((T'&K(1) NE 'M')AND(T'&K(1) NE 'N')AND(T'&K(1) NE 'O')*27650002 AND(T'&K(1) NE 'T')AND(T'&K(1) NE 'W')AND(T'&K(1) NE '$'*27720002 )AND(T'&K(1) NE 'U'))).KMIXED 27790002 .* THIS MUST BE THE CASE WHERE "R=L" IS CODED. * 27860002 AIF (T'&K(1) NE 'N').K1NOTN SEE IF IT IS A SELF-DEFINING *27930002 FIELD. 28000002 .********************************************************************** 28070002 .* K=L IS CODED, AND L IS A SELF-DEFINING TERM. USE L FOR THE RECORD * 28140002 .* LENGTH, BUT FIRST CHECK TO SEE IF THE A PARAMETER IS CODED. IF THE * 28210002 .* A PARAMETER IS NOT CODED IT IS AN ERROR. * 28280002 .********************************************************************** 28350002 &IGAKEYL SETA (&K(1)) GET THE RECORD LENGTH FROM THE L OF THE K *28420002 PARAMETER. 28490002 AIF (K'&A EQ 0).K1AMT SEE IF THE A PARAMETER HAS BEEN LEFT *28560002 OUT. 28630002 AIF (&IGAKEYL GT 256).K1LERR FOR THE NONCE ONLY TAKE FIELDS*28700002 THAT ARE LESS THAN 257 BYTES LONG. 28770002 AIF (NOT &XFER).KFIN SEE IF THIS IS THE MVC GENERATION *28840002 LOOP, OR JUST THE VALIDATION AND ADDING UP *28910002 FIELD LENGTHS LOOP. 28980002 AIF ('&A'(1,1) EQ '(').K1AGPR SEE IF THE ADDRESS IS IN A *29050002 GPR. 29120002 LA 0,&A ADDRESS OF SEARCH KEY. 29190002 AGO .KFIN ALL DONE NOW. 29260002 .K1AGPR AIF ('&A' EQ '(0)').KFIN SEE IF THE SEARCH KEY ADDRESS IS *29330002 ALREADY IN REGISTER 0. 29400002 LR 0,&A(1) ADDRESS OF SEARCH KEY. 29470002 AGO .KFIN GO TO THE END OF THE K PARAMETER PROCESSING. 29540002 .********************************************************************** 29610002 .* FOLLOWING ARE THE MISCELLANEOUS ERROR MNOTES FROM THE SINGLE * 29680002 .* ELEMENT CASE OF THE K PARAMETER. * 29750002 .********************************************************************** 29820002 .K2LERR ANOP 29890002 .K1LERR MNOTE 12,'THE LENGTH OF EACH FIELD DEFINED BY K CANNOT EXCEED *29960002 256 BYTES.' 30030002 &ERROR SETB (1) SET THE ERROR FLAG ON SO THE MVC'S DON'T GET *30100002 GENERATED. 30170002 AGO .KFIN 30240002 .K1AMT MNOTE 12,'THE A PARAMETER MUST BE CODED WITH K AS CODED.' 30310002 &ERROR SETB (1) SET THE ERROR FLAG ON. 30380002 AGO .KFIN 30450002 .K1NOTN MNOTE 12,'THE LENGTH MUST BE A SELF-DEFINING TERM FOR THE K PA*30520002 RAMETER.' 30590002 &ERROR SETB (1) SET THE ERROR FLAG ON. 30660002 AGO .KFIN 30730002 .********************************************************************** 30800002 .* THE K PARAMETER HAS EXACTLY TWO ELEMENTS IN IT ON LEVEL 1. SEE IF * 30870002 .* EITHER OF THESE TWO ELEMENTS STARTS WITH A LEFT PARENTHESIS, WHICH * 30940002 .* MEANS ONE OF THE CASES K=(X,(X)), K=((X),X), OR K=((X),(X)). IF IT * 31010002 .* IS ONE OF THESE CASES ENTER THE MIXED ROUTINE AT .KMIXED. * 31080002 .* IF IT IS NOT ONE OF THOSE THREE CASES, THEN IT MUST BE ONE OF THE * 31150002 .* CASES K=(F,F), K=(F,L), OR K=(D,L). NOTE THAT THE CASE K=(D,L) CAN * 31220002 .* BE CODED AS K=(,L). * 31290002 .********************************************************************** 31360002 .KHAS2 AIF (K'&K(2) NE 0).K2NOTMT SEE IF THE SECOND ELEMENT IS THE*31430002 EMPTY STRING. THIS IS NO GOOD. 31500002 MNOTE 12,'THE SECOND ELEMENT OF A DISPLACEMENT-LENGTH PAIR MUS*31570002 T BE CODED.' 31640002 &ERROR SETB (1) SET THE ERROR FLAG ON. 31710002 AGO .FIN FORGET IT, CAN'T DO ANYTHING WITH AN EMPTY *31780002 STRING FOR THE LENGTH. 31850002 .K2DMT ANOP 31920002 &DSP SETA (0) SET THE DISPLACEMENT TO ZERO, SINCE IT IS *31990002 CODED AS THE EMPTY STRING. 32060002 AGO .K2MERGE MERGE WITH THE CASE WHERE THE DISPLACEMENT IS *32130002 NOT THE EMPTY STRING. 32200002 .K2NOTMT AIF (K'&K(1) EQ 0).K2DMT SEE IF THE DISPLACEMENT IS THE *32270002 EMPTY STRING. 32340002 AIF (('&K(1)'(1,1) EQ '(')OR('&K(2)'(1,1) EQ '(')).KMIXED *32410002 LOOK FOR ONE OF THE CASES K=(X,(X)), K=((X), *32480002 X), OR K=((X),(X)). 32550002 AIF (((T'&K(2) NE 'M')AND(T'&K(2) NE 'N')AND(T'&K(2) NE 'O')*32620002 AND(T'&K(2) NE 'T')AND(T'&K(2) NE 'W')AND(T'&K(2) NE '$'*32690002 )AND(T'&K(2) NE 'U'))).KMIXED 32760002 .* THE SECOND ELEMENT IS NOT A FIELD NAME, SO IT MUST EITHER BE ONE OF* 32830002 .* THE TWO CASES K=(F,L) OR K=(D,L), OR IT IS AN ERROR. * 32900002 &IGAKEYL SETA 0 ALLOW THE CASE WHERE THE LENGTH IS LEFT OUT *32970002 WHEN THERE IS ONLY ONE DISPLACEMENT. 33040002 AIF (K'&K EQ 0).MERGEK2 SEE IF THE LENGTH IS ELIDED. 33110002 AIF ((T'&K(1) NE 'M')AND(T'&K(1) NE 'N')AND(T'&K(1) NE 'O')A*33180002 ND(T'&K(1) NE 'T')AND(T'&K(1) NE 'W')AND(T'&K(1) NE '$')*33250002 AND(T'&K(1) NE 'U')).K2F1 33320002 AIF (T'&K(1) EQ 'N').K2D SEE IF THE DISPLACEMENT IS A SELF-*33390002 DEFINING TERM. 33460002 &I SETA (K'&K(1)) THE DISPLACEMENT IS NOT A SELF-DEFINING TERM, 33530002 .K2DCHK AIF (('&K(1)'(&I,1) LT '0')OR('&K(1)'(&I,1) GT '9')).K2DTYPE 33600002 &I SETA (&I+1) SEE IF IT IS A DECIMAL NUMBER ANYWAY. 33670002 AIF (&I GT 0).K2DCHK THIS IS NECESSARY BECAUSE OF THE WAY *33740002 ASSEMBLER F DOES NOT RECORD THE CORRECT TYPE ATTRIBUTE *33810002 OF OPERANDS PASSED IN A SUBLIST VIA MACRO-RECURSION. 33880002 AIF (K'&K(1) GT 4).K2DERR SEE IF IT HAS TOO MANY DIGITS. 33950002 .K2D ANOP 34020002 &DSP SETA (&K(1)) PICK UP THE DISPLACEMENT. 34090002 .K2MERGE ANOP 34160002 AIF (T'&K(2) EQ 'N').K2L SEE IF IT IS A SELF-DEFINING TERM. 34230002 &I SETA (K'&K(2)) SET THE INDEX TO IT'S INITIAL VALUE. 34300002 AIF (K'&K(2) EQ 0).K2LERR SEE IF IT IS THE EMPTY STRING. 34370002 .K2LCHK AIF (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).K2LTYPE 34440002 &I SETA (&I-1) DECREASE THE INDEX TO THE NEXT CHARACTER. 34510002 AIF (&I GT 0).K2LCHK SEE IF THERE ARE MORE TO CHECK. 34580002 AIF (K'&K(2) GT 4).K2LERR SEE IF IT HAS TOO MANY DIGITS. 34650002 .K2L ANOP 34720002 &IGAKEYL SETA (&K(2)) GET THE LENGTH AS A NUMBER. 34790002 .MERGEK2 ANOP 34860002 AIF (&IGAKEYL GT 256).K1LERR SEE IF THE LENGTH IS MORE THAN*34930002 256 BYTES. 35000002 AIF (&DSP GT 4095).K2DERR SEE IF THE DISPLACEMENT IS *35070002 GREATER THAN 4095. 35140002 AIF (K'&A EQ 0).K1AMT SEE IF THE A PARAMETER IS LEFT OUT; *35210002 THAT IS BAD. 35280002 AIF (NOT &XFER).KFIN SEE IF THIS IS THE MVC GENERATING LOOP*35350002 OR NOT. 35420002 .********************************************************************** 35490002 .* THERE IS ONLY ONE FIELD SPECIFIED FOR THE KEY; PUT ITS ADDRESS IN * 35560002 .* REGISTER 0 FOR THE SEARCH SUBROUTINE IN IGARPT01. * 35630002 .********************************************************************** 35700002 AIF ('&A'(1,1) EQ '(').K2AGPR SEE IF THE ADDRESS IS IN A *35770002 GPR. 35840002 AIF (&DSP EQ 0).K2SZDSP SEE IF THE DISPLACEMENT IS ZERO. 35910002 LA 0,&DSP+&A ADDRESS OF SEARCH KEY. 35980002 AGO .KFIN 36050002 .K2SZDSP LA 0,&A ADDRESS OF SEARCH KEY. 36120002 AGO .KFIN ALL DONE WITH THE A AND K NOW. 36190002 .K2AGPR AIF (&DSP EQ 0).K2RZDSP SEE IF THE DISPLACEMENT IS ZERO. 36260002 LA 0,&DSP&A ADDRESS OF SEARCH KEY. 36330002 AGO .KFIN 36400002 .K2RZDSP AIF ('&A' EQ '(0)').KFIN SEE IF THE ADDRESS IS ALREADY IN *36470002 REGISTER 0. 36540002 LR 0,&A(1) ADDRESS OF SEARCH KEY. 36610002 AGO .KFIN ALL DONE GETTING THE ADDRESS OF THE SEARCH KEY*36680002 IN REGISTER 0. 36750002 .********************************************************************** 36820002 .* IT IS AN (F,L) PAIR, NOW SEE IF THE SECOND ELEMENT IS A VALID L. * 36890002 .********************************************************************** 36960002 .K2F1 AIF (T'&K(2) EQ 'N').K2F SEE IF IT IS A SELF-DEFINING TERM. 37030002 &I SETA (K'&K(2)) SET THE INDEX TO IT'S INITIAL VALUE. 37100002 .K2FCHK AIF (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).K2LTYPE 37170002 &I SETA (&I+1) EKE THE INDEX TO THE NEXT CHARACTER. 37240002 AIF (&I GT 0).K2FCHK SEE IF THERE ARE MORE TO CHECK. 37310002 AIF (K'&K(2) GT 4).K2LERR SEE IF IT HAS TOO MANY DIGITS. 37380002 .K2F ANOP 37450002 &IGAKEYL SETA (&K(2)) GET THE LENGTH OF THE (F,L) PAIR. 37520002 AIF (&IGAKEYL GT 256).K1LERR SEE IF THE LENGTH OF THE FIELD*37590002 IS MORE THAN 256. 37660002 AIF (NOT &XFER).KFIN SEE IF THIS IS THE MOVE GENERATION *37730002 LOOP. 37800002 AIF (K'&A EQ 0).AISNT SEE IF A ISN'T. 37870002 MNOTE 4,'THE A PARAMETER IS REDUNDANT.' 37940002 .AISNT LA 0,&K(1) ADDRESS OF SEARCH KEY. 38010002 AGO .KFIN ALL DONE NOW, GO CHECK FOR THE MOVE GENERATION*38080002 ITERATION. 38150002 .********************************************************************** 38220002 .* THE FOLLOWING ARE THE SUNDRY MNOTES FOR THE TWO ELEMENT CASE FOR * 38290002 .* THE K PARAMETER. * 38360002 .********************************************************************** 38430002 .K2DERR MNOTE 12,'DISPLACEMENT IN K PARAMETER CANNOT EXCEED 4095.' 38500002 &ERROR SETB (1) SET THE ERROR FLAG ON. 38570002 AGO .KFIN 38640002 .K2DTYPE MNOTE 12,'THE DISPLACEMENT IN K MUST BE A SELF-DEFINING TERM.' 38710002 &ERROR SETB (1) SET THE ERROR FLAG ON TO PREVENT THE MVC *38780002 GENERATION. 38850002 AGO .KFIN 38920002 .K2LTYPE MNOTE 12,'THE LENGTH IN K MUST BE A SELF-DEFINING TERM.' 38990002 &ERROR SETB 1 SET THE ERROR FLAG ON. 39060002 AGO .KFIN 39130002 .********************************************************************** 39200002 .* THE K PARAMETER CONSISTS OF A LIST OF MIXED PAIRS OF FIELDS AND * 39270002 .* DISPLACEMENT-LENGTH PAIRS. PICK OUT ALL THESE AND CHECK THEM FOR * 39340002 .* VALIDITY, WHILE ADDING UP ALL THE LENGTHS OF THE INDIVIDUAL FIELDS * 39410002 .* FOR THE MOVES TO IGAWORK, AND (POSSIBLY) FOR USE IN THE REL * 39480002 .* PARAMETER LATER. * 39550002 .********************************************************************** 39620002 .* THIS IS THE SECTION TO PROCESS A MIXED LIST OF FIELD NAMES AND (D * 39690002 .* ,L) PAIRS. PARSE THE OPERAND USING THE PARSE IN THE RPTDSECT * 39760002 .* MACRO-INSTRUCTION, AND CHECK THE VARIABLE &IGAOKAY TO SEE IF THERE * 39830002 .* ARE NO SYNTAX ERRORS IN THE K PARAMETER. * 39900002 .********************************************************************** 39970002 .KMIXED ANOP 40040002 RPTDSECT SCAN=PARSE,LIST=&K PARSE THE OPERAND. 40110002 AIF (&IGAOKAY).KMXOK SEE IF THE PARSE DETECTED BAD SYNTAX. 40180002 MNOTE 12,'INVALID SYNTAX IN THE K PARAMETER.' 40250002 &ERROR SETB (1) SET THE ERROR FLAG ON. 40320002 AGO .KFIN CAN'T DO ANYTHING WITH THIS. 40390002 .********************************************************************** 40460002 .* THE SYNTAX APPEARS TO BE OK, NOW START SCANNING OUT THE ATOMS ONE * 40530002 .* AT A TIME, ANALYZING EACH ONE INDIVIDUALLY IN CONTEXT WITH THE ONES* 40600002 .* ON EITHER SIDE OF IT. * 40670002 .********************************************************************** 40740002 .KMXOK RPTDSECT SCAN=ISCAN INITIALIZE FOR SUBSEQUENT SCANNING OF *40810002 ATOMS. 40880002 L 15,(&IGAKEYW+&IGABLST)(,1) ADDR OF W.A. TO COLLECT THE 40950002 BALR 14,0 SEARCH KEY OR THE ADDRESS OF A ROUTINE IN THE 41020002 LTR 0,15 MODULE IGARPT01 TO GET AN AREA TO USE FOR 41090002 &WORKEY SETB (1) ON TO INDICATE THAT THE KEY HAS BEEN COLLECTED*41160002 AT IGAWORK. 41230002 BCR 4,15 COLLECTING THE SEARCH KEY. 41300002 .KMXMOR RPTDSECT SCAN=NEXT GET THE CURSOR POSITIONED AT THE NEXT ATOM. 41370002 .KMXCHK AIF (&IGAX EQ 0).KFIN SEE IF THERE ARE ANY MORE TO DO. 41440002 AIF (&IGALEVL EQ 2).KMXLVL2 SEE IF THIS ATOM IS ON LEVEL 2. 41510002 AIF (&IGALEVL LE 1).KMXL01 SEE IF THIS ATOM IS ON LEVEL 0 *41580002 OR 1. 41650002 .********************************************************************** 41720002 .* THE CURRENT ATOM HAS TOO MANY LEVELS OF PARENTHESES AROUND IT, GIVE* 41790002 .* THE ERROR MESSAGE AND GO LOOK FOR THE NEX THING THAT CHANGES LEVEL * 41860002 .* 1 IN THE PATH VECTOR. * 41930002 .********************************************************************** 42000002 &I SETA &IGAPATH(1)+1 SET &I TO THE CURRENT OPERAND NUMBER. 42070002 MNOTE 12,'TOO MANY () LEVELS IN OPERAND &I OF R.' 42140002 &ERROR SETB (1) SET THE ERROR FLAG ON. 42210002 .********************************************************************** 42280002 .* AN ERROR HAS BEEN DETECTED AND FLAGGED IN THE CURRENT OPERAND. SCAN* 42350002 .* OVER TO THE NEXT ATOM THAT IS NOT PART OF THE CURRENT ENTRY ON * 42420002 .* LEVEL 1 IN THE PARAMETER. * 42490002 .********************************************************************** 42560002 .SYNC ANOP 42630002 &I SETA &IGAPATH(1) SET &I TO THE INDEX OF THE OPERAND ON LEVEL*42700002 1. 42770002 RPTDSECT SCAN=NEXT SET THE CURSOR TO THE NEXT ONE. 42840002 AIF (&IGAX EQ 0).KFIN SEE IF THERE AREN'T ANY MORE. 42910002 AIF (&I EQ &IGAPATH(1)).SYNC SEE IF IT IS STILL ON THE SAME*42980002 ONE. 43050002 AGO .KMXCHK FINALLY GOT THE NEXT ATOM, NOW GO CHECK IT FOR*43120002 VALIDITY. 43190002 .********************************************************************** 43260002 .* THE CURRENT ATOM IS ON LEVEL 0 OR 1. THEREFORE IT SHOULD BE A VALID* 43330002 .* FIELD NAME; SEE IF IT IS. * 43400002 .********************************************************************** 43470002 .KMXL01 ANOP 43540002 .KMX01 ANOP 43610002 &I SETA (1+&IGAPATH(1)) SET &I TO THE 1-ORIGIN INDEX OF THE *43680002 FIELD NAME ON LEVEL 1. 43750002 AIF ((T'&K(&I) NE 'M')AND(T'&K(&I) NE 'N')AND(T'&K(&I) NE 'O*43820002 ')AND(T'&K(&I) NE 'T')AND(T'&K(&I) NE 'W')AND(T'&K(&I) N*43890002 E '$')AND(T'&K(&I) NE 'U')).KMX01OK 43960002 MNOTE 12,'OPERAND &I OF K DOES NOT HAVE THE PROPER TYPE ATTRIB*44030002 UTE.' 44100002 &ERROR SETB (1) SET THE ERROR FLAG. 44170002 AGO .SYNC GO POSITION THE CURSOR TO THE NEXT ONE. 44240002 .********************************************************************** 44310002 .* THE CURRENT ATOM LOOKS LIKE A VALIID FIELD NAME, GET ITS LENGTH * 44380002 .* ATTRIBUTE AND SEE IF IT ACCEPTABLE. * 44450002 .********************************************************************** 44520002 .KMX01OK ANOP 44590002 &LNG SETA (L'&K(&I)) CAPTURE IT AS A NUMBER. 44660002 AIF (&LNG LE 256).KMX0LOK SEE IF IT EXCEEDS 256. 44730002 MNOTE 12,'THE LENGTH OF FIELD &I OF K EXCEEDS 256 BYTES.' 44800002 &ERROR SETB (1) SET TEH ERROR FLAG. 44870002 AGO .SYNC GO LOOK AT THE NEXT ONE. 44940002 .KMX0LOK ANOP 45010002 .********************************************************************** 45080002 .* NOW SEE IF THIS IS THE MOVE GENERATION ITERATION. * 45150002 .********************************************************************** 45220002 AIF (NOT &XFER).KX0M GO IF THIS ISN'T THE MOVE GENERATION *45290002 ITERATION. 45360002 MVC &IGAKEYL.(&LNG,15),&K(&I) MOVE SUBKEY. 45430002 .KX0M ANOP 45500002 &IGAKEYL SETA (&IGAKEYL+&LNG) EKE THE CUMMULATIVE RECORD LENGTH. 45570002 AIF (&IGAKEYL LE 256).KMXMOR SEE IF THE KEYL LENGTH IS *45640002 STILL LESS THAN 257. 45710002 AIF (&KLMNOTE).KMXMOR SEE IF THE MNOTE HAS ALREADY BEEN *45780002 GENERATED. 45850002 &KLMNOTE SETB (1) SET THE BIT ON SO THE MNOTE ONLY GETS *45920002 GENERATED ONCE. 45990002 &ERROR SETB (1) SET THE ERROR FLAG ON. 46060002 MNOTE 12,'KEY LENGTH EXCEEDS 256 BYTES.' 46130002 AGO .KMXMOR GO LOKK FOR THE NEXT ONE. 46200002 .********************************************************************** 46270002 .* THE CURRENT ATOM IS ON LEVEL 2. IT MUST THEREFORE BE THE FIRST * 46340002 .* ELEMENT IN ONE OF THE CASES (F,L) OR (D,L). * 46410002 .* FIND OUT WHETHER THE CURRENT ATOM IS AN F OR A D. * 46480002 .********************************************************************** 46550002 .KMXLVL2 ANOP 46620002 &X SETC '0' SET THIS FOR THE CASE WHERE THE DISPLACEMENT *46690002 IS AN EMPTY STRING. 46760002 AIF (&IGAZ EQ 0).KMGDSP GO IF IT IS AN EMPTY STRING, WHICH *46830002 MEANS A DISPLACEMENT OF 0. 46900002 .********************************************************************** 46970002 .* SEE IF ALL THE CHARACTERS IN THE CURRENT ATOM ARE DIGITS 0 THROUGH * 47040002 .* 9, WHICH WOULD MAKE IT A SELF-DEFINING DECIMAL TERM. * 47110002 .********************************************************************** 47180002 &I SETA 0 INITIALIZE THE INDEX OF THE CURRENT CHARACTER *47250002 IN THE ATOM. 47320002 .KMCONT AIF (('&K'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&K'(&IGALEFT(&IG*47390002 AZ)+&I,1) GT '9')).KMNOTD 47460002 &I SETA (&I+1) EKE THE INDEX. 47530002 AIF (&I LT &IGARGHT(&IGAZ)).KMCONT KEEP GOING UNTIL ALL *47600002 DIGITS HAVE BEEN EXAMINED. 47670002 AIF (&IGARGHT(&IGAZ) GT 4).KMXBADD SEE IF THE DISPLACEMENT *47740002 HAS TOO MANY BYTES IN IT. 47810002 &X SETC '&K'(&IGALEFT(&IGAZ),&I) GET THE DISPLACEMENT AS A *47880002 NUMBER. 47950002 .KMGDSP ANOP 48020002 &DSP SETA (&X) GET THE NUMBER NOW. 48090002 AIF (&DSP GT 4095).KMXDBAD SEE IF THE DISPLACEMENT IS TOO *48160002 BIG. 48230002 .********************************************************************** 48300002 .* THE CURRENT ATOM IS A VALID DISPLACEMENT OF A (D,L) PAIR, AND ITS * 48370002 .* ARITHMETIC VALUE IS IN THE APPROPRIATE RANGE OF VALUES FOR A * 48440002 .* DISPLACEMENT. ITS VALUE HAS BEEN CAPTURED IN &DSP. NOW LOOK FOR THE* 48510002 .* CORRESPONDING L OF THE PAIR. * 48580002 .********************************************************************** 48650002 &I SETA (&IGAPATH(1)) SAVE THE CURRENT ATOM LEVEL 1 INDEX. 48720002 RPTDSECT SCAN=NEXT POSITION THE CURSOR TO THE NEXT ATOM. 48790002 AIF (&IGAX EQ 0).KMXNOLL SEE IF THERE ISN'T ANY L FOR IT *48860002 BECAUSE THERE AREN'T ANY MORE ATOMS. 48930002 AIF (&IGAPATH(1) NE &I).KMXNOL SEE IF THE NEXT ATOM IS PART*49000002 OF A DIFFERENT ELEMENT ON LEVEL 1. 49070002 AIF (&IGALEVL NE 2).KMXPRN SEE IF THERE ARE TOO MANY LEVELS*49140002 OF PARENTHESES. 49210002 AIF (&IGAZ EQ 0).KMXLBAD SEE IF THE L ATOM IS THE EMPTY *49280002 STRING. 49350002 .********************************************************************** 49420002 .* THERE IS A NEXT ATOM IN THE SAME PAIR, NOW CHECK IT TO SEE IF IT IS* 49490002 .* A SELF-DEFINING DECIMAL TERM. * 49560002 .********************************************************************** 49630002 &I SETA 0 INITIALIZE THE INDEX OF THE CURRENT BYTE IN THE ATOM. 49700002 .KMCNT1 AIF (('&K'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&K'(&IGALEFT(&IG*49770002 AZ)+&I,1) GT '9')).KMXBADL 49840002 &I SETA (&I+1) EKE THE INDEX TO THE NEXT BYTE. 49910002 AIF (&I LT &IGARGHT(&IGAZ)).KMCNT1 KEEP LOOKING UNTIL ALL *49980002 THE BYTES ARE EXAMINED. 50050002 AIF (&IGARGHT(&IGAZ) GT 4).KMXLERR SEE IF THE LENGTH IS *50120002 MORE THAN 4 CHARACTERS. 50190002 &X SETC '&K'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ)) GET THE LENGTH. 50260002 &LNG SETA (&X) TURN IT INTO A NUMBER. 50330002 AIF (&LNG GT 256).KMXLERR SEE IF IT IS TOO BIG TO DO WITH *50400002 AN MVC. 50470002 .********************************************************************** 50540002 .* THE DISPLACEMENT OF THE DISPLACEMENT-LENGTH PAIR IS AT &DSP, AND * 50610002 .* THE LENGTH IS AT &LNG. CHECK THE A PARAMETER TO SEE IF IT IS CODED,* 50680002 .* BECAUSE IF IT ISN'T CODED THERE IS NO WAY TO FIND OUT WHERE THE * 50750002 .* RECORD REALLY IS. * 50820002 .********************************************************************** 50890002 AIF (K'&A EQ 0).KMXAMT SEE IF IT ISN'T THERE. 50960002 .* NOW GENERATE THE MOVE OF THE FIELD IF THIS IS THE MOVE GENERATION * 51030002 .* ITERATION. * 51100002 AIF (NOT &XFER).KMOVED SEE IF IT ISN'T THE MOVE GENERATION *51170002 ITERATION. 51240002 &X SETC '' SET IT UP FOR THE ADDRESS IN A REGISTER. 51310002 AIF ('&A'(1,1) EQ '(').KMAGPR GO IF THE ADDRESS IS IN A *51380002 REGISTER. 51450002 &X SETC '+' SET IT UP FOR THE CASE EHERE THE ADDRESS IS *51520002 SUPPLIED IN THE FORM OF A LABEL. 51590002 .KMAGPR MVC &IGAKEYL.(&LNG,15),&DSP&X&A MOVE SUBKEY. 51660002 .KMOVED ANOP 51730002 &IGAKEYL SETA (&IGAKEYL+&LNG) EKE THE CUMMULATIVE RECORD LENGTH. 51800002 AIF (&IGAKEYL LE 256).STILLOK SEE IF THE CUMMULATIVE KEY *51870002 LENGTH HAS GONE OVER 256 BYTES. 51940002 AIF (&KLMNOTE).STILLOK SEE IF THE MNOTE HAS ALREADY BEEN *52010002 GENERATED. 52080002 &ERROR SETB (1) SET THE ERROR FLAG ON. 52150002 &KLMNOTE SETB (1) SET IT ON SO THE MNOTE HAS ALREADY BEEN GENERATED. 52220002 MNOTE 12,'KEY LENGTH IS TOO BIG 256 BYTES IS MAX.' 52290002 .STILLOK ANOP 52360002 .********************************************************************** 52430002 .* NOW SET THE CURSOR TO THE NEXT ATOM, AND SEE IF THE FIRST ELEMENT * 52500002 .* IS PART OF THE SAME ELEMENT ON LEVEL 1 AS THE LAST (D,L) PAIR. * 52570002 .********************************************************************** 52640002 &I SETA &IGAPATH(1) PRESERVE THE CURRENT LEVEL 0 INDEX. 52710002 RPTDSECT SCAN=NEXT POSITION THE CURSOR TO THE NEXT ATOM. 52780002 AIF (&IGAX EQ 0).KFIN GO IF THERE ISN'T ANY NEXT ATOM. 52850002 AIF (&I EQ &IGAPATH(1)).KMXSAME SEE IF THE LEVEL 1 ELEMENT *52920002 IN THE PATH VECTOR DIDN'T CHANGE. 52990002 AGO .KMXCHK GO CHECK THE NEXT ATOM, IT ISN'T PART OF THE *53060002 LAST TWO. 53130002 .********************************************************************** 53200002 .* THE FOLLOWING ARE SUNDRY MNOTES FROM THE PROCESSING OF A LIST OF * 53270002 .* MIXED PAIRS WHERE THE PAIRS ARE OF THE FORM (D,L). * 53340002 .********************************************************************** 53410002 .KMXSAME ANOP 53480002 &I SETA (&IGAPATH(1)+1) SET &I TO THE CURRENT OPERAND #. 53550002 MNOTE 12,'TOO MANY ELEMENTS IN SUBLIST OPERAND &I IN R.' 53620002 &ERROR SETB (1) SET THE ERROR FLAG ON. 53690002 AGO .SYNC GO LOOK FOR THE NEXT ONE. 53760002 .KMXAMT ANOP 53830002 &I SETA (1+&IGAPATH(1)) GET THE CURRENT OPERAND NUMBER. 53900002 MNOTE 12,'THE A PARAMETER MUST BE CODED TO USE A (D,L) PAIR FO*53970002 R K(&I).' 54040002 &ERROR SETB (1) SET THE ERROR FLAG ON. 54110002 AGO .SYNC GO LOOK FOR THE NEXT ONE. 54180002 .KMXLERR ANOP 54250002 &I SETA (&IGAPATH(1)+1) GET THE CURRENT OPERAND NUMBER. 54320002 MNOTE 12,'THE LENGTH OF THE FIELD DEFINED BY K(&I) EXCEEDS 256*54390002 BYTES.' 54460002 &ERROR SETB (1) SET THE ERROR FLAG ON. 54530002 AGO .SYNC GO LOOK AT THE NEXT ONE. 54600002 .KMXBADL ANOP 54670002 &I SETA (1+&IGAPATH(1)) 54740002 MNOTE 12,'THE LENGTH FOR K(&I) MUST BE A SELF-DEFINING DECIMAL*54810002 NUMBER.' 54880002 &ERROR SETB (1) 54950002 AGO .SYNC 55020002 .KMXLBAD ANOP 55090002 &I SETA (1+&IGAPATH(1)) 55160002 MNOTE 12,'THE LENGTH FOR K(&I) CANNOT BE THE EMPTY STRING.' 55230002 &ERROR SETB (1) 55300002 AGO .SYNC 55370002 .KMXNOL ANOP 55440002 &I SETA (1+&IGAPATH(1)) 55510002 MNOTE 12,'LENGTH OF (D,L) PAIR MISSING IN K(&I).' 55580002 &ERROR SETB (1) 55650002 AGO .KMXCHK GO CHECK THE CURRENT ATOM FOR VALIDITY. 55720002 .KMXNOLL ANOP 55790002 MNOTE 12,'LENGTH OF LAST (D,L) PAIR IN K IS MISSING.' 55860002 &ERROR SETB (1) SET THE ERROR FLAG ON. 55930002 AGO .KFIN 56000002 .KMXPRN ANOP 56070002 &I SETA (&IGAPATH(1)+1) 56140002 MNOTE 12,'TOO MANY () LEVELS IN K(&I).' 56210002 &ERROR SETB (1) SET THE ERROR FLAG ON. 56280002 AGO .SYNC 56350002 .KMXBADD ANOP 56420002 &I SETA (1+&IGAPATH(1)) 56490002 MNOTE 12,'DISPLACEMENT IN K(&I) EXCEEDS 4 DIGITS.' 56560002 &ERROR SETB (1) 56630002 AGO .SYNC 56700002 .KMXDBAD ANOP 56770002 &I SETA (1+&IGAPATH(1)) 56840002 MNOTE 12,'DISPLACEMENT IN K(&I) EXCEEDS 4095.' 56910002 &ERROR SETB (1) 56980002 AGO .SYNC 57050002 .********************************************************************** 57120002 .* THE CURRENT ATOM IS AN F OF A (F,L) PAIR. * 57190002 .********************************************************************** 57260002 .KMNOTD AIF (&IGARGHT(&IGAZ) LE 8).KMXBIGF SEE IF THE STRING IS *57330002 BIGGER THAN 8 CHARACTERS. 57400002 &I SETA (1+&IGAPATH(1)) 57470002 MNOTE 12,'FIELD NAME IN K(&I) IS BIGGER THAN 8 CHARACTERS.' 57540002 &ERROR SETB (1) 57610002 AGO .SYNC 57680002 .KMXBIGF ANOP 57750002 &FIELD SETC '&K'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ)) GET THE FIELD *57820002 NAME. 57890002 .* NOW TRY TO GET THE L OF THE (F,L) PAIR. * 57960002 &I SETA (&IGAPATH(1)) PRESERVE THE CURRENT LEVEL 1 INDEX. 58030002 RPTDSECT SCAN=NEXT POSITION THE CURSOR TO THE NEXT ATOM. 58100002 AIF (&IGAX EQ 0).KFLNOL SEE IF THERE IS NO LENGTH BECAUSE *58170002 THERE ISN'T ANY NEXT ATOM. 58240002 AIF (&IGAPATH(1) NE &I).KFNOL SEE IF THE NEXT ATOM IS NOT *58310002 PART OF THE SAME PAIR. 58380002 AIF (&IGALEVL NE 2).KFNOLL SEE IF THE NEXT ATOM HAS TOO *58450002 MANY () LEVELS. 58520002 AIF (&IGAZ EQ 0).KFLMT SEE IF THE LENGTH ATOM IS THE EMPTY *58590002 STRING. 58660002 .********************************************************************** 58730002 .* THE CURRENT ATOM IS INDEED THE SECOND ELEMENT OF A (F,X) PAIR. NOW * 58800002 .* LET'S SEE IF X IS A VALID L. * 58870002 .********************************************************************** 58940002 AIF (&IGARGHT(&IGAZ) GT 3).KFLLBAD SEE IF THE LENGTH ATOM *59010002 IS MORE THAN 3 DIGITS. 59080002 &I SETA 0 INITIALIZE THE INDEX OF THE CURRENT BYTE. 59150002 .KMXCNT2 AIF (('&K'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&K'(&IGALEFT(&IG*59220002 AZ)+&I,1) GT '9')).KFLBAD 59290002 &I SETA (&I+1) STEP OVER TO THE NEXT DIGIT. 59360002 AIF (&I LT &IGARGHT(&IGAZ)).KMXCNT2 KEEP GOING UNTIL ALL *59430002 THE DIGITS HAVE BEEN SCANNED. 59500002 &X SETC '&K'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ)) EXTRACT THE *59570002 LENGTH. 59640002 &LNG SETA (&X) CONVERT IT TO A NUMBER. 59710002 AIF (&LNG GT 256).KFBADL SEE IF THE LENGTH EXCEEDS 256 *59780002 BYTES. 59850002 .********************************************************************** 59920002 .* IT LOOKS LIKE A VALID (F,L) PAIR; GENERATE THE MOVE IF THIS IS THE * 59990002 .* MOVE GENERATION ITERATION. * 60060002 .********************************************************************** 60130002 AIF (NOT &XFER).KMOVED GO IF IT IS NOT THE MOVE ITERATION. 60200002 MVC &IGAKEYL.(&LNG,15),&FIELD MOVE SUBKEY. 60270002 AGO .KMOVED MERGE WITH THE COMMON PATH. 60340002 .********************************************************************** 60410002 .* THE FOLLOWING ARE SUNDRY MNOTES FOR THE (F,L) CASE IN A MIXED LIST.* 60480002 .********************************************************************** 60550002 .KFBADL ANOP 60620002 &I SETA (&IGAPATH(1)+1) 60690002 MNOTE 12,'LENGTH IN OPERAND &I OF K EXCEEDS 256 BYTES.' 60760002 &ERROR SETB (1) 60830002 AGO .SYNC 60900002 .KFLBAD ANOP 60970002 &I SETA (1+&IGAPATH(1)) 61040002 MNOTE 12,'THE LENGTH IN OPERAND K(&I) IS NOT A SELF-DEFINING D*61110002 ECIMAL NUMBER.' 61180002 &ERROR SETB (1) 61250002 AGO .SYNC 61320002 .KFLLBAD ANOP 61390002 &I SETA (1+&IGAPATH(1)) 61460002 MNOTE 12,'LENGTH IN OPERAND K(&I) IS MORE THAN 3 DIGITS.' 61530002 &ERROR SETB (1) 61600002 AGO .SYNC 61670002 .KFLMT ANOP 61740002 &I SETA (1+&IGAPATH(1)) 61810002 MNOTE 12,'LENGTH IN OPERAND &I OF K CANNOT BE THE EMPTY STRING*61880002 .' 61950002 &ERROR SETB (1) 62020002 AGO .SYNC 62090002 .KFNOL ANOP 62160002 MNOTE 12,'LENGTH OF (F,L) PAIR IN OPERAND &I OF K IS MISSING.' 62230002 &ERROR SETB (1) 62300002 AGO .KMXCHK 62370002 .KFNOLL ANOP 62440002 &I SETA (1+&IGAPATH(1)) 62510002 MNOTE 12,'TOO MANY () LEVELS IN K(&I).' 62580002 AGO .SYNC 62650002 .KFLNOL MNOTE 12,'LENGTH OF LAST (FIELD,LENGTH) PAIR IN K IS MISSING.' 62720002 &ERROR SETB (1) SET THE ERROR FLAG ON TO PREVENT THE MOVES. 62790002 AGO .KFIN 62860002 .********************************************************************** 62930002 .KFIN ANOP 63000002 AGO .LINK GO LINK TO THE SRCH8 SUBROUTINE. 63070002 .********************************************************************** 63140002 .* THERE IS NO NEED TO COLLECT THE SEARCH KEY AT IGAWORK, BECAUSE THE * 63210002 .* THE K PARAMETER IS NOT CODED, AND THERE IS ONLY ONE FIELD. * 63280002 .********************************************************************** 63350002 .CHKA AIF (K'&A EQ 0).ASARG SEE IF THE ADDRESS IS OMITTED; IF IT *63420002 IS GET IT OUT OF THE SEARCH ARGUMENT. 63490002 AIF ('&A'(1,1) EQ '(').AGPR SEE IF THE ADDRESS IS IN A GPR. 63560002 LA 0,&A ADDRESS OF SEARCH KEY. 63630002 AGO .CHKAEND GO TO THE END OF CHECKING THE A PARAMETER. 63700002 .AGPR AIF ('&A' EQ '(0)').CHKAEND SEE IF IT IS ALREADY IN R0. 63770002 LR 0,&A(1) ADDRESS OF SEARCH KEY. 63840002 AGO .CHKAEND ALL DONE NOW EXIT FROM CHECKING THE A *63910002 PARAMETER. 63980002 .ASARG ANOP 64050002 .CHKAEND ANOP 64120002 .********************************************************************** 64190002 .* THE ADDRESS OF THE SEARCH KEY IS IN REGISTER 0, NOW LINK TO THE * 64260002 .* SEARCH SUBROUTINE IN IGARPT01 FOR TYPE 8 RADIX PARTITION TREES. * 64330002 .********************************************************************** 64400002 .LINK ANOP 64470002 L 15,(&IGABLST+&IGASRCH)(,1) ADDRESS OF SEARCH ROUTINE. 64540002 BALR 14,15 LINK TO THE APPROPRIATE SEARCH ROUTINE. 64610002 .********************************************************************** 64680002 .* CHECK THE REL PARAMETER FOR ANY ADDITIONAL ACTIONS THAT MUST BE DONE 64750002 .********************************************************************** 64820002 AIF (K'&REL EQ 0).FIN0 SEE IF THE REL PARAMETER IS CODED. 64890002 MNOTE 12,'NONCE ERROR, REL NOT YET AVAILABLE.' 64960002 AGO .FIN0 SKIP THE REST. 65030002 .********************************************************************** 65100002 .* CHECK THE REL PARAMETER FOR A PARTIAL ORDER VALUE SEARCH. * 65170002 .********************************************************************** 65240002 .ITSAPOV ANOP 65310002 AIF (('&REL(1)' EQ 'POV')AND('&REL(2)' EQ 'GE')).POVSRCH 65380002 AIF (('&REL(1)' EQ 'MAX')AND('&REL(2)' EQ 'POV')).MAXPOV 65450002 .BADREL MNOTE 12,'INVALID REL PARAMETER.' 65520002 AGO .FIN0 GO TO THE END OF THE SRCH MACRO. 65590002 .MAXPOV AIF (K'&NULL EQ 0).LOADMAX SEE IF THE NULL IS CODED. 65660002 TM &IGAEOPV.(1),B'1001' SEE IF THE TREE IS EMPTY. 65730002 AIF ('&NULL'(1,1) EQ '(').MXPVGPR 65800002 BC 8,&NULL BRANCH IF THE TREE IS EMPTY. 65870002 AGO .LOADMAX 65940002 .MXPVGPR BCR 8,&NULL(1) BRANCH IF THE RPT IS EMPTY. 66010002 .LOADMAX L 0,&IGAMAX.(,1) LOAD THE MAXIMUM PARTIAL ORDER VALUE. 66080002 L 15,(&IGABLST+&IGAPVS)(,1) ADDRESS OF POV SEARCH. 66150002 BALR 14,15 SET CURSOR TO SINK WITH MAX POV. 66220002 AGO .FIN0 GO TO THE END OF THE SEARCH. 66290002 .********************************************************************** 66360002 .* SEARCH FOR A PARTIAL ORDER VALUE THAT IS GREATER THAN OR EQUAL TO * 66430002 .* THE SEARCH ARGUMENT, BUT AS SMALL A VALUE AS CAN EFFICIENTLY BE * 66500002 .* FOUND. * 66570002 .********************************************************************** 66640002 .POVSRCH AIF ((K'&A EQ 0)AND(K'&K NE 0)).PVS01 66710002 AIF ((K'&A NE 0)AND(K'&K EQ 0)).PVS10 66780002 AIF ((K'&A EQ 0)AND(K'&K EQ 0)).PVS00 66850002 AIF ('&A'(1,1) EQ '(').PVS11R 66920002 L 0,&A(1)+&K(1) LOAD PARTIAL ORDER SEARCH KEY. 66990002 .PVS11RR L 15,(&IGABLST+&IGAPVS)(,1) ADDRESS OF POV SEARCH. 67060002 BALR 14,15 LINK TO POV SEARCH ROUTINE. 67130002 .PVSTEST AIF (K'&NULL EQ 0).PVNNULL SEE IF THE NULL IS CODED. 67200002 &TMP SETC '' SET IT TO THE EMPTY VECTOR. 67270002 AIF ('&NULL'(1,1) NE '(').PVSNGPR AGO IF NULL NOT A GPR. 67340002 &TMP SETC 'R' SET IT TO GENERATE A BCR. 67410002 .PVSNGPR TM &IGAEOPV.(1),B'1001' SEE IF THE TREE IS EMPTY. 67480002 BC&TMP 8,&NULL(1) BRANCH IF IT IS EMPTY. 67550002 .PVNNULL AIF ((K'&Y EQ 0)AND(K'&N EQ 0)).FIN0 SEE IF EITHER Y OR N. 67620002 LTR 15,15 TEST THE RETURN CODE. 67690002 AIF (K'&Y EQ 0).PVNOY SEE IF THE Y PARAMETER NOT CODED. 67760002 &TMP SETC '' SET IT UP TO GENERATE A BC. 67830002 AIF ('&Y'(1,1) NE '(').PVYBC GO IF A BC IS GENERATED. 67900002 &TMP SETC 'R' SET IT UP TO GENERATE A BCR. 67970002 .PVYBC BC&TMP 10,&Y(1) BRANCH IF THE SEARCH FOUND ONE. 68040002 .PVNOY AIF (K'&N EQ 0).FIN0 GO IF N IS NOT CODED. 68110002 &TMP SETC '' 68180002 AIF ('&N'(1,1) NE '(').PVNBC GO IF IT'S NOT IN A GPR. 68250002 &TMP SETC 'R' GET SET TO GENERATE A BCR. 68320002 .PVNBC AIF (K'&Y NE 0).PVNBCC GO IF THE LTR IS ALREADY THERE. 68390002 LTR 15,15 TEST THE RETURN CODE. 68460002 .PVNBCC BC&TMP 4,&N(1) BRANCH IF THERE IS NO QUALIFYING VALUE. 68530002 AGO .FIN0 THE SRCH MACRO IS FINISHED. 68600002 .PVS11R L 0,&K(1)(,&A(1)) LOAD THE PARTIAL ORDER SEARCH KEY. 68670002 AGO .PVS11RR GO DO THE SEARCH. 68740002 .PVS00 MNOTE 12,'PARTIAL ORDER SEARCH KEY NOT SPECIFIED.' 68810002 AGO .FIN0 FORGET, CAN'T DO ANYTHING. 68880002 .PVS10 AIF ('&A' EQ '((0))').PVS11RR SEE IF IT'S ALREADY LOADED. 68950002 &TMP SETC '' 69020002 AIF ('&A'(1,1) NE '(').PVS10M 69090002 &TMP SETC 'R' 69160002 .PVS10M L&TMP 0,&A(1) LOAD THE PARTIAL ORDER SEARCH KEY. 69230002 AGO .PVS11RR GO DO THE SEARCH. 69300002 .PVS01 ANOP 69370002 &TMP SETC 'R' PREPARE TO GENEATE A LOAD REGISTER INSTRUCTION. 69440002 AIF ('&K(1)'(1,1) EQ '(').PVS01R 69510002 &TMP SETC '' 69580002 .PVS01R L&TMP 0,&K(1) LOAD THE PARTIAL ORDER SEARCH KEY. 69650002 AGO .PVS11RR GO DO THE SEARCH. 69720002 .********************************************************************** 69790002 .* PARTIAL ORDER VALUE SEARCH. IF A SEARCH KEY IS SPECIFIED SET THE * 69860002 .* CURSOR USING THE SEARCH KEY. IN ORDER FOR THE SEARCH TO BE * 69930002 .* SUCCESSFUL THERE MUST BE AN EXACT MATCH BETWEEN THE SEARCH KEY AND * 70000002 .* ONE ALREADY IN THE TREE. * 70070002 .********************************************************************** 70140002 .POVGET ANOP 70210002 AIF ((K'&A EQ 0)AND(K'&K EQ 0)).GETPOV 70280002 SRCH (1),A=&A,K=&K,T=&IGARPT# SET THE CURSOR. 70350002 .GETPOV L 15,(&IGABLST+&IGAGPV)(,1) ADDRESS OF GET POV. 70420002 BALR 14,15 LINK TO GET POV FOR CURRENT SINK. 70490002 AGO .PVSTEST GO TEST FOR EXITING BRANCHES, ETC.. 70560002 .*--------------------------------------------------------------------* 70630002 .FIN0 ANOP 70700002 AIF (NOT(&FIN)).SRCH8ZZ SEE IF THE FIN&SYSNDX EQU * SHOULD *70770002 BE GENERATED. 70840002 FIN&SYSNDX EQU * 70910002 .SRCH8ZZ ANOP 70980002 AIF (NOT &USING).FIN SEE IF A USING FOR R1 HAS BEEN *71050002 GENERATED; IF SO GENERATE THE CORRESPONDING *71120002 DROP. 71190002 AGO .FIN SKIP AROUND SRCH5. 71260002 .********************************************************************** 71330002 .* R E A D O N L Y S E A R C H ------- S R C H 5. * 71400002 .********************************************************************** 71470002 .* FOR SRCH5: * 71540002 .* 0. ABSOLUTE 3-BYTE EDGE FIELDS WITH SUCCESSOR PAIRING. * 71610002 .* 1. BIT 0 OF EACH WORD IS A ZERO FOR SINK WORDS AND A ONE FOR INNER * 71680002 .* VERTICES. * 71750002 .* 2. BITS 1-7 OF EACH INNER VERTEX ARE THE BIT INDEX, THUS ALLOWING * 71820002 .* A MAXIMUM KEY OF 16 BYTES. * 71890002 .* 3. NO SCAN FUNCTIONS ARE AVAILABLE WITH SRCH5. * 71960002 .* 4. SRCH5 IS READ-ONLY, IN THE SENSE THAT IT DOES NOT STORE INTO * 72030002 .* ANY MEMORY LOCATIONS, BUT USES REGISTERS 0, 1, 2, 3, 14, AND 15 * 72100002 .* AS WORKING REGISTERS. * 72170002 .* SRCH5 CHECKS A USE COUNT AFTER TERMINATION TO SEE IF AN INSERT * 72240002 .* OR DELETE CHANGE THE TREE DURING THE TIME THE SEARCH WAS IN * 72310002 .* PROGRESS. THIS IS TO ALLOW THE VALIDITY OF SEARCHES PROCEEDING * 72380002 .* WHILE AN INSERT OR DELETE IS IN PROGRESS IN AN MP SITUATION. * 72450002 .*--------------------------------------------------------------------* 72520002 .SRCH5 ANOP 72590002 &GOLEFT SETC 'LOOP'.'&SYSNDX' GENERATE THE LABELS FOR THE 72660002 &ITSMOP SETC 'MOP'.'&SYSNDX' READ-ONLY SEARCH LOOP. 72730002 &ITSEOP SETC 'EOP'.'&SYSNDX' XX 72800002 &TOOBAD SETC 'MORE'.'&SYSNDX' 72870002 &O SETC '0' JUST A ZERO DISPLACEMENT. 72940002 &EKE SETC '4' DISPLACEMENT TO THE USE COUNTER. 73010002 &FOUR SETC '4' A CONSTANT DISPLACEMENT 4. 73080002 &ARG SETC '0' REGISTER TO HOLD THE SEARCH ARGUMENT. 73150002 &TREEHDR SETC '1' USE REGISTER 1 FOR THE TREEHDR ADDRESS. 73220002 &P SETC '2' USE REGISTER 2 FOR THE PREDECESSOR. 73290002 &C SETC '3' USE REGISTER 3 FOR THE PENULTIMATE VERTEX. 73360002 &EKER SETC '14' REGISTER TO HOLD THE COUNTER DURING THE 73430002 .* READ-ONLY SEARCH. 73500002 &S SETC '15' USE REGISTER 15 TO HOLD THE SINK WORD. 73570002 &USING SETB (1) SET THE BIT ON TO INDICATE THAT A USING HAS *73640002 BEEN GENERATED FOR R1. 73710002 .********************************************************************** 73780002 .* THE FOLLOWING TABLE SHOWS THE VARIOUS COMBINATIONS AND * 73850002 .* INTERPRETATIONS OF THE OPERANDS FOR SRCH WITH TYPE 5 TREES: * 73920002 .********************************************************************** 73990002 .* A: A=LABEL OR A=(GPR) MAY BE CODED. * 74060002 .* K: K=, K=FIELDNAME, K=(FIELDNAME,LENGTH), OR K=(D,L) MAY BE * 74130002 .* CODED. IF "K=FIELDNAME" OR "K=(FIELDNAME,LENGTH)" IS CODED, * 74200002 .* THEN THE A PARAMETER DOES NOT HAVE TO BE CODED. IF A IS ALSO * 74270002 .* CODED AN MNOTE WILL BE GENERATED. * 74340002 .* THE MAXIMUM SIZE KEY THAT CAN BE ACCOMODATED FOR TYPE 5 TREES* 74410002 .* IS 16 BYTES. THERE CAN ONLY BE ONE (D,L) PAIR FOR TYPE 5 * 74480002 .* TREES, UNLIKE TYPE 8 TREES, WHERE THERE CAN BE AN ARBITRARY * 74550002 .* NUMBER. * 74620002 .*--------------------------------------------------------------------* 74690002 .* CHECK FOR THE VARIOUS ALLOWABLE COMBINATIONS OF THE KEYL AND SARG. * 74760002 .*--------------------------------------------------------------------* 74830002 .********************************************************************** 74900002 .* THE FOLLOWING ARE THE ONLY WAYS TO CODE THE A AND K PARAMETERS FOR * 74970002 .* TYPE 5 RADIX PARTITION TREES: * 75040002 .* F MEANS A FIELD NAME WITH A LENGTH ATTRIBUTE. * 75110002 .* L MEANS A LENGTH, WHICH MUST BE A SELF-DEFINING TERM. * 75180002 .* D MEANS A DISPLACEMENT, WHICH MUST EITHER BE THE EMPTY STRING OR A * 75250002 .* SELF-DEFINING TERM. * 75320002 .* GPR IS A GENERAL REGISTER NAME OR NUMBER. * 75390002 .* X MEANS ANY STRING OF CHARACTERS. * 75460002 .* * 75530002 .* COMBINATION: MEANING: * 75600002 .* ------------ -------- * 75670002 .* A=F,K= F IS A LABEL, AND THE LENGTH OF THE KEY IS * 75740002 .* THE SAME AS THE LENGTH OF F. * 75810002 .* A=F,K=L F IS THE SEARCH KEY, AND L IS THE SEARCH KEY * 75880002 .* LENGTH (IT MUST BE A SELF-DEFINING TERM). * 75950002 .* A=F,K=(,L) SAME AS ABOVE. * 76020002 .* A=F,K=(D,L) THE SEARCH KEY IS AT DISPLACEMENT D FROM THE * 76090002 .* BEGINNING OF THE FIELD F, AND IS L BYTES LONG. 76160002 .* A=(GPR),K=L THE ADDRESS OF THE FIRST BYTE OF THE SEARCH * 76230002 .* KEY IS IN THE INDICATED REGISTER, AND THE KEY* 76300002 .* IS L BYTES LONG. * 76370002 .* A=(GPR),K=(,L) SAME AS ABOVE. * 76440002 .* A=(GPR),K=(D,L) THE ADDRESS OF THE KEY IS FORMED BY ADDING * 76510002 .* THE ADDRESS IN THE INDICATED REGISTER TO THE * 76580002 .* DISPLACEMENT D, AND THE KEY IS L BYTES LONG. * 76650002 .* A=,K=F F IS THE SEARCH KEY, AND ITS LENGTH IS THE * 76720002 .* SAME AS THE LENGTH OF F. * 76790002 .* A=,K=(F,L) F IS THE SEARCH KEY, AND L IS ITS LENGTH. * 76860002 .********************************************************************** 76930002 .*--------------------------------------------------------------------* 77000002 .********************************************************************** 77070002 .* IN THE FOLLOWING, THE SEARCH IS DONE FOR KEYS WITH 4 BYTES OR LESS.* 77140002 .* THE KEY IS PLACED IN REGISTER 0 JUST BEFORE THE MAIN SEARCH LOOP. * 77210002 .* THE KEY IS RIGHT ALIGNED IN REGISTER ZERO, WITH ZEROS FILLED IN ON * 77280002 .* THE LEFT. * 77350002 .********************************************************************** 77420002 AIF (&ERROR).FIN5 SEE IF ANY ERRORS HAVE BEEN DISCOVERED *77490002 PRIOR TO THIS PART. 77560002 AIF ((K'&A EQ 0)AND(K'&K EQ 0)).FIN5 SEE IF NEITHER A NOR K*77630002 IS CODED. 77700002 AIF (K'&K NE 0).S5KNOTZ SEE IF K IS CODED. 77770002 .********************************************************************** 77840002 .* ONLY THE A PARAMETER IS CODED, SO IT MUST BE A FIELD NAME WITH A * 77910002 .* LENGTH ATTRIBUTE IN ORDER TO BE VALID. * 77980002 .********************************************************************** 78050002 AIF (K'&A LE 4).NOTPP SEE IF THE A PARAMETER IS CODED AS *78120002 "A=((GPR))". IF IT IS, THEN THE SEARCH KEY IS *78190002 ALREADY LOADED INTO THE INDICATED REGISTER. 78260002 AIF ('&A'(1,2) NE '((').NOTPP IF IT IS IN A REGISTER, THEN *78330002 IT MUST BE RIGHT ALIGNED, WITH THE LEFT FILL *78400002 BITS BEING ZERO. 78470002 AIF ('&A' EQ '((0))').SRCH5Z SEE IF IT IS EVEN ALREADY IN *78540002 REGISTER 0. 78610002 LR 0,&A(1) SEARCH KEY. 78680002 AGO .SRCH5Z GOT THE SEARCH KEY IN REGISTER 0, NOW GO *78750002 GENERATE THE SEARCH. 78820002 .NOTPP ANOP 78890002 AIF ('&A'(1,1) EQ '(').AGRNOK SEE IF THE A PARAMETER IS *78960002 INCORRECTLY SPECIFIED IN A REGISTER. 79030002 AIF ((T'&A EQ 'M')OR(T'&A EQ 'N')OR(T'&A EQ 'O')OR (T'&A EQ *79100002 'T')OR(T'&A EQ 'W')OR(T'&A EQ '$')OR(T'&A EQ 'U')).ANOTF*79170002 SEE IF A IS NOT A FIELD NAME. 79240002 &IGAKEYL SETA (L'&A) GET THE SEARCH KEY LENGTH. 79310002 AIF (K'&A GT 8).ATOOBIG SEE IF THE FIELD NAME IS BIGGER *79380002 THAN 8 CHARACTERS. 79450002 &FIELD SETC '&A' GET THE FIELD NAME. 79520002 .S5LCHK AIF (&IGAKEYL GT 4).AFLGT4 SEE IF THE KEY LENGTH IS MORE *79590002 THAN FOUR BYTES. 79660002 AIF (&IGAKEYL GE 3).AFL34 SEE IF THE KEY LENGTH IS BIGGER *79730002 THAN TWO BYTES. 79800002 AIF (&IGAKEYL EQ 2).AFL2 SEE IF THE KEY LENGTH IS EXACTLY *79870002 TWO BYTES. 79940002 AIF (&IGAKEYL NE 1).NULLKEY SEE IF THE KEY LENGTH IS ZERO. 80010002 .AFL1 SLR 0,0 THE SEARCH KEY 80080002 IC 0,&FIELD IS ONE BYTE LONG. 80150002 AGO .SRCH5Z NOW GO GENERATE THE SRCH5 IN LINE. 80220002 .AFL2 LH 0,&FIELD SEARCH KEY IS 80290002 N 0,=XL4'0000FFFF' TWO BYTES LONG. 80360002 AGO .SRCH5Z NOW GO GENERATE THE SEARCH IN LINE. 80430002 .AFL3 L 00,&FIELD 3-BYTE SEARCH KEY. 80500002 SRL 0,8 GET IT RIGHT ALIGNED. 80570002 AGO .SRCH5Z GO GENERATE THE SEARCH LOOP. 80640002 .AFL34 AIF (&IGAKEYL EQ 3).AFL3 SEE IF THE SEARCH KEY LENGTH IS *80710002 EXACTLY THREE BYTES. 80780002 L 0,&FIELD 4-BYTE SEARCH KEY. 80850002 AGO .SRCH5Z GO FINISH UP NOW. 80920002 .AFLGT4 AGO .S5NONCE CAN'T HAVE TYPE 5 KEYS BIGGER THAN 5 YET. 80990002 .********************************************************************** 81060002 .* THE K PARAMETER IS CODED, SEE IF THE A PARAMETER IS CODED TOO. * 81130002 .********************************************************************** 81200002 .S5KNOTZ ANOP 81270002 AIF (K'&A NE 0).S5BOTH SEE IF BOTH THE A AND K PARAMETERS *81340002 ARE CODED. 81410002 .********************************************************************** 81480002 .* ONLY THE K PARAMETER IS CODED. IT MUST BE ONE OF THE CASES K=F OR * 81550002 .* K=(F,L). ANYTHING ELSE MUST BE WRONG. * 81620002 .********************************************************************** 81690002 AIF (N'&K GT 2).LOTSAK SEE IF THERE ARE TOO MANY OPERANDS. 81760002 AIF (N'&K EQ 2).S5K2 SEE IF THERE ARE EXACTLY 2. 81830002 AIF ('&K'(1,1) EQ '(').S5K1P SEE IF IT LOOKS LIKE A GPR. 81900002 AIF ((T'&K(1) EQ 'M')OR(T'&K(1) EQ 'N')OR(T'&K(1) EQ 'O')OR(*81970002 T'&K(1) EQ 'T')OR(T'&K(1) EQ 'W')OR(T'&K(1) EQ '$')OR(T'*82040002 &K(1) EQ 'U')).KINVF SEE IF K IS A GOOD FIELD NAME. 82110002 AIF (K'&K GT 8).KBIGTAG SEE IF THE FIELD NAME HAS TOO MANY *82180002 CHARACTERS IN IT TO BE A VALID NAME. 82250002 &FIELD SETC '&K' SET FIELD TO THE FIELD NAME. 82320002 AGO .S5LCHK MERGE IN WITH THE OTHER LENGTH CHECK. 82390002 .********************************************************************** 82460002 .* THE K PARAMETER IS CODED AND THE A PARAMETER IS NOT CODED, AND THE * 82530002 .* K PARAMETER HAS EXACTLY TWO ELEMENTS IN IT. SEE IF K IS OF THE FORM* 82600002 .* (F,L). IF IT ISN'T IT IS AN ERROR. * 82670002 .********************************************************************** 82740002 .S5K2 ANOP 82810002 AIF (T'&K(2) EQ 'N').S5K2N SEE IF THE LENGTH IS A SELF- *82880002 DEFINING TERM. 82950002 &I SETA (K'&K(2)) SET THE INDEX TO IT'S INITIAL VALUE. 83020002 .K5LCHK AIF (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).S5LERR 83090002 &I SETA (&I-1) DECREASE THE INDEX TO THE NEXT CHARACTER. 83160002 AIF (&I GT 0).K5LCHK SEE IF THERE ARE MORE TO CHECK. 83230002 AIF (K'&K(2) GT 4).S5LERR SEE IF IT HAS TOO MANY DIGITS. 83300002 .S5K2N ANOP 83370002 &IGAKEYL SETA (&K(2)) GET THE LENGTH AS A NUMBER. 83440002 AIF (K'&K(1) GT 8).KBIGTAG SEE IF IT HAS TOO MANY *83510002 CHARACTERS IN IT TO BE A VALID NAME. 83580002 &FIELD SETC '&K(1)' GET THE FIELD NAME. 83650002 AGO .S5LCHK MERGE IN WITH THE OTHER SEQUENCE. 83720002 .********************************************************************** 83790002 .* BOTH THE A AND K PARAMETERS ARE CODED. * 83860002 .********************************************************************** 83930002 .S5BOTH ANOP 84000002 AIF ('&A'(1,1) EQ '(').S5BAISG SEE IF THE A PARAMETER *84070002 SPECIFIES A GENERAL REGISTER. 84140002 AIF (N'&K GT 2).LOTSAK SEE IF THERE ARE TOO MANY. 84210002 AIF (N'&K EQ 2).S5AK2 SEE IF THERE ARE EXACTLY 2. 84280002 AIF ('&K'(1,1) EQ '(').S5K1P SEE IF IT LOOKS LIKE THE *84350002 DISPLACEMENT-LENGTH PAIR IS IN A GPR. 84420002 .********************************************************************** 84490002 .* THIS MUST BE THE CASE WHERE A=F,K=L. * 84560002 .********************************************************************** 84630002 AIF (T'&K EQ 'N').AFKL5OK SEE IF THE LENGTH IS A *84700002 SELF-DEFINING TERM. 84770002 &I SETA (1) SET THE INDEX TO ITS INITIAL VALUE. 84840002 .AFKL5CK AIF (('&K'(&I,1) LE '0')OR('&K'(&I,1) GT '9')).S5LERR *84910002 CHECK THE LENGTH TO SEE IF IT IS REALLY A *84980002 NUMBER. 85050002 &I SETA (&I+1) EKE THE INDEX OF THE NEXT CHARACTER TO BE *85120002 INSPECTED. 85190002 AIF (&I LT K'&K).AFKL5CK KEEP ON LOOKING UNTIL ALL THE *85260002 CHARACTERS HAVE BEEN INSPECTED. 85330002 .AFKL5OK ANOP 85400002 &IGAKEYL SETA (&K) CAPTURE THE KEY LENGTH AS A NUMBER. 85470002 AIF (&IGAKEYL EQ 1).AFKL51 SEE IF THE KEY LENGTH IS ONE *85540002 BYTE. 85610002 AIF (&IGAKEYL EQ 2).AFKL52 SEE IF THE KEY LENGTH IS TWO *85680002 BYTES. 85750002 AIF (&IGAKEYL EQ 3).AFKL53 SEE IF THE KEY LENGTH IS 3 *85820002 BYTES. 85890002 AIF (&IGAKEYL NE 4).S5NONCE SEE IF THE KEY LENGTH IS FOUR *85960002 BYTES. 86030002 L 0,&A SEARCH ARGUMENT. 86100002 AGO .SRCH5Z GO DO THE ACTUAL SEARCH. 86170002 .AFKL51 SLR 0,0 KEY LENGTH IS ONE BYTE. 86240002 IC 0,&A 1-BYTE SEARCH KEY. 86310002 AGO .SRCH5Z GO GENERATE THE ACTUAL SEARCH CODE. 86380002 .AFKL52 LH 0,&A HALFWORD SEARCH KEY. 86450002 AGO .SRCH5Z GO GENERATE THE SEARCH CODE. 86520002 .AFKL53 L 0,&A LOAD 3-BYTE SEARCH KEY. 86590002 SRL 0,8 SHIFT IT OVER. 86660002 AGO .SRCH5Z GO GENERATE THE REAL SEARCH. 86730002 .AFKL54 L 0,&A LOAD FULL-WORD SEARCH KEY. 86800002 AGO .SRCH5Z GO GENERATE THE REAL SEARCH CODE. 86870002 .********************************************************************** 86940002 .* THIS MUST BE THE CASE WHERE A=F,K=(D,L). * 87010002 .********************************************************************** 87080002 .S5AK2 AIF (T'&K(2) EQ 'N').S5K2N1 SEE IF THE LENGTH IS A SELF- *87150002 DEFINING TERM. 87220002 AIF (K'&K(2) EQ 0).S5LERR SEE IF IT IS THE EMPTY STRING. 87290002 &I SETA (K'&K(2)) SET THE INDEX TO IT'S INITIAL VALUE. 87360002 .K5LCHK1 AIF (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).S5LERR 87430002 &I SETA (&I-1) DECREASE THE INDEX TO THE NEXT CHARACTER. 87500002 AIF (&I GT 0).K5LCHK1 SEE IF THERE ARE MORE TO CHECK. 87570002 AIF (K'&K(2) GT 4).S5LERR SEE IF IT HAS TOO MANY DIGITS. 87640002 .S5K2N1 ANOP 87710002 &IGAKEYL SETA (&K(2)) GET THE KEY LENGTH AS A NUMBER. 87780002 &DSP SETA 0 SET THE DISPLACEMENT TO ITS DEFAULT VALUE. 87850002 AIF (K'&K(1) EQ 0).S5AK2D SEE IF THE DISPLACEMENT FIELD IS *87920002 ELIDED. 87990002 AIF ('&K(1)' EQ '0').S5AK2D SEE IF IT IS ZERO. 88060002 AIF (T'&K(1) EQ 'N').PICK5D SEE IF THE DISPLACEMENT IS A *88130002 SELF-DEFINING TERM. 88200002 &I SETA (K'&K(1)) SET THE INDEX TO IT'S INITIAL VALUE. 88270002 .CHECK5D AIF (('&K(1)'(&I,1) LT '0')OR('&K(1)'(&I,1) GT '9')).S5DERR 88340002 &I SETA (&I-1) DECREASE THE INDEX TO THE NEXT CHARACTER. 88410002 AIF (&I GT 0).CHECK5D SEE IF IT GOT TO THE END. 88480002 AIF (K'&K(1) GT 4).S5DLONG SEE IF IT HAS TOO MANY DIGITS. 88550002 .PICK5D ANOP 88620002 &DSP SETA (&K(1)) GET THE DISPLACEMENT AS A NUMBER. 88690002 .S5AK2D ANOP 88760002 .S5DLCHK ANOP 88830002 AIF (&IGAKEYL GT 4).S5DL5 SEE IF THE KEY LENGTH IS MORE *88900002 THAN 4 BYTES. 88970002 AIF (&IGAKEYL EQ 4).S5DL4 SEE IF THE KEY LENGTH IS 4 BYTES. 89040002 AIF (&IGAKEYL EQ 3).S5DL3 SEE IF THE KEY LENGTH IS 3 BYTES. 89110002 AIF (&IGAKEYL EQ 2).S5DL2 SEE IF THE KEY LENGTH IS 2 BYTES. 89180002 AIF (&IGAKEYL NE 1).NULLKEY SEE IF THE KEY LENGTH IS ZERO. 89250002 .S5DL1 SLR 0,0 SEARCH KEY IS 89320002 AIF (&DSP EQ 0).S5DL1Z SEE IF THE DISPLACEMENT IS ZERO. 89390002 IC 0,&A ONE BYTE LONG. 89460002 AGO .S5DL1ZZ SKIP AROUND THE OTHER INSERT CHARACTER *89530002 INSTRUCTION. 89600002 .S5DL1Z IC 0,&DSP+&A ONE BYTE LONG. 89670002 .S5DL1ZZ ANOP 89740002 AGO .SRCH5Z GO DO THE IN LINE SEARCH. 89810002 .S5DL2 AIF (&DSP EQ 0).S5DL2Z SEE IF THE DISPLACEMENT IS ZERO. 89880002 LH 0,&DSP+&A HALFWORD 89950002 AGO .S5DL2ZZ SKIP AROUND THE OTHER LOAD HALFWORD *90020002 INSTRUCTION. 90090002 .S5DL2Z LH 0,&A HALFWORD 90160002 .S5DL2ZZ ANOP 90230002 N 0,=XL4'0000FFFF' SEARCH KEY. 90300002 AGO .SRCH5Z GO WRAP IT UP. 90370002 .S5DL3 AIF (&DSP EQ 0).S5DL3Z SEE IF THE DISPLACEMENT IS ZERO. 90440002 L 0,&DSP+&A THREE-BYTE SEARCH KEY. 90510002 AGO .S5DL3ZZ SKIP THE OTHER LOAD INSTRUCTION. 90580002 .S5DL3Z L 0,&A THREE-BYTE SEARCH KEY. 90650002 .S5DL3ZZ ANOP 90720002 SRL 0,8 GET IT RIGHT ALIGNED. 90790002 AGO .SRCH5Z GO DO THE IN-LINE SEARCH. 90860002 .S5DL4 AIF (&DSP EQ 0).S5DL4Z SEE IF THE DISPLACEMENT IS ZERO. 90930002 L 0,&DSP+&A 4-BYTE KEY. 91000002 AGO .S5DL4ZZ SKIP THE OTHER LOAD INSTRUCTION. 91070002 .S5DL4Z L 0 &A 4-BYTE KEY. 91140002 .S5DL4ZZ ANOP 91210002 AGO .SRCH5Z GO FINISH IT UP. 91280002 .S5DL5 AGO .S5NONCE THIS IS ONLY FOR THE NONCE. 91350002 .********************************************************************** 91420002 .* BOTH THE A AND K PARAMETERS ARE CODED, AND A SPECIFIES A GPR. * 91490002 .* THEREFORE IT MUST BE THE CASE WHERE A=(GPR),K=(D,L). NOTE THAT THE * 91560002 .* DISPLACEMENT CAN BE THE EMPTY STRING. * 91630002 .* ALSO THE CASE OF A=(GPR),K=L GOES ALONG WITH THESE. * 91700002 .********************************************************************** 91770002 .S5BAISG ANOP 91840002 AIF (N'&K GT 2).LOTSAK SEE IF K HAS TOO MANY OPERANDS. 91910002 AIF (N'&K EQ 2).S5AGK2 SEE IF K HAS EXACTLY 2 OPERANDS. 91980002 AIF ('&K'(1,1) EQ '(').S5K1P SEE IF IT LOOKS LIKE A GPR. 92050002 AIF (T'&K NE 'N').S5LERR SEE IF IT'S A SELF-DEFINING TERM. 92120002 .********************************************************************** 92190002 .* IT IS A=(GPR),K=L. * 92260002 .********************************************************************** 92330002 &IGAKEYL SETA (&K) GET THE KEY LENGTH AS A NUMBER. 92400002 &DSP SETA 0 SET THE DISPLACEMENT TO ITS DEFAULT VALUE. 92470002 .S5GLCHK AIF (&IGAKEYL GT 4).S5GL5 SEE IF THE KEY LENGTH EXCEEDS 4. 92540002 AIF (&IGAKEYL EQ 4).S5GL4 SEE IF IT IS EXACTLY 4 BYTES. 92610002 AIF (&IGAKEYL EQ 3).S5GL3 SEE IF IT IS EXACTLY 3 BYTES. 92680002 AIF (&IGAKEYL EQ 2).S5GL2 SEE IF IT IS EXACTLY 2 BYTES. 92750002 AIF (&IGAKEYL NE 1).S5LERR SEE IF IT IS ZERO. 92820002 .S5GL1 SLR 0,0 1-BYTE KEY. 92890002 IC 0,&DSP&A 92960002 AGO .SRCH5Z GO FINISH UP. 93030002 .S5GL2 LH 0,&DSP&A 2-BYTE KEY. 93100002 N 0,=XL4'0000FFFF' 93170002 AGO .SRCH5Z 93240002 .S5GL3 L 0,&DSP&A 3-BYTE KEY. 93310002 SRL 0,8 93380002 AGO .SRCH5Z 93450002 .S5GL4 L 0,&DSP&A 4-BYTE KEY. 93520002 AGO .SRCH5Z GO FINISH IT UP. 93590002 .S5GL5 AGO .S5NONCE 93660002 .********************************************************************** 93730002 .* IT IS A=(GPR),K=(D,L). * 93800002 .********************************************************************** 93870002 .S5AGK2 ANOP 93940002 AIF (T'&K(2) NE 'N').S5LERR SEE IF IT'S NOT SELF-DEFINING. 94010002 &DSP SETA 0 SET D TO THE DEFAULT VALUE. 94080002 &IGAKEYL SETA (&K(2)) GET THE KEY LENGTH AS A NUMBER. 94150002 AIF (K'&K(1) EQ 0).S5GLCHK SEE IF THE DISPLACEMENT IS THE *94220002 EMPTY STRING. 94290002 AIF (T'&K(1) NE 'N').S5DERR SEE IF IT'S NOT SELF-DEFINING. 94360002 &DSP SETA (&K(1)) GET THE DISPLACEMENT AS A NUMBER. 94430002 AGO .S5GLCHK MERGE WITH THE COMMON PATH. 94500002 .SRCH5Z AIF (&ERROR).FIN5 DON'T GENERATE THE SEARCH IF ERRORS HAVE *94570002 BEEN DETECTED ALREADY. 94640002 &TOOBAD L &EKER,&IGACNT5.(,&TREEHDR) LOAD THE USE COUNTER. 94710002 LA &P,&IGATOP5.(,&TREEHDR) ADDRESS OF RPT SOURCE. 94780002 LR &C,&P XX 94850002 L &S,&O.(&O,&C) 94920002 CL &S,&IGAMSK5.(,&TREEHDR) SEE IF THERE ARE ZERO SINKS. 94990002 BC 7,&GOLEFT+4 95060002 BC 15,&ITSEOP 95130002 &GOLEFT L &S,&O.(&O,&C) LOAD THE SINK WORD OR THE NEXT INNER 95200002 LTR &S,&S VERTEX AND TEST FOR THE END OF THE PATH. 95270002 BC 10,&ITSEOP BRANCH IF THE SINK WORD WAS LOADED. 95340002 &ITSMOP LR &P,&C CYCLE THE REGISTERS SO THAT THESE TWO 95410002 LR &C,&S ARE ALWAYS CONSECUTIVE VERTICES. 95480002 SRL &S,24 GET THE BIT INDEX FIELD IN THE LOW ORDER. 95550002 L &S,(&IGAMSK5-X'80')(&TREEHDR,&S) LOAD MASK TO TEST BIT. 95620002 NR &S,&ARG TEST THE BIT. 95690002 BC 8,&GOLEFT BRANCH IF IT IS A ZERO TO THE LEFT PATH. 95760002 L &S,&FOUR.(&O,&C) ENTER THE RIGHT SUBTREE BY LOADING 95830002 LA &C,&FOUR.(&O,&C) THE PAIRED RIGHT SUCCESSOR AND 95900002 LTR &S,&S MAKE THE CURRENT VERTEX ADDRESS IT. 95970002 BC 4,&ITSMOP BRANCH IF THE NEW VERTEX IS AN INNER VERTEX. 96040002 &ITSEOP CL &EKER,&IGACNT5.(,&TREEHDR) CHECK THE COUNTER TO SEE IF 96110002 BC 7,&TOOBAD THE READ-ONLY SEARCH MUST BE DONE AGAIN. 96180002 AGO .FIN5 96250002 .AGRNOK MNOTE 12,'SEARCH KEY LENGTH CANNOT BE DETERMINED WITH A IN A *96320002 GPR AND NO K.' 96390002 &ERROR SETB (1) SET THE ERROR FLAG ON. 96460002 AGO .FIN5 FINISH UP AND GET OUT. 96530002 .ANOTF MNOTE 12,'THE FIELD DEFINED BY A HAS NOT A VALID LENGTH ATTRIB*96600002 UTE.' 96670002 &ERROR SETB (1) SET THE ERROR FLAG ON. 96740002 AGO .FIN5 GET OUT NOW. 96810002 .ATOOBIG MNOTE 12,'FIELD NAME IN A PARAMETER IS TOO MANY CHARACTERS.' 96880002 &ERROR SETB (1) SET THE ERROR FLAG ON. 96950002 AGO .FIN5 EXIT. 97020002 .NULLKEY MNOTE 12,'LENGTH OF SEARCH KEY DEFINED IS ZERO.' 97090002 &ERROR SETB (1) SET THE ERROR FLAG ON. 97160002 AGO .FIN5 EXIT AFTER CLEANING UP. 97230002 .S5NONCE MNOTE 12,'NONCE ERROR, ONLY KEYS UP TO 4 BYTES ARE SUPPORTED.' 97300002 &ERROR SETB (1) SET THE ERROR FLAG ON. 97370002 AGO .FIN5 FORGET IT FOR THE NONCE. 97440002 .LOTSAK MNOTE 12,'TOO MANY OPERANDS IN THE K PARAMETER LIST.' 97510002 &ERROR SETB (1) SET THE ERROR FLAG ON. 97580002 AGO .FIN5 97650002 .S5K1P MNOTE 12,'THE DISPLACEMENT-LENGTH PAIR MAY NOT BE IN A GPR.' 97720002 &ERROR SETB (1) 97790002 AGO .FIN5 97860002 .KINVF MNOTE 12,'FIELD IN K PARAMETER HAS INVALID LENGTH ATTRIBUTE.' 97930002 &ERROR SETB (1) 98000002 AGO .FIN5 98070002 .KBIGTAG MNOTE 12,'TOO MANY CHARACTERS IN FIELD NAME; ONLY 8 ALLOWED.' 98140002 &ERROR SETB (1) 98210002 AGO .FIN5 98280002 .S5LERR MNOTE 12,'LENGTH IS NOT A SELF-DEFINING TERM IN K PARAMETER.' 98350002 &ERROR SETB (1) 98420002 AGO .FIN5 98490002 .S5DERR MNOTE 12,'THE DISPLACEMENT IN THE K PARAMETER IS NOT A SELF-DE*98560002 FINING TERM.' 98630002 &ERROR SETB (1) 98700002 AGO .FIN5 98770002 .S5DLONG MNOTE 12,'K PARAMETER DISPLACEMENT HAS TOO MANY DIGITS.' 98840002 &ERROR SETB (1) 98910002 .FIN5 ANOP 98980002 AIF (NOT &USING).FIN SEE IF THE DROP SHOULD BE GENERATED. 99050002 .*--------------------------------------------------------------------* 99120002 .* T H E E N D O F M A C R O S R C H. * 99190002 .*--------------------------------------------------------------------* 99260002 .FIN ANOP 99330002 .END ANOP 99400002 MEND 99470002