std::string build_filename(const URI& input, const Uint rank) { const URI my_dir = input.base_path(); const std::string basename = input.base_name(); const URI result(my_dir / (basename + "_P" + to_str(rank) + ".cfbin")); return result.path(); }
void Component::complete_path ( URI& path ) const { using namespace boost::algorithm; // CFinfo << "PATH [" << path.string() << "]\n" << CFflush; cf_assert( path.scheme() == URI::Scheme::CPATH ); if(path.empty()) path = "./"; if ( is_null(m_raw_parent) ) throw InvalidURI(FromHere(), "Component \'" + name() + "\' has no parent"); if (m_root.expired()) throw InvalidURI(FromHere(), "Component \'" + name() + "\' has no root"); boost::shared_ptr<Component> parent = m_raw_parent->self(); boost::shared_ptr<Component> root = m_root.lock(); std::string sp = path.path(); if ( path.is_relative() ) // transform it to absolute { if ( starts_with(sp,"/") ) // remove leading "/" if any boost::algorithm::replace_first(sp, "/", "" ); // substitute leading "../" for uri() of parent if (starts_with(sp,"..")) { std::string pfp = parent->uri().path(); boost::algorithm::replace_first(sp, "..", pfp); } // substitute leading "./" for uri() of this component else if (starts_with(sp,".")) { boost::algorithm::replace_first(sp, ".", uri().path()); } else { sp = uri().path()+"/"+sp; } } cf_assert ( URI(sp).is_absolute() ); // break path in tokens and loop on them, while concatenaitng to a new path boost::char_separator<char> sep("/"); typedef boost::tokenizer<boost::char_separator<char> > tokenizer; tokenizer tok (sp,sep); path = "/" ; std::string last; for(tokenizer::iterator el=tok.begin(); el!=tok.end(); ++el) { if ( equals (*el, ".") ) continue; // substitute any "/./" for nothing if ( equals (*el, "..") ) // substitute any "../" for base path path = path.base_path(); else path /= *el; } // CFinfo << "FINAL PATH: [" << path.string() << "]\n" << CFflush; cf_assert ( path.is_complete() ); }