*DECK WRITERI PROC WRITERI ( (FET),(RECID),(WSA),(LENGTH), STATIS ); BEGIN # WRITERI # *IF DEF,IMS # ** * * 1. PROC NAME AUTHOR DATE * WRITERI M. D. PICKARD 77/01/13 * * 2. FUNCTIONAL DESCRIPTION * WRITERI WILL WRITE A RECORD TO A SUPIO RANDOM FILE * AND ADD THE RECORD IDENT TO THE SUPIO RANDOM INDEX. * * 3. METHOD USED * IF THE FILE IS A SUPIO RANDOM FILE AND THERE IS ROOM IN * THE INDEX, FINDRI IS CALLED TO FIND THE PLACE IN THE INDEX * FOR THE RECORD IDENT. WRITER IS CALLED TO WRITE THE RECORD. * IF THE WRITE IS SUCCESSFULL, THE RI IS ADDED TO THE INDEX. * * 4. ENTRY PARAMETERS * FET ADDRESS OF THE FET * RECID RECORD IDENT * WSA ADDRESS OF WRITE BUFFER * LENGTH LENGTH OF RECORD TO REWRITE * * 5. EXIT PARAMETERS * STATIS RETURN STATUS * 0 - OPERATION COMPLETE * DECPEOC - PARITY ERROR, OPERATION COMP. * DECPE - PARITY ERROR * DECAEOC - ADDRESS ERROR, OPER. COMPLETE * DECAE - ADDRESS ERROR * DECDSOC - DETAILED STATUS ERROR, OP. CMP. * DECDS - DETAILED STATUS ERROR * DECTL - TRACK LIMIT * RANRSEQ - RANDOM REQUEST ON SEQ. FILE * BADRI - BAD RECORD IDENT, DUPLICATE * INDXSML - INDEX TOO SMALL TO ADD RECID * NOTSIOF - NOT A SUPIO FILE * * 6. COMDECKS CALLED * SIODEFS SUPIO SYMPL DEFS * SIOBASE SUPIO BASED ARRAY DEFINITIONS * * 7. ROUTINES CALLED * FINDRI FINDS PLACE FOR RECORD IDENT * RECALL MACREL CPU RECALL SYMPL INTERFACE * WRITER MACREL WRITER SYMPL INTERFACE * * 8. DAYFILE MESSAGES * NONE. * # *ENDIF CONTROL NOLIST; # STOPS LIST OF SIODEFS AND SIOBASE # *CALL SIODEFS *CALL SIOBASE CONTROL LIST; XREF BEGIN PROC WRITER; PROC RECALL; PROC FINDRI; END ITEM FET U, # FET ADDRESS # RECID U, # RECORD IDENT # WSA U, # WORKING STORAGE AREA, WRITE FROM BUFFER # LENGTH U, # RECORD LENGTH # STATIS U; # RETURN STATUS # ITEM I U, # INDUCTION VARIABLE # REQWORD U, # REQUEST WORD FOR WRITER # TEMP U, # TEMPORARY UNSIGNED INTEGER # TEMPB B; # TEMPORARY BOOLEAN # P = FET; # FORMAT FET # IF FETRAN[0] THEN # FET IS RANDOM FILE FET # BEGIN # SEE IF THE INDEX IS OK # P = FETINDX[0]; # FORMAT THE INDEX # IF SIONAME[0] EQ "SUPIOINDEX" THEN # FILE IS SUPIO RANDOM FILE # BEGIN IF ( LINDX[0] + 1 ) * SIOINDL LS FETINDL[0] THEN # THERE"S ROOM IN THE INDEX FOR WRITE # BEGIN FINDRI(LOC(SIOINDX),RECID,TEMP,TEMPB); # FIND RI IN INDX # IF NOT TEMPB THEN # NOT A DUPLICATE RECORD IDENT, # BEGIN # TEMP CONTAINS PLACE IT SHOULD GO # FETFST[0] = WSA; # SET FIRST # FETIN[0] = WSA + LENGTH; # SET IN FOR BUFFER FULL # FETOUT[0] = WSA; # SET OUT # FETLMT[0] = FETIN[0] + 1; # SET LIMIT # FETRR[0] = LOC(REQWORD); # RETURN RANDOM ADDR. TO REQWORD# WRITER(SIOFET,0); # WRITE THE RECORD # RECALL(SIOFET); # WAIT TIL COMPLETE BIT SET # IF FETABNT[0] EQ 0 THEN # WRITE TOOK PLACE OK # BEGIN # MOVE HIGHER ORDINAL DOWN TO MAKE ROOM # FOR I = LINDX[0] STEP -1 UNTIL TEMP DO BEGIN # MOVE ALL HIGHER ENTRIES DOWN ONE # RI[I+1] = RI[I]; # MOVE RECORD IDENT DOWN ONE # RL[I+1] = RL[I]; # MOVE RECORD LENGTH DOWN ONE # RANINDX[I+1] = RANINDX[I]; # MOVE RANDOM INDEX DOWN # END RI[TEMP] = RECID; # SET THIS ENTRY RI FIELD # RL[TEMP] = LENGTH; # SET THIS ENTRY RECORD LENGTH # RANINDX[TEMP] = REQWORD; LINDX[0] = LINDX[0] + 1; # ADJUST LAST INDEX ORDINAL # CINDX[0] = TEMP; # SET CURRENT INDEX POSITION # STATIS = 0; END ELSE STATIS = FETDEC[0]; # USE DETAIL ERROR CODE FOR STATUS # END ELSE # DUPLICATE # STATIS = BADRI; # BAD RECORD IDENT # END ELSE # INDEX AREA TO SMALL # STATIS = INDXSML; # SET RETURN STATUS # END ELSE # NOT A SUPIO INDEX # STATIS = NOTSIOF; # SET RETURN STATUS # END ELSE # NOT A RANDOM FILE # STATIS = RANRSEQ; # SET RETURN STATUS # RETURN; END TERM # WRITERI #