*DECK NP$GETQ USETEXT AIPDEF USETEXT HEADER USETEXT NP$DB USETEXT NP$GETS USETEXT NP$GMB USETEXT NP$MODE USETEXT NP$NWNC USETEXT NP$NWL USETEXT NP$STAT USETEXT NP$TAA PROC NP$GETQ(GMMSC); # *1DC NP$GETQ * * 1. PROC NAME AUTHOR DATE * NP$GETQ E. GEE 01/30/85 * * 2. FUNCTIONAL DESCRIPTION. * EXTRACT OR UPDATE DATA MESSAGES IN THE AIP UPLINE DATA * BUFFER. * * 3. METHOD USED. * IF PREVIOUS AIP REQUEST HAS NOT COMPLETED, * CALL NP$ERR TO ISSUE DAYFILE MSG AND ABORT APP. * PROCESS ACCORDING TO THE SEARCH CODE THAT WAS PROVIDED. * SC = 0 SEARCH BUFFER FOR MSG FOR SPECIFIED CONNECTION NUM. * IF FOUND, * UPDATE DATA BUFFER POINTERS. * CALL NP$EXTQ TO RETURN DATA MSG OR NULL BLK TO APP. * SC = 1 SEARCH BUFFER FOR MSG FOR SPECIFIED LIST NUMBER. * IF FOUND, * UPDATE DATA BUFFER POINTERS. * CALL NP$EXTQ TO RETURN DATA MSG OR NULL BLK TO APP. * SC = 2 SEARCH BUFFER FOR ALL MSGS FOR SPECIFIED CON NUM. * ADJUST DATA BUFFER POINTERS TO ELIMINATE MSG * MOVING MSGS FOR OTHER CONNECTIONS AS NECESSARY. * CALL NP$USI TO UPDATE THE NSUP WORD. * * 4. ENTRY CONDITIONS. * GMMSC SEARCH CODE TO DETERMINE TYPE OF PROCESSING * = 0 GET DATA FOR SPECIFIED ACN * = 1 GET DATA FOR SPECIFIED LIST NUMBER * = 2 DISCARD ALL DATA FOR SPECIFIED ACN * * * 5. EXIT CONDITIONS. * HA CONTAIN NULL BLOCK IF NOT DATA MSG WAS * AVAILABLE. OTHERWISE, IT WILL CONTAIN THE * APP BLOCK HEADER OF THE TEXT. * ATA CONTAINS TEXT OF DATA MSG IF ONE WAS * DELIVERED. * * 6. COMDECKS AND SYMPL TEXT USED. * AIPDEF CONSTANT DEFINITIONS * HEADER APP BLOCK HEADER TEMPLATE * NP$DB UPLINE DATA BUFFER TEMPLATE * NP$GETS GLOBAL VARIABLES * NP$GMB APP SUPPLIED DATA BUFFER TEMPLATE * NP$MODE GLOBAL VARIABLES * NP$NWL NETWORK WORKLIST TABLE * NP$NWNC GLOBAL VARIABLES * NP$STAT STATISTICS TABLE * * 7. PROCEDURES/FUNCTIONS CALLED. * NP$DBG LOG DATA MESSAGE IN DEBUG LOG FILE * NP$ERR ISSUE ERROR MSG AND ABORT APP * NP$ITMG INTERCEPT DATA MSG TO FILE TRANSFER MSGS * NP$SN INCREMENT AIP STATISTICS * NP$USI UPDATE NSUP WORD * * 8. DAYFILE MESSAGES OR OTHER IMPORTANT INFORMATION. * NONE. # BEGIN # EXTERNAL ROUTINES CALLED # XREF BEGIN PROC NP$DBG; # LOG AIP TRAFFIC IN TRACE FILE # PROC NP$ERR; # ISSUE DAYFILE MSG AND ABT APP # PROC NP$SN; # INCREMENT STATISTICS COUNTERS # PROC NP$USI; # UPDATE S AND I BIT IN NSUP # END # INPUT VARIABLES # ITEM GMMSC; # SEARCH CODE TO PROCESS # # OUTPUT VARIABLES # ITEM GMMRC; # RETURN CODE # # LOCAL VARIABLES # ITEM DACT; # CHARACTER TYPE OF DATA # ITEM I; # LOOP CONTROL VARIABLE # ITEM I1; # LOOP CONTROL VARIABLE # ITEM I2; # TEMPORARY INDEX # ITEM J; # TEMPORARY INDEX # ITEM K; # TEMPORARY INDEX # ITEM N; # WORDS OF SM TRANSFERRED - 1 # ITEM NEXTHEAD; # 1ST WD AFTER RETURNED ENTRY # ITEM NOWHEAD; # 1ST WD OF RETURNED ENTRY # ITEM TLW; # ACTUAL SIZE OF SM # ITEM TLWDIF; # TLW - SUM OF TAASIZE[K] # BASED ARRAY MEM S(1); ITEM HA I (0), # HEADER AREA # WORD I (0); # TEXT ARRAY # SWITCH SWTCH$SC SC$0,SC$1,SC$2,SC$3,SC$4,SC$5,SC$6,SC$7; #**********************************************************************# CONTROL EJECT; # EXECUTABLE CODE BEGINS HERE # *IF,DEF,STAT NP$SN(IAM); # INCREMENT STATISTICS COUNTER # *ENDIF GMMRC = 1; # INIT RETURN CODE TO NOT FOUND # IF DEFER$PRO THEN # PREVIOUS REQUEST IS INCOMPLETE# BEGIN NP$ERR("42"); # ISSUE DAYFILE MSG AND ABT APP # END # PROCESS ACCORDING TO SEARCH CODE # GOTO SWTCH$SC[GMMSC]; SC$0: # GET DATA FOR CONNECTION # BEGIN IF (GMBHEAD NQ GMBFOOT) AND ( ( (GMBCN NQ 0) AND (GMBCN EQ ACLN) ) OR (GMBCN EQ 0) ) THEN # AIP BUF MAY CONTAIN MSG FOR CN# BEGIN NOWHEAD = GMBHEAD; # START SEARCH AT 1ST MSG # FOR I1=I1 WHILE (NOWHEAD NQ GMBFOOT) AND (GMMRC EQ 1) DO # CHECK ALL MSGS IN AIP BUFFER # BEGIN P
= LOC(GMBWRD[NOWHEAD]); # ABH WORD OF MSG # DACT = GMBACT[NOWHEAD]; # CHARACTER TYPE OF QUEUED DATA # TLW = (2 * GMBTLC[NOWHEAD] + NW$ROUND[DACT])/ NW$FACT[DACT]; IF ACLN EQ ABHADR[0] THEN # WE HAVE FOUND AN ENTRY # BEGIN GMMRC = 0; END ELSE # BUFFER ENTRY FOR DIFFERENT CN # BEGIN NOWHEAD = NOWHEAD + TLW +1; # SKIP TO CHECK NEXT ENTRY # IF (GMBLAST LQ NOWHEAD) AND # REACHED END OF BUFFER # (NOWHEAD NQ GMBFOOT) # NOT REACHED END OF DATA # THEN # WE HAVE REACHED THE END OF BUF# BEGIN NOWHEAD = 1; # RESTART SEARCH AT BEGIN OF BUF# END END END END NP$EXTQ; # RETURN DATA MSG OR NULL MSG # GOTO SC$END; END SC$1: # GET DATA FOR LIST NUMBER # BEGIN IF (GMBHEAD NQ GMBFOOT) AND (ACLN EQ GMBLN) THEN # AIP HAS DATA AVAILABLE # BEGIN GMMRC = 0; # FLAG THAT ENTRY WAS FOUND # NOWHEAD = GMBHEAD; # SAVE PTR OF CURRENT HEAD # DACT = GMBACT[NOWHEAD]; # CHARACTER TYPE OF QUEUED DATA # TLW = (2 * GMBTLC[NOWHEAD] + NW$ROUND[DACT])/ NW$FACT[DACT]; END NP$EXTQ; GOTO SC$END; END SC$2: # DISCARD ALL DATA ON CONNECTION# BEGIN IF (GMBHEAD NQ GMBFOOT) AND ( ( (GMBCN NQ 0) AND (GMBCN EQ ACLN) ) OR (GMBCN EQ 0) ) THEN # AIP BUF MAY CONTAIN MSG FOR CN# BEGIN NOWHEAD = GMBHEAD; # START SEARCH AT 1ST MSG # FOR I1=I1 WHILE NOWHEAD NQ GMBFOOT DO # CHECK ALL MSGS IN AIP BUFFER # BEGIN P
= LOC(GMBWRD[NOWHEAD]); # ABH WORD OF MSG # DACT = GMBACT[NOWHEAD]; # CHARACTER TYPE OF QUEUED DATA # TLW = (2*GMBTLC[NOWHEAD] + NW$ROUND[DACT])/NW$FACT[DACT]; NEXTHEAD = NOWHEAD + TLW + 1; # INDEX FOR NEXT MSG IN BUF # IF ACLN EQ ABHADR[0] THEN # WE HAVE FOUND AN ENTRY # BEGIN GMMRC = 0; *IF,DEF,STAT NP$SN(TYPE"GDM"); # INCREMENT AIP STATISTICS # *ENDIF IF GMBHEAD EQ NOWHEAD THEN # RETURNED FIRST MSG IN BUFFER # BEGIN GMBHEAD = NEXTHEAD; # UPDATE PTR TO NEXT MSG # IF (GMBLAST LQ GMBHEAD) AND (GMBHEAD NQ GMBFOOT) THEN # REACHED END OF BUFFER # BEGIN GMBHEAD = 1; END NOWHEAD = GMBHEAD; # ADDR OF NEXT ENTRY TO CHECK # END # END DATA MESSAGE DELIVERED # ELSE # DID NOT RETURN 1ST MSG IN BF # BEGIN IF GMBFOOT EQ NEXTHEAD THEN # RETURNED LAST MSG IN BUFFER # BEGIN GMBFOOT = GMBFOOT - TLW - 1; # UPDATE PTR FOR NXT # END ELSE # NOT LAST MSG IN BUFFER # BEGIN IF NOWHEAD LS GMBFOOT THEN # RETURNED MSG IS IN 1ST PART # BEGIN # MOVE UP ALL DATA ENTRIES BELOW ONE RETURNED TO APP # FOR I = 0 STEP 1 UNTIL GMBFOOT-NEXTHEAD-1 DO BEGIN GMBWRD[NOWHEAD+I] = GMBWRD[NEXTHEAD+I]; END GMBFOOT = GMBFOOT - TLW - 1; # NEW INDEX FOR LAST # END ELSE # RETURNED MSG IS IN LAST PART# BEGIN # MOVE DOWN ALL DATA ENTRIES BEFORE ONE RETURNED TO APP # FOR I = 1 STEP 1 UNTIL NOWHEAD - GMBHEAD DO BEGIN GMBWRD[NEXTHEAD-I] = GMBWRD[NOWHEAD-I]; END GMBHEAD = GMBHEAD + TLW + 1; # NEW INDX FOR 1ST # NOWHEAD = NEXTHEAD;# ADDR OF NEXT ENTRY TO CHECK # END END END END ELSE # BUFFER ENTRY FOR DIFFERENT CN # BEGIN NOWHEAD = NEXTHEAD; # SKIP TO CHECK NEXT ENTRY # IF (GMBLAST LQ NOWHEAD) AND # REACHED END OF BUFFER # (NOWHEAD NQ GMBFOOT) # NOT REACHED END OF DATA # THEN # WE HAVE REACHED THE END OF BUF# BEGIN NOWHEAD = 1; # RESTART SEARCH AT BEGIN OF BUF# END END END IF GMBFOOT EQ GMBHEAD THEN # BUFFER IS NOW EMPTY # BEGIN GMBFOOT = 1; # INITIAL PTR FOR NEXT FREE WORD# GMBHEAD = 1; # INITIAL PTR FOR NEXT DATA MSG # END END GOTO SC$END; END SC$3: # DISCARD ALL DATA ON LIST NO # BEGIN # THIS FEATURE HAS NOT BEEN IMPLEMENTED # GOTO SC$END; END SC$4: # SET LIST OFF FLAG FOR ALL MSGS# # IN BUFFER WITH SPECIFIED LIST # # NUMBER. # BEGIN # THIS FEATURE HAS NOT BEEN IMPLEMENTED # GOTO SC$END; END SC$5: # CLEAR LIST OFF FLAG FOR ALL # # MSGS IN BUFFER WITH SPECIFIED # # LIST NUMBER. # BEGIN # THIS FEATURE HAS NOT BEEN IMPLEMENTED # GOTO SC$END; END SC$6: # SET TEMP LIST OFF FLAG FOR ALL# # MSGS IN BUFFER WITH SPECIFIED # # LIST NUMBER. # BEGIN # THIS FEATURE HAS NOT BEEN IMPLEMENTED # GOTO SC$END; END SC$7: # CLEAR TEMP LIST OFF FLAG FOR # # ALL MSGS IN BUFFER WITH # # SPECIFIED LIST NUMBER. # # THIS FEATURE HAS NOT BEEN IMPLEMENTED # BEGIN GOTO SC$END; END SC$END: # END OF CASE STATEMENT # NP$USI; # UPDATE NSUP WORD # LTAA = 0; # CLEAR FRAGMENT CALL FLAG # RETURN; CONTROL EJECT; PROC NP$EXTQ; # *1DC NP$EXTQ * * 1. PROC NAME AUTHOR DATE * NP$EXTQ E. GEE 01/30/85 * * 2. FUNCTIONAL DESCRIPTION. * EXTRACT DATA MSG FROM UPLINE DATA BUFFER AND DELIVER TO * THE APPLICATION. * * 3. METHOD USED. * IF NO MESSAGE FOUND, * RETURN NULL BLOCK TO APPLICATION. * ELSE (DATA MESSAGE FOUND IN DATA BUFFER), * IF APP BUFFER IS NOT BIG ENOUGH AND TRUNCATION NOT ALLOWED, * SET IBU BIT IN ABH WORD. * ELSE ( DATA MSG CAN BE DELIVERED), * SET TRUNCATION BIT IF DATA MSG IS TRUNCATED. * IF FRAGMENTED GET REQUEST, * COPY TEXT INTO FRAGMENTED BUFFERS. * ELSE (DELIVER MSG INTO ONE BUFFER), * COPY TEXT INTO APPLICATION BUFFER. * ADJUST AIP POINTERS FOR UPLINE DATA BUFFER. * * 4. ENTRY CONDITIONS. * GMMRC MESSAGE FOUND FLAG. * = 0 MESSAGE FOUND TO DELIVER. * = 1 RETURN NULL BLOCK TO APPLICATION. * * 5. EXIT CONDITIONS. * HA CONTAIN NULL BLOCK IF NOT DATA MSG WAS * AVAILABLE. OTHERWISE, IT WILL CONTAIN THE * APP BLOCK HEADER OF THE TEXT. * ATA CONTAINS TEXT OF DATA MSG IF ONE WAS * DELIVERED. * * 7. PROCEDURES/FUNCTIONS CALLED. * NONE. * * 8. DAYFILE MESSAGES OR OTHER IMPORTANT INFORMATION. * NONE. # #**********************************************************************# CONTROL EJECT; BEGIN IF GMMRC EQ 1 THEN # NO MATCHING ENTRY FOUND # BEGIN # RETURN NULL BLOCK # I = NEXT + 1; # CURRENT INDEX INTO NWL BUF # ABH[I] = 0; # ZERO ABH WORD IN NWL BUFFER # ABH$ADR[0] = ACLN; # CONNECTION/LIST NUMBER # P
= LOC$HA; # ADDRESS TO WRITE ABH WORD # ABHWORD[0] = ABH[I]; # WRITE NULL ABH TO ABH WORD # *IF,DEF,STAT NP$SN(TYPE"INB"); *ENDIF END ELSE # MATCHING ENTRY FOUND # BEGIN NEXTHEAD = NOWHEAD + TLW + 1; P
= LOC$HA; # ADDRESS TO WRITE ABH WORD # ABHWORD[0] = GMBWRD[NOWHEAD]; IF (TLW GR TLMX) AND (NOT GMBTRUNC) THEN # BLOCK IS TOO LARGE TO DELIVER # BEGIN GMBIBU[NOWHEAD] = TRUE; # SET IBU BIT IN BLOCK HEADER # END ELSE # BLOCK CAN BE DELIVERED # BEGIN IF TLW GR TLMX THEN # BLOCK MUST BE TRUNCATED # BEGIN TLW = TLMX; # NO OF WORDS OF TEXT TO DELIVER# ABHTLC[0] = (TLMX * NW$FACT[DACT]) / 2; # NO OF CHARS # ABHTRU[0] = 1; # SET TRUNCATION FLAG IN ABH # END N = TLW - 1; P = LOC$TA; P = LOC$TA; J = NOWHEAD + 1; TLWDIF = TLW; CONTROL FASTLOOP; FOR K = 1 STEP 1 UNTIL LTAA DO BEGIN IF LTAA NQ 0 THEN BEGIN P = TAADDR[K]; N = TAASIZE[K] - 1; IF N GR TLWDIF # MAKE SURE THAT AIP IS ONLY # THEN # COPYING THE DATA # N = TLWDIF - 1; # MESSAGE TO THE FRAGMENTED # # BUFFERS - NO MATTER WHAT SIZE # #HAS BEEN SPECIFIED IN THE # #TEXT AREA ARRAY. # TLWDIF = TLWDIF - TAASIZE[K]; END CONTROL SLOWLOOP; FOR I = 0 STEP 1 UNTIL N DO BEGIN WORD[I] = GMBWRD[I+J]; END J = J + TAASIZE[K]; END *IF,DEF,STAT I = GMBABT[NOWHEAD] + TYPE"INB"; NP$SN(I); *ENDIF *IF,DEF,DEBUG NP$DBG; # WRITE MSG TO AIP DEBUG FILE # *ENDIF IF GMBHEAD EQ NOWHEAD THEN # RETURNED FIRST MSG IN BUFFER # BEGIN GMBHEAD = NEXTHEAD; # UPDATE PTR TO NEXT MSG # IF (GMBLAST LQ GMBHEAD) AND (GMBFOOT NQ GMBHEAD) THEN # REACHED END OF BUFFER # BEGIN GMBHEAD = 1; END END # END DATA MESSAGE DELIVERED # ELSE # DID NOT RETURN 1ST MSG IN BUF # BEGIN IF GMBFOOT EQ NEXTHEAD THEN # RETURNED LAST MSG IN BUFFER # BEGIN GMBFOOT = GMBFOOT - TLW - 1; # UPDATE PTR FOR NXT FREE# END ELSE # NOT LAST MSG IN BUFFER # BEGIN IF NOWHEAD LS GMBFOOT THEN # RETURNED MSG IS IN 1ST PART # BEGIN # MOVE UP ALL DATA ENTRIES BELOW ONE RETURNED TO APP # FOR I = 0 STEP 1 UNTIL GMBFOOT-NEXTHEAD - 1 DO BEGIN GMBWRD[NOWHEAD+I] = GMBWRD[NEXTHEAD+I]; END GMBFOOT = GMBFOOT - TLW - 1; # NEW INDEX FOR LAST MS# END ELSE # RETURNED MSG IS IN LAST PART # BEGIN # MOVE DOWN ALL DATA ENTRIES BEFORE ONE RETURNED TO APP # FOR I = 1 STEP 1 UNTIL NOWHEAD - GMBHEAD DO BEGIN GMBWRD[NEXTHEAD-I] = GMBWRD[NOWHEAD-I]; END GMBHEAD = GMBHEAD + TLW + 1; # NEW INDEX FOR 1ST MSG# END END END IF GMBHEAD EQ GMBFOOT THEN # EMPTY UPLINE DATA BUFFER # BEGIN GMBHEAD = 1; GMBFOOT = 1; END END END RETURN; END END TERM