1ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//===- CXString.h - Routines for manipulating CXStrings -------------------===// 2ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// 3ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// The LLVM Compiler Infrastructure 4ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// 5ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// This file is distributed under the University of Illinois Open Source 6ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// License. See LICENSE.TXT for details. 7ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// 8ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//===----------------------------------------------------------------------===// 9ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// 10ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// This file defines routines for manipulating CXStrings. 11ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek// 12ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek//===----------------------------------------------------------------------===// 13ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXSTRING_H 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_TOOLS_LIBCLANG_CXSTRING_H 16ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 17ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#include "clang-c/Index.h" 18686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 19a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek#include "llvm/ADT/SmallString.h" 20f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "llvm/ADT/StringRef.h" 215595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko#include "llvm/Support/Compiler.h" 225595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko#include <string> 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <vector> 24ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 25ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremeneknamespace clang { 26ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremeneknamespace cxstring { 279c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 289c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkostruct CXStringBuf; 29ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 30dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko/// \brief Create a CXString object for an empty "" string. 31dc66adb40ee871b4c578ba615f45d82476c7119eDmitri GribenkoCXString createEmpty(); 32dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko 33dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko/// \brief Create a CXString object for an NULL string. 3415a2aa0954bcf38411c14cf67c65e336022a7a1bDmitri Gribenko/// 3515a2aa0954bcf38411c14cf67c65e336022a7a1bDmitri Gribenko/// A NULL string should be used as an "invalid" value in case of errors. 36dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri GribenkoCXString createNull(); 37dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko 380c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \brief Create a CXString object from a nul-terminated C string. New 390c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// CXString may contain a pointer to \p String. 400c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// 410c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \p String should not be changed by the caller afterwards. 420c4394c7f63008fbf4d335710b34f71afab362a3Dmitri GribenkoCXString createRef(const char *String); 430c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko 440c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \brief Create a CXString object from a nul-terminated C string. New 450c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// CXString will contain a copy of \p String. 460c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// 470c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko/// \p String can be changed or freed by the caller. 480c4394c7f63008fbf4d335710b34f71afab362a3Dmitri GribenkoCXString createDup(const char *String); 49ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 505595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// \brief Create a CXString object from a StringRef. New CXString may 515595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// contain a pointer to the undrelying data of \p String. 525595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// 535595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// \p String should not be changed by the caller afterwards. 545595ded882b22d77fdf535bd1a4c6c090110348aDmitri GribenkoCXString createRef(StringRef String); 555595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko 565595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// \brief Create a CXString object from a StringRef. New CXString will 575595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// contain a copy of \p String. 585595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// 595595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko/// \p String can be changed or freed by the caller. 605595ded882b22d77fdf535bd1a4c6c090110348aDmitri GribenkoCXString createDup(StringRef String); 615595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko 625595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko// Usually std::string is intended to be used as backing storage for CXString. 635595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko// In this case, call \c createRef(String.c_str()). 645595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko// 655595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko// If you need to make a copy, call \c createDup(StringRef(String)). 660e2c34f92f00628d48968dfea096d36381f494cbStephen HinesCXString createRef(std::string String) = delete; 67a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek 68a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek/// \brief Create a CXString object that is backed by a string buffer. 69a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXString createCXString(CXStringBuf *buf); 70a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek 71a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga NainarCXStringSet *createSet(const std::vector<std::string> &Strings); 72a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 739c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko/// \brief A string pool used for fast allocation/deallocation of strings. 749c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkoclass CXStringPool { 759c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkopublic: 769c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko ~CXStringPool(); 779c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 789c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko CXStringBuf *getCXStringBuf(CXTranslationUnit TU); 799c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 809c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkoprivate: 819c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko std::vector<CXStringBuf *> Pool; 829c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 839c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko friend struct CXStringBuf; 849c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko}; 859c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 869c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenkostruct CXStringBuf { 879c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko SmallString<128> Data; 889c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko CXTranslationUnit TU; 899c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 909c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko CXStringBuf(CXTranslationUnit TU) : TU(TU) {} 919c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko 929c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko /// \brief Return this buffer to the pool. 939c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko void dispose(); 949c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko}; 95a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek 96a60ed47da13393796d8552b9fdca12abbb3eea42Ted KremenekCXStringBuf *getCXStringBuf(CXTranslationUnit TU); 97ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 98baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek/// \brief Returns true if the CXString data is managed by a pool. 99baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenekbool isManagedByPool(CXString str); 100baf82b0fdf5c23dff80660add40bb92bd850bba0Ted Kremenek 101ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek} 102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstatic inline StringRef getContents(const CXUnsavedFile &UF) { 104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return StringRef(UF.Contents, UF.Length); 105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 106ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek} 107ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 108ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek#endif 109ea834df7cd07d67a77e7dd6e48e8db27464be2fdTed Kremenek 110