lsame.f 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. *DECK LSAME
  2. LOGICAL FUNCTION LSAME (CA, CB)
  3. C***BEGIN PROLOGUE LSAME
  4. C***SUBSIDIARY
  5. C***PURPOSE Test two characters to determine if they are the same
  6. C letter, except for case.
  7. C***LIBRARY SLATEC
  8. C***CATEGORY R, N3
  9. C***TYPE LOGICAL (LSAME-L)
  10. C***KEYWORDS CHARACTER COMPARISON, LEVEL 2 BLAS, LEVEL 3 BLAS
  11. C***AUTHOR Hanson, R., (SNLA)
  12. C Du Croz, J., (NAG)
  13. C***DESCRIPTION
  14. C
  15. C LSAME tests if CA is the same letter as CB regardless of case.
  16. C CB is assumed to be an upper case letter. LSAME returns .TRUE. if
  17. C CA is either the same as CB or the equivalent lower case letter.
  18. C
  19. C N.B. This version of the code is correct for both ASCII and EBCDIC
  20. C systems. Installers must modify the routine for other
  21. C character-codes.
  22. C
  23. C For CDC systems using 6-12 bit representations, the system-
  24. C specific code in comments must be activated.
  25. C
  26. C Parameters
  27. C ==========
  28. C
  29. C CA - CHARACTER*1
  30. C CB - CHARACTER*1
  31. C On entry, CA and CB specify characters to be compared.
  32. C Unchanged on exit.
  33. C
  34. C***REFERENCES (NONE)
  35. C***ROUTINES CALLED (NONE)
  36. C***REVISION HISTORY (YYMMDD)
  37. C 860720 DATE WRITTEN
  38. C 910606 Modified to meet SLATEC prologue standards. Only comment
  39. C lines were modified. (BKS)
  40. C 910607 Modified to handle ASCII and EBCDIC codes. (WRB)
  41. C 930201 Tests for equality and equivalence combined. (RWC and WRB)
  42. C***END PROLOGUE LSAME
  43. C .. Scalar Arguments ..
  44. CHARACTER CA*1, CB*1
  45. C .. Local Scalars ..
  46. INTEGER IOFF
  47. LOGICAL FIRST
  48. C .. Intrinsic Functions ..
  49. INTRINSIC ICHAR
  50. C .. Save statement ..
  51. SAVE FIRST, IOFF
  52. C .. Data statements ..
  53. DATA FIRST /.TRUE./
  54. C***FIRST EXECUTABLE STATEMENT LSAME
  55. IF (FIRST) IOFF = ICHAR('a') - ICHAR('A')
  56. C
  57. FIRST = .FALSE.
  58. C
  59. C Test if the characters are equal or equivalent.
  60. C
  61. LSAME = (CA.EQ.CB) .OR. (ICHAR(CA)-IOFF.EQ.ICHAR(CB))
  62. C
  63. RETURN
  64. C
  65. C The following comments contain code for CDC systems using 6-12 bit
  66. C representations.
  67. C
  68. C .. Parameters ..
  69. C INTEGER ICIRFX
  70. C PARAMETER ( ICIRFX=62 )
  71. C .. Scalar Arguments ..
  72. C CHARACTER*1 CB
  73. C .. Array Arguments ..
  74. C CHARACTER*1 CA(*)
  75. C .. Local Scalars ..
  76. C INTEGER IVAL
  77. C .. Intrinsic Functions ..
  78. C INTRINSIC ICHAR, CHAR
  79. C .. Executable Statements ..
  80. C INTRINSIC ICHAR, CHAR
  81. C
  82. C See if the first character in string CA equals string CB.
  83. C
  84. C LSAME = CA(1) .EQ. CB .AND. CA(1) .NE. CHAR(ICIRFX)
  85. C
  86. C IF (LSAME) RETURN
  87. C
  88. C The characters are not identical. Now check them for equivalence.
  89. C Look for the 'escape' character, circumflex, followed by the
  90. C letter.
  91. C
  92. C IVAL = ICHAR(CA(2))
  93. C IF (IVAL.GE.ICHAR('A') .AND. IVAL.LE.ICHAR('Z')) THEN
  94. C LSAME = CA(1) .EQ. CHAR(ICIRFX) .AND. CA(2) .EQ. CB
  95. C ENDIF
  96. C
  97. C RETURN
  98. C
  99. C End of LSAME.
  100. C
  101. END