STRING.f90
上传用户:goto8899
上传日期:2014-01-20
资源大小:303k
文件大小:9k
源码类别:

并行计算

开发平台:

MultiPlatform

  1. module STRING
  2. implicit none
  3. ! -- Variables globales du module -------------------------------------------
  4. integer, parameter :: iposamin = iachar('a')
  5. integer, parameter :: iposzmin = iachar('z')
  6. integer, parameter :: iposamaj = iachar('A')
  7. integer, parameter :: iposzmaj = iachar('Z')
  8. !interface uppercase
  9. !  module procedure charuppercase, struppercase
  10. !endinterface
  11. interface strof
  12.   module procedure strof_int, strof_int2
  13. endinterface
  14. contains 
  15. !------------------------------------------------------------------------------!
  16. ! Fonction : Mise en minuscule d'un caractere
  17. !------------------------------------------------------------------------------!
  18. function lowercasechar(c)
  19.   implicit none
  20.   character, intent(in) :: c
  21.   character             :: lowercasechar
  22.   integer               :: i
  23.   i = iachar(c)
  24.   select case(i)
  25.     case(iposamaj:iposzmaj)
  26.       lowercasechar = achar(i-iposamaj+iposamin)
  27.     case default
  28.       lowercasechar = c
  29.   endselect
  30. endfunction
  31. !------------------------------------------------------------------------------!
  32. ! Fonction : Mise en majuscule d'un caractere
  33. !------------------------------------------------------------------------------!
  34. function uppercasechar(c)
  35.   implicit none
  36.   character, intent(in) :: c
  37.   character             :: uppercasechar
  38.   integer               :: i
  39.   i = iachar(c)
  40.   select case(i)
  41.     case(iposamin:iposzmin)
  42.       uppercasechar = achar(i-iposamin+iposamaj)
  43.     case default
  44.       uppercasechar = c
  45.   endselect
  46. endfunction
  47. !------------------------------------------------------------------------------!
  48. ! Fonction : Mise en minuscule d'une chaine de caracteres
  49. !------------------------------------------------------------------------------!
  50. function lowercase(str) result(strout)
  51.   implicit none
  52.   character(len=*), intent(in) :: str
  53.   character(len=len(str))      :: strout
  54.   integer                      :: i
  55.   do i = 1, len(str)
  56.     strout(i:i) = lowercasechar(str(i:i))
  57.   enddo
  58. endfunction lowercase
  59. !------------------------------------------------------------------------------!
  60. ! Fonction : Mise en majuscule d'une chaine de caracteres
  61. !------------------------------------------------------------------------------!
  62. function uppercase(str) result(strout)
  63.   implicit none
  64.   character(len=*), intent(in) :: str
  65.   character(len=len(str))      :: strout
  66.   integer                      :: i
  67.   do i = 1, len(str)
  68.     strout(i:i) = uppercasechar(str(i:i))
  69.   enddo
  70. endfunction uppercase
  71. !------------------------------------------------------------------------------!
  72. ! Fonction : Remplacement de caractere
  73. !------------------------------------------------------------------------------!
  74. function chg_char(str, c, r) result(strout)
  75.   implicit none
  76.   character(len=*), intent(in) :: str
  77.   character                    :: c, r
  78.   character(len=len(str))      :: strout
  79.   integer                      :: i
  80.   strout = str
  81.   do i = 1, len(str)
  82.     if (strout(i:i) == c) strout(i:i) = r
  83.   enddo
  84. endfunction chg_char
  85. !------------------------------------------------------------------------------!
  86. ! Fonction : tranformation entier -> chaine de caracteres (len=l)
  87. !------------------------------------------------------------------------------!
  88. function strof_int(nb, l) result(strout)
  89.   implicit none
  90.   integer, intent(in) :: nb, l   ! nombre a transformer, et longueur
  91.   character(len=l)    :: strout  ! longueur de la chaine
  92.   character(len=3) :: sform
  93.   write(sform,'(i3)') l   
  94.   write(strout,'(i'//trim(adjustl(sform))//')') nb
  95. endfunction strof_int
  96. !------------------------------------------------------------------------------!
  97. ! Fonction : tranformation entier -> chaine de caracteres (ajuste a gauche)
  98. !------------------------------------------------------------------------------!
  99. function strof_int2(nb) result(strout)
  100.   implicit none
  101.   integer, intent(in) :: nb      ! nombre a transformer, et longueur
  102.   character(len=20)   :: strout  ! longueur de la chaine
  103.   write(strout,'(i20)') nb
  104.   strout = adjustl(strout)
  105. endfunction strof_int2
  106. !------------------------------------------------------------------------------!
  107. ! Fonction : tranformation entier -> chaine de caracteres (len=l)
  108. !------------------------------------------------------------------------------!
  109. function strof_full_int(nb, l) result(strout)
  110.   implicit none
  111.   integer, intent(in) :: nb, l   ! nombre a transformer, et longueur
  112.   character(len=l)    :: strout  ! longueur de la chaine
  113.   character(len=20)   :: sform
  114.   integer             :: tl      ! trimmed length
  115.   write(sform,'(i20)') nb
  116.   sform  = adjustl(sform)
  117.   tl     = len_trim(sform)
  118.   strout = repeat('0',l-tl)//trim(sform)
  119. endfunction strof_full_int
  120. !------------------------------------------------------------------------------!
  121. ! Fonction : Test logique d'egalite des chaines de caracteres
  122. !------------------------------------------------------------------------------!
  123. function samestring(str1, str2)
  124.   implicit none
  125.   character(len=*), intent(in) :: str1, str2
  126.   logical                      :: samestring
  127.   
  128.   !print*,"samestring: ",index(trim(str1),trim(str2))," ",&
  129.   !index(trim(str2),trim(str1))
  130.   !print*,"samestring:",trim(str1),"#",trim(str2)
  131.   samestring =      (index(trim(str1),trim(str2)) == 1) &
  132.                .and.(index(trim(str2),trim(str1)) == 1)
  133. endfunction samestring
  134. !------------------------------------------------------------------------------!
  135. ! Fonction : Donne le nombre d'un caractere donne dans un chaine
  136. !------------------------------------------------------------------------------!
  137. function numbchar(str, c)
  138.   implicit none
  139.   character(len=*), intent(in) :: str
  140.   character,        intent(in) :: c
  141.   integer                      :: numbchar
  142.   integer ideb, ipos, nb
  143.   
  144.   nb   = 0
  145.   ideb = 1
  146.   ipos = index(str(ideb:),c)
  147.   do while (ipos /= 0)
  148.     nb   = nb + 1
  149.     ideb = ideb + ipos
  150.     ipos = index(str(ideb:),c)
  151.   enddo
  152.   numbchar = nb
  153.   
  154. endfunction numbchar
  155. !------------------------------------------------------------------------------!
  156. ! Procedure : Renvoie le n-ieme mot d'une chaine, separateurs optionnels
  157. !------------------------------------------------------------------------------!
  158. subroutine nthword(nw, strin, strout, info, separator)
  159.   implicit none
  160. ! -- entrees --
  161.   character(len=*), intent(in)        :: strin      ! chaine entree
  162.   character(len=*), intent(in)        :: separator  ! separateur de mot
  163.   integer                             :: nw         ! numero du mot recherche
  164. ! -- sorties --
  165.   character(len=*), intent(out)       :: strout     ! chaine resultat
  166.   integer                             :: info       ! -1 si erreur
  167. ! -- variables internes --
  168.   integer                             :: i, n       ! entiers provisoires
  169.   !if (present(separator)) then
  170.   !  allocate(sep(len(separator)))
  171.   !  sep = separator
  172.   !else
  173.   !  allocate(sep(1))
  174.   !  sep = " "
  175.   !endif
  176.   info   = 0
  177.   n      = 1
  178.   strout = adjustl(strin)
  179.   do while ((info == 0).and.(n /= nw))   ! teste le numero du mot
  180.     i = scan(strout, separator)                  ! recherche des separateurs
  181.     if (len_trim(strout) == 0) info = -1   ! si chaine remplie de blancs : erreur
  182.     if (i < 0) then                        ! si pas de separateurs : erreur
  183.       info = -1
  184.     else                                   ! sinon
  185.       n      = n + 1                       ! on coupe le mot courant
  186.       strout = adjustl(strout(i+1:len(strout)))
  187.     endif
  188.   enddo  
  189.   if (info == 0) then                    ! on doit couper le reste de la chaine
  190.     i = scan(strout, separator)            ! recherche de separateurs
  191.     if (i < 0) i = len_trim(strout)        ! si il n'y en a pas : dernier mot
  192.     strout = strout(1:i-1)
  193.   endif
  194.   !deallocate(sep)
  195. endsubroutine nthword
  196. !------------------------------------------------------------------------------!
  197. ! Procedure : Renvoie l'index de parenthese fermante associee
  198. !------------------------------------------------------------------------------!
  199. integer function index_rightpar (str, ip, info)
  200.   implicit none
  201. ! -- entrees --
  202.   character(len=*), intent(in) :: str        ! chaine entree
  203.   integer                      :: ip         ! index de parenthese ouvrante
  204. ! -- sorties --
  205.   integer                      :: info       ! nombre de parentheses non fermees
  206. ! -- variables internes --
  207.   integer                      :: np           ! nombre de parentheses ouvrantes
  208.   integer                      :: len          ! longueur totale de chaine
  209.   integer                      :: i, ipl, ipr  ! index de chaine
  210.   len    = len_trim(str)
  211.   np     = 1         
  212.   i      = ip+1
  213.   do while ((i <= len).and.(np > 0))
  214.     select case(str(i:i))
  215.     case('(')
  216.       np = np + 1
  217.     case(')')
  218.       np = np - 1
  219.     endselect
  220.     i = i + 1
  221.   enddo
  222.   info           = np
  223.   index_rightpar = i-1
  224. endfunction index_rightpar
  225. endmodule STRING