mirror of https://github.com/KLayout/klayout.git
More consistent handling of special paths (like data: URLs) for technology components.
This commit is contained in:
parent
1c23d77073
commit
dc9b3bb398
|
|
@ -60,7 +60,7 @@ typedef l2n_std_format::keys<true> skeys;
|
||||||
typedef l2n_std_format::keys<false> lkeys;
|
typedef l2n_std_format::keys<false> lkeys;
|
||||||
|
|
||||||
LayoutToNetlistStandardReader::LayoutToNetlistStandardReader (tl::InputStream &stream)
|
LayoutToNetlistStandardReader::LayoutToNetlistStandardReader (tl::InputStream &stream)
|
||||||
: m_stream (stream), m_path (stream.absolute_path ()), m_dbu (0.0),
|
: m_stream (stream), m_path (stream.absolute_file_path ()), m_dbu (0.0),
|
||||||
m_progress (tl::to_string (tr ("Reading L2N database")), 1000)
|
m_progress (tl::to_string (tr ("Reading L2N database")), 1000)
|
||||||
{
|
{
|
||||||
m_progress.set_format (tl::to_string (tr ("%.0fk lines")));
|
m_progress.set_format (tl::to_string (tr ("%.0fk lines")));
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ SpiceReaderStream::line_number () const
|
||||||
std::string
|
std::string
|
||||||
SpiceReaderStream::source () const
|
SpiceReaderStream::source () const
|
||||||
{
|
{
|
||||||
return mp_stream->absolute_path ();
|
return mp_stream->absolute_file_path ();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -495,7 +495,7 @@ SpiceCircuitDict::read (tl::InputStream &stream)
|
||||||
m_global_net_names.clear ();
|
m_global_net_names.clear ();
|
||||||
m_global_nets.clear ();
|
m_global_nets.clear ();
|
||||||
|
|
||||||
m_file_id = file_id (stream.absolute_path ());
|
m_file_id = file_id (stream.absolute_file_path ());
|
||||||
|
|
||||||
while (! at_end ()) {
|
while (! at_end ()) {
|
||||||
read_card ();
|
read_card ();
|
||||||
|
|
|
||||||
|
|
@ -479,10 +479,10 @@ std::string
|
||||||
Technology::correct_path (const std::string &fp) const
|
Technology::correct_path (const std::string &fp) const
|
||||||
{
|
{
|
||||||
std::string bp = base_path ();
|
std::string bp = base_path ();
|
||||||
if (bp.empty ()) {
|
if (bp.empty () || ! tl::InputStream::is_file_path (fp) || ! tl::InputStream::is_file_path (bp)) {
|
||||||
return fp;
|
return fp;
|
||||||
} else {
|
} else {
|
||||||
return tl::relative_path (bp, fp);
|
return tl::relative_path (tl::InputStream::as_file_path (bp), tl::InputStream::as_file_path (fp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -494,7 +494,11 @@ Technology::load (const std::string &fn)
|
||||||
xml_struct.parse (source, *this);
|
xml_struct.parse (source, *this);
|
||||||
|
|
||||||
// use the tech file's path as the default base path
|
// use the tech file's path as the default base path
|
||||||
set_default_base_path (tl::absolute_path (fn));
|
if (tl::InputStream::is_file_path (fn)) {
|
||||||
|
set_default_base_path (tl::absolute_path (fn));
|
||||||
|
} else {
|
||||||
|
set_default_base_path (std::string ());
|
||||||
|
}
|
||||||
|
|
||||||
set_tech_file_path (fn);
|
set_tech_file_path (fn);
|
||||||
}
|
}
|
||||||
|
|
@ -515,10 +519,10 @@ Technology::build_effective_path (const std::string &p) const
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tl::is_absolute (p)) {
|
if (tl::InputStream::is_absolute (p)) {
|
||||||
return p;
|
return p;
|
||||||
} else {
|
} else {
|
||||||
return tl::combine_path (bp, p);
|
return tl::InputStream::combine (bp, p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2981,7 +2981,7 @@ void
|
||||||
MainWindow::add_mru (const std::string &fn_rel, const std::string &tech)
|
MainWindow::add_mru (const std::string &fn_rel, const std::string &tech)
|
||||||
{
|
{
|
||||||
std::vector <std::pair<std::string, std::string> > new_mru;
|
std::vector <std::pair<std::string, std::string> > new_mru;
|
||||||
std::string fn (tl::InputStream::absolute_path (fn_rel));
|
std::string fn (tl::InputStream::absolute_file_path (fn_rel));
|
||||||
|
|
||||||
for (auto mru = m_mru.begin (); mru != m_mru.end (); ++mru) {
|
for (auto mru = m_mru.begin (); mru != m_mru.end (); ++mru) {
|
||||||
if (mru->first != fn /* delete non-existing files: && tl::is_readable (mru->first) */) {
|
if (mru->first != fn /* delete non-existing files: && tl::is_readable (mru->first) */) {
|
||||||
|
|
@ -3025,7 +3025,7 @@ MainWindow::add_to_other_mru (const std::string &fn_rel, const std::string &cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector <std::string> new_mru;
|
std::vector <std::string> new_mru;
|
||||||
std::string fn (tl::InputStream::absolute_path (fn_rel));
|
std::string fn (tl::InputStream::absolute_file_path (fn_rel));
|
||||||
|
|
||||||
for (auto mru = mru_ptr->begin (); mru != mru_ptr->end (); ++mru) {
|
for (auto mru = mru_ptr->begin (); mru != mru_ptr->end (); ++mru) {
|
||||||
if (*mru != fn /* delete non-existing files: && tl::is_readable (*mru) */) {
|
if (*mru != fn /* delete non-existing files: && tl::is_readable (*mru) */) {
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ Session::fetch (const lay::MainWindow &mw)
|
||||||
if (lh) {
|
if (lh) {
|
||||||
m_layouts.push_back (SessionLayoutDescriptor ());
|
m_layouts.push_back (SessionLayoutDescriptor ());
|
||||||
m_layouts.back ().name = *l;
|
m_layouts.back ().name = *l;
|
||||||
m_layouts.back ().file_path = tl::InputStream::absolute_path (lh->filename ());
|
m_layouts.back ().file_path = tl::InputStream::absolute_file_path (lh->filename ());
|
||||||
m_layouts.back ().load_options = lh->load_options ();
|
m_layouts.back ().load_options = lh->load_options ();
|
||||||
m_layouts.back ().save_options = lh->save_options ();
|
m_layouts.back ().save_options = lh->save_options ();
|
||||||
m_layouts.back ().save_options_valid = lh->save_options_valid ();
|
m_layouts.back ().save_options_valid = lh->save_options_valid ();
|
||||||
|
|
@ -89,7 +89,7 @@ Session::fetch (const lay::MainWindow &mw)
|
||||||
|
|
||||||
const rdb::Database *rdb = view->get_rdb (j);
|
const rdb::Database *rdb = view->get_rdb (j);
|
||||||
if (rdb && ! rdb->filename ().empty ()) {
|
if (rdb && ! rdb->filename ().empty ()) {
|
||||||
view_desc.rdb_filenames.push_back (tl::InputStream::absolute_path (rdb->filename ()));
|
view_desc.rdb_filenames.push_back (tl::InputStream::absolute_file_path (rdb->filename ()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -98,7 +98,7 @@ Session::fetch (const lay::MainWindow &mw)
|
||||||
|
|
||||||
const db::LayoutToNetlist *l2ndb = view->get_l2ndb (j);
|
const db::LayoutToNetlist *l2ndb = view->get_l2ndb (j);
|
||||||
if (l2ndb && ! l2ndb->filename ().empty ()) {
|
if (l2ndb && ! l2ndb->filename ().empty ()) {
|
||||||
view_desc.l2ndb_filenames.push_back (tl::InputStream::absolute_path (l2ndb->filename ()));
|
view_desc.l2ndb_filenames.push_back (tl::InputStream::absolute_file_path (l2ndb->filename ()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1084,7 +1084,7 @@ LEFDEFReaderState::read_single_map_file (const std::string &path, std::map<std::
|
||||||
tl::InputStream file_stream (file);
|
tl::InputStream file_stream (file);
|
||||||
tl::TextInputStream ts (file_stream);
|
tl::TextInputStream ts (file_stream);
|
||||||
|
|
||||||
tl::log << tl::to_string (tr ("Reading LEF/DEF map file")) << " " << file_stream.absolute_path ();
|
tl::log << tl::to_string (tr ("Reading LEF/DEF map file")) << " " << file_stream.absolute_file_path ();
|
||||||
|
|
||||||
// Purpose name to purpose code
|
// Purpose name to purpose code
|
||||||
std::map<std::string, LayerPurpose> purpose_translation;
|
std::map<std::string, LayerPurpose> purpose_translation;
|
||||||
|
|
@ -2011,7 +2011,7 @@ LEFDEFImporter::get_mask (long m)
|
||||||
void
|
void
|
||||||
LEFDEFImporter::read (tl::InputStream &stream, db::Layout &layout, LEFDEFReaderState &state)
|
LEFDEFImporter::read (tl::InputStream &stream, db::Layout &layout, LEFDEFReaderState &state)
|
||||||
{
|
{
|
||||||
tl::log << tl::to_string (tr ("Reading LEF/DEF file")) << " " << stream.absolute_path ();
|
tl::log << tl::to_string (tr ("Reading LEF/DEF file")) << " " << stream.absolute_file_path ();
|
||||||
|
|
||||||
m_fn = stream.filename ();
|
m_fn = stream.filename ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,7 @@ LEFDEFReader::read_lefdef (db::Layout &layout, const db::LoadLayoutOptions &opti
|
||||||
|
|
||||||
std::string base_path;
|
std::string base_path;
|
||||||
if (! effective_options.paths_relative_to_cwd ()) {
|
if (! effective_options.paths_relative_to_cwd ()) {
|
||||||
base_path = tl::dirname (m_stream.absolute_path ());
|
base_path = tl::dirname (m_stream.absolute_file_path ());
|
||||||
}
|
}
|
||||||
|
|
||||||
db::LEFDEFReaderState state (&effective_options, layout, base_path);
|
db::LEFDEFReaderState state (&effective_options, layout, base_path);
|
||||||
|
|
@ -179,7 +179,7 @@ LEFDEFReader::read_lefdef (db::Layout &layout, const db::LoadLayoutOptions &opti
|
||||||
|
|
||||||
if (effective_options.read_lef_with_def ()) {
|
if (effective_options.read_lef_with_def ()) {
|
||||||
|
|
||||||
std::string input_dir = tl::absolute_path (m_stream.absolute_path ());
|
std::string input_dir = tl::absolute_path (m_stream.absolute_file_path ());
|
||||||
|
|
||||||
if (tl::file_exists (input_dir)) {
|
if (tl::file_exists (input_dir)) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1786,7 +1786,7 @@ Database::load (std::string fn)
|
||||||
reader.read (*this);
|
reader.read (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
set_filename (stream.absolute_path ());
|
set_filename (stream.absolute_file_path ());
|
||||||
set_name (stream.filename ());
|
set_name (stream.filename ());
|
||||||
|
|
||||||
reset_modified ();
|
reset_modified ();
|
||||||
|
|
|
||||||
|
|
@ -254,7 +254,6 @@ static std::vector<std::string> split_filename (const std::string &fn)
|
||||||
const char *cp0 = cp;
|
const char *cp0 = cp;
|
||||||
++cp;
|
++cp;
|
||||||
while (*cp && *cp != '.') {
|
while (*cp && *cp != '.') {
|
||||||
// backslash escaping (ineffective on Windows because that is a path separator)
|
|
||||||
if (*cp == '\\' && cp[1]) {
|
if (*cp == '\\' && cp[1]) {
|
||||||
++cp;
|
++cp;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -425,32 +425,124 @@ InputStream::~InputStream ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string InputStream::absolute_path (const std::string &abstract_path)
|
std::string InputStream::absolute_file_path (const std::string &abstract_path)
|
||||||
{
|
{
|
||||||
// TODO: align this implementation with InputStream ctor
|
// TODO: align this implementation with InputStream ctor
|
||||||
|
|
||||||
tl::Extractor ex (abstract_path.c_str ());
|
tl::Extractor ex (abstract_path.c_str ());
|
||||||
#if defined(HAVE_QT)
|
|
||||||
if (ex.test (":")) {
|
if (ex.test (":")) {
|
||||||
return abstract_path;
|
return abstract_path;
|
||||||
} else
|
} else if (ex.test ("http:") || ex.test ("https:") || ex.test ("pipe:") || ex.test ("data:")) {
|
||||||
#endif
|
|
||||||
#if defined(HAVE_CURL) || defined(HAVE_QT)
|
|
||||||
if (ex.test ("http:") || ex.test ("https:")) {
|
|
||||||
return abstract_path;
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (ex.test ("pipe:")) {
|
|
||||||
return abstract_path;
|
return abstract_path;
|
||||||
} else if (ex.test ("file:")) {
|
} else if (ex.test ("file:")) {
|
||||||
tl::URI uri (abstract_path);
|
tl::URI uri (abstract_path);
|
||||||
return tl::absolute_path (uri.path ());
|
return tl::absolute_file_path (uri.path ());
|
||||||
} else {
|
} else {
|
||||||
return tl::absolute_file_path (abstract_path);
|
return tl::absolute_file_path (abstract_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
bool InputStream::is_absolute (const std::string &abstract_path)
|
||||||
|
{
|
||||||
|
// TODO: align this implementation with InputStream ctor
|
||||||
|
|
||||||
|
tl::Extractor ex (abstract_path.c_str ());
|
||||||
|
if (ex.test (":")) {
|
||||||
|
return true;
|
||||||
|
} else if (ex.test ("http:") || ex.test ("https:") || ex.test ("pipe:") || ex.test ("data:")) {
|
||||||
|
return true;
|
||||||
|
} else if (ex.test ("file:")) {
|
||||||
|
tl::URI uri (abstract_path);
|
||||||
|
return tl::is_absolute (uri.path ());
|
||||||
|
} else {
|
||||||
|
return tl::is_absolute (abstract_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InputStream::is_file_path (const std::string &abstract_path)
|
||||||
|
{
|
||||||
|
tl::Extractor ex (abstract_path.c_str ());
|
||||||
|
if (ex.test (":")) {
|
||||||
|
return false;
|
||||||
|
} else if (ex.test ("http:") || ex.test ("https:") || ex.test ("pipe:") || ex.test ("data:")) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string InputStream::as_file_path (const std::string &abstract_path)
|
||||||
|
{
|
||||||
|
tl::Extractor ex (abstract_path.c_str ());
|
||||||
|
if (ex.test (":")) {
|
||||||
|
return std::string ();
|
||||||
|
} else if (ex.test ("http:") || ex.test ("https:") || ex.test ("pipe:") || ex.test ("data:")) {
|
||||||
|
return std::string ();
|
||||||
|
} else if (ex.test ("file:")) {
|
||||||
|
tl::URI uri (abstract_path);
|
||||||
|
return uri.path ();
|
||||||
|
} else {
|
||||||
|
return abstract_path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string InputStream::combine (const std::string &path1, const std::string &path2)
|
||||||
|
{
|
||||||
|
if (is_absolute (path2)) {
|
||||||
|
return path2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tl::Extractor ex (path1);
|
||||||
|
if (ex.test (":")) {
|
||||||
|
return path1 + "/" + path2;
|
||||||
|
} else if (ex.test ("pipe:") || ex.test ("data:")) {
|
||||||
|
// ignore un-combinable first parts
|
||||||
|
return path2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tl::URI uri1 (path1);
|
||||||
|
tl::URI uri2 (path2);
|
||||||
|
|
||||||
|
if (uri1.scheme ().empty ()) {
|
||||||
|
if (uri2.scheme ().empty ()) {
|
||||||
|
return tl::combine_path (path1, path2);
|
||||||
|
} else {
|
||||||
|
return tl::combine_path (path1, uri2.path ());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (uri2.scheme ().empty ()) {
|
||||||
|
uri1.set_path (uri1.path () + "/" + tl::replaced (path2, "\\", "/"));
|
||||||
|
} else {
|
||||||
|
uri1.set_path (uri1.path () + "/" + uri2.path ());
|
||||||
|
}
|
||||||
|
return uri1.to_abstract_path ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string InputStream::relative_path (const std::string &path1, const std::string &path2)
|
||||||
|
{
|
||||||
|
// TODO: align this implementation with InputStream ctor
|
||||||
|
|
||||||
|
tl::Extractor ex (path2);
|
||||||
|
if (ex.test (":")) {
|
||||||
|
return path2;
|
||||||
|
} else if (ex.test ("pipe:") || ex.test ("data:")) {
|
||||||
|
return path2;
|
||||||
|
}
|
||||||
|
|
||||||
|
tl::URI uri1 (path1);
|
||||||
|
tl::URI uri2 (path2);
|
||||||
|
|
||||||
|
// NOTE: only file schemes are supported as of now
|
||||||
|
if ((uri1.scheme ().empty () || uri1.scheme () == "file") &&
|
||||||
|
(uri2.scheme ().empty () || uri2.scheme () == "file")) {
|
||||||
|
return tl::relative_path (uri1.path (), uri2.path ());
|
||||||
|
}
|
||||||
|
|
||||||
|
return path2;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
InputStream::get (size_t n, bool bypass_inflate)
|
InputStream::get (size_t n, bool bypass_inflate)
|
||||||
{
|
{
|
||||||
// if deflating, employ the deflate filter to get the data
|
// if deflating, employ the deflate filter to get the data
|
||||||
|
|
|
||||||
|
|
@ -531,7 +531,7 @@ public:
|
||||||
*
|
*
|
||||||
* Returns an empty string if no absolute path is available.
|
* Returns an empty string if no absolute path is available.
|
||||||
*/
|
*/
|
||||||
std::string absolute_path () const
|
std::string absolute_file_path () const
|
||||||
{
|
{
|
||||||
return mp_delegate->absolute_path ();
|
return mp_delegate->absolute_path ();
|
||||||
}
|
}
|
||||||
|
|
@ -549,9 +549,34 @@ public:
|
||||||
void close ();
|
void close ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the absolute path for a given URL
|
* @brief Gets the absolute, abstract path for a given abstract path
|
||||||
*/
|
*/
|
||||||
static std::string absolute_path (const std::string &path);
|
static std::string absolute_file_path (const std::string &apath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the absolute path for a given abstract path
|
||||||
|
*/
|
||||||
|
static bool is_absolute (const std::string &apath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets a value indicating whether the path is a file path
|
||||||
|
*/
|
||||||
|
static bool is_file_path (const std::string &apath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the file path (no scheme) if it applies to the given abstract path
|
||||||
|
*/
|
||||||
|
static std::string as_file_path (const std::string &apath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Combines two abstract paths
|
||||||
|
*/
|
||||||
|
static std::string combine (const std::string &apath1, const std::string &apath2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the relative abstract path of path2 vs. path1
|
||||||
|
*/
|
||||||
|
static std::string relative_path (const std::string &apath1, const std::string &apath2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the base reader (delegate)
|
* @brief Gets the base reader (delegate)
|
||||||
|
|
@ -621,7 +646,7 @@ public:
|
||||||
|
|
||||||
virtual std::string absolute_path () const
|
virtual std::string absolute_path () const
|
||||||
{
|
{
|
||||||
return m_inflating_stream.absolute_path ();
|
return m_inflating_stream.absolute_file_path ();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string filename () const
|
virtual std::string filename () const
|
||||||
|
|
|
||||||
|
|
@ -479,3 +479,111 @@ TEST(RefuseToWrite)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(AbstractPathFunctions)
|
||||||
|
{
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path (""), tl::absolute_file_path ("."));
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("."), tl::absolute_file_path ("."));
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("pipe:xyz"), "pipe:xyz");
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("data:xyz"), "data:xyz");
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("https:xyz"), "https:xyz");
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("http:xyz"), "http:xyz");
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path (":xyz"), ":xyz");
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("file:xyz"), tl::absolute_file_path ("xyz"));
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("xyz"), tl::absolute_file_path ("xyz"));
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("xyz/uvw"), tl::absolute_file_path ("xyz/uvw"));
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("/xyz/uvw"), "/xyz/uvw");
|
||||||
|
tl::file_utils_force_windows ();
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("xyz\\uvw"), tl::absolute_file_path ("xyz\\uvw"));
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("\\\\server\\xyz\\uvw"), "\\\\server\\xyz\\uvw");
|
||||||
|
EXPECT_EQ (tl::InputStream::absolute_file_path ("c:\\xyz\\uvw"), "c:\\xyz\\uvw");
|
||||||
|
tl::file_utils_force_reset ();
|
||||||
|
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute (""), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("."), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("pipe:xyz"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("data:xyz"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("https:xyz"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("http:xyz"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute (":xyz"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("file:xyz"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("xyz"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("xyz/uvw"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("/xyz/uvw"), true);
|
||||||
|
tl::file_utils_force_windows ();
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("xyz\\uvw"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("\\\\server\\xyz\\uvw"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_absolute ("c:\\xyz\\uvw"), true);
|
||||||
|
tl::file_utils_force_reset ();
|
||||||
|
|
||||||
|
tl::file_utils_force_windows ();
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", ""), "a");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("", "b"), "\\b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "b"), "a\\b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "b/c"), "a\\b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "b\\c"), "a\\b\\c");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "data:abc"), "data:abc");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("data:a", "b"), "b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("pipe:a", "b"), "b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine (":a", "b"), ":a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("https://a", "b"), "https://a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("https://a", "https:b"), "https:b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "https:b"), "https:b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "file:b"), "a\\b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "file:\\b"), "file:\\b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("file:a", "file:b"), "file:a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("file:a", "file:b/c"), "file:a/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("file:a", "b\\c"), "file:a/b/c");
|
||||||
|
tl::file_utils_force_linux ();
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "b"), "a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("", "b"), "/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "b/c"), "a/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "data:abc"), "data:abc");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("data:a", "b"), "b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("pipe:a", "b"), "b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine (":a", "b"), ":a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("https://a", "b"), "https://a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("https://a", "https:b"), "https:b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "https:b"), "https:b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "file:b"), "a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("a", "file:/b"), "file:/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("file:a", "file:b"), "file:a/b");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("file:a", "file:b/c"), "file:a/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::combine ("file:a", "b/c"), "file:a/b/c");
|
||||||
|
tl::file_utils_force_reset ();
|
||||||
|
|
||||||
|
tl::file_utils_force_linux ();
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("", "file:/a/b/c"), "/a/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path (".", "file:/a/b/c"), "/a/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("https://x", "a/b/c"), "a/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("file:/a/b", "file:/a/b/c"), "c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("/a/b", "/a/b/c"), "c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("/a/b", "/x/b/c"), "/x/b/c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("file:/a/b", "file:/a/b/c"), "c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("/a/b", "/a/b/c"), "c");
|
||||||
|
tl::file_utils_force_windows ();
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("/a/b", "/a/b/c"), "c");
|
||||||
|
EXPECT_EQ (tl::InputStream::relative_path ("/a/b", "\\a\\b\\c\\d"), "c\\d");
|
||||||
|
tl::file_utils_force_reset ();
|
||||||
|
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path (""), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path (":abc"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path ("pipe:abc"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path ("data:abc"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path ("http:abc"), false);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path ("file:abc"), true);
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path ("a/b/c"), true);
|
||||||
|
tl::file_utils_force_windows ();
|
||||||
|
EXPECT_EQ (tl::InputStream::is_file_path ("a\\b\\c"), true);
|
||||||
|
tl::file_utils_force_reset ();
|
||||||
|
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path (""), std::string ());
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path (":abc"), std::string ());
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path ("pipe:abc"), std::string ());
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path ("data:abc"), std::string ());
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path ("http:abc"), std::string ());
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path ("file:abc"), "abc");
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path ("a/b/c"), "a/b/c");
|
||||||
|
tl::file_utils_force_windows ();
|
||||||
|
EXPECT_EQ (tl::InputStream::as_file_path ("a\\b\\c"), "a\\b\\c");
|
||||||
|
tl::file_utils_force_reset ();
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue