*DECK FINDRI PROC FINDRI ( (INDXPTR),(RECID), INDXORD , SUCCESS ); BEGIN # FINDRI # *IF DEF,IMS # ** * * 1. PROC NAME AUTHOR DATE * FINDRI M. D. PICKARD 77/01/28 * * 2. FUNCTIONAL DESCRIPTION * FINDRI WILL SEARCH A SUPIO RANDOM FILE INDEX TO FIND AN * ENTRY ASSOCIATED TO A RECORD IDENT AND PASS BACK IT"S ORDINAL * TO THE CALLER. * * 3. METHOD USED * IF THERE IS ANY THING IN THE LIST, RECID IS CHECK AGAINST * THE FIRST AND LAST ENTRY TO SEE IF IT MIGHT BE IN THE * INDEX. IF IT IS OUTSIDE THE INDEX THEN SUCCESS IS SET FALSE * AND THE ORDINAL IS SET TO 1 OR LINDX + 1, DEPENDING ON * WHICH END IT IS OUTSICE OF. OTHERWISE THE INDEX IS SEARCHED * UNTIL IT IS FOUND OR IT CANT BE FOUND. THE ORDINAL IS SET * TO THE "HIT" ORDINAL OR THE PLACE WHERE THIS RECID WOULD * BELONG IN THE INDEX IF IT IS NOT FOUND. SUCCESS IS SET * APPROPRIATELY. * * 4. ENTRY PARAMETERS * INDXPTR POINTER TO INDEX * RECID RECORD IDENT TO FIND * * 5. EXIT PARAMETERS * INDEXORD "HIT" ORDINAL, OR WHERE RECID BELONGS * SUCCESS FOUND/NOT FOUND FLAG * * 6. COMDECKS CALLED * SIOBASE SUPIO BASED ARRAY DEFINITIONS * SIODEFS SUPIO SYMPL DEFS * * 7. ROUTINES CALLED * NONE. * * 8. DAYFILE MESSAGES * NONE. # *ENDIF CONTROL NOLIST; # STOPS LIST OF SIODEFS AND SIOBASE # *CALL SIODEFS *CALL SIOBASE CONTROL LIST; ITEM INDXPTR U, # ADDRESS OF SUPIO INDEX # RECID U, # RECORD IDENT # INDXORD U, # INDEX ORDINAL # SUCCESS B; # FOUND RI SUCCESS FLAG # ITEM I U; P = INDXPTR; # FORMAT SUPIO INDEX # SUCCESS = FALSE; # INITIALIZE SUCCESS INDICATOR # IF LINDX[0] EQ 0 THEN # THERE ARE NO ENTRIES, THIS RI BELONGS # INDXORD = 1; # SET RETURN ORDINAL AT ONE# ELSE BEGIN # SEE IF IT IS AFTER LAST OR BEFORE FIRST # IF ( RECID LS RI[1] ) OR ( RECID GR RI[LINDX[0]] ) THEN # TREAT RECID"S BEFORE FIRST AND AFTER # BEGIN # LAST DIFFERENTLY # IF RECID LS RI[1] THEN # IT BELONGS BEFORE ENTRY ONE # INDXORD = 1; # IT SHOULD BE ENTRY ONE # ELSE # IT BELONGS AFTER LAST # INDXORD = LINDX[0] + 1; # GIVE IT LAST INDEX PLUS ONE # END ELSE # FIND IT"S PLACE # BEGIN INDXORD = 0; # CLEAR INDEX ORDINAL # FOR I = 1 WHILE ( I LQ LINDX[0] ) AND NOT SUCCESS DO BEGIN IF RECID EQ RI[I] THEN # PLACE IS HERE, FOUND RI # BEGIN SUCCESS = TRUE; # FOUND RI INDICATOR # INDXORD = I; # SET RETURN ORDINAL # END ELSE # SHOULD WE GO ANY FURTHER # BEGIN IF RECID LS RI[I] THEN # RI NOT FOUND, BUT IT BELONGS HERE # BEGIN INDXORD = I; # SET RETURN ORDINAL # I = LINDX[0] + 1; # FORCE END OF LOOP # END ELSE # BUMP THE INDEX ORDINAL # I = I + 1; END END END END RETURN; END TERM # FINDRI #