From b51c95776fb9d863906ce35e766bb2d1bbbb48b1 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Mon, 3 Jul 2017 00:18:45 +0430 Subject: added a new command --- bruiser/bruiser.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/bruiser/bruiser.cpp b/bruiser/bruiser.cpp index a19a6ca..1cb137f 100644 --- a/bruiser/bruiser.cpp +++ b/bruiser/bruiser.cpp @@ -105,12 +105,12 @@ cl::opt LuaJIT("jit", cl::desc("should bruiser use luajit or not."), cl::i class LuaEngine { public: - LuaEngine() + LuaEngine() { LS = luaL_newstate(); } - /*@DEVI-this will just create member functions that open a single lua libarary. + /*@DEVI-this will just create member functions that open a single lua libarary. * For example to load the string library just call LuaEngine::LoadstringLib().*/ #define OPEN_LUA_LIBS(__x1) \ void Load##__x1##Lib(void){\ @@ -250,12 +250,12 @@ class CompilationDatabaseProcessor }; /**********************************************************************************************************************/ /*the implementation of the bruiser logger.*/ -bruiser::BruiserReport::BruiserReport () +bruiser::BruiserReport::BruiserReport () { BruiserLog.open("bruiser.log"); } -bruiser::BruiserReport::~BruiserReport() +bruiser::BruiserReport::~BruiserReport() { BruiserLog.close(); } @@ -386,7 +386,7 @@ class NameFinder /**********************************************************************************************************************/ /**********************************************************************************************************************/ /**********************************************************************************************************************/ -class IfBreaker : public MatchFinder::MatchCallback +class IfBreaker : public MatchFinder::MatchCallback { public: IfBreaker (Rewriter &Rewrite) : Rewrite(Rewrite) {} @@ -464,7 +464,7 @@ public: SourceRange SR(SL, SLE); - std::string MainSig = Rewrite.getRewrittenText(SR); + std::string MainSig = Rewrite.getRewrittenText(SR); size_t mainbegin = MainSig.find("main"); @@ -572,7 +572,7 @@ public: BruiserASTConsumer(Rewriter &R) : HIfBreaker(R), HMainWrapper(R) {} - void HandleTranslationUnit(ASTContext &Context) override + void HandleTranslationUnit(ASTContext &Context) override { Matcher.addMatcher(ifStmt(hasDescendant(expr(anyOf(unaryOperator().bind("uno"), binaryOperator().bind("dous"))))), &HIfBreaker); @@ -746,7 +746,7 @@ class BlankDiagConsumer : public clang::DiagnosticConsumer virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) override {} }; /**********************************************************************************************************************/ -class BruiserFrontendAction : public ASTFrontendAction +class BruiserFrontendAction : public ASTFrontendAction { public: BruiserFrontendAction() {} @@ -765,7 +765,7 @@ public: TheRewriter.getEditBuffer(TheRewriter.getSourceMgr().getMainFileID()).write(*tee); } - std::unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef file) override + std::unique_ptr CreateASTConsumer(CompilerInstance &CI, StringRef file) override { DiagnosticsEngine &DE = CI.getPreprocessor().getDiagnostics(); DE.setClient(BDCProto, false); @@ -1151,7 +1151,7 @@ class LuaWrapper PRINT_WITH_COLOR_LB(RED, "function was not called by one argument. Run help()."); return 0; } - + unsigned int historysize = lua_tonumber(__ls, 1); linenoiseHistorySetMaxLen(historysize); @@ -1247,7 +1247,7 @@ class LuaWrapper returned = waitpid(pid, &status, 0); lua_pushnumber(__ls, returned); } - + return 1; } @@ -1305,6 +1305,7 @@ class LuaWrapper if (pid == 0) { int retval = execl((ShellGlobalInstance.BINPATH + "/" + binname).c_str(), binname.c_str(), NULL); + std::cout << BLUE << "child returned " << retval << NORMAL << "\n"; lua_pushnumber(__ls, retval); exit(EXIT_SUCCESS); } @@ -1348,7 +1349,7 @@ class LuaWrapper } ShellGlobalInstance.BINPATH = lua_tostring(__ls, 1); - + return 0; } @@ -1393,6 +1394,46 @@ class LuaWrapper return returncount; } + + int BruiserLuaChangeDirectory(lua_State* __ls) + { + int numargs = lua_gettop(__ls); + + if (numargs != 1) + { + PRINT_WITH_COLOR_LB(RED, "wrond number of arguments. needed one. see help()."); + lua_pushnumber(__ls, 1U); + return 1; + } + + std::string destinationpath = lua_tostring(__ls, 1); + + pid_t pid = fork(); + + if (pid < 0) + { + PRINT_WITH_COLOR_LB(RED, "could not fork..."); + lua_pushnumber(__ls, EXIT_FAILURE); + return 1; + } + + if (pid == 0) + { + int retval = execl("/usr/bin/cd", "cd", destinationpath.c_str(), NULL); + std::cout << BLUE << "child returned " << retval << NORMAL << "\n"; + } + + if (pid > 0) + { + int status; + pid_t returned; + returned = waitpid(pid, &status, 0); + lua_pushnumber(__ls, returned); + } + + return 1; + } + #define LIST_GENERATOR(__x1) \ int List##__x1(lua_State* __ls)\ {\ @@ -1450,7 +1491,7 @@ int LuaDispatch(lua_State* __ls) /**********************************************************************************************************************/ /**********************************************************************************************************************/ /*Main*/ -int main(int argc, const char **argv) +int main(int argc, const char **argv) { /*gets the compilation database and options for the clang instances that we would later run*/ CommonOptionsParser op(argc, argv, BruiserCategory); @@ -1516,6 +1557,7 @@ int main(int argc, const char **argv) lua_register(LE.GetLuaState(), "getmakepath", &LuaDispatch<&LuaWrapper::BruiserLuaGetMakePath>); lua_register(LE.GetLuaState(), "getpaths", &LuaDispatch<&LuaWrapper::BruiserLuaGetPath>); lua_register(LE.GetLuaState(), "getsourcefiles", &LuaDispatch<&LuaWrapper::BruiserLuaGetSourceFiles>); + lua_register(LE.GetLuaState(), "changedirectory", &LuaDispatch<&LuaWrapper::BruiserLuaChangeDirectory>); /*its just regisering the List function from LuaWrapper with X-macros.*/ #define X(__x1, __x2) lua_register(LE.GetLuaState(), #__x1, &LuaDispatch<&LuaWrapper::List##__x1>); @@ -1535,7 +1577,7 @@ int main(int argc, const char **argv) /*end of bruiser main*/ return 0; } //end of cli block - + } //end of main /*last line intentionally left blank.*/ -- cgit v1.2.3