*DECK FINDCW
USETEXT COMCBEG 
USETEXT COMMCOM 
    PROC FINDCW;
      BEGIN  # FINDCW # 
#  TITLE  FINDCW  - FIND NAD CONTROLWARE #
  
# 
**    FINDCW  - FIND NAD CONTROLWARE
* 
*     ENTRY    - DLSTATE = 01 (LOAD IN-PROGRESS). 
*                CWBUF = FWA OF BUFFER FOR CONTROLWARE. 
*                CWLEN = LENGTH OF BUFFER.
*                CWTYP = CONTROLWARE TYPE.
*                IPBUF = FWA OF BUFFER FOR INITIALIZATION PARAMETERS. 
*                IPLEN = LENGTH OF BUFFER.
*                IPNAM = NAME OF I.P. RECORD. 
* 
*     EXIT     - ERROR = FALSE, IF NO ERROR.
*                  CWADR = FWA OF CONTROLWARE.
*                  CWLEN = LENGTH OF CONTROLWARE. 
*                  CWNAM = CONTROLWARE NAME.
*                  IPADR = FWA INITIALIZATION PARAMETERS. 
*                  IPLEN = LENGTH OF INITIALIZATION PARAMETERS. 
*                  IPNAM = NAME OF I.P. RECORD. 
* 
*                ERROR = TRUE, IF ERROR ENCOUNTERED.
* 
*     PROCESS  - CALL GETCWIP TO OBTAIN NAMED I.P. RECORD 
*                IF RECORD NOT FOUND: 
*                  IF LOADING 170 NAD:  
*                    CALL GETCWIP TO OBTAIN 1ST I.P. RECORD 
*                    IF NO RECORD FOUND:  
*                      SET UP DEFAULT I.P. RECORD FOR 170 NAD.
*                  ELSE:  
*                    SET ERROR. 
*                IF NOT ERROR:  
*                  CALL GETNCW TO OBTAIN NAMED C/W. 
*                  IF C/W NOT FOUND:  
*                    IF LOADING 170 NAD:  
*                      CALL GETNCW TO OBTAIN 170 NAD C/W
*                    ELSE:  
*                      SET ERROR. 
# 
  
  
# 
****  PROC FINDCW  - XREF BEGINS. 
# 
      XREF
        BEGIN 
        PROC CALLSYS;              # CALL SYSTEM VIA RA+1 # 
        PROC DBGNAME;              # DEBUG - DAYFILE MESSAGE #
        PROC GETNCW;               # GET NAD CONTROLWARE #
        PROC GETCWIP;              # GET CW INIT PARAMETERS # 
        END 
# 
****  PROC FINDCW  - XREF ENDS. 
# 
  
  
  
      ITEM I          I;           # SCRATCH #
  
CONTROL EJECT;
  
      $BEGIN
      DBGNAME ("FINDCW");          # DEBUG MESSAGE #
      $END
  
      IPADR = IPBUF;               # RESET I.P. POINTER # 
      ERROR = FALSE;
  
      ASLONGAS IPADR EQ IPBUF 
        AND NOT ERROR 
      DO
        BEGIN 
        GETCWIP;                   # GET CW INIT PARAMETERS # 
  
        IF IPADR LT 0              # IF NO I.P. RECORD FOUND #
        THEN
          BEGIN 
          ERROR = TRUE; 
          I = -IPADR; 
  
          IF I GT CWIPERR$MX       # IF INVALID ERROR # 
          THEN
            BEGIN 
            I = CWIPERR$MX;        # USE DEFAULT ERROR #
            END 
  
          IF I EQ CWIPERR$NM       # IF NO MATCHING RECORD FOUND #
            AND IPNAMU NE 0 
          THEN
            BEGIN 
            CWIPERRNAM[I] = IPNAM; # PUT RECORD NAME IN MESSAGE # 
            MSG$BUFADR = LOC(CWIPERRMSG[I]);
            MSG$STATUS = 0; 
            CALLSYS (MSGCALL);     # DAYFILE MESSAGE #
  
            IF CWTYP EQ CW170      # IF LOADING 170 NAD # 
            THEN
              BEGIN 
              IPNAMU = 0;          # FOR 1ST IP RECORD #
              ERROR = FALSE;
              END 
            END 
  
          IF I GE CWIPERR$MX
          THEN
            BEGIN 
            CALLSYS (ABTCALL);     # ABORT PROGRAM #
            END 
          END 
        END 
  
      IF ERROR                     # IF ERROR # 
        AND CWTYP EQ CW170         # IF LOADING 170 NAD # 
      THEN
        BEGIN 
        P<BUF1> = IPBUF;
        SLOWFOR I = 0 STEP 1 UNTIL ONEPRU  # CLEAR IP BUFFER #
        DO
          BEGIN 
          BUF1WORD[I] = 0;
          END 
  
        IPADR = IPBUF;             # USE DEFAULT I.P. # 
        IPLEN = CWIPMINL52 - CWIPHDRL52;  # USE DEFAULT LENGTH #
        CWNAMU = 0;                # USE DEFAULT CW NAME #
        ERROR = FALSE;             # CLEAR ERROR #
        END 
  
      CWADR = CWBUF;               # RESET CW FWA # 
  
      ASLONGAS NOT ERROR
        AND CWADR EQ CWBUF
      DO
        BEGIN 
  
        $BEGIN
        DBGNAME ("GETNCW"); 
        $END
  
        GETNCW (CWNAM,CWADR,CWLEN);  # GET CONTROLWARE #
  
        IF CWADR LT 0 
        THEN
          BEGIN 
          ERROR = TRUE;            # SET ERROR FLAG # 
          I = -CWADR; 
  
          IF I GT CWERROR$MX       # IF INVALID ERROR # 
          THEN
            BEGIN 
            I = CWERROR$MX;        # USE DEFAULT ERROR #
            END 
  
          IF I LT CWERROR$MX
          THEN
            BEGIN 
            CWERRORNAM[I] = CWNAMC;  # SET C/W NAME IN MESSAGE #
            END 
  
          MSG$BUFADR = LOC(CWERRORMSG[I]);
          MSG$STATUS = 0; 
          MSG$DSPLAY = MSG$DAYF;
          CALLSYS (MSGCALL);       # DAYFILE MESSAGE #
  
          IF I GE CWERROR$MX
          THEN
            BEGIN 
            CALLSYS (ABTCALL);     # ABORT PROGRAM #
            END 
  
          IF I EQ CWERROR$NM       # IF CW NOT FOUND #
            AND CWTYP EQ CW170     # AND LOADING 170 NAD #
            AND CWNAMU NE DEFCWN   # AND 170 C/W NOT TRIED YET #
          THEN
            BEGIN 
            CWNAMU = 0;            # FIND 170 CW #
            ERROR = FALSE;         # CLEAR ERROR #
            CWADR = CWBUF;         # RESET CW FWA # 
            END 
          END 
  
        ELSE
          BEGIN 
          IF (CWLEN LAN 1) EQ 1    # IF CW LENGTH ODD # 
          THEN
            BEGIN 
            P<BUF1> = LOC(CWADR); 
            BUF1WORD[CWLEN] = 0;   # CLEAR EXTRA WORD # 
            CWLEN = CWLEN + 1;     # ADD EXTRA WORD TO C/W #
            END 
          END 
        END 
      END 
    TERM
