#include #include #include #include #include #include #include #include #include "ToolBase.hpp" #include "ToolInit.hpp" #include "ToolSpec.hpp" #include "ToolAdd.hpp" #include "ToolRemove.hpp" #include "ToolGroup.hpp" #include "ToolCook.hpp" #include "ToolClean.hpp" #include "ToolPackage.hpp" #include "ToolHelp.hpp" bool XTERM_COLOR = false; #define HECL_GIT 1234567 #define HECL_GIT_S "1234567" #define HECL_BRANCH master #define HECL_BRANCH_S "master" /* Main usage message */ static void printHelp(const HECL::SystemChar* pname) { if (XTERM_COLOR) HECL::Printf(_S("" BOLD "HECL" NORMAL "")); else HECL::Printf(_S("HECL")); #if HECL_GIT HECL::Printf(_S(" Commit " HECL_GIT_S " " HECL_BRANCH_S "\nUsage: %s init|add|remove|group|cook|clean|package|help\n"), pname); #elif HECL_VER HECL::Printf(_S(" Version " HECL_VER_S "\nUsage: %s init|add|remove|group|cook|clean|package|help\n"), pname); #else HECL::Printf(_S("\nUsage: %s init|add|remove|group|cook|clean|package|help\n"), pname); #endif } /* Regex patterns */ static const HECL::SystemRegex regOPEN(_S("-o([^\"]*|\\S*))"), std::regex::ECMAScript|std::regex::optimize); static const HECL::SystemRegex regVERBOSE(_S("-v(v*)"), std::regex::ECMAScript|std::regex::optimize); static const HECL::SystemRegex regFORCE(_S("-f"), std::regex::ECMAScript|std::regex::optimize); #include "../blender/CBlenderConnection.hpp" #if HECL_UCS2 int wmain(int argc, const wchar_t** argv) #else int main(int argc, const char** argv) #endif { /* Xterm check */ const char* term = getenv("TERM"); if (!strncmp(term, "xterm", 5)) XTERM_COLOR = true; //CBlenderConnection bconn(false); //return 0; /* Basic usage check */ if (argc == 1) { printHelp(argv[0]); return 0; } else if (argc == 0) { printHelp(_S("hecl")); return 0; } /* Assemble common tool pass info */ ToolPassInfo info; info.pname = argv[0]; HECL::SystemChar cwdbuf[MAXPATHLEN]; if (HECL::Getcwd(cwdbuf, MAXPATHLEN)) info.cwd = cwdbuf; /* Concatenate args */ std::list args; for (int i=2 ; i::const_iterator it = args.begin() ; it != args.end() ;) { const HECL::SystemString& arg = *it; HECL::SystemRegexMatch oMatch; if (std::regex_search(arg, oMatch, regOPEN)) { const HECL::SystemString& token = oMatch[1].str(); if (token.size()) { if (info.output.empty()) info.output = oMatch[1].str(); it = args.erase(it); } else { it = args.erase(it); if (it == args.end()) break; if (info.output.empty()) info.output = *it; it = args.erase(it); } continue; } ++it; } /* Count verbosity */ for (std::list::const_iterator it = args.begin() ; it != args.end() ;) { const HECL::SystemString& arg = *it; HECL::SystemRegexMatch vMatch; if (std::regex_search(arg, vMatch, regVERBOSE)) { ++info.verbosityLevel; info.verbosityLevel += vMatch[1].str().size(); it = args.erase(it); continue; } ++it; } /* Check force argument */ for (std::list::const_iterator it = args.begin() ; it != args.end() ;) { const HECL::SystemString& arg = *it; if (std::regex_search(arg, regFORCE)) { info.force = true; it = args.erase(it); continue; } ++it; } /* Gather remaining args */ for (const HECL::SystemString& arg : args) info.args.push_back(arg); } /* Construct selected tool */ HECL::SystemString toolName(argv[1]); #if HECL_UCS2 std::transform(toolName.begin(), toolName.end(), toolName.begin(), towlower); #else std::transform(toolName.begin(), toolName.end(), toolName.begin(), tolower); #endif ToolBase* tool = NULL; try { if (toolName == _S("init")) tool = new ToolInit(info); else if (toolName == _S("spec")) tool = new ToolSpec(info); else if (toolName == _S("add")) tool = new ToolAdd(info); else if (toolName == _S("remove") || toolName == _S("rm")) tool = new ToolRemove(info); else if (toolName == _S("group")) tool = new ToolGroup(info); else if (toolName == _S("cook")) tool = new ToolCook(info); else if (toolName == _S("clean")) tool = new ToolClean(info); else if (toolName == _S("package") || toolName == _S("pack")) tool = new ToolPackage(info); else if (toolName == _S("help")) tool = new ToolHelp(info); else throw HECL::Exception(_S("unrecognized tool '") + toolName + _S("'")); } catch (HECL::Exception& ex) { HECL::FPrintf(stderr, _S("Unable to construct HECL tool '%s':\n%s\n"), toolName.c_str(), ex.swhat()); delete tool; return -1; } if (info.verbosityLevel) HECL::Printf(_S("Constructed tool '%s' %d\n"), tool->toolName().c_str(), info.verbosityLevel); /* Run tool */ int retval; try { retval = tool->run(); } catch (HECL::Exception& ex) { HECL::FPrintf(stderr, _S("Error running HECL tool '%s':\n%s\n"), toolName.c_str(), ex.swhat()); delete tool; return -1; } delete tool; return retval; }