⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 match.for

📁 This Source-Navigator, an IDE for C/C++/Fortran/Java/Tcl/PHP/Python and a host of other languages.
💻 FOR
字号:
      SUBROUTINE MATCH(SEARCH,IMC1,IMC2,STATEM,ICC1,ICC2, HOLFLG,KPOSM,     +ILEVEL,NSPEC,KSPEC1,KSPEC2)*-----------------------------------------------------------------------** matches two strings** blanks outside strings are ignored in STATEM** input* SEARCH      string (possibly with special symbols) to be matched*             special symbols and their meanings are :*             @  ( commercial at  )     numeric string*             &  ( ampersand )          alphabetic string*             $  ( dollar )             alphanumeric string*             #  ( hash )               any string ( including null )*             ?  ( questionmark )       FORTRAN name type ( length not*                                                          limited)*             !  ( exclam. mark )       expression (no [,] at level 0)*             >)                        string up to open bracket level*             ;  (semicolon)            nothing must follow, i.e.*                                       ICC2 must be last matched ch.* IMC1        first ch. in SEARCH* IMC2        last ch. in SEARCH* STATEM      input string (typically a statement)* ICC1        first ch. in STATEM* ICC2        last ch. in STATEM* HOLFLG      if TRUE, hollerith included in STATEM* output* KPOSM       position of last ch. in STATEM for first fit of SEARCH.*             if last ch. in SEARCH is a special ch.( as above),*             the match will be performed to the ENDC of that type.*             KPOSM = 0 in case of no match* ILEVEL      round bracket level relative to input level 0, at KPOS* NSPEC       no. of special ch. encountered in SEARCH* KSPEC1(i)   start of i-th special ch. corresp. string in STATEM* KSPEC2(i)   end   -  -     -      -     -        -    -   -*             attention: KSPEC2(i) < KSPEC1(i) for null string match**-----------------------------------------------------------------------      DIMENSION KSPEC1(*),KSPEC2(*)      LOGICAL HOLFLG,FREE,EVER,POSIT      CHARACTER SEARCH*(*),STATEM*(*),STEMP*1,STEMP1*1      include 'convex.h'      KPOSM=0      ILEVEL=0      NSPEC=0*--- INSTR = string indicator for SEARCH, ISSTR for STATEM      INSTR=0      ISSTR=0      FREE=.FALSE.      EVER=.FALSE.*--- KSTR is the current ch. pos. in STATEM      KSTR=ICC1      KEEP=ICC2      JC=IMC1-1*--- loop over characters in 'SEARCH' string*--- exits are:*                 10   continue looping*                 30   match exit*                 40   nomatch exit   10 JC=JC+1      IF (JC.GT.IMC2) GOTO 30      STEMP=SEARCH(JC:JC)      IF(STEMP.EQ.'''')  INSTR=1-INSTR      IF(INSTR.EQ.0)  THEN*--- not inside quotes         IF (STEMP.EQ.';')  THEN*--- matches if nothing follows in STATEM            IF (KSTR.GT.ICC2)  THEN               GOTO 30            ENDIF            GOTO 40         ENDIF         IF (KSTR.GT.ICC2)  THEN            IF (STEMP.EQ.'#'.AND.JC.EQ.IMC2)  THEN*--- '#' at end of SEARCH string               NSPEC=NSPEC+1               KSPEC1(NSPEC)=KSTR               FREE=.TRUE.               GOTO 30            ENDIF            GOTO 40         ENDIF**--- for '#' and '>)', move the pointer forward*         IF (STEMP.EQ.'#')  THEN*--- any string, including null            JCFREE=JC            FREE=.TRUE.            EVER=.TRUE.            NSPEC=NSPEC+1            NSPECK=NSPEC            KSPEC1(NSPEC)=KSTR            GOTO 10         ELSEIF (STEMP.EQ.'>')  THEN*---  look for ')' (level jump)            IF (JC.EQ.IMC2) GOTO 40            IF (SEARCH(JC+1:JC+1).NE.')')GOTO 40*--- ')' is next character - perform level jump            CALL SKIPLV(STATEM,KSTR,ICC2,HOLFLG,KPOS,ILEV)            IF (KPOS.EQ.0)  THEN               IF (EVER)  THEN                  JC=JCFREE                  FREE=.TRUE.                  KSTR=KEEP+1                  GOTO 10               ENDIF               GOTO 40            ENDIF            NSPEC=NSPEC+1            KSPEC1(NSPEC)=KSTR            KSTR=KPOS            KSPEC2(NSPEC)=KPOS-1            GOTO 10         ENDIF**--- set ITYPE to indicate normal ch. (0) or special*         ITYPE=INDEX(SPCHAR,STEMP)      ELSE*--- inside quotes in SEARCH - treat as normal         ITYPE=0      ENDIF      POSIT=.FALSE.      IF(FREE)  THEN*--- look for STEMP further upstream         FREE=.FALSE.         POSIT=.TRUE.         IF (ITYPE.EQ.0)  THEN*--- normal character            CALL POSCH(STEMP,STATEM,KSTR,ICC2,HOLFLG,9999,KPOS,ILEV)         ELSE*--- special character            CALL CHRTYP(ITYPE,STATEM,KSTR,ICC2,HOLFLG,KPOS,ILEV)         ENDIF*--- no match if not found         IF (KPOS.EQ.0) GOTO 40         KEEP=KPOS         KSTR=KPOS         ILEVEL=ILEVEL+ILEV         KSPEC2(NSPEC)=KPOS-1*--- following ENDIF for IF FREE      ENDIF**--- now STEMP must match, or be special*      IF(ITYPE.EQ.0)  THEN*--- normal   20    CONTINUE         IF (KSTR.GT.ICC2) GOTO 40         STEMP1=STATEM(KSTR:KSTR)*--- skip blanks  outside strings         IF (STEMP1.EQ.' '.AND.ISSTR.EQ.0)  THEN            KSTR=KSTR+1            GOTO 20         ELSEIF (STEMP1.EQ.'{')  THEN*--- start of character string            IF (HOLFLG)  THEN*--- strings are included in match               KSTR=KSTR+1               ISSTR=1            ELSE*--- skip over string               I=INDEX(STATEM(KSTR:ICC2),'}')               IF (I.EQ.0) GOTO 40               KSTR=I+KSTR            ENDIF            GOTO 20         ELSEIF (STEMP1.EQ.'}')  THEN*--- skip            KSTR=KSTR+1            ISSTR=0            GOTO 20         ENDIF*--- now match STEMP and STEMP1         IF (STEMP.EQ.STEMP1)  THEN            KSTR=KSTR+1            IF (.NOT.POSIT)  THEN               IF (STEMP.EQ.'(')  THEN                  ILEVEL=ILEVEL+1               ELSEIF (STEMP.EQ.')')  THEN                  ILEVEL=ILEVEL-1               ENDIF            ENDIF            GOTO 10         ELSE*--- try further upstream if possible            IF (EVER)  THEN               JC=JCFREE               FREE=.TRUE.               KSTR=KEEP+1               NSPEC=NSPECK               GOTO 10            ENDIF            GOTO 40         ENDIF      ELSE*--- string of type ITYPE         CALL SKIPTP(ITYPE,STATEM,KSTR,ICC2,.FALSE.,KPOS,ILEV)         IF (KPOS.EQ.0)  THEN            IF (EVER)  THEN               JC=JCFREE               KSTR=KEEP+1               NSPEC=NSPECK               FREE=.TRUE.               GOTO 10            ENDIF            GOTO 40         ELSE*--- KPOS ne 0, i.e. found            NSPEC=NSPEC+1            KSPEC1(NSPEC)=KSTR            KSPEC2(NSPEC)=KPOS            KSTR=KPOS+1            ILEVEL=ILEVEL+ILEV            GOTO 10         ENDIF      ENDIF   30 CONTINUE*--- when arriving here, strings do match      IF (FREE)  THEN         KPOSM=ICC2         KSPEC2(NSPEC)=ICC2      ELSE         KPOSM=KSTR-1      ENDIF   40 CONTINUE      END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -