*DECK DB$CMPR 
USETEXT CDGDFTX 
      PROC DB$CMPR; 
      BEGIN 
 #
  *    DB$CMPR                                   PAGE 1 
  *   COMPARE PRIMITIVE 
  *   J.W.PERRY                                  DATE  04/04/74 
  *   M L MOORE - REVISION FOR MFP               11/11/75 
  *   M D SAXE - REVISION FOR MFP (CDCS 2.0)     09/24/76 
  DC  PURPOSE 
      COMPARE VALUE OF DESIGNATED TARGET ITEM WITH
      DESIGNATED COMPARISON VALUE (USUALLY CHECK LITERAL OR,
      FROM MFP, A SOURCE DBI VALUE SAVED IN A JOIN BUFFER). 
  DC  ENTRY CONDITIONS
        DB$RMCM CELLS 
      COMPBWP CONTAINS BEGINNING WORD POS OF COMPARISON VALUE.
      COMPBCP CONTAINS BEGINNING CHAR POS OF COMPARISON VALUE 
      DCTABLE CONTAINS DISPLAY-TO-COLLATING TABLE.
      LITLENG CONTAINS LENGTH OF COMPARISON VALUE (WORDS).
      TCLASS (IN ARRAY TRGCLASS) CONTAINS TARGET ITEM CLASS CODE. 
      TGIBBP CONTAINS TARGET ITEM BEGINNING BIT POSITION. 
      TGIFWA CONTAINS TARGET ITEM FWA.
      TSIZE  (IN ARRAY TRGCLASS) CONTAINS TARGET ITEM SIZE (BITS).
      TRGPIC ARRAY CONTAINS TARGET ITEM PIC INFO. 
  DC  EXIT CONDITIONS 
      HILOEQ (DB$RMCM COMMON) = -1 IF TARGET VAL LESS THAN COMP VAL.
                              = 0  IF TARGET VAL EQUALS COMPARISON VAL. 
                              = +1 IF TARGET VAL GREATER THAN COMP VAL. 
      ENTRY CELLS UNCHANGED.
  DC  CALLING ROUTINES
      DB$JCPR - COMPARE JOIN ITEM (IN DB$MFP) 
      DB$QUAL - RELATION QUALIFICATION ROUTINE
  DC  CALLED ROUTINES 
      DB$FLOP - GENERATE FLOW POINT 
      DC$CMPR - COMPARE ROUTINE SHARED WITH RECORD MAPPER.
  DC  NON-LOCAL VARIABLES 
      ERRSTAT 
  DC  DESCRIPTION 
        CURRENT IMPLEMENTATION SUPPORTS COMPARISON OF VALUES WHERE THE
      TARGET ITEM IS ONE OF THE FOLLOWING CLASSES (DATA-CLASS CODE) 
          ALPHANUMERIC
          ALPHABETIC
          DCNUMERIC 
          DCFIXED 
          DCFLOAT 
          INTEGER 
          FIXED 
          FLOATUNNORM 
          FLOATNORM 
          DOUBLE
          COMPLEX 
        THE TARGET ITEM IS AT TGIFWA,TGIBBP, OF CLASS TCLASS, AND 
      SIZE TSIZE (BITS).
        THE VALUE WITH WHICH THE TARGET ITEM IS COMPARED IS AT
      COMPBWP (STARTING AT CHAR COMPBCP) AND EXTENDS FOR LITLENG FULL 
      WORDS.
        FOR ALPHANUMERIC AND ALPHABETIC CLASSES, THE COMPARISON VALUE 
      IS LEFT-JUSTIFIED BLANK FILL (ADDITIONAL BLANK FILL IS SUPPLIED 
      IF TARGET ITEM SIZE EXCEEDS THE LITERAL LENGTH).
        FOR THE NUMERIC DISPLAY CODE CLASSES, THE COMPARISON VALUE IS 
      CONFIGURED EXACTLY AS THE TARGET ITEM (WITH RESPECT TO SIGN 
      POSITION AND REPRESENTATION, DECIMAL POINT POSITION AND REPRES, 
      JUSTIFICATION, AND SIZE (TSIZE ROUNDED UP TO WORDS)). 
      HENCE THE QUANTITIES ARE DIRECTLY COMPARABLE WITH NO CONVERSION.
        FOR REMAINDER OF CLASSES, TARGET ITEM IS NECESSARILY
      WORD-ALIGNED (1 OR 2 WORDS) AND THE COMPARISON VALUE IS 
      DIRECTLY COMPARABLE (IDENTICAL DATA REPRESENTATION).
  
        PROCEDURE 
  
        FOR ALPHANUMERIC DISPLAY CODE ITEMS (MAX 18 DIGITS) STORE 
      TARGET AND LITERAL VALUES IN LOCAL CELLS, STRIPPING SIGN OVERPUN
      AND CHANGING DEC PT (IF ANY) TO ZERO.  COMPARISON IS DETERMINED BY
      OPPOSITE SIGNS (UNLESS COMPARISON VALUE IS ZERO) OR BY COMPARING
      THE STORED STRINGS, UP TO 18 CHARACTERS.
        FOR ALPHANUMERIC ITEMS, COMPARE TARGET AND LITERAL VALUES 
      (UP TO) 60 BITS AT A TIME.  IF NON-EQUALITY IS DETECTED,
      REPLACE CHARACTERS IN BOTH VALUES WITH COLLATING SEQUENCE 
      EQUIVALENTS AND COMPARE.  CONTINUE UNTIL TARGET IS EXHAUSTED
      OR INEQUALITY IS INDICATED. 
        FOR BINARY VALUES COMPARE FIRST WORD OF VALUES DIRECTLY 
      AND COMPARE SECOND WORD FOR DOUBLE, COMPLEX CLASSES,
      IF FIRST WORDS EQUAL. 
      UNNORMALIZED FLOATING POINT VALUES ARE ASSUMED TO HAVE
      EXPONENT 2000 (OR 5777).
        (COMPLEX VALUE X IS CONSIDERED LESS THAN COMPLEX VALUE Y IF 
      REAL PART OF X IS LESS THAN THAT OF Y, OR IF REAL PARTS ARE EQUAL 
      AND IMAGINARY COEFF OF X IS LESS THAN THAT OF Y.) 
 #
      CONTROL EJECT;
      CONTROL NOLIST;        #RMCOMDCLS,MFPCMDCLS,MFPDFDCLS#
*CALL MFPCMDCLS 
*CALL RMCOMDCLS 
*CALL MFPDFDCLS 
      CONTROL LIST; 
  
      XREF
        BEGIN 
        PROC DB$FLOP; 
        PROC DC$CMPR; 
        END 
  
#     CALL DC$CMPR TO PERFORM THE COMPARISON.                          #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("CMPR");
      CONTROL ENDIF;
  
      DC$CMPR(ERRSTAT,HILOEQ,DCTABLE,COMPBWP,COMPBCP,LITLENG,TCLASS,
              TGIBBP,TGIFWA,TSIZE,0,0,0); 
      RETURN; 
      END 
      TERM; 
