.TITLE LOCATE - TABLE SEARCH .IDENT /03MAY7/ ;16:15:00 LV ; .ENTRY LOCATE - TABLE SEARCH ;+ ; L O C A T E ; ; PURPOSE: SEARCH A TABLE FOR A SPECIFIED ELEMENT ; ; INTERFACE: CALLING SEQUENCE (FORTRAN-CALLABLE FUNCTION) ; LOC=LOCATE(TABLE,LOOK4,END,SIZE[,INCR]) ; ; INPUT: TABLE = ADDRESS OF TABLE TO BE SEARCHED ; LOOK4(INTEGER) = VALUE FOR WHICH A MATCH IS BEING SOUGHT ; END = ADDRESS OF LAST ELEMENT IN TABLE. PLEASE ; BE CAREFUL HERE, AND NOTE THAT AN ; ADDRESS IS REQUIRED, NOT A COUNT OF THE ; NUMBER OF ELEMENTS. IF THE ADDRESS OF ; THE NEXT BYTE TO BE EXAMINED IS GREATER ; THAN THIS VALUE, A FUNCTION VALUE OF ; 0 IS RETURNED. ; SIZE(INTEGER) = NUMBER OF BYTES IN LOOK4. THIS VALUE ; WILL REFLECT DATA TYPES IN A VALUE SEARCH, ; OR SEARCH STRING LENGTH IN A STRING SEARCH. ; ; OPTIONAL PARAMETER: INCR(INTEGER) = SEARCH INCREMENT: ; THE AMOUNT THAT THE SEARCH INDEX IS ; BUMPED BETWEEN EXAMINATIONS. (BYTES) ; DEFAULT > SAME AS SIZE ; ; OUTPUT: LOCATE(INTEGER) = INDEX OF ELEMENT MATCHING LOOK4. ; EACH GROUP OF "SIZE" NUMBER OF BYTES IS ; CONSIDERED ONE ELEMENT. LOCATE WILL EQUAL ; ZERO IF A MATCH IS NOT FOUND. ; ; METHOD: LOCATE WILL SEARCH A TABLE FOR A SPECIFIED ; ELEMENT AND RETURN THE INDEX OF THE ENTRY IF IT IS ; FOUND. IF NO MATCH IS FOUND, A ZERO IS RETURNED ; AS THE FUNCTION VALUE. NOTE THAT THE ELEMENT ; BEING SEARCHED FOR MAY CONSIST OF MANY BYTES, ; ALLOWING US TO SEARCH FOR A STRING WITHIN A STRING, ; OR DOUBLE-PRECISION VALUES IN A TABLE. ; ; LANGUAGE: MACRO-11 ;- ; REVISIONS: ; JAN-75 RK WRITTEN ; 02-SEP-76 SS ELIMINATE DEPENDENCE ON NON-STANDARD MACROS ; 20-JAN-77 NS REMOVE LOCAL DEFINITIONS OF NON-STANDARD ; MACROS. THIS IS HANDLED IN THE PREFIX FILE . ; 03-MAY-77 LV UPDATED TO CONFORM TO STANDARDS ; ; MACROS .MCALL PUSH,POP ; LOCATE::PUSH CMP 2(R5),6(R5) ;IS START ADDR >= END ADDR? BHIS NOFIND ;YES TST @10(R5) ;IS SIZE OK? BLE NOFIND ;NO MOV @10(R5),INCR ;DEFAULT INCREMENT CMPB (R5),#5 ;DO WE HAVE 5 ARGS? BLT 10$ ;NO TST 12(R5) ;WAS INCR SPECIFIED? BMI 10$ ;NO MOV @12(R5),INCR ;YES, SET INCREMENT 10$: MOV #1,R0 ;1ST ELEMENT CLR R4 ;NO TABLE OFFSET YET 20$: MOV @10(R5),R1 ;SIZE MOV 2(R5),R2 ;TABLE ADDRESS MOV 4(R5),R3 ;LOOK4 ADDRESS ADD R4,R2 ;POSITION WITHIN TABLE FOR THIS SEARCH CMP R2,6(R5) ;ARE WE OFF END OF TABLE? BHI NOFIND ;YES 30$: CMPB (R2)+,(R3)+ ;LOOK FOR MATCH BNE 40$ ;1ST NON-MATCH INVALIDATES THIS ELEMENT DEC R1 ;IS THERE MORE OF LOOK4 TO CHECK? BEQ DONE ;NO, WE FOUND IT CMP R2,6(R5) ;ARE WE OFF END OF TABLE? BLOS 30$ ;NO, CHECK THIS BYTE BR NOFIND ;YES, RETURN ZERO INDEX 40$: ADD INCR,R4 ;MOVE DOWN TABLE INC R0 ;NEXT ELEMENT BR 20$ NOFIND: CLR R0 ;RETURN INDEX=0 DONE: POP RETURN INCR: 0 .END