/*! \file
Copyright (c) 2003, The Regents of the University of California, through
Lawrence Berkeley National Laboratory (subject to receipt of any required
approvals from U.S. Dept. of Energy)

All rights reserved.

The source code is distributed under BSD license, see the file License.txt
at the top-level directory.
*/
int lsame_(char* ca, char* cb) {
    /*  -- LAPACK auxiliary routine (version 2.0) --
           Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
           Courant Institute, Argonne National Lab, and Rice University
           September 30, 1994

        Purpose
        =======

        LSAME returns .TRUE. if CA is the same letter as CB regardless of case.

        Arguments
        =========

        CA      (input) CHARACTER*1
        CB      (input) CHARACTER*1
                CA and CB specify the single characters to be compared.

       =====================================================================
    */

    /* System generated locals */
    int ret_val;

    /* Local variables */
    int inta, intb, zcode;

    ret_val = *(unsigned char*)ca == *(unsigned char*)cb;
    if(ret_val) {
        return ret_val;
    }

    /* Now test for equivalence if both characters are alphabetic. */

    zcode = 'Z';

    /* Use 'Z' rather than 'A' so that ASCII can be detected on Prime
       machines, on which ICHAR returns a value with bit 8 set.
       ICHAR('A') on Prime machines returns 193 which is the same as
       ICHAR('A') on an EBCDIC machine. */

    inta = *(unsigned char*)ca;
    intb = *(unsigned char*)cb;

    if(zcode == 90 || zcode == 122) {
        /* ASCII is assumed - ZCODE is the ASCII code of either lower or
              upper case 'Z'. */
        if(inta >= 97 && inta <= 122) inta += -32;
        if(intb >= 97 && intb <= 122) intb += -32;
    }
    else if(zcode == 233 || zcode == 169) {
        /* EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or
              upper case 'Z'. */
        if(inta >= 129 && inta <= 137 || inta >= 145 && inta <= 153 || inta >= 162 && inta <= 169)
            inta += 64;
        if(intb >= 129 && intb <= 137 || intb >= 145 && intb <= 153 || intb >= 162 && intb <= 169)
            intb += 64;
    }
    else if(zcode == 218 || zcode == 250) {
        /* ASCII is assumed, on Prime machines - ZCODE is the ASCII code
              plus 128 of either lower or upper case 'Z'. */
        if(inta >= 225 && inta <= 250) inta += -32;
        if(intb >= 225 && intb <= 250) intb += -32;
    }
    ret_val = inta == intb;
    return ret_val;

} /* lsame_ */
