*DECK DFREAD
USETEXT COMCBEG 
USETEXT COMDFRD 
PROC  DFREAD (DIRBUF,(MXL),LEN);
# TITLE  DFREAD - READ DIRECTIVE FILE.  # 
      BEGIN    # DFREAD # 
# 
**    DFREAD - READ DIRECTIVE FILE. 
* 
*     DFREAD READS THE DIRECTIVE FILE.
* 
*     PROC       DFREAD 
* 
*     ENTRY     DIRBUF = ARRAY TO WHERE DIRECTIVE WILL BE RETURNED. 
*                  MXL = MAX. LENGTH OF ARRAY.
* 
*     EXIT      DIRBUF = CONTAINS NEXT DIRECTIVE. 
*                  LEN = LENGTH OF DIRECTIVE READ 
*                      LS 0 IF END-OF-DIRECTIVES REACHED. 
* 
*     PROCESS 
*               IF NOT FIRST: 
*                 IF INTERACTIVE: 
*                   ISSUE PROMPT
*                   IF INPUT FILE:  
*                     CALL DF$RDH 
*                   ELSE: 
*                     READ NEXT CONTROL STATEMENT 
*                     IF NO MORE CONTROL STATEMENTS:  
*                       EOF = TRUE
*                     ELSE: 
*                       IF FIRST CHAR NQ PC:  
*                         EOF = TRUE
*                         BACKSPACE CONTROL STATEMENT RECORD. 
*               FIRST = FALSE 
*               IF NOT EOF: 
*                 IF I EQ 0:  
*                   REMOVE PREFIX CHARACTER 
*                   MOVE CONTROL STATEMENT TO DIRBUF
*                 LEN = LENGTH OF CONTROL STATEMENT 
*               ELSE: 
*                 LEN = -1. 
*               RETURN. 
* 
# 
# 
  
# 
# 
****  PROC DFREAD - XREF LIST BEGIN.
# 
      XREF
        BEGIN 
        PROC DF$RDH;
        PROC DF$RD;                # ISSUE READ TO PRIME BUFFER # 
        PROC DF$RCS;               # READ CONTROL STATEMENT RECORD #
        PROC DF$WPR;
        PROC DF$ISM;
        END 
# 
****  PROC DFREAD - XREF LIST END.
# 
  
  
      ITEM MXL        I;           # MAX. LENGTH OF USER BUFFER # 
      ITEM LEN        I;           # LENGTH OF DIRECTIVE READ # 
      ITEM DONE       B;
      ITEM J          I;
      ITEM K          I;
      DEF RA$CCD   #56#;
  
      BASED ARRAY ZBYTE      S(1);
        BEGIN 
        ITEM ZWORD      U(00,00,60);
        END 
  
      BASED ARRAY PCSHIFT    S(1);
        BEGIN 
        ITEM FSTCHAR    C(00,00,01);
        ITEM RESTCHAR   C(00,06,09);
        END 
  
      ARRAY DIRBUF    [0:0]  S(1);
        BEGIN 
        ITEM WORDX      C(00,00,10);
        ITEM FRSTCHS    C(00,00,09);
        ITEM LSTCHAR    C(00,54,01);
        END 
  
  
      CONTROL EJECT;
      DONE = FALSE; 
      IF NOT FIRST
      THEN
        BEGIN 
        IF INT
        THEN
          BEGIN 
          DF$WPR(PROMPT,OUFET); 
          END 
  
        IF (I NQ 0) OR INT
        THEN
          BEGIN 
          IF INT
          THEN
            BEGIN 
            DF$RD(DFET);
            END 
  
          DF$RDH(DFET,DIRBUF,MXL,EOF);
          END 
  
        ELSE
          BEGIN    # I EQ 0 # 
          DF$RCS(NXT,EOF);
          IF NOT EOF
          THEN
            BEGIN 
            IF RA$CSFC NQ PROMPT
            THEN
              BEGIN 
              EOF = TRUE; 
              DF$RCS(BKSP,DUM); 
              END 
  
            END 
  
          END 
  
        END 
  
      FIRST = FALSE;
      IF NOT EOF
      THEN
        BEGIN 
        IF (I EQ 0) AND (NOT INT) 
        THEN
          BEGIN 
          P<ZBYTE> = RA$CCD;
          FOR LEN = 1 STEP 1 WHILE (B<48,12>ZWORD NQ 0) 
          DO
            BEGIN 
            P<ZBYTE> = P<ZBYTE>+1;
            END 
  
          IF ZWORD EQ 0 
          THEN
            BEGIN 
            LEN = LEN-1;
            P<ZBYTE> = P<ZBYTE>-1;
            IF B<54,6>ZWORD EQ 0
            THEN
              BEGIN 
              C<9,1>ZWORD = " ";
              END 
  
            END 
  
          ELSE
            BEGIN 
            FOR J = 48 STEP -12 WHILE (B<J,12>ZWORD EQ 0) 
            DO
              BEGIN 
              C<J/6,2>ZWORD = "  "; 
              END 
  
            IF B<J+6,6>ZWORD EQ 0 
            THEN
              BEGIN 
              C<(J+6)/6,1>ZWORD= " "; 
              END 
  
            END 
  
          P<PCSHIFT> = RA$CCD;
          J = 0;
          FRSTCHS[J] = RESTCHAR;
          FOR J = 1 STEP 1 WHILE (J LS LEN AND J LS MXL)
          DO
            BEGIN 
            P<PCSHIFT> = P<PCSHIFT>+1;
            LSTCHAR[J-1] = FSTCHAR; 
            FRSTCHS[J] = RESTCHAR;
            END 
  
          LSTCHAR[J-1] = " "; 
          FOR J = J STEP 1 WHILE J LS MXL 
          DO
            BEGIN 
            WORDX[J] = "          ";
            END 
  
          END 
  
        LEN = MXL*10; 
        FOR J = MXL-1 STEP -1 WHILE (NOT DONE AND J GQ 0) 
        DO
          BEGIN 
          FOR K = 9 STEP -1 WHILE (NOT DONE AND K GQ 0) 
          DO
            BEGIN 
            IF C<K,1>WORDX[J] NQ " "
            THEN
              BEGIN 
              DONE = TRUE;
              END 
  
            ELSE
              BEGIN 
              LEN = LEN-1;
              END 
  
            END 
  
          END 
  
        IF INT AND (LEN EQ 1) 
        THEN
          BEGIN 
          IF C<0,1>WORDX[0] EQ PROMPT 
          THEN
            BEGIN 
            LEN = -1; 
            END 
  
          END 
  
        END 
  
      ELSE    # EOF # 
        BEGIN 
        LEN = -1; 
        END 
  
      IF (LEN EQ -1) AND FSTCALL
        AND DIRREQ                 # AND DIRECTIVES REQUIRED #
      THEN
        BEGIN 
        DF$ISM(NORDFD,OUFET,PNAME,INT); 
        END 
  
      FSTCALL = FALSE;
  
      RETURN; 
      END     # DFREAD #
      TERM
