std::string CmdLineParams::GetCmdLine() const { std::string cmdLine = (argc > 0) ? UnQuote(argv[0]) : "unknown"; for (int i = 1; i < argc; ++i) { cmdLine += " "; cmdLine += argv[i]; } return cmdLine; }
/** * Returns the absolute version of a supplied relative path. * This is very simple, and can only handle "./", but not "../". */ static std::string CreateAbsolutePath(const std::string& relativePath) { if (relativePath.empty()) return relativePath; std::string absolutePath = UnQuote(relativePath); if (absolutePath.length() > 0 && (absolutePath[0] == '/')) { // is already absolute } else { if (absolutePath.find("./") == 0) { // remove initial "./" absolutePath = absolutePath.substr(2); } absolutePath = FileSystemAbstraction::EnsurePathSepAtEnd(GetBinaryLocation()) + absolutePath; } if (!FileSystem::FileExists(absolutePath)) return relativePath; return absolutePath; }
std::string GetModuleFile(std::string moduleName) { std::string moduleFilePath = ""; // this will only be used if moduleFilePath stays empty const char* error = NULL; #if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) #ifdef __APPLE__ #define SHARED_LIBRARY_EXTENSION "dylib" #else #define SHARED_LIBRARY_EXTENSION "so" #endif void* moduleAddress = NULL; // find an address in the module we are looking for if (moduleName.empty()) { // look for current module moduleAddress = (void*) GetModuleFile; } else { // look for specified module // add extension if it is not in the file name // it could also be "libXZY.so-1.2.3" // -> does not have to be the end, my friend if (moduleName.find("." SHARED_LIBRARY_EXTENSION) == std::string::npos) { moduleName = moduleName + "." SHARED_LIBRARY_EXTENSION; } // will not not try to load, but return the libs address // if it is already loaded, NULL otherwise moduleAddress = dlopen(moduleName.c_str(), RTLD_LAZY | RTLD_NOLOAD); if (moduleAddress == NULL) { // if not found, try with "lib" prefix moduleName = "lib" + moduleName; moduleAddress = dlopen(moduleName.c_str(), RTLD_LAZY | RTLD_NOLOAD); } } if (moduleAddress != NULL) { // fetch info about the module containing the address we just evaluated Dl_info moduleInfo; const int ret = dladdr(moduleAddress, &moduleInfo); if ((ret != 0) && (moduleInfo.dli_fname != NULL)) { moduleFilePath = moduleInfo.dli_fname; // required on APPLE; does not hurt elsewhere moduleFilePath = GetRealPath(moduleFilePath); } else { error = dlerror(); if (error == NULL) { error = "Unknown"; } } } else { error = "Not loaded"; } #elif WIN32 HMODULE hModule = NULL; if (moduleName.empty()) { hModule = GetCurrentModule(); } else { // If this fails, we get a NULL handle hModule = GetModuleHandle(moduleName.c_str()); } if (hModule != NULL) { // fetch module file name TCHAR moduleFile[MAX_PATH+1]; const int ret = ::GetModuleFileName(hModule, moduleFile, sizeof(moduleFile)); if ((ret != 0) && (ret != sizeof(moduleFile))) { moduleFilePath = std::string(moduleFile); } else { error = + "Unknown"; } } else { error = "Not found"; } #else #warning implement this (or use linux version) #endif if (moduleFilePath.empty()) { if (moduleName.empty()) { moduleName = "<current>"; } LOG_L(L_WARNING, "Failed to get file path of the module \"%s\", reason: %s", moduleName.c_str(), error); } return UnQuote(moduleFilePath); }
void EffectNyquist::Parse(wxString line) { wxArrayString tokens; int i; int len = line.Length(); bool sl = false; bool q = false; wxString tok = wxT(""); for (i = 1; i < len; i++) { wxChar c = line[i]; if (c == wxT('\\')) { sl = true; } else if (c == wxT('"')) { q = !q; } else { if ((!q && !sl && c == wxT(' ')) || c == wxT('\t')) { tokens.Add(tok); tok = wxT(""); } else if (sl && c == wxT('n')) { tok += wxT('\n'); } else { tok += c; } sl = false; } } if (tok != wxT("")) { tokens.Add(tok); } len = tokens.GetCount(); if (len < 1) { return; } if (len == 2 && tokens[0] == wxT("nyquist") && tokens[1] == wxT("plug-in")) { mOK = true; return; } if (len >= 2 && tokens[0] == wxT("type")) { if (tokens[1] == wxT("process")) { SetEffectFlags(PROCESS_EFFECT | PLUGIN_EFFECT); } else if (tokens[1] == wxT("generate")) { SetEffectFlags(INSERT_EFFECT | PLUGIN_EFFECT); } else if (tokens[1] == wxT("analyze")) { SetEffectFlags(ANALYZE_EFFECT | PLUGIN_EFFECT); } return; } if (len == 2 && tokens[0] == wxT("codetype")) { if (tokens[1] == wxT("lisp")) { mIsSal = false; } else if (tokens[1] == wxT("sal")) { mIsSal = true; } return; } if (len >= 2 && tokens[0] == wxT("debugflags")) { for (int i = 1; i < len; i++) { // Note: "trace" and "notrace" are overridden by "Debug" and "OK" // buttons if the plug-in generates a dialog box by using controls if (tokens[i] == wxT("trace")) { mDebug = true; } else if (tokens[i] == wxT("notrace")) { mDebug = false; } else if (tokens[i] == wxT("compiler")) { mCompiler = true; } else if (tokens[i] == wxT("nocompiler")) { mCompiler = false; } } return; } // We support versions 1, 2 and 3 // (Version 2 added support for string parameters.) // (Version 3 added support for choice parameters.) if (len >= 2 && tokens[0] == wxT("version")) { if (tokens[1] != wxT("1") && tokens[1] != wxT("2") && tokens[1] != wxT("3")) { // This is an unsupported plug-in version mOK = false; return; } } if (len >= 2 && tokens[0] == wxT("name")) { mName = UnQuote(tokens[1]); return; } if (len >= 2 && tokens[0] == wxT("action")) { mAction = UnQuote(tokens[1]); return; } if (len >= 2 && tokens[0] == wxT("info")) { mInfo = UnQuote(tokens[1]); return; } if (len >= 6 && tokens[0] == wxT("control")) { NyqControl ctrl; ctrl.var = tokens[1]; ctrl.name = tokens[2]; ctrl.label = tokens[4]; ctrl.valStr = tokens[5]; if (tokens[3] == wxT("string")) { ctrl.type = NYQ_CTRL_STRING; } else if (tokens[ 3 ] == wxT("choice")) { ctrl.type = NYQ_CTRL_CHOICE; } else { if (len < 8) { return; } if ((tokens[3] == wxT("real")) || (tokens[3] == wxT("float"))) // undocumented, but useful, alternative ctrl.type = NYQ_CTRL_REAL; else if (tokens[3] == wxT("int")) ctrl.type = NYQ_CTRL_INT; else { wxString str; str.Printf(_("Bad Nyquist 'control' type specification: '%s' in plugin file '%s'.\nControl not created."), tokens[3].c_str(), mFileName.GetFullPath().c_str()); // Too disturbing to show alert before Audacity frame is up. // wxMessageBox(str, wxT("Nyquist Warning"), wxOK | wxICON_EXCLAMATION); // Note that the AudacityApp's mLogger has not yet been created, // so this brings up an alert box, but after the Audacity frame is up. wxLogWarning(str); return; } ctrl.lowStr = tokens[6]; ctrl.highStr = tokens[7]; } ctrl.val = UNINITIALIZED_CONTROL; mControls.Add(ctrl); } if (len >= 2 && tokens[0] == wxT("categories")) { for (size_t i = 1; i < tokens.GetCount(); ++i) { mCategories.Add(tokens[i]); } } }