//===-- Demangle.cpp - Common demangling functions ------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file This file contains definitions of common demangling functions.
///
//===----------------------------------------------------------------------===//

#include "llvm/Demangle/Demangle.h"
#include <cstdlib>

static bool isItaniumEncoding(const std::string &MangledName) {
  size_t Pos = MangledName.find_first_not_of('_');
  // A valid Itanium encoding requires 1-4 leading underscores, followed by 'Z'.
  return Pos > 0 && Pos <= 4 && MangledName[Pos] == 'Z';
}

static bool isRustEncoding(const std::string &MangledName) {
  return MangledName.size() >= 2 && MangledName[0] == '_' &&
         MangledName[1] == 'R';
}

std::string llvm::demangle(const std::string &MangledName) {
  char *Demangled;
  if (isItaniumEncoding(MangledName))
    Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr);
  else if (isRustEncoding(MangledName))
    Demangled = rustDemangle(MangledName.c_str(), nullptr, nullptr, nullptr);
  else
    Demangled = microsoftDemangle(MangledName.c_str(), nullptr, nullptr,
                                  nullptr, nullptr);

  if (!Demangled)
    return MangledName;

  std::string Ret = Demangled;
  std::free(Demangled);
  return Ret;
}
