//===- Version.cpp - Clang Version Number -----------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines several version-related utility functions for Clang.
//
//===----------------------------------------------------------------------===//

#include "clang/Basic/Version.h"
#include "llvm/Support/raw_ostream.h"
#include <cstring>
#include <cstdlib>

using namespace std;

namespace clang {
  
llvm::StringRef getClangRepositoryPath() {
  static const char URL[] = "$URL$";
  const char *URLEnd = URL + strlen(URL);

  const char *End = strstr(URL, "/lib/Basic");
  if (End)
    URLEnd = End;

  End = strstr(URL, "/clang/tools/clang");
  if (End)
    URLEnd = End;

  const char *Begin = strstr(URL, "cfe/");
  if (Begin)
    return llvm::StringRef(Begin + 4, URLEnd - Begin - 4);

  return llvm::StringRef(URL, URLEnd - URL);
}

std::string getClangRevision() {
#ifdef SVN_REVISION
  if (SVN_REVISION[0] != '\0') {
    std::string revision;
    llvm::raw_string_ostream OS(revision);
    OS << strtol(SVN_REVISION, 0, 10);
    return OS.str();
  }
#endif
  return "";
}

std::string getClangFullRepositoryVersion() {
  std::string buf;
  llvm::raw_string_ostream OS(buf);
  OS << getClangRepositoryPath();
  const std::string &Revision = getClangRevision();
  if (!Revision.empty())
    OS << ' ' << Revision;
  return OS.str();
}
  
std::string getClangFullVersion() {
  std::string buf;
  llvm::raw_string_ostream OS(buf);
#ifdef CLANG_VENDOR
  OS << CLANG_VENDOR;
#endif
  OS << "clang version " CLANG_VERSION_STRING " ("
     << getClangFullRepositoryVersion() << ')';
  return OS.str();
}

} // end namespace clang
