*DECK HPUTF 
USETEXT NIPDEF
USETEXT ACB 
USETEXT APPSTAT 
USETEXT AT
USETEXT AWLNTRY 
USETEXT DRHDR 
USETEXT FLIST 
USETEXT FREETAB 
USETEXT MEM 
USETEXT NP$TAA
USETEXT NWLHEAD 
USETEXT NWLNTRY 
USETEXT OVERLAY 
USETEXT PARAMP
USETEXT PARAMS
USETEXT PT
 PRGM HPUTF;                 # PROCESS NETPUTF REQUEST                 #
 STARTIMS;
 #
*1DC  HPUTF 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HPUTF               P.C.TAM             77/05/11 
* 
*     2. FUNCTIONAL DESCRIPTION.
*          USE TEXT ARRAY PROVIDED BY APP TO READ TEXT INTO NWL FOR 
*          HPUTBLK
* 
*     3. METHOD USED. 
*          EDIT NA, SIZE FIELDS OF NWL. 
*          GET BUFFER BIG ENOUGH FOR FLHEAD, DATA BLOCK AND REST OF 
*          NWL. 
*          SET UP FLHEAD AND FLENTRIES FOR SF.LIST IN OLD NWL.
*          CALL SF.LIST 
*          IF EVERYTHING IS OK, COPY REST OF NWL OVER.
* 
*     4. ENTRY PARAMETERS.
*          ACBADDR           APPLICATION"S ACB
*          WLADDR            WORKLIST ENTRY 
* 
*     5. EXIT PARAMETERS. 
*          DONE              TRUE 
*          PARAMS1           REASON,IF LGL/ERR
*          ACBUCPFSNS         TRUE,IF NOT ENOUGH SPACE FOR MESSAGE. 
*          ACBUCPFSSO         TRUE,IF SFREAD RC IS RCSWAPPEDOUT 
*          PARAMP1           FLAG TO INDICATE IF VALID NETPUTF REQUEST
*                            = 0 IF INVALID REQUEST.
*                            = 1 IF VALID REQUEST 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        ACB     APPSTAT     AT     DRHDR 
*        FLIST  FREETAB   MEM       NIPDEF    NP$TAA
*        PT  NWLHEAD   NWLNTRY   OVERLAY   PARAMS 
*        PARAMP1             BUFFER FOR PASSING PARAMETERS FROM PRI OVL 
* 
*     7. ROUTINES CALLED. 
*          HLGLERR    OVL    ISSUE ERR/LGL SUP MSG
*          HRELWWL           RELEASE WHOLE NWL
*          XCTLW             CALCULATE TEXT LENGTH FROM TLC, ACT. 
*          MGETS             ALLOCATE BUFFER SPACE
*          OMOVE             COPY INFORMATION 
*          OSCCALL           SCP CALL 
*          OSCHAPP           SCHEDULE APPLICATION 
*          MRELS             RELEASE FREE BUFFER SPACE
*          XTRACE            RECORD PROCEDURE CALLS 
* 
*     8. DAYFILE MESSAGES. NONE 
 #
 STOPIMS; 
  
      XREF BEGIN
        PROC XCTLW;          #CALCULATE TEXT LENGTH FROM TLC  # 
        PROC HRELWWL;        # RELEASE WHOLE NWL                       #
        PROC MGETS;          #ALLOCATE BUFFER SPACE           # 
        PROC OMOVE;          # COPY INFORMATION                        #
        PROC OSCCALL;        #SCP CALL                        # 
        PROC OSCHAPP;        #SCHEDULE APPLICATION            # 
        PROC MRELS;          #RELEASE FREE BUFFER SPACE       # 
        PROC OVLCALL;        #OVERLAY SUBROUTINE              # 
        PROC XTRACE;
        LABEL RJMAIN;        # RETURN ADDRESS IN OVLCALL TO RETURN TO  #
      END 
  
      ITEM  LENGTH         I, 
            TXTLN1         I, 
            TXTLN2         I, 
            SIZE           I, 
            BUFADDR        U, 
            LEFT           I, 
            TMP            I, 
            I              I, 
            START0         U, 
            START1         U; 
  
  
      BEGIN                  #NWL FOR NETPUTF                          #
      CONTROL IFEQ DEBUG,1; 
        XTRACE("HPUTF") ; 
      CONTROL FI; 
        CONTROL OVERLAP;
        DONE        =   FALSE;      # PRESET STATUS                   # 
        P<ACB>      =   ACBADDR;    # ESTABLISH ADDRESS.              # 
        P<NWLENTRY> =   WLADDR;     #                                 # 
        P<TAA>      =   WLADDR + FLSIZE;
        P<DRHDRWD> = 0; 
  
        TMP         =   0;
        LENGTH      =   0;
        XCTLW(NWLEABH,TXTLN1);
        TXTLN2      =   TXTLN1; 
  
        FOR I = 1 STEP FLESIZE UNTIL NWLELTAA      #GET ACTUAL SIZE   # 
        DO                   # GET ACTUAL SIZE OF TEXT FROM TAA DESC.  #
          BEGIN              # AND CHECK IF EACH FRAGMENT SIZE GR 63   #
          LENGTH    = LENGTH + TAASIZE[I];
          IF TAASIZE[I] GR 63 
          THEN
            TMP     = 1;
          END 
  
        IF (LENGTH GQ TXTLN1) AND # TEXT LENGTH ACTUAL LS BUFFER       #
           (TMP NQ 1)         AND # SIZE FRAGMENTS LS 63               #
           (NWLELTAA LQ MAXNA)    # NO OF TA ENTRIES LS 40             #
        THEN
        BEGIN 
          MGETS(ACBWLLWA[0]-WLADDR+TXTLN1,         # GET BUFFER SPACE  #
                BUFADDR, FALSE);                   # FOR DATA BLOCK    #
  
            MGETS(NWLEBS[0], START0, TRUE);        # GET BUF FOR FLIST.#
            SIZE       = BLKBS[BUFADDR];           #SAVE THE SIZE OF B# 
            MEMORY[BUFADDR] = MEMORY[WLADDR]; # AIP HEAD               #
            MEMORY[BUFADDR+AIPHSIZE] = MEMORY[WLADDR+AIPHSIZE]; 
  
            #  PREPARE FL HEADER FOR SF.LIST CALL  #
  
            P<FLHEAD> = START0; 
            FLID       = FLIDVALUE;                #SF.FUNCTION BLK ID# 
            FLAN       = ACBAN[0];
            FLJOBID    = ACBJNWD[0];               #FILL 3RD WORD     # 
            FLSCPA     = START0 + FLSIZE;          # CALCULATE SCP ADDR#
            FLFC       = SFLIST;                   #FUNCTION CODE     # 
            P<FLE>     = FLSCPA;
  
            P<TAA>     = WLADDR + FLSIZE; 
            FOR I = 0 STEP FLESIZE WHILE TXTLN2 GR 0
            DO                                     #LOOP TO FILL      # 
            BEGIN                                  #SF.READ ENTRIES   # 
              FLEFC[I]  = SFREAD; 
              FLEFP[I]  = TAASIZE[I+1]; 
              FLEUCPA[I]= TAADDR[I+1];
              FLESCPA[I]= BUFADDR + AIPHSIZE + ABHSIZE + TXTLN1 - 
                          TXTLN2; 
              TXTLN2    = TXTLN2 - TAASIZE[I+1];
            END 
  
            FLEFP[I-1] = FLEFP[I-1] + TXTLN2; 
            FLFP       = I; 
            P<FLE>     = START0 + FLHSIZE;
            OSCCALL(FLE); 
                                                   #CHECK FOR NORMAL  # 
            IF FLRC NQ 0                           #COMPLETION        # 
            THEN
            BEGIN 
  
              IF FLRC EQ RCSWAPPEDOUT              #USER JOB SWAPPED  # 
              THEN                                 #SET APP. SWP OUT  # 
              BEGIN                                #BIT, SCHEDULE     # 
                ATASBS[ACBAN[0]] = TRUE;           #APPLICATION       # 
                OSCHAPP(ACBADDR); 
              END 
  
              ELSE
              IF FLRC EQ RCUCPAOOR                 #UCPA OUT OF RANGE # 
              THEN ABTAPPF = XFLERR;
              ELSE FAILADR = ACBADDR;              #OTHER SCP ERROR   # 
              BLKBS[BUFADDR] = SIZE;   # RESTORE ORIGINAL BUFFER SIZE  #
              MRELS(BUFADDR); 
              MRELS(START0);
            END 
  
            ELSE                                   #SCP REQUEST COMP. # 
            BEGIN 
              MRELS(START0);
              DONE = TRUE;                         #COPY REST OF NWL  # 
              BLKBS[BUFADDR] = TXTLN1 + AIPHSIZE + ABHSIZE; 
              MSIZE = ACBWLLWA[0] - WLADDR - AIPHSIZE 
                      - ABHSIZE - NWLELTAA[0];
              MNEW = BUFADDR + BLKBS[BUFADDR];
              MOLD = WLADDR + AIPHSIZE + ABHSIZE + 1 + NWLELTAA[0]; 
              OMOVE;
              HRELWWL;       # RELEASE WHOLE NWL                       #
              ACBWLLWA[0] = BUFADDR + SIZE - 1;   # UPDATE ACB FIELDS # 
              ACBWLFWA[0] = BUFADDR;
              ACBWLADR[0] = BUFADDR;
              BLKID[BUFADDR] = NWLEIDVALUE; 
              NEXTWLA = BUFADDR + BLKBS[BUFADDR];  #                  # 
              WLADDR  = BUFADDR;
            END 
          PARAMP1 = 1;       # GOOD NETPUTF REQUEST WAS PROCESSED      #
        END 
        ELSE
                             #TOTAL SIZE IN TAA DESCRIPTION TOO SMALL # 
        BEGIN 
          CMWORD[WLADDR+AIPHSIZE+ABHSIZE] = TAAWORD[0]; # RESTORE NWL  #
          PARAMS1 = RLG"RES"; 
          OVLNAME = HLGLERRP; 
          OVLCALL;
          DONE    = TRUE; 
          PARAMP1 = 0;       # ERR/LGL WAS GENERATED FOR BAD NETPUTF RQ#
        END 
      GOTO RJMAIN;           # RETURN TO CALLING PROGRAM               #
      END #HPUTF# 
 TERM 
