C++********************************************************************* C C CHARINSIDE.F NEW MAY 1997 ARDEAN LEITH C ADDED FROMBACK JAN 2001 ARDEAN LEITH C C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C C CHARINSIDE(STRING,CLEFT,CRIGHT,INCLUSIVE,FROMBACK,IGO,IEND,NCHAR) C C PARAMETERS: STRING INPUT STRING (SENT) C CLEFT START DELIMITER (SENT) C CRIGHT END DELIMITER (SENT) C INCLUSIVE FLAG TO EXCLUDE DELIMITERS (SENT) C FROMBACK FLAG TO FIND FROM BACK (SENT) C IGO STARTING LOCATION (RETURNED) C IEND ENDING LOCATION (RETURNED) C NCHAR NUMBER OF CHAR. (RETURNED) C C PURPOSE: FINDS FIRST OCCURANCE OF SUBSTRING DELIMINATED BY C CLEFT AND CRIGHT INSIDE OF STRING. IF LOGICAL FLAG C FROMBACK IS TRUE THEN HUNTS FOR LAST OCCURANCE. C IF INCLUSIVE THEN THE POSTIONS RETURNED IN IGO..IEND C DO NOT INCLUDE THE CLEFT & CRIGHT DELIMITERS. NCHAR C IS NUMBER OF CHARACTERS IN IGO...IEND. IF THERE C ARE MULTIPLE OCCURANCES OF THE DELIMITERS WITHIN C THE SUBSTRING THEN THE INNERMOST SET IS CHOSEN C E.G. IF FROMBACK IS FALSE AND STRING IS CLEFT, CLEFT, C CRIGHT THEN THE RETURNED STRING IS CLEFT,CRIGHT ONLY C C--********************************************************************* SUBROUTINE CHARINSIDE(STRING,CLEFT,CRIGHT,INCLUSIVE,FROMBACK, & IGO,IEND,NCHAR) INCLUDE 'CMBLOCK.INC' CHARACTER *(*) STRING CHARACTER *(*) CLEFT CHARACTER *(*) CRIGHT LOGICAL INCLUSIVE,FROMBACK C SUBSTRING NOT PRESENT (IS DIFFERENT FROM EMPTY SUBSTRING) NCHAR = -1 LENT = LEN(STRING) IF (.NOT. FROMBACK) THEN C SEARCH FROM FRONT END OF STRING C FIND BEGINNING OF SUBSTRING (CLEFT) INSIDE STRING IGO = INDEX(STRING(1:LENT),CLEFT) C RETURN IF START OF SUBSTRING (CLEFT) NOT PRESENT IF (IGO .LE. 0 ) RETURN C RETURN IF START OF SUBSTRING (CLEFT) IS AT END OF STRING IF (IGO .GE. LENT) RETURN C FIND END OF SUBSTRING (CRIGHT) FOLLOWING IGO IEND = INDEX(STRING(IGO+1:),CRIGHT) + IGO C RETURN IF END OF SUBSTRING (CRIGHT) WAS NOT PRESENT IF (IEND .LE. IGO) RETURN C FIND LAST BEGINNING OF SUBSTRING (CLEFT) INSIDE NEW STRING IGO2 = INDEX(STRING(IGO+1:IEND-1),CLEFT,BACK=.TRUE.) IGO = IGO + IGO2 ELSE C SEARCH FROM BACK END OF STRING C FIND END OF SUBSTRING (CRIGHT) INSIDE STRING IEND = INDEX(STRING(1:LENT),CRIGHT,BACK=FROMBACK) C RETURN IF END OF SUBSTRING (CRIGHT) NOT PRESENT IF (IEND .LE. 1) RETURN C FIND BEGINNING OF SUBSTRING (CLEFT) PRECEDING IEND IGO = INDEX(STRING(:IEND-1),CLEFT,BACK=FROMBACK) C RETURN IF BEGINNING OF SUBSTRING (CLEFT) NOT PRESENT IF (IGO .LE. 0) RETURN C FIND FIRST END OF SUBSTRING (CRIGHT) INSIDE NEW STRING IEND2 = INDEX(STRING(IGO:IEND-1),CRIGHT) IF (IEND2 .GT. 0) IEND = IGO + IEND2 - 1 ENDIF IF (INCLUSIVE) THEN C DO NOT WANT TO INCLUDE DELIMITER LOCATIONS IGO = IGO + 1 IEND = IEND - 1 ENDIF C FIND NUMBER OF CHARACTERS IN RETURNED SUBSTRING NCHAR = IEND - IGO + 1 RETURN END