.TITLE WRITE_QREC WRITE RECORD TO QUEUE .IDENT /1.2/ ;.begin.doc ************************** begin.doc ; ; .c ;MODULE ; .c ;^&WRITE_QREC\& ; .nf ; .x WRITE_QREC>Defined ; Source:WRITE_QREC.MOD ; TO BECOME PART OF LIBRARY:QUEUE ; Designer :EARL LAKIA ; Author :EARL LAKIA ; Inland Steel ; Process Automation Department ; 3210 Watling St. MS 2-465 ; East Chicago, IN 46312 ; ; Date of last update:26-AUG-1986 ; Revision level :1.2 ; ; .C ;Formal Parameter List ; Receives: ; ; Q_BLOCK ARRAY(2) INTEGER*4 ; Q_BLOCK AS FILLED IN BY ATTACH_Q ; ; MESSAGE_ID CHARACTER*16 ; MESSAGE ID OF QUEUE TO WRITE TO. ; ; RECORD RECORD ; RECORD CONTAINING MESSAGE TO BE WRITTEN TO THE ; QUEUE. NOTE: PASSED BY REFERENCE AND NOT BY ; DESCRIPTOR AS WRITE_Q IS. (IE: WHY THIS ; ROUTINE WAS WRITTEN) ; ; LENGTH INTEGER*2 ; LENGTH OF THE MESAGE TO BE WRITTEN IN BYTES ; ; MTYPE INTEGER*2 ; TYPE OF MESSAGE (0= NORMAL, 1= CAN NOT BE ; DELETED) ; ; INDEX INTEGER*2 ; OPTIONAL INDEX OF THE MESSAGE ID WITHIN THE ; QUEUE. SPACE HOLDER MUST BE PRESENT IF NOT ; SPECIFIED (IE: EXTRA COMMA) ; ; Returns: ; ; WRITE_QREC INTEGER*4 ; STATUS FROM WRITE_Q ; ; Accesses common(s): ; ; Accesses file(s): ; ; Other modules referenced: ; ; .X WRITE_Q>Referenced ; WRIT_Q ACTUALLY WRITE MESSAGE TO THE QUEUE ; AND CALLS THE SYSTEM SERVICE ; .SK ; .fill ; .SK ; Description: ; .sk ; This subroutine allows the caller to call the Q_WRITE ; subroutine with record type variables. The Q_WRITE only ; accepts message buffer to be passed by DESCRIPTOR. This ; routine therefore makes a fake descriptor for the caller. ; Since this code is written in FORTRAN, all parameters must ; be specified or placed holder present for the single ; optional argument (INDEX). ; CALLING SEQUENCE ; .TP 30 ; .literal ; INCLUDE'MA_Q$DEF:QUEUE.TLB(QUECONST)' ; INTEGER*4 Q_BLOCK(2) ! AS RECEIVED FROM ATTACH_Q ; INTEGER*2 LENGTH ! LENGTH OF MESSAGE ; STRUCTURE/RECORD/ ; CHARACTER*100 DUMMY ; END STRUCTURE ; RECORD/RECORD/RECORD ! RECORD TO BE WRITTEN ; INTEGER*2 MTYPE ! TYPE OF MESSAGE ; INTEGER*4 SYS_STATUS ! STATUS FROM WRITE_Q ; CHARACTER*16 MESSAGE_ID ; C ; DATA MESSAGE_ID/'STANDARDS'/ ; DATA MTYPE/0/ ; DATA LENGTH/100/ ; C ; SYS_STATUS=ATTACH_Q(Q_BLOCK) ! ATTACH TO THE QUEUE ; IF(.NOT. SYS_STATUS)THEN ; ..... ; ..... ; ENDIF ; C ; SYS_STATUS=WRITE_QREC(Q_BLOCK,MESSAGE_ID, ; 1 RECORD,LENGTH,MTYPE,) ! INDEX NOT SPECIFIED ; - O R - ; SYS_STATUS=WRITE_QREC(Q_BLOCK,MESSAGE_ID, ; 1 RECORD,LENGTH,MTYPE) ! INDEX NOT SPECIFIED ; - O R - ; SYS_STATUS=WRITE_QREC(Q_BLOCK,MESSAGE_ID, ; 1 RECORD,LENGTH,MTYPE,INDEX) ! INDEX SPECIFIED ; C ; IF(.NOT. SYS_STATUS)THEN ; ...... ; ...... ; ENDIF ; ; .END LITERAL ; .FILL ; The return status is from the Q_WRITE except if the ; user does not pass either four or five arguments. ; ; end.doc ****************************** end.doc .PSECT RQLOCAL,PIC,CON,REL,LCL,NOSHR,NOEXE,RD,WRT,LONG QDESC: .LONG 0 ; LENGTH OF RECORD .LONG 0 ; ADDRESS OF RECORD .PAGE ; ; 00(AP)= NUMBER OF ARGUMENTS ; 04(AP)= Q_BLOCK ; 08(AP)= MESSAGE ID (DESCRIPTOR) ; 12(AP)= ADDRESS OF RECORD ; 16(AP)= LENGTH OF RECORD ; 20(AP)= ADDRESS OF THE TYPE OF MESSAGE ; 24(AP)= INDEX OR NOT SPECIFIED ; .PSECT RQCODE,CON,REL,LCL,SHR,EXE,RD,NOWRT,LONG .ENTRY WRITE_QREC,^M<> ; CMPL #5,(AP) ; WAS THE INDEX SPECIFIED? BEQL 10$ ; NO. CMPL #6,(AP) ; CORRECT NUMBER ARGUMENTS BNEQ 30$ ; INVALID NUMBER OF ARGUMENTS ; PUSHL 24(AP) ; PUSH ADDRESS OF INDEX 10$: PUSHL 20(AP) ; PUSH ADDRESS OF TYPE PUSHL 16(AP) ; PUSH LENGTH OF RECORD PUSHAL QDESC ; PUSH ADDRESS OF RECORD DESCRIPTOR MOVZWL @16(AP),QDESC ; LENGTH OF RECORD MOVL 12(AP),QDESC+4 ; GET BYTE RECORD ADDRESS PUSHL 8(AP) ; DESCRIPTOR FOR MESSAGE ID PUSHL 4(AP) ; ADDRESS OF Q_BLOCK CALLS (AP),G^WRITE_Q ; CALL ACTUAL SERVICE RET ; ; INVALID NUMBER OF ARGUMENTS ; 30$: MOVL #QUE_INSFARG,R0 ; INSUFFICIENT NUMBER OF ARGUMENTS RET .END