/*
  Copyright 2022 Equinor ASA.

  This file is part of the Open Porous Media project (OPM).

  OPM is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  OPM is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with OPM.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <config.h>
#include <opm/common/utility/DemangledType.hpp>

#include <cstdlib>

#if __has_include(<cxxabi.h>)
#define HAVE_CXA_DEMANGLE 1
#include <cxxabi.h>
#endif

namespace Opm {

std::string demangle(const char* mangled_symbol)
{
    std::string name = mangled_symbol;

#if HAVE_CXA_DEMANGLE
    int status;
    char* demangled = abi::__cxa_demangle(mangled_symbol,
                                          nullptr, nullptr, &status);
    if (demangled) {
        name = demangled;
        free(demangled);
    }
#endif

    return name;
}

}
