*DECK,QACCALL 
USETEXT COMCBEG 
USETEXT COMQDEF 
USETEXT COMQDSP 
USETEXT COMQFIL 
USETEXT COMQPID 
USETEXT COMQQAC 
USETEXT COMQSEL 
    PROC QACCALL ((RECALL));
      BEGIN    # QACCALL #
# 
**    QACCALL    CALL QAC/QAF TO ACQUIRE QUEUE FILE.
* 
*     QACCALL IS CALLED TO ISSUE EXTENDED GET FUNCTION TO QAC(NOS) OR 
*     ACQUIRE FUNCTION TO QAF(NOS/BE).
* 
*     PROC QACCALL (RECALL) 
* 
*     ENTRY      RECALL = TRUE IF REQUEST TO BE MADE WITH AUTO-RECALL.
*                FILETAB = VACANT AFT ENTRY.
*                FILELID = LID IF CALL IS FOR ONE LID ONLY, 
*                          0, IF FOR ALL LIDS ASSOCIATED WITH PID.
*                FILESEL = SELECTION CLASS OF FILE. 
*                PLTHDR = PID ENTRY.
* 
*     EXIT       QAC/QAF CALL ISSUED (AND COMPLETE IF RECALL TRUE). 
* 
*     PROCESS    SET UP QAC BUFFER
*                CALL QAC OR QAF. 
# 
  
      ITEM RECALL     B;           # AUTO-RECALL FLAG # 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC CALLSYS;              # ISSUE SYSTEM REQUEST # 
        FUNC GENLFN     C(10);     # GENERATE UNIQUE NAME # 
        PROC NAME;                 # DEBUG CODE # 
        END 
  
# 
****  XREF END
# 
  
  
      ITEM I          I;           # SCRATCH #
      ITEM NUMWDS     U;           # NUMBER OF LID WORDS #
  
        $BEGIN
        NAME("QACCALL");
        $END
  
      P<FET> = LOC(QACBW0) - 1;    # CLEAR QAC PARAMETER BLOCK #
      SLOWFOR I = 1 STEP 1 UNTIL QACPBN 
      DO
        BEGIN 
        FETWD[I] = 0; 
        END 
  
      IF FILELID NE 0              # IF CALL IS FOR SPECIFIC LID #
      THEN
        BEGIN 
        QACBDID = FILELID;         # STORE ONLY LID # 
        END 
  
      ELSE
        BEGIN 
        NUMWDS = (PLTNUMLID+1) / 3;  # THREE PER WORD AFTER FIRST # 
        QACBDID = PLTFLID;         # STORE FIRST DLID # 
  
      CONTROL IFEQ OS$NOS;
        QACBF15 = TRUE;            # ALID LIST SPECIFIED #
        QACBALID = LOC(TLIDWD[0]); # ADDRESS OF ALID LIST # 
      CONTROL ENDIF;
  
      CONTROL IFEQ OS$NOSBE;
        QACBLN = NUMWDS;           # SET QAF WORD COUNT # 
      CONTROL ENDIF;
  
        IF NUMWDS GE TLIDN         # IF TOO MANY DLIDS FOR ARRAY #
        THEN
          BEGIN 
          NUMWDS = TLIDN - 1; 
          END 
  
        P<PLTDLID> = P<PLTHDR> + PLTHDRL + NUMWDS;
        TLIDWD[NUMWDS] = 0;        # ZERO TERMINATE LIST #
        ASLONGAS NUMWDS GT 0       # WHILE DLID WORDS TO MOVE # 
        DO
          BEGIN 
          NUMWDS = NUMWDS - 1;     # DECREMENT COUNT #
          P<PLTDLID> = P<PLTDLID> - 1;
          TLIDWD[NUMWDS] = PLTDLIDWD; 
          END 
  
        END 
  
      QACBQUE = QACQTP;            # SET QUEUE TYPES #
      QACBFC  = QACGET;            # SET FUNCTION CODE #
      QACPBLK = LOC(QACBW0);       # SET UP QAC/QAF CALL #
      QACRCL  = RECALL;            # SET/CLEAR AUTO-RECALL #
  
    CONTROL IFEQ OS$NOS;
      QACBLFN = GENLFN;            # GENERATE UNIQUE NAME # 
      QACBF20 = TRUE;              # FILE SIZE INDEX SPECIFIED #
      QACBF14 = TRUE;              # DLID SPECIFIED # 
      QACBLEN = EXGET;             # PARAMETER BLOCK LENGTH # 
      QACBFSLB = SEL$LFSI[FILESEL];  # FSI LOWER BOUND #
      QACBFSUB = SEL$UFSI[FILESEL];  # FSI UPPER BOUND #
    CONTROL ENDIF;
  
    CONTROL IFEQ OS$NOSBE;
      QACBPRI = QACPTY;            # SET PRIORITY # 
      QACBILLID = TRUE;            # IGNORE LOCAL LIDS #
      QACBPDFC  = "PREDAYF";       # PREDAYFILE NAME #
      QACRTR  = TRUE;              # RETURN ROUTING TEXTS IF POSSIBLE # 
      QACBFSB = TRUE;              # FILE SIZE BOUNDS SPECIFIED # 
      QACBSIL = TRUE;              # SKIP FILES WITH INVALID LFNS # 
      QACXPBP = LOC(QAFXPB);       # POINTER TO ROUTING TEXT BUFFER # 
      QACBFSL = FSIL[SEL$LFSI[FILESEL] ];  # FILE SIZE LOWER BOUND #
      QACBFSU = FSIU[SEL$UFSI[FILESEL] ];  # FILE SIZE UPPER BOUND #
    CONTROL ENDIF;
  
      CALLSYS (QACWD);             # CALL QAC OR QAF #
      FILEQAR = QAR$INCMPL;        # WAITING FOR ACQUIRE COMPLETE # 
  
      END  # QACCALL #
    TERM
