*DECK DB$CNSC 
USETEXT UTMPTTX 
USETEXT UTCITTX 
USETEXT UTCDFTX 
USETEXT CUGBATX 
      PROC DB$CNSC(TYPE,LENGTH);
 #
  *   DB$CNSC - USE ENTRY NAME FOR SCHEMA GET    PAGE  1
  *   STEVEN P. LEVIN                            DATE  09/19/75 
  
  DC  PURPOSE 
  
      CALL DIRECTORY ACCESS ROUTINE DE$NMSC TO READ A DESIRED SCHEMA
      ENTRY"S HEADER INTO THE SCHEMA HEADER FIXED ARRAY IN COMMON.
  
  DC  ENTRY CONDITIONS
  
      PARAMETER TYPE IS THE DIRECTORY ENTRY DATA BASE ELEMENT TYPE. 
      PARAMETER LENGTH IS DESIRED DIRECTORY ENTRY NAME WORD LENGTH. 
      THE DESIRED SCHEMA DIRECTORY ENTRY DATA BASE ELEMENT NAME SHOULD
      BE LOCATED AT THE START OF THE SUBSCHEMA MANAGED MEMORY BLOCK.
      THE ARRAY SCCWDDIT IN COMMON SHOULD CONTAIN THE SCHEMA CONTROL
      WORDS AND THE REST OF THE DIRECTORY INFORMATION TABLE (DIT).
      THE SCHEMA DIRECTORY FILE SHOULD BE OPEN AND AVAILABLE FOR USE. 
  
  DC  EXIT CONDITIONS 
  
      UPON NORMAL RETURN FROM DB$CNSC, THE HEADER FOR THE DESIRED 
      SCHEMA DIRECTORY ENTRY WHOSE NAME IS LOCATED AT THE START OF THE
      SUBSCHEMA MEMORY BLOCK WILL BE READ TO THE SCHEMA HEADER ARRAY. 
      THE COMMON ITEM SCCURRAD WILL CONTAIN THE SCHEMA DIRECTORY WORD 
      ADDRESS OF THE FIRST WORD THAT IS IN THE SCHEMA HEADER ARRAY. 
      IF AN ERROR IS FOUND DURING DB$CNSC PROCESSING, THE CST BUILDER 
      (AT LEAST) WILL BE ABORTED THROUGH A CALL TO THE MODULE DB$CERR.
  
  DC  CALLING ROUTINES
  
      DB$CARE - BUILD AN AREA WORK BLOCK IN THE WORK BLOCK CORE BLOCK 
      DB$CCPP - PREPROCESS SUBSCHEMA AND SCHEMA FOR CONSTRAINT INFO 
      DB$CREC - BUILD A RECORD WORK BLOCK IN THE WORK BLOCK CORE BLOCK
  
  DC  CALLED ROUTINES 
  
      DE$NMSC - DIRECTORY ACCESS ROUTINE FOR READING SCHEMA ENTRIES 
      DB$CERR - ERROR MESSAGE AND RETURN HANDLER FOR FATAL ERRORS 
      DB$CESC - SCHEMA FILE CYBER RECORD MANAGER (CRM) ERROR HANDLER
      DB$UADR - UPDATE MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS
  
  DC  NON-LOCAL VARIABLES 
  
      CURSCRAT - CURRENT SCRATCH NAME (USED AS A TEMPORARY AT TIMES)
      SCCURRAD - SCHEMA CURRENT MAIN ENTRY WORD ADDRESS 
      IN ADDITION, THE CONTENTS OF THE COMMON ARRAYS SCCWDDIT AND 
      SCHEADER WILL BE CHANGED BY DIRECTORY ACCESS ROUTINE DE$NMSC. 
  
  DC  DESCRIPTION 
  
      CALL DE$NMSC TO READ THE HEADER FOR THE DESIRED SCHEMA ENTRY. 
      IF DE$NMSC DOES NOT FIND THE ENTRY, CALL PROC DB$CERR TO ABORT. 
      IF DE$NMSC GETS A CRM ERROR, CALL DB$CESC (MAY RETURN OR ABORT).
      IF THE READ WAS OK, CALL DB$UADR AND SAVE THE ENTRY"S ADDRESS.
      RETURN FROM DB$CNSC WITH THE HEADER FOR THE DESIRED ENTRY READ. 
 #
        CONTROL EJECT;
  
        BEGIN                # DB$CNSC #
  
# THE FOLLOWING ARE FORMAL PARAMETERS IN THE ORDER THEY ARE PASSED #
  
        ITEM TYPE I;         # DIRECTORY ENTRY DATA BASE ELEMENT TYPE#
        ITEM LENGTH I;       # LENGTH IN WORDS OF THE ENTRY NAME #
  
# THE FOLLOWING ARE EXTERNALLY REFERENCED PROCEDURES #
  
        XREF PROC DE$NMSC;   # DIRECTORY ACCESS READ SCHEMA ENTRIES # 
        XREF PROC DB$CERR;   # ERROR HANDLER FOR FATAL ERRORS # 
        XREF PROC DB$CESC;   # SCHEMA FILE CRM ERROR HANDLER #
        XREF PROC DB$UADR;   # UPDATE MANAGED MEMORY USABLE ADDRESSES#
  
        CONTROL NOLIST;      # DCLS: UTCDF UTCIT UTMPT UTCAS CUGBA #
*CALL UTCASDCLS 
        CONTROL LIST;        # RESUME THE LISTING OF THE SOURCE CODE #
  
# THE FOLLOWING COMMON IS FOR DDL SUBSCHEMA AND SCHEMA HEADER ARRAYS #
  
        COMMON DB$CCAH; 
  
          BEGIN              # DB$CCAH COMMON BLOCK # 
  
# THE FOLLOWING FIXED ARRAY IS FOR THE SUBSCHEMA HEADER ENTRY # 
  
            ARRAY SBHEADER[0:0] P(DFSBHEAD);;    # SUBSCHEMA HEADER # 
  
# THE FOLLOWING FIXED ARRAY IS FOR THE SCHEMA DB ELEMENT HEADER ENTRY#
  
            ARRAY SCHEADER[0:0] P(DFSCHEAD);;    # SCHEMA HEADER #
  
          END                # DB$CCAH COMMON BLOCK # 
        CONTROL EJECT;
  
# CALL DE$NMSC TO READ THE HEADER FOR THE DESIRED SCHEMA ENTRY #
  
        P<GETENTRY> = SUBSADDR;        # POINT TO DESIRED ENTRY NAME #
        CURSCRAT = GETWDTHR[0];        # MOVE ENTRY NAME TO CURSCRAT #
        XCALL                # DFSCHEAD WORDS ARE READ TO SCHEADER #
          DE$NMSC(SCCWDDIT,TYPE,CURSCRAT,LENGTH,DFSCHEAD,SCHEADER); 
  
# IF DE$NMSC DOES NOT FIND THE ENTRY, CALL MODULE DB$CERR TO ABORT #
  
        P<DIRACCES> = LOC(SCCWDDIT);   # POINT TO SCHEMA DIT ARRAY #
        IF DASTATE[0] EQ 1             # CHECK DIRECTORY ACCESS STATE#
          THEN XCALL DB$CERR("7051CNSC",LENGTH * DFCHARWD);# ABORT #
  
# IF DE$NMSC GETS CRM ERROR, CALL DB$CESC (MAY RETURN OR CAUSE ABORT)#
  
        IF DASTATE[0] NQ 0 THEN XCALL DB$CESC;   # RETURNS OR ABORTS #
  
# THE READ WAS OK, SO CALL DB$UADR AND SAVE THE ENTRY"S WORD ADDRESS #
  
        XCALL DB$UADR;       # UPDATE MANAGED MEMORY USABLE ADDRESSES#
        SCCURRAD = DAENTAD[0];         # SCHEMA CURRENT ENTRY ADDRESS#
  
# RETURN FROM DB$CNSC WITH THE HEADER FOR THE DESIRED ENTRY NOW READ #
  
        RETURN;              # DESIRED SCHEMA ENTRY"S HEADER NOW READ#
  
        END                  # DB$CNSC #
  
      TERM
