//- Rename to a corresponding backup file // If the backup file already exists, attempt with "01" .. "99" index bool Foam::mvBak(const fileName& src, const std::string& ext) { if (POSIX::debug) { Info<< "mvBak : " << src << " to extension " << ext << endl; } if (exists(src, false)) { const int maxIndex = 99; char index[3]; for (int n = 0; n <= maxIndex; n++) { fileName dstName(src + "." + ext); if (n) { sprintf(index, "%02d", n); dstName += index; } // avoid overwriting existing files, except for the last // possible index where we have no choice if (!exists(dstName, false) || n == maxIndex) { return rename(src.c_str(), dstName.c_str()) == 0; } } } // fall-through: nothing to do return false; }
// //------------------------------------------------------------------------------ bool BFFParser::StoreVariableToVariable( const char * varNameDstStart, const char * varNameDstEnd, const BFFIterator & varNameSrcStart, const BFFIterator & varNameSrcEnd, const BFFIterator & operatorIter ) { // find vars AStackString<> dstName( varNameDstStart, varNameDstEnd ); AStackString<> srcName( varNameSrcStart.GetCurrent(), varNameSrcEnd.GetCurrent() ); const BFFVariable * varDst = BFFStackFrame::GetVar( dstName ); const BFFVariable * varSrc = BFFStackFrame::GetVar( srcName ); // src var unknown? if ( varSrc == nullptr ) { Error::Error_1009_UnknownVariable( varNameSrcStart, nullptr ); return false; } const bool concat = ( *operatorIter == BFF_VARIABLE_CONCATENATION ); // concatenation? if ( concat ) { // can only concatenate to existing vars if ( varDst == nullptr ) { Error::Error_1026_VariableNotFoundForConcatenation( operatorIter, dstName ); return false; } } // if dst exists, types must match BFFVariable::VarType srcType = varSrc->GetType(); BFFVariable::VarType dstType = BFFVariable::VAR_ANY; if ( varDst ) { dstType = varDst->GetType(); } else { ASSERT( concat == false ); dstType = srcType; } // handle supported types if ( srcType != dstType ) { // Mismatched - is there a supported conversion? // String to ArrayOfStrings if ( ( dstType == BFFVariable::VAR_ARRAY_OF_STRINGS ) && ( srcType == BFFVariable::VAR_STRING ) ) { uint32_t num = (uint32_t)( 1 + ( concat ? varDst->GetArrayOfStrings().GetSize() : 0 ) ); Array< AString > values( num, false ); if ( concat ) { values.Append( varDst->GetArrayOfStrings() ); } values.Append( varSrc->GetString() ); BFFStackFrame::SetVarArrayOfStrings( dstName, values ); FLOG_INFO( "Registered <ArrayOfStrings> variable '%s' with %u elements", dstName.Get(), num ); return true; } // Struct to ArrayOfStructs if ( ( dstType == BFFVariable::VAR_ARRAY_OF_STRUCTS ) && ( srcType == BFFVariable::VAR_STRUCT ) ) { uint32_t num = (uint32_t)( 1 + ( concat ? varDst->GetArrayOfStructs().GetSize() : 0 ) ); Array< const BFFVariable * > values( num, false ); if ( concat ) { values.Append( varDst->GetArrayOfStructs() ); } values.Append( varSrc ); BFFStackFrame::SetVarArrayOfStructs( dstName, values ); FLOG_INFO( "Registered <ArrayOfStructs> variable '%s' with %u elements", dstName.Get(), num ); return true; } } else { // Matching Src and Dst if ( srcType == BFFVariable::VAR_STRING ) { AStackString< 2048 > finalValue; if ( concat ) { finalValue = varDst->GetString(); } finalValue += varSrc->GetString(); BFFStackFrame::SetVarString( dstName, finalValue ); FLOG_INFO( "Registered <string> variable '%s' with value '%s'", dstName.Get(), finalValue.Get() ); return true; } if ( srcType == BFFVariable::VAR_ARRAY_OF_STRINGS ) { if ( concat ) { const unsigned int num = (unsigned int)( varSrc->GetArrayOfStrings().GetSize() + varDst->GetArrayOfStrings().GetSize() ); Array< AString > values( num, false ); values.Append( varDst->GetArrayOfStrings() ); values.Append( varSrc->GetArrayOfStrings() ); BFFStackFrame::SetVarArrayOfStrings( dstName, values ); FLOG_INFO( "Registered <ArrayOfStrings> variable '%s' with %u elements", dstName.Get(), num ); } else { BFFStackFrame::SetVarArrayOfStrings( dstName, varSrc->GetArrayOfStrings() ); FLOG_INFO( "Registered <ArrayOfStrings> variable '%s' with %u elements", dstName.Get(), (unsigned int)varSrc->GetArrayOfStrings().GetSize() ); } return true; } if ( srcType == BFFVariable::VAR_ARRAY_OF_STRUCTS ) { if ( concat ) { const unsigned int num = (unsigned int)( varSrc->GetArrayOfStructs().GetSize() + varDst->GetArrayOfStructs().GetSize() ); Array< const BFFVariable * > values( num, false ); values.Append( varDst->GetArrayOfStructs() ); values.Append( varSrc->GetArrayOfStructs() ); BFFStackFrame::SetVarArrayOfStructs( dstName, values ); FLOG_INFO( "Registered <ArrayOfStructs> variable '%s' with %u elements", dstName.Get(), num ); } else { BFFStackFrame::SetVarArrayOfStructs( dstName, varSrc->GetArrayOfStructs() ); FLOG_INFO( "Registered <ArrayOfStructs> variable '%s' with %u elements", dstName.Get(), (unsigned int)varSrc->GetArrayOfStructs().GetSize() ); } return true; } if ( srcType == BFFVariable::VAR_INT ) { int newVal( varSrc->GetInt() ); if ( concat ) { newVal += varDst->GetInt(); } return StoreVariableInt( varNameDstStart, varNameDstEnd, newVal ); } if ( srcType == BFFVariable::VAR_BOOL ) { // only assignment is supported if ( concat == false ) { return StoreVariableBool( varNameDstStart, varNameDstEnd, varSrc->GetBool() ); } } if ( srcType == BFFVariable::VAR_STRUCT ) { const Array< const BFFVariable * > & srcMembers = varSrc->GetStructMembers(); if ( concat ) { BFFVariable *const newVar = BFFStackFrame::ConcatVars( dstName, varSrc, varDst ); FLOG_INFO( "Registered <struct> variable '%s' with %u members", dstName.Get(), newVar->GetStructMembers().GetSize() ); } else { // Register this variable BFFStackFrame::SetVarStruct( dstName, srcMembers ); FLOG_INFO( "Registered <struct> variable '%s' with %u members", dstName.Get(), srcMembers.GetSize() ); } return true; } } Error::Error_1034_OperationNotSupported( varNameSrcStart, varDst ? varDst->GetType() : varSrc->GetType(), varSrc->GetType(), operatorIter ); return false; }