summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/zippath.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/zippath.cpp')
-rw-r--r--src/lib/util/zippath.cpp128
1 files changed, 39 insertions, 89 deletions
diff --git a/src/lib/util/zippath.cpp b/src/lib/util/zippath.cpp
index 249d5643d89..f85a81ed079 100644
--- a/src/lib/util/zippath.cpp
+++ b/src/lib/util/zippath.cpp
@@ -46,21 +46,16 @@ int is_path_separator(char c)
// is_root - tests to see if this path is the root
// -------------------------------------------------
-bool is_root(std::string const &path)
+bool is_root(std::string_view path)
{
// FIXME: get rid of the assumption that paths are DOS-like
- std::string::size_type i = 0;
-
// skip drive letter
- if (isalpha(path[i]) && (path[i + 1] == ':'))
- i += 2;
+ if (path.length() >= 2 && isalpha(path[0]) && (path[1] == ':'))
+ path.remove_prefix(2);
// skip path separators
- while (is_path_separator(path[i]))
- i++;
-
- return path[i] == '\0';
+ return path.find_first_not_of(PATH_SEPARATOR) == std::string_view::npos;
}
@@ -72,8 +67,7 @@ bool is_root(std::string const &path)
bool is_7z_file(std::string const &path)
{
- auto const s = path.rfind('.');
- return (std::string::npos != s) && !core_stricmp(path.c_str() + s, ".7z");
+ return core_filename_ends_with(path, ".7z");
}
@@ -84,8 +78,7 @@ bool is_7z_file(std::string const &path)
bool is_zip_file(std::string const &path)
{
- auto const s = path.rfind('.');
- return (std::string::npos != s) && !core_stricmp(path.c_str() + s, ".zip");
+ return core_filename_ends_with(path, ".7zip");
}
@@ -119,7 +112,7 @@ bool is_zip_path_separator(char c)
// character, normalizing separators as '/'
// -------------------------------------------------
-char next_path_char(std::string const &s, std::string::size_type &pos)
+char next_path_char(std::string_view s, std::string_view::size_type &pos)
{
// skip over any initial separators
if (pos == 0)
@@ -158,11 +151,11 @@ char next_path_char(std::string const &s, std::string::size_type &pos)
// type of a sub path in a zip file
// -------------------------------------------------
-int zippath_find_sub_path(archive_file &zipfile, std::string const &subpath, osd::directory::entry::entry_type &type)
+int zippath_find_sub_path(archive_file &zipfile, std::string_view subpath, osd::directory::entry::entry_type &type)
{
for (int header = zipfile.first_file(); header >= 0; header = zipfile.next_file())
{
- std::string::size_type i = 0, j = 0;
+ std::string_view::size_type i = 0, j = 0;
char c1, c2;
do
{
@@ -196,23 +189,20 @@ int zippath_find_sub_path(archive_file &zipfile, std::string const &subpath, osd
// parse_parent_path - parses out the parent path
// -------------------------------------------------
-void parse_parent_path(const std::string &path, std::string::size_type *beginpos, std::string::size_type *endpos)
+void parse_parent_path(std::string_view path, std::string_view::size_type *beginpos, std::string_view::size_type *endpos)
{
- std::string::size_type length = path.length();
- std::string::size_type pos;
+ std::string_view::size_type pos;
// skip over trailing path separators
- pos = length ? (length - 1) : std::string::npos;
- while ((pos > 0) && (pos != std::string::npos) && is_path_separator(path[pos]))
- pos--;
+ pos = path.find_last_not_of(PATH_SEPARATOR);
// return endpos
if (endpos != nullptr)
*endpos = pos;
// now skip until we find a path separator
- while ((pos != std::string::npos) && !is_path_separator(path[pos]))
- pos = (pos > 0) ? pos - 1 : std::string::npos;
+ while ((pos != std::string_view::npos) && !is_path_separator(path[pos]))
+ pos = (pos > 0) ? pos - 1 : std::string_view::npos;
// return beginpos
if (beginpos != nullptr)
@@ -225,7 +215,7 @@ void parse_parent_path(const std::string &path, std::string::size_type *beginpos
// true path and ZIP entry components
// -------------------------------------------------
-osd_file::error zippath_resolve(const char *path, osd::directory::entry::entry_type &entry_type, archive_file::ptr &zipfile, std::string &newpath)
+osd_file::error zippath_resolve(std::string_view path, osd::directory::entry::entry_type &entry_type, archive_file::ptr &zipfile, std::string &newpath)
{
newpath.clear();
@@ -240,10 +230,10 @@ osd_file::error zippath_resolve(const char *path, osd::directory::entry::entry_t
do
{
// trim the path of trailing path separators
- auto i = apath.length();
- while ((i > 1) && is_path_separator(apath[i - 1]))
- i--;
- apath.resize(i);
+ auto i = apath.find_last_not_of(PATH_SEPARATOR);
+ if (i == std::string::npos)
+ break;
+ apath = apath.substr(0, i + 1);
apath_trimmed = apath;
// stat the path
@@ -274,10 +264,10 @@ osd_file::error zippath_resolve(const char *path, osd::directory::entry::entry_t
((is_zip_file(apath_trimmed) && (archive_file::open_zip(apath_trimmed, zipfile) == archive_file::error::NONE)) ||
(is_7z_file(apath_trimmed) && (archive_file::open_7z(apath_trimmed, zipfile) == archive_file::error::NONE))))
{
- auto i = strlen(path + apath.length());
+ auto i = path.length() - apath.length();
while ((i > 0) && is_zip_path_separator(path[apath.length() + i - 1]))
i--;
- newpath.assign(path + apath.length(), i);
+ newpath.assign(path, apath.length(), i);
// this was a true ZIP path - attempt to identify the type of path
zippath_find_sub_path(*zipfile, newpath, current_entry_type);
@@ -524,10 +514,10 @@ private:
};
-class filesystem_diectory_impl : public zippath_directory_base
+class filesystem_directory_impl : public zippath_directory_base
{
public:
- filesystem_diectory_impl(std::string const &path) : zippath_directory_base(!is_root(path)), m_directory(osd::directory::open(path))
+ filesystem_directory_impl(std::string_view path) : zippath_directory_base(!is_root(path)), m_directory(osd::directory::open(std::string(path)))
{
}
@@ -573,7 +563,7 @@ private:
// zippath_directory::open - opens a directory
// -------------------------------------------------
-osd_file::error zippath_directory::open(std::string const &path, ptr &directory)
+osd_file::error zippath_directory::open(std::string_view path, ptr &directory)
{
try
{
@@ -581,7 +571,7 @@ osd_file::error zippath_directory::open(std::string const &path, ptr &directory)
osd::directory::entry::entry_type entry_type;
archive_file::ptr zipfile;
std::string zipprefix;
- osd_file::error const err = zippath_resolve(path.c_str(), entry_type, zipfile, zipprefix);
+ osd_file::error const err = zippath_resolve(path, entry_type, zipfile, zipprefix);
if (osd_file::error::NONE != err)
return err;
@@ -598,7 +588,7 @@ osd_file::error zippath_directory::open(std::string const &path, ptr &directory)
else
{
// a conventional directory
- std::unique_ptr<filesystem_diectory_impl> result(new filesystem_diectory_impl(path));
+ std::unique_ptr<filesystem_directory_impl> result(new filesystem_directory_impl(path));
if (!*result)
return osd_file::error::FAILURE;
@@ -627,12 +617,12 @@ zippath_directory::~zippath_directory()
// zippath_parent - retrieves the parent directory
// -------------------------------------------------
-std::string &zippath_parent(std::string &dst, const std::string &path)
+std::string &zippath_parent(std::string &dst, std::string_view path)
{
- std::string::size_type pos;
+ std::string_view::size_type pos;
parse_parent_path(path, &pos, nullptr);
- if (pos != std::string::npos)
+ if (pos != std::string_view::npos)
dst = path.substr(0, pos + 1);
else
dst.clear();
@@ -645,7 +635,7 @@ std::string &zippath_parent(std::string &dst, const std::string &path)
// zippath_parent - retrieves the parent directory
// -------------------------------------------------
-std::string zippath_parent(const std::string &path)
+std::string zippath_parent(std::string_view path)
{
std::string result;
zippath_parent(result, path);
@@ -655,46 +645,6 @@ std::string zippath_parent(const std::string &path)
// -------------------------------------------------
-// zippath_parent_basename - retrieves the parent
-// directory basename
-// -------------------------------------------------
-
-/**
- * @fn std::string &zippath_parent_basename(std::string &dst, const std::string &path)
- *
- * @brief Zippath parent basename.
- *
- * @param [in,out] dst Destination for the.
- * @param path Full pathname of the file.
- *
- * @return A std::string&amp;
- */
-
-std::string &zippath_parent_basename(std::string &dst, const std::string &path)
-{
- std::string::size_type beginpos, endpos;
- parse_parent_path(path, &beginpos, &endpos);
- dst.copy((char*)(path.c_str() + beginpos + 1), endpos - beginpos);
- return dst;
-}
-
-
-
-// -------------------------------------------------
-// zippath_parent_basename - retrieves the parent
-// directory basename
-// -------------------------------------------------
-
-std::string zippath_parent_basename(const std::string &path)
-{
- std::string result;
- zippath_parent_basename(result, path);
- return result;
-}
-
-
-
-// -------------------------------------------------
// zippath_combine - combines two paths
// -------------------------------------------------
@@ -759,7 +709,7 @@ std::string zippath_combine(const std::string &path1, const std::string &path2)
// -------------------------------------------------
/**
- * @fn osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
+ * @fn osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
*
* @brief Zippath fopen.
*
@@ -771,7 +721,7 @@ std::string zippath_combine(const std::string &path1, const std::string &path2)
* @return A osd_file::error.
*/
-osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
+osd_file::error zippath_fopen(std::string_view filename, uint32_t openflags, util::core_file::ptr &file, std::string &revised_path)
{
osd_file::error filerr = osd_file::error::NOT_FOUND;
archive_file::error ziperr;
@@ -787,7 +737,7 @@ osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, u
/* loop through */
while((file == nullptr) && (mainpath.length() > 0)
- && ((openflags == OPEN_FLAG_READ) || (subpath.length() == 0)))
+ && ((openflags == OPEN_FLAG_READ) || subpath.empty()))
{
/* is the mainpath a ZIP path? */
if (is_zip_file(mainpath) || is_7z_file(mainpath))
@@ -803,7 +753,7 @@ osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, u
goto done;
}
- if (subpath.length() > 0)
+ if (!subpath.empty())
header = zippath_find_sub_path(*zip, subpath, entry_type);
else
header = zip->first_file();
@@ -820,7 +770,7 @@ osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, u
goto done;
/* update subpath, if appropriate */
- if (subpath.length() == 0)
+ if (subpath.empty())
subpath.assign(zip->current_name());
/* we're done */
@@ -828,8 +778,8 @@ osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, u
}
}
- if (subpath.length() == 0)
- filerr = util::core_file::open(filename, openflags, file);
+ if (subpath.empty())
+ filerr = util::core_file::open(std::string(filename), openflags, file);
else
filerr = osd_file::error::NOT_FOUND;
@@ -840,7 +790,7 @@ osd_file::error zippath_fopen(const std::string &filename, uint32_t openflags, u
auto temp = zippath_parent(mainpath);
/* append to the sub path */
- if (subpath.length() > 0)
+ if (!subpath.empty())
{
std::string temp2;
mainpath = mainpath.substr(temp.length());
@@ -872,7 +822,7 @@ done:
if (filerr == osd_file::error::NONE)
{
revised_path = alloc_fullpath;
- if (subpath.length() > 0)
+ if (!subpath.empty())
revised_path.append(PATH_SEPARATOR).append(subpath);
}
}