Pre-commit commit to get URL keyword expansion for Clang version information

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83319 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Basic/Version.cpp b/lib/Basic/Version.cpp
new file mode 100644
index 0000000..3a51ccb
--- /dev/null
+++ b/lib/Basic/Version.cpp
@@ -0,0 +1,63 @@
+//===- 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 <cstring>
+#include <cstdlib>
+using namespace std;
+
+namespace clang {
+  
+const char *getClangSubversionPath() {
+  static const char *Path = 0;
+  if (Path)
+    return Path;
+  
+  static char URL[] = "$URL$";
+  char *End = strstr(URL, "/lib/Basic");
+  if (End)
+    *End = 0;
+  
+  char *Begin = strstr(URL, "cfe/");
+  if (Begin) {
+    Path = Begin + 4;
+    return Path;
+  }
+  
+  Path = URL;
+  return Path;
+}
+
+
+unsigned getClangSubversionRevision() {
+#ifndef SVN_REVISION
+  return 0;
+#else
+  // What follows is an evil trick. We can end up getting three different
+  // kinds of results when asking for the Subversion information:
+  //   - if SVN_REVISION is a number, we return that number (adding 0 to it is
+  //     harmless).
+  //   - if SVN_REVISION is "exported" (for an tree without any Subversion 
+  //     info), we end up referencing the local variable "exported" and adding
+  //     zero to it, and we return 0.
+  //   - if SVN_REVISION is empty (because "svn info" returned no results),
+  //     the "+" turns into a unary "+" operator and we return 0.
+  //
+  // Making this less ugly requires doing more computation in the CMake- and
+  // Makefile-based build systems, with all sorts of checking to make sure we
+  // don't end up breaking this build. It's better this way. Really.
+  const unsigned exported = 0;
+  (void)exported;
+  return SVN_REVISION + 0;
+#endif
+}
+
+} // end namespace clang