summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang/CXString.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2010-11-16 02:03:55 +0000
committerTed Kremenek <kremenek@apple.com>2010-11-16 02:03:55 +0000
commit64dddfb39cc8f99a42750dec6d016c7d99134fc0 (patch)
tree7a7314edf42bfa6951a50b75f96872afe29969a1 /clang/tools/libclang/CXString.cpp
parent02089a39a04ba8308cd1fee4fdd2a9a580523122 (diff)
downloadbcm5719-llvm-64dddfb39cc8f99a42750dec6d016c7d99134fc0.tar.gz
bcm5719-llvm-64dddfb39cc8f99a42750dec6d016c7d99134fc0.zip
Add CXString.cpp and CXString.h
llvm-svn: 119322
Diffstat (limited to 'clang/tools/libclang/CXString.cpp')
-rw-r--r--clang/tools/libclang/CXString.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp
new file mode 100644
index 00000000000..341b72032df
--- /dev/null
+++ b/clang/tools/libclang/CXString.cpp
@@ -0,0 +1,67 @@
+//===- CXString.cpp - Routines for manipulating CXStrings -----------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines routines for manipulating CXStrings. It should be the
+// only file that has internal knowledge of the encoding of the data in
+// CXStrings.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CXString.h"
+#include "clang/Frontend/ASTUnit.h"
+#include "clang-c/Index.h"
+#include "llvm/Support/ErrorHandling.h"
+
+using namespace clang;
+using namespace clang::cxstring;
+
+enum CXStringFlag { CXS_Unmanaged, CXS_Malloc };
+
+CXString cxstring::createCXString(const char *String, bool DupString){
+ CXString Str;
+ if (DupString) {
+ Str.Spelling = strdup(String);
+ Str.private_flags = (unsigned) CXS_Malloc;
+ } else {
+ Str.Spelling = String;
+ Str.private_flags = (unsigned) CXS_Unmanaged;
+ }
+ return Str;
+}
+
+CXString cxstring::createCXString(llvm::StringRef String, bool DupString) {
+ CXString Result;
+ if (DupString || (!String.empty() && String.data()[String.size()] != 0)) {
+ char *Spelling = (char *)malloc(String.size() + 1);
+ memmove(Spelling, String.data(), String.size());
+ Spelling[String.size()] = 0;
+ Result.Spelling = Spelling;
+ Result.private_flags = (unsigned) CXS_Malloc;
+ } else {
+ Result.Spelling = String.data();
+ Result.private_flags = (unsigned) CXS_Unmanaged;
+ }
+ return Result;
+}
+
+//===----------------------------------------------------------------------===//
+// libClang public APIs.
+//===----------------------------------------------------------------------===//
+
+extern "C" {
+const char *clang_getCString(CXString string) {
+ return string.Spelling;
+}
+
+void clang_disposeString(CXString string) {
+ if (string.private_flags == CXS_Malloc && string.Spelling)
+ free((void*)string.Spelling);
+}
+} // end: extern "C"
+
OpenPOWER on IntegriCloud