*DECK CBPOLSH 
  PROC CBPOLSH; 
    BEGIN 
#  PARAMETERS PASSED                                                   #
      XREF ARRAY QIN [500] S;      #CONTAINS THE OPERATORS SPECIF-     #
        BEGIN                          # IED IN THE WHERE CLAUSE. THERE#
          ITEM QINENTRY U(0,0,60);     # SEQUENCE WHEN ENTERING        #
                                       # CBPOLISH IS THE ORDER IN WHICH#
                                       # THEY WERE SPECIFIED. WHEN EXIT#
                                       # ING CBPOLISH, QIN WILL CONTAIN#
                                       # THE OPERATOR ENTRIES IN POLISH#
                                       # NOTATION.                     #
          ITEM QINOPCDE U(0,0,6);      # OPERATOR CODE.                #
                                       # 1 = EQ                        #
                                       # 2 = NE                        #
                                       # 3 = GE                        #
                                       # 4 = LE                        #
                                       # 5 = GT                        #
                                       # 6 = LT                        #
                                       # 7 = AND                       #
                                       # 8 = OR                        #
                                       # 9 = XOR                       #
                                       # 10= NOT                       #
                                       # 11=<                          #
                                       # 12= >                         #
                                       # 13= TERMINATOR                #
        END 
      XREF ITEM ERRCODE;               # THIS IS AN EXIT CONDITION. IF #
                                       # CBPOLISH ENCOUNTERED AN ERROR,#
                                       # IT STORES THE RQTSTACK OPERATR#
                                       # ENTRY POINTER OF THE OPERATOR #
                                       # IN ERROR INTO THIS CELL.      #
#   END OF PARAMETERS                                                  #
      ITEM QINPTR;                     # POINTER TO AN OPERATOR ENTRY  #
                                       # IN QIN.                       #
      ITEM QOPSPTR;                    # POINTER TO AN OPERATOR ENTRY  #
                                       # IN QOPS.                      #
      ITEM POLISHPTR;                  # POINTER TO AN OPERATOR ENTRY  #
                                       # IN QIN AFTER EXAMINING PRECED-#
                                       # ENCE.                         #
      ARRAY PRECEDENTBL [13];          # CONTAINS CODES RELATING THE   #
                                       # OPERATORS BY PRECEDENCE. EACH #
                                       # WORD STANDS FOR AN OPERATOR   #
                                       # AND 2-BIT FIELDS WITHIN EACH  #
                                       # WORD CONTAINS A CODE REPRESENT#
                                       # ING THE PRECEDENCE BETWEEN    #
                                       # THAT OPERATOR AND ANOTHER.    #
                                       # 0 = NO RELATION (ERROR)       #
                                       # 1 = PRECEDED BY               #
                                       # 2 = PRECEDES                  #
                                       # 3 = EQUALS.                   #
        ITEM PRECEDENCE U(0,0,60) = [O"05252525400000000000", 
                                     O"00001240500000000000", 
                                     O"00001240500000000000", 
                                     O"00001240500000000000", 
                                     O"00001240500000000000", 
                                     O"00001240500000000000", 
                                     O"00001240500000000000", 
                                     O"05253245500000000000", 
                                     O"05252645500000000000", 
                                     O"05253245500000000000", 
                                     O"05253251500000000000", 
                                     O"05252525700000000000", 
                                     O"00000524300000000000", 
                                     O"00000000000000000000"];
      SWITCH   PRECEDSWITCH NORELATION,FOLLOWS,PRECEDES,EQUALS; 
      ARRAY QOPS [100] S(1);         # TEMPORARY OPERATOR STACK USED TO#
        BEGIN                        # HOLD OPERATORS WHILE DETERMINING#
          ITEM QOPSOPCDE U(0,0,6);   # PRECEDENCE.                     #
          ITEM QOPSENTRY U(0,0,60); 
        END 
      FOR QOPSPTR = 0 STEP 1 UNTIL 100 DO 
        QOPSENTRY[QOPSPTR] = 0; 
      QINPTR = 0;  # INITIALIZE POINTER.                               #
      POLISHPTR = 0; # INITIALIZE POINTER.                             #
      QOPSPTR = 0;    # INITIALIZE QOPS POINTER.                       #
      QOPSOPCDE[QOPSPTR] = 0; # STACK LEFT TERMINATOR.                 #
    NEXT: 
      IF QINOPCDE[QINPTR] LS 1 OR QINOPCDE[QINPTR] GR 13 THEN 
        GOTO NORELATION; # CHECK FOR INVALID OPERATOR CODE             #
      GOTO PRECEDSWITCH[B<QINOPCDE[QINPTR]*2,2>PRECEDENCE[QOPSOPCDE 
        [QOPSPTR]]]; # USE PRECEDENCE RELATIONSHIP BETWEEN TOP OF QOPS# 
                    # AND CURRENT QIN AS A SWITCH VALUE.               #
    NORELATION: 
      QINOPCDE[POLISHPTR] = 13; 
      RETURN; 
    EQUALS: 
      QINPTR = QINPTR + 1; # SET POINTER TO THE NEXT QIN ENTRY.        #
      QOPSPTR = QOPSPTR - 1; # POP QOPS STACK.                         #
      GOTO NEXT;
    FOLLOWS:  
      QOPSPTR = QOPSPTR + 1; # PUSH DOWN QOPS STACK.                   #
      QOPSENTRY[QOPSPTR] = QINENTRY[QINPTR]; # STACK INPUT OPERATOR IN #
      QINPTR = QINPTR + 1;                   # QOPS.                   #
      GOTO NEXT;
    PRECEDES: 
      QINENTRY[POLISHPTR] = QOPSENTRY[QOPSPTR]; # STACK OPERATOR ON    #
                                                # POLISH STACK.        #
      IF QINOPCDE[POLISHPTR] EQ 0 THEN  # END OF STACK.                #
        RETURN; 
      POLISHPTR = POLISHPTR + 1; # PUSHDOWN POLISH STACK.              #
      QOPSPTR = QOPSPTR - 1;  # POP OPS STACK.                         #
      GOTO NEXT;
    END 
  TERM; 
