FUNCTION LOCATE(STRING,SLEN,IBEG,P,PATERN,PLEN) C This file: http://ftp.aset.psu.edu/pub/ger/fortran/hdk/substr.f90 C C=========LOCATE IS A SCANNING FUNCTION WHICH SCANS THE C STRING, "STRING" OF LENGTH "SLEN" BEGINNING AT STRING(|IBEG|) C FOR THE FIRST OCCURENCE OF THE SUBSTRING "PATERN" OF C LENGTH "PLEN". IF P IS .TRUE. THEN THE INDEX OF THE FIRST C OCCURENCE WHERE THE SUBSTRING OF "STRING" EQUALS "PATERN" IS C RETURNED; IF P IS .FALSE. THEN THE INDEX OF THE FIRST C OCCURENCE WHERE ANY SUBSTRING OF "STRING" IS NOT EQUAL C TO "PATERN" IS RETURNED. C IF IBEG IS POSITIVE THEN THE SCAN IS (FORWARD) TOWARDS C STRING(SLEN); IF IBEG IS NEGATIVE THEN THE SCAN IS C (BACKWARD) TOWARD STRING(1). C IF P IS TRUE AND "PATTERN" IS NOT A SUBSTRING OF "STRING" OR C IF P IS FALSE AND "STRING" IS EXACTLY EQUAL TO "PATERN" C THEN LOCATE IS RETURNED ZERO. IF "STRING" OR "PATERN" C ARE NULL OR "PATERN" IS LONGER THAN "STRING" THEN LOCATE C IS RETURNED ZERO. OTHERWISE LOCATE IS RETURNED AS A C INDEX SUCH THAT THE SUBSTRING BEGINNING AT STRING(LOCATE) C OF LENGTH PLEN IS EQUAL TO PATERN. C HDK - 1978 C INTEGER SLEN,PLEN LOGICAL P,CEQ C, CHARACTER*1 STRING(SLEN),PATERN(PLEN) LOGICAL*1 STRING(SLEN),PATERN(PLEN) IF(IBEG.LT.0) GO TO 1 C----------SCAN NSCANS FORWARD BEGINNING AT STRING(LOCATE). NSCANS=CLEN-PLEN-IBEG+1 LOCATE=IBEG GO TO 2 C----------SCAN NSCANS BACKWARD BEGINNING AT STRING(LOCATE). 1 NSCANS=-IBEG-PLEN LOCATE=NSCANS 2 INCR=ISIGN(1,IBEG) IF(IBEG.EQ.0 .OR. PLEN.LT.1 .OR. NSCANS.LT.1) GO TO 4 C----------DO THE SCAN. DO 3 I=1,NSCANS IF(CEQ(CARD(LOCATE),PAT,PLEN).AND.P) GO TO 5 3 LOCATE=LOCATE+INCR 4 LOCATE=0 5 RETURN END