Foam::sigStopAtWriteNow::sigStopAtWriteNow ( const bool verbose, const Time& runTime ) { if (signal_ > 0) { // Check that the signal is different from the writeNowSignal if (sigWriteNow::signal_ == signal_) { FatalErrorIn ( "Foam::sigStopAtWriteNow::sigStopAtWriteNow" "(const bool, const Time&)" ) << "stopAtWriteNowSignal : " << signal_ << " cannot be the same as the writeNowSignal." << " Please change this in the controlDict (" << findEtcFile("controlDict", false) << ")." << exit(FatalError); } // Store runTime runTimePtr_ = &runTime; struct sigaction newAction; newAction.sa_handler = sigHandler; newAction.sa_flags = SA_NODEFER; sigemptyset(&newAction.sa_mask); if (sigaction(signal_, &newAction, &oldAction_) < 0) { FatalErrorIn ( "Foam::sigStopAtWriteNow::sigStopAtWriteNow" "(const bool, const Time&)" ) << "Cannot set " << signal_ << " trapping" << abort(FatalError); } if (verbose) { Info<< "sigStopAtWriteNow :" << " Enabling writing and stopping upon signal " << signal_ << endl; } } }
bool Foam::dynamicCode::resolveTemplates ( const UList<fileName>& templateNames, DynamicList<fileName>& resolvedFiles, DynamicList<fileName>& badFiles ) { // Try to get template from FOAM_CODESTREAM_TEMPLATES const fileName templateDir(Foam::getEnv(codeTemplateEnvName)); bool allOkay = true; forAll(templateNames, fileI) { const fileName& templateName = templateNames[fileI]; fileName file; if (!templateDir.empty() && isDir(templateDir)) { file = templateDir/templateName; if (!isFile(file, false)) { file.clear(); } } // Not found - fallback to ~OpenFOAM expansion if (file.empty()) { file = findEtcFile(codeTemplateDirName/templateName); } if (file.empty()) { badFiles.append(templateName); allOkay = false; } else { resolvedFiles.append(file); } } return allOkay; }
Foam::dictionary& Foam::debug::controlDict() { if (!controlDictPtr_) { // Allow users to override the location of the global controlDict // dictionary using an environment variable. Using this environment // variable, one can assign a different global controlDict for each // case, without having to modify the "default" ones. fileName globControlDictFileName = getEnv("FOAM_GLOBAL_CONTROLDICT"); // Fallback to default locations if filename is empty or not valid if( ! isFile(globControlDictFileName) ) globControlDictFileName = findEtcFile("controlDict", true); controlDictPtr_ = new dictionary ( IFstream(globControlDictFileName)() ); } return *controlDictPtr_; }
Foam::fileName Foam::dynamicCode::resolveTemplate(const fileName& templateName) { // Try to get template from FOAM_CODESTREAM_TEMPLATES const fileName templateDir(Foam::getEnv(codeTemplateEnvName)); fileName file; if (!templateDir.empty() && isDir(templateDir)) { file = templateDir/templateName; if (!isFile(file, false)) { file.clear(); } } // Not found - fallback to ~OpenFOAM expansion if (file.empty()) { file = findEtcFile(codeTemplateDirName/templateName); } return file; }
Foam::string& Foam::stringOps::inplaceExpand ( string& s, const bool allowEmpty ) { string::size_type begVar = 0; // Expand $VARS // Repeat until nothing more is found while ( (begVar = s.find('$', begVar)) != string::npos && begVar < s.size()-1 ) { if (begVar == 0 || s[begVar-1] != '\\') { // Find end of first occurrence string::size_type endVar = begVar; string::size_type delim = 0; // The type/position of the ":-" or ":+" alternative values int altType = 0; string::size_type altPos = string::npos; if (s[begVar+1] == '{') { endVar = s.find('}', begVar); delim = 1; // check for ${parameter:-word} or ${parameter:+word} if (endVar != string::npos) { altPos = begVar; altType = findParameterAlternative(s, altPos, endVar); } } else { string::iterator iter = s.begin() + begVar + 1; while ( iter != s.end() && (isalnum(*iter) || *iter == '_') ) { ++iter; ++endVar; } } if (endVar == string::npos) { // likely parsed '${...' without closing '}' - abort break; } else if (endVar == begVar) { // parsed '${}' or $badChar - skip over begVar = endVar + 1; } else { const word varName ( s.substr ( begVar + 1 + delim, ( (altPos == string::npos ? endVar : altPos) - begVar - 2*delim ) ), false ); std::string altValue; if (altPos != string::npos) { // had ":-" or ":+" alternative value altValue = s.substr ( altPos + 2, endVar - altPos - 2*delim ); } const string varValue = getEnv(varName); if (varValue.size()) { if (altPos != string::npos && altType == '+') { // was found, use ":+" alternative s.std::string::replace ( begVar, endVar - begVar + 1, altValue ); begVar += altValue.size(); } else { // was found, use value s.std::string::replace ( begVar, endVar - begVar + 1, varValue ); begVar += varValue.size(); } } else if (altPos != string::npos) { // use ":-" or ":+" alternative values if (altType == '-') { // was not found, use ":-" alternative s.std::string::replace ( begVar, endVar - begVar + 1, altValue ); begVar += altValue.size(); } else { // was not found, ":+" alternative implies // substitute with nothing s.std::string::erase(begVar, endVar - begVar + 1); } } else if (allowEmpty) { s.std::string::erase(begVar, endVar - begVar + 1); } else { FatalErrorIn ( "stringOps::inplaceExpand(string&, const bool)" ) << "Unknown variable name '" << varName << "'" << exit(FatalError); } } } else { ++begVar; } } if (!s.empty()) { if (s[0] == '~') { // Expand initial ~ // ~/ => home directory // ~OpenFOAM => site/user OpenFOAM configuration directory // ~user => home directory for specified user string user; fileName file; if ((begVar = s.find('/')) != string::npos) { user = s.substr(1, begVar - 1); file = s.substr(begVar + 1); } else { user = s.substr(1); } // NB: be a bit lazy and expand ~unknownUser as an // empty string rather than leaving it untouched. // otherwise add extra test if (user == "OpenFOAM") { s = findEtcFile(file); } else { s = home(user)/file; } } else if (s[0] == '.') { // Expand a lone '.' and an initial './' into cwd if (s.size() == 1) { s = cwd(); } else if (s[1] == '/') { s.std::string::replace(0, 1, cwd()); } } } return s; }
Foam::string& Foam::stringOps::inplaceExpand ( string& s, const dictionary& dict, const bool allowEnvVars, const bool allowEmpty, const char sigil ) { string::size_type begVar = 0; // Expand $VAR or ${VAR} // Repeat until nothing more is found while ( (begVar = s.find(sigil, begVar)) != string::npos && begVar < s.size()-1 ) { if (begVar == 0 || s[begVar-1] != '\\') { if (s[begVar+1] == '{') { // Recursive variable expansion mode label stringStart = begVar; begVar += 2; string varValue ( expand ( s, begVar, dict, allowEnvVars, allowEmpty ) ); s.std::string::replace ( stringStart, begVar - stringStart + 1, varValue ); begVar = stringStart+varValue.size(); } else { string::iterator iter = s.begin() + begVar + 1; // more generous in accepting keywords than for env variables string::size_type endVar = begVar; while ( iter != s.end() && ( isalnum(*iter) || *iter == '.' || *iter == ':' || *iter == '_' ) ) { ++iter; ++endVar; } const word varName ( s.substr ( begVar + 1, endVar - begVar ), false ); string varValue ( getVariable ( varName, dict, allowEnvVars, allowEmpty ) ); s.std::string::replace ( begVar, varName.size()+1, varValue ); begVar += varValue.size(); } } else { ++begVar; } } if (!s.empty()) { if (s[0] == '~') { // Expand initial ~ // ~/ => home directory // ~OpenFOAM => site/user OpenFOAM configuration directory // ~user => home directory for specified user string user; fileName file; if ((begVar = s.find('/')) != string::npos) { user = s.substr(1, begVar - 1); file = s.substr(begVar + 1); } else { user = s.substr(1); } // NB: be a bit lazy and expand ~unknownUser as an // empty string rather than leaving it untouched. // otherwise add extra test if (user == "OpenFOAM") { s = findEtcFile(file); } else { s = home(user)/file; } } else if (s[0] == '.') { // Expand a lone '.' and an initial './' into cwd if (s.size() == 1) { s = cwd(); } else if (s[1] == '/') { s.std::string::replace(0, 1, cwd()); } } } return s; }
// Expand all occurences of environment variables and initial tilde sequences Foam::string& Foam::string::expand() { size_type startEnvar = 0; // Expand $VARS // Repeat until nothing more is found while ( (startEnvar = find('$', startEnvar)) != npos && startEnvar < size()-1 ) { if (startEnvar == 0 || operator[](startEnvar-1) != '\\') { // Find end of first occurrence size_type endEnvar = startEnvar; size_type nd = 0; if (operator[](startEnvar+1) == '{') { endEnvar = find('}', startEnvar); nd = 1; } else { iterator iter = begin() + startEnvar + 1; while (iter != end() && (isalnum(*iter) || *iter == '_')) { ++iter; ++endEnvar; } } if (endEnvar != npos && endEnvar != startEnvar) { string enVar = substr ( startEnvar + 1 + nd, endEnvar - startEnvar - 2*nd ); string enVarString = getEnv(enVar); if (enVarString.size()) { std::string::replace ( startEnvar, endEnvar - startEnvar + 1, enVarString ); startEnvar += enVarString.size(); } else { //startEnvar = endEnvar; FatalErrorIn("string::expand()") << "Unknown variable name " << enVar << '.' << exit(FatalError); } } else { break; } } else { startEnvar++; } } if (size()) { if (operator[](0) == '~') { // Expand initial ~ // ~/ => home directory // ~OpenFOAM => site/user OpenFOAM configuration directory // ~user => home directory for specified user word user; fileName file; if ((startEnvar = find('/')) != npos) { user = substr(1, startEnvar - 1); file = substr(startEnvar + 1); } else { user = substr(1); } // NB: be a bit lazy and expand ~unknownUser as an // empty string rather than leaving it untouched. // otherwise add extra test if (user == "OpenFOAM") { *this = findEtcFile(file); } else { *this = home(user)/file; } } else if (operator[](0) == '.') { // Expand initial '.' and './' into cwd if (size() == 1) { *this = cwd(); } else if (operator[](1) == '/') { std::string::replace(0, 1, cwd()); } } } return *this; }