*DECK CBSSITA 
USETEXT TSBP2CM 
      FUNC CBSSITA(SSADDR,CTKEYOFFSET); 
      BEGIN 
 #
* *   CBSSITA 
* *   C O GIMBER                                 10.9.74
* 
* DC  PURPOSE 
* 
*     FUNCTION RETURNS THE ADDRESS OF A SUBSCHEMA ITEM GIVEN THE ADDRESS
*     OF THE CORRESPONDING SCHEMA ITEM AND IF NECESSARY, THE SUBSCHEMA
*     OFFSET TO THE CONCATENATED KEY.  IF THE ITEM IS NOT FOUND IN
*     THE SUBSCHEMA, ZERO IS RETURNED.
* 
* DC  DESCRIPTION 
* 
*     READ ITEM ENTRY FROM SCHEMA 
*     SEARCH THRU ITEMS IN SUBSCHEMA RECORD (RECOFFSET SPECIFIED RECORD)
*       FOR ITEM. 
*     IF THE CURRENT ITEM IS NOT UNIQUE AND THE ITEM OFFSET IS LESS THAN
*     "CTKEYOFFSET", THEN THE ITEM BEING SEARCHED FOR IS PART OF AN 
*     OVERLAPPING CONCATENATED KEY.  THEREFORE CONTINUE THE SEARCH FOR
*     AN ITEM THAT HAS AN OFFSET GREATER THAN "CTKEYOFFSET".
*     IF ITEM FOUND RETURN ITEM ADDRESS IN THE SUBSCHEMA. 
*     ELSE RETURN 0.
 #
  
# PASSED PARAMETERS#
      ITEM SSADDR;           #SCHEMA ITEM WORD ADDRESS# 
      ITEM CTKEYOFFSET I;    #OFFSET TO THE CONCATENATED KEY.          #
                             #EQUALS ZERO IF NOT A CONCATENATED KEY.   #
  
# EXTRNAL REFERENCES# 
      XREF PROC READSC;      #DA ROUTINE TO READ SCHEMA GIVEN ADDRESS#
  
      CONTROL EJECT;
# READ ITEM ENTRY FROM SCHEMA#
      READSC(SCHEMA,10,SSADDR); 
# GET ITEM NAME FROM SCHEMA ITEM ENTRY# 
      NAME = C<0,SCITMNAMLENC[0]>SCITMNAM30[SCITMNAMEPTR[0]]; 
# IF NO ITEM ENTRIES FOR SUBSCHEMA RECORD THEN RETURN WITH 0# 
      IF SBRECNXITEMP[RECOFFSET] EQ 0 THEN
        BEGIN 
        CBSSITA = 0;
        RETURN; 
        END 
# LOOP THRU ITEM ENTRIES FOR RECORD UNTIL END OR ITEM FOUND#
      SSITEMOFFSET = RECOFFSET+SBRECNXITEMP[RECOFFSET]; 
ITEMLOOP: 
      IF SBITMALIASP[SSITEMOFFSET] EQ 0 THEN
        BEGIN                #NO ALIAS# 
        IF NAME EQ C<0,SBITMNMELENC[SSITEMOFFSET]>SBITMNAME30 
                 [SSITEMOFFSET+SBITMNAMEPTR[SSITEMOFFSET]] THEN 
          BEGIN 
          IF NOT SBITMUNIQFLG[SSITEMOFFSET] 
             AND
             SSITEMOFFSET LS CTKEYOFFSET
          THEN
            BEGIN 
            GOTO NEXTITEM;
            END 
          CBSSITA = SSITEMOFFSET; 
          RETURN; 
          END 
        END 
      ELSE                   #ALIAS#
        BEGIN 
        ADDRESS = SSITEMOFFSET+SBITMALIASP[SSITEMOFFSET]; 
        IF NAME EQ C<0,SBITMALIASLC[SSITEMOFFSET]>SBITMALIAS30[ADDRESS] 
        THEN
          BEGIN 
          IF NOT SBITMUNIQFLG[SSITEMOFFSET] 
             AND
             SSITEMOFFSET LS CTKEYOFFSET
          THEN
            BEGIN 
            GOTO NEXTITEM;
            END 
          CBSSITA = SSITEMOFFSET; 
          RETURN; 
          END 
        END 
# GET NEXT ITEM ENTRY, RETURN IF LAST ENTRY#
NEXTITEM: 
      IF SBITMNEXTP[SSITEMOFFSET] EQ 0 THEN 
        BEGIN 
        CBSSITA = 0;
        RETURN; 
        END 
      SSITEMOFFSET = SSITEMOFFSET+SBITMNEXTP[SSITEMOFFSET]; 
      GOTO ITEMLOOP;
      END 
      TERM; 
