1*2b3c8603SArnaud A. de Grandmaison #include "clang-c/CXCompilationDatabase.h"
2*2b3c8603SArnaud A. de Grandmaison #include "clang/Tooling/CompilationDatabase.h"
3*2b3c8603SArnaud A. de Grandmaison #include "CXString.h"
4*2b3c8603SArnaud A. de Grandmaison 
5*2b3c8603SArnaud A. de Grandmaison using namespace clang;
6*2b3c8603SArnaud A. de Grandmaison using namespace clang::tooling;
7*2b3c8603SArnaud A. de Grandmaison using namespace clang::cxstring;
8*2b3c8603SArnaud A. de Grandmaison 
9*2b3c8603SArnaud A. de Grandmaison extern "C" {
10*2b3c8603SArnaud A. de Grandmaison 
11*2b3c8603SArnaud A. de Grandmaison // FIXME: do something more usefull with the error message
12*2b3c8603SArnaud A. de Grandmaison CXCompilationDatabase
13*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompilationDatabase_fromDirectory(
14*2b3c8603SArnaud A. de Grandmaison   const char *BuildDir,
15*2b3c8603SArnaud A. de Grandmaison   CXCompilationDatabase_Error *ErrorCode)
16*2b3c8603SArnaud A. de Grandmaison {
17*2b3c8603SArnaud A. de Grandmaison   std::string ErrorMsg;
18*2b3c8603SArnaud A. de Grandmaison   CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError;
19*2b3c8603SArnaud A. de Grandmaison 
20*2b3c8603SArnaud A. de Grandmaison   CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir,
21*2b3c8603SArnaud A. de Grandmaison                                                                    ErrorMsg);
22*2b3c8603SArnaud A. de Grandmaison 
23*2b3c8603SArnaud A. de Grandmaison   if (!db) {
24*2b3c8603SArnaud A. de Grandmaison     fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str());
25*2b3c8603SArnaud A. de Grandmaison     Err = CXCompilationDatabase_CanNotLoadDatabase;
26*2b3c8603SArnaud A. de Grandmaison   }
27*2b3c8603SArnaud A. de Grandmaison 
28*2b3c8603SArnaud A. de Grandmaison   if (ErrorCode)
29*2b3c8603SArnaud A. de Grandmaison     *ErrorCode = Err;
30*2b3c8603SArnaud A. de Grandmaison 
31*2b3c8603SArnaud A. de Grandmaison   return db;
32*2b3c8603SArnaud A. de Grandmaison }
33*2b3c8603SArnaud A. de Grandmaison 
34*2b3c8603SArnaud A. de Grandmaison void
35*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompilationDatabase_dispose(CXCompilationDatabase CDb)
36*2b3c8603SArnaud A. de Grandmaison {
37*2b3c8603SArnaud A. de Grandmaison   delete static_cast<CompilationDatabase *>(CDb);
38*2b3c8603SArnaud A. de Grandmaison }
39*2b3c8603SArnaud A. de Grandmaison 
40*2b3c8603SArnaud A. de Grandmaison struct AllocatedCXCompileCommands
41*2b3c8603SArnaud A. de Grandmaison {
42*2b3c8603SArnaud A. de Grandmaison   std::vector<CompileCommand> CCmd;
43*2b3c8603SArnaud A. de Grandmaison 
44*2b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd)
45*2b3c8603SArnaud A. de Grandmaison     : CCmd(Cmd)
46*2b3c8603SArnaud A. de Grandmaison   { }
47*2b3c8603SArnaud A. de Grandmaison };
48*2b3c8603SArnaud A. de Grandmaison 
49*2b3c8603SArnaud A. de Grandmaison CXCompileCommands
50*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb,
51*2b3c8603SArnaud A. de Grandmaison                                  const char *CompleteFileName)
52*2b3c8603SArnaud A. de Grandmaison {
53*2b3c8603SArnaud A. de Grandmaison   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
54*2b3c8603SArnaud A. de Grandmaison     const std::vector<CompileCommand>
55*2b3c8603SArnaud A. de Grandmaison       CCmd(db->getCompileCommands(CompleteFileName));
56*2b3c8603SArnaud A. de Grandmaison     if (!CCmd.empty())
57*2b3c8603SArnaud A. de Grandmaison       return new AllocatedCXCompileCommands( CCmd );
58*2b3c8603SArnaud A. de Grandmaison   }
59*2b3c8603SArnaud A. de Grandmaison 
60*2b3c8603SArnaud A. de Grandmaison   return 0;
61*2b3c8603SArnaud A. de Grandmaison }
62*2b3c8603SArnaud A. de Grandmaison 
63*2b3c8603SArnaud A. de Grandmaison void
64*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommands_dispose(CXCompileCommands Cmds)
65*2b3c8603SArnaud A. de Grandmaison {
66*2b3c8603SArnaud A. de Grandmaison   delete static_cast<AllocatedCXCompileCommands *>(Cmds);
67*2b3c8603SArnaud A. de Grandmaison }
68*2b3c8603SArnaud A. de Grandmaison 
69*2b3c8603SArnaud A. de Grandmaison unsigned
70*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommands_getSize(CXCompileCommands Cmds)
71*2b3c8603SArnaud A. de Grandmaison {
72*2b3c8603SArnaud A. de Grandmaison   if (!Cmds)
73*2b3c8603SArnaud A. de Grandmaison     return 0;
74*2b3c8603SArnaud A. de Grandmaison 
75*2b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands *ACC =
76*2b3c8603SArnaud A. de Grandmaison     static_cast<AllocatedCXCompileCommands *>(Cmds);
77*2b3c8603SArnaud A. de Grandmaison 
78*2b3c8603SArnaud A. de Grandmaison   return ACC->CCmd.size();
79*2b3c8603SArnaud A. de Grandmaison }
80*2b3c8603SArnaud A. de Grandmaison 
81*2b3c8603SArnaud A. de Grandmaison CXCompileCommand
82*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I)
83*2b3c8603SArnaud A. de Grandmaison {
84*2b3c8603SArnaud A. de Grandmaison   if (!Cmds)
85*2b3c8603SArnaud A. de Grandmaison     return 0;
86*2b3c8603SArnaud A. de Grandmaison 
87*2b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands *ACC =
88*2b3c8603SArnaud A. de Grandmaison     static_cast<AllocatedCXCompileCommands *>(Cmds);
89*2b3c8603SArnaud A. de Grandmaison 
90*2b3c8603SArnaud A. de Grandmaison   if (I >= ACC->CCmd.size())
91*2b3c8603SArnaud A. de Grandmaison     return 0;
92*2b3c8603SArnaud A. de Grandmaison 
93*2b3c8603SArnaud A. de Grandmaison   return &ACC->CCmd[I];
94*2b3c8603SArnaud A. de Grandmaison }
95*2b3c8603SArnaud A. de Grandmaison 
96*2b3c8603SArnaud A. de Grandmaison CXString
97*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommand_getDirectory(CXCompileCommand CCmd)
98*2b3c8603SArnaud A. de Grandmaison {
99*2b3c8603SArnaud A. de Grandmaison   if (!CCmd)
100*2b3c8603SArnaud A. de Grandmaison     return createCXString((const char*)NULL);
101*2b3c8603SArnaud A. de Grandmaison 
102*2b3c8603SArnaud A. de Grandmaison   CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
103*2b3c8603SArnaud A. de Grandmaison   return createCXString(cmd->Directory);
104*2b3c8603SArnaud A. de Grandmaison }
105*2b3c8603SArnaud A. de Grandmaison 
106*2b3c8603SArnaud A. de Grandmaison unsigned
107*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommand_getNumArgs(CXCompileCommand CCmd)
108*2b3c8603SArnaud A. de Grandmaison {
109*2b3c8603SArnaud A. de Grandmaison   if (!CCmd)
110*2b3c8603SArnaud A. de Grandmaison     return 0;
111*2b3c8603SArnaud A. de Grandmaison 
112*2b3c8603SArnaud A. de Grandmaison   return static_cast<CompileCommand *>(CCmd)->CommandLine.size();
113*2b3c8603SArnaud A. de Grandmaison }
114*2b3c8603SArnaud A. de Grandmaison 
115*2b3c8603SArnaud A. de Grandmaison CXString
116*2b3c8603SArnaud A. de Grandmaison clang_tooling_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg)
117*2b3c8603SArnaud A. de Grandmaison {
118*2b3c8603SArnaud A. de Grandmaison   if (!CCmd)
119*2b3c8603SArnaud A. de Grandmaison     return createCXString((const char*)NULL);
120*2b3c8603SArnaud A. de Grandmaison 
121*2b3c8603SArnaud A. de Grandmaison   CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
122*2b3c8603SArnaud A. de Grandmaison 
123*2b3c8603SArnaud A. de Grandmaison   if (Arg >= Cmd->CommandLine.size())
124*2b3c8603SArnaud A. de Grandmaison     return createCXString((const char*)NULL);
125*2b3c8603SArnaud A. de Grandmaison 
126*2b3c8603SArnaud A. de Grandmaison   return createCXString(Cmd->CommandLine[Arg]);
127*2b3c8603SArnaud A. de Grandmaison }
128*2b3c8603SArnaud A. de Grandmaison 
129*2b3c8603SArnaud A. de Grandmaison 
130*2b3c8603SArnaud A. de Grandmaison } // end: extern "C"
131