12b3c8603SArnaud A. de Grandmaison #include "clang-c/CXCompilationDatabase.h"
22b3c8603SArnaud A. de Grandmaison #include "clang/Tooling/CompilationDatabase.h"
32b3c8603SArnaud A. de Grandmaison #include "CXString.h"
42b3c8603SArnaud A. de Grandmaison 
52b3c8603SArnaud A. de Grandmaison using namespace clang;
62b3c8603SArnaud A. de Grandmaison using namespace clang::tooling;
72b3c8603SArnaud A. de Grandmaison using namespace clang::cxstring;
82b3c8603SArnaud A. de Grandmaison 
92b3c8603SArnaud A. de Grandmaison extern "C" {
102b3c8603SArnaud A. de Grandmaison 
112b3c8603SArnaud A. de Grandmaison // FIXME: do something more usefull with the error message
122b3c8603SArnaud A. de Grandmaison CXCompilationDatabase
13*fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_fromDirectory(const char *BuildDir,
142b3c8603SArnaud A. de Grandmaison                                         CXCompilationDatabase_Error *ErrorCode)
152b3c8603SArnaud A. de Grandmaison {
162b3c8603SArnaud A. de Grandmaison   std::string ErrorMsg;
172b3c8603SArnaud A. de Grandmaison   CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError;
182b3c8603SArnaud A. de Grandmaison 
192b3c8603SArnaud A. de Grandmaison   CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir,
202b3c8603SArnaud A. de Grandmaison                                                                    ErrorMsg);
212b3c8603SArnaud A. de Grandmaison 
222b3c8603SArnaud A. de Grandmaison   if (!db) {
232b3c8603SArnaud A. de Grandmaison     fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str());
242b3c8603SArnaud A. de Grandmaison     Err = CXCompilationDatabase_CanNotLoadDatabase;
252b3c8603SArnaud A. de Grandmaison   }
262b3c8603SArnaud A. de Grandmaison 
272b3c8603SArnaud A. de Grandmaison   if (ErrorCode)
282b3c8603SArnaud A. de Grandmaison     *ErrorCode = Err;
292b3c8603SArnaud A. de Grandmaison 
302b3c8603SArnaud A. de Grandmaison   return db;
312b3c8603SArnaud A. de Grandmaison }
322b3c8603SArnaud A. de Grandmaison 
332b3c8603SArnaud A. de Grandmaison void
34*fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_dispose(CXCompilationDatabase CDb)
352b3c8603SArnaud A. de Grandmaison {
362b3c8603SArnaud A. de Grandmaison   delete static_cast<CompilationDatabase *>(CDb);
372b3c8603SArnaud A. de Grandmaison }
382b3c8603SArnaud A. de Grandmaison 
392b3c8603SArnaud A. de Grandmaison struct AllocatedCXCompileCommands
402b3c8603SArnaud A. de Grandmaison {
412b3c8603SArnaud A. de Grandmaison   std::vector<CompileCommand> CCmd;
422b3c8603SArnaud A. de Grandmaison 
432b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd)
442b3c8603SArnaud A. de Grandmaison     : CCmd(Cmd)
452b3c8603SArnaud A. de Grandmaison   { }
462b3c8603SArnaud A. de Grandmaison };
472b3c8603SArnaud A. de Grandmaison 
482b3c8603SArnaud A. de Grandmaison CXCompileCommands
49*fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb,
502b3c8603SArnaud A. de Grandmaison                                              const char *CompleteFileName)
512b3c8603SArnaud A. de Grandmaison {
522b3c8603SArnaud A. de Grandmaison   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
532b3c8603SArnaud A. de Grandmaison     const std::vector<CompileCommand>
542b3c8603SArnaud A. de Grandmaison       CCmd(db->getCompileCommands(CompleteFileName));
552b3c8603SArnaud A. de Grandmaison     if (!CCmd.empty())
562b3c8603SArnaud A. de Grandmaison       return new AllocatedCXCompileCommands( CCmd );
572b3c8603SArnaud A. de Grandmaison   }
582b3c8603SArnaud A. de Grandmaison 
592b3c8603SArnaud A. de Grandmaison   return 0;
602b3c8603SArnaud A. de Grandmaison }
612b3c8603SArnaud A. de Grandmaison 
622b3c8603SArnaud A. de Grandmaison void
63*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_dispose(CXCompileCommands Cmds)
642b3c8603SArnaud A. de Grandmaison {
652b3c8603SArnaud A. de Grandmaison   delete static_cast<AllocatedCXCompileCommands *>(Cmds);
662b3c8603SArnaud A. de Grandmaison }
672b3c8603SArnaud A. de Grandmaison 
682b3c8603SArnaud A. de Grandmaison unsigned
69*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getSize(CXCompileCommands Cmds)
702b3c8603SArnaud A. de Grandmaison {
712b3c8603SArnaud A. de Grandmaison   if (!Cmds)
722b3c8603SArnaud A. de Grandmaison     return 0;
732b3c8603SArnaud A. de Grandmaison 
742b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands *ACC =
752b3c8603SArnaud A. de Grandmaison     static_cast<AllocatedCXCompileCommands *>(Cmds);
762b3c8603SArnaud A. de Grandmaison 
772b3c8603SArnaud A. de Grandmaison   return ACC->CCmd.size();
782b3c8603SArnaud A. de Grandmaison }
792b3c8603SArnaud A. de Grandmaison 
802b3c8603SArnaud A. de Grandmaison CXCompileCommand
81*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I)
822b3c8603SArnaud A. de Grandmaison {
832b3c8603SArnaud A. de Grandmaison   if (!Cmds)
842b3c8603SArnaud A. de Grandmaison     return 0;
852b3c8603SArnaud A. de Grandmaison 
862b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands *ACC =
872b3c8603SArnaud A. de Grandmaison     static_cast<AllocatedCXCompileCommands *>(Cmds);
882b3c8603SArnaud A. de Grandmaison 
892b3c8603SArnaud A. de Grandmaison   if (I >= ACC->CCmd.size())
902b3c8603SArnaud A. de Grandmaison     return 0;
912b3c8603SArnaud A. de Grandmaison 
922b3c8603SArnaud A. de Grandmaison   return &ACC->CCmd[I];
932b3c8603SArnaud A. de Grandmaison }
942b3c8603SArnaud A. de Grandmaison 
952b3c8603SArnaud A. de Grandmaison CXString
96*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getDirectory(CXCompileCommand CCmd)
972b3c8603SArnaud A. de Grandmaison {
982b3c8603SArnaud A. de Grandmaison   if (!CCmd)
992b3c8603SArnaud A. de Grandmaison     return createCXString((const char*)NULL);
1002b3c8603SArnaud A. de Grandmaison 
1012b3c8603SArnaud A. de Grandmaison   CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
1022b3c8603SArnaud A. de Grandmaison   return createCXString(cmd->Directory);
1032b3c8603SArnaud A. de Grandmaison }
1042b3c8603SArnaud A. de Grandmaison 
1052b3c8603SArnaud A. de Grandmaison unsigned
106*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getNumArgs(CXCompileCommand CCmd)
1072b3c8603SArnaud A. de Grandmaison {
1082b3c8603SArnaud A. de Grandmaison   if (!CCmd)
1092b3c8603SArnaud A. de Grandmaison     return 0;
1102b3c8603SArnaud A. de Grandmaison 
1112b3c8603SArnaud A. de Grandmaison   return static_cast<CompileCommand *>(CCmd)->CommandLine.size();
1122b3c8603SArnaud A. de Grandmaison }
1132b3c8603SArnaud A. de Grandmaison 
1142b3c8603SArnaud A. de Grandmaison CXString
115*fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg)
1162b3c8603SArnaud A. de Grandmaison {
1172b3c8603SArnaud A. de Grandmaison   if (!CCmd)
1182b3c8603SArnaud A. de Grandmaison     return createCXString((const char*)NULL);
1192b3c8603SArnaud A. de Grandmaison 
1202b3c8603SArnaud A. de Grandmaison   CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
1212b3c8603SArnaud A. de Grandmaison 
1222b3c8603SArnaud A. de Grandmaison   if (Arg >= Cmd->CommandLine.size())
1232b3c8603SArnaud A. de Grandmaison     return createCXString((const char*)NULL);
1242b3c8603SArnaud A. de Grandmaison 
1252b3c8603SArnaud A. de Grandmaison   return createCXString(Cmd->CommandLine[Arg]);
1262b3c8603SArnaud A. de Grandmaison }
1272b3c8603SArnaud A. de Grandmaison 
1282b3c8603SArnaud A. de Grandmaison 
1292b3c8603SArnaud A. de Grandmaison } // end: extern "C"
130