mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
Add QUtil::path_basename
This commit is contained in:
parent
f21e4f264a
commit
0b1623d07d
@ -1,5 +1,7 @@
|
|||||||
2021-02-18 Jay Berkenbilt <ejb@ql.org>
|
2021-02-18 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Add QUtil::path_basename to get last element of a path.
|
||||||
|
|
||||||
* Add examples/pdf-attach-file.cc to illustrate new file
|
* Add examples/pdf-attach-file.cc to illustrate new file
|
||||||
attachment method and also new parse that takes indirect objects.
|
attachment method and also new parse that takes indirect objects.
|
||||||
|
|
||||||
|
@ -130,14 +130,22 @@ namespace QUtil
|
|||||||
// Write the contents of filename as a binary file to the
|
// Write the contents of filename as a binary file to the
|
||||||
// pipeline.
|
// pipeline.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
void
|
void pipe_file(char const* filename, Pipeline* p);
|
||||||
pipe_file(char const* filename, Pipeline* p);
|
|
||||||
|
|
||||||
// Return a function that will send the contents of the given file
|
// Return a function that will send the contents of the given file
|
||||||
// through the given pipeline as binary data.
|
// through the given pipeline as binary data.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
std::function<void(Pipeline*)>
|
std::function<void(Pipeline*)> file_provider(std::string const& filename);
|
||||||
file_provider(std::string const& filename);
|
|
||||||
|
// Return the last path element. On Windows, either / or \ are
|
||||||
|
// path separators. Otherwise, only / is a path separator. Strip
|
||||||
|
// any trailing path separators. Then, if any path separators
|
||||||
|
// remain, return everything after the last path separator.
|
||||||
|
// Otherwise, return the whole string. As a special case, if a
|
||||||
|
// string consists entirely of path separators, the first
|
||||||
|
// character is returned.
|
||||||
|
QPDF_DLL
|
||||||
|
std::string path_basename(std::string const& filename);
|
||||||
|
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
char* copy_string(std::string const&);
|
char* copy_string(std::string const&);
|
||||||
|
@ -663,6 +663,37 @@ QUtil::file_provider(std::string const& filename)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
QUtil::path_basename(std::string const& filename)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
char const* pathsep = "/\\";
|
||||||
|
#else
|
||||||
|
char const* pathsep = "/";
|
||||||
|
#endif
|
||||||
|
std::string last = filename;
|
||||||
|
auto len = last.length();
|
||||||
|
while (len > 1)
|
||||||
|
{
|
||||||
|
auto pos = last.find_last_of(pathsep);
|
||||||
|
if (pos == len - 1)
|
||||||
|
{
|
||||||
|
last.pop_back();
|
||||||
|
--len;
|
||||||
|
}
|
||||||
|
else if (pos == std::string::npos)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last = last.substr(pos + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
QUtil::copy_string(std::string const& str)
|
QUtil::copy_string(std::string const& str)
|
||||||
{
|
{
|
||||||
|
@ -97,6 +97,13 @@ file1: -qutil.out-, file2: -other-file-; same: 0: PASS
|
|||||||
file1: -qutil.out-, file2: --; same: 0: PASS
|
file1: -qutil.out-, file2: --; same: 0: PASS
|
||||||
file1: -qutil.out-, file2: -(null)-; same: 0: PASS
|
file1: -qutil.out-, file2: -(null)-; same: 0: PASS
|
||||||
file1: --, file2: -qutil.out-; same: 0: PASS
|
file1: --, file2: -qutil.out-; same: 0: PASS
|
||||||
|
---- path
|
||||||
|
//// -> /
|
||||||
|
a/b/cdef -> cdef
|
||||||
|
a/b/cdef/ -> cdef
|
||||||
|
/ -> /
|
||||||
|
->
|
||||||
|
quack -> quack
|
||||||
---- read from file
|
---- read from file
|
||||||
This file is used for qutil testing.
|
This file is used for qutil testing.
|
||||||
It has mixed newlines.
|
It has mixed newlines.
|
||||||
|
@ -439,6 +439,29 @@ void same_file_test()
|
|||||||
assert_same_file("", "qutil.out", false);
|
assert_same_file("", "qutil.out", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void path_test()
|
||||||
|
{
|
||||||
|
auto check = [](bool print, std::string const& a, std::string const& b) {
|
||||||
|
auto result = QUtil::path_basename(a);
|
||||||
|
if (print)
|
||||||
|
{
|
||||||
|
std::cout << a << " -> " << result << std::endl;
|
||||||
|
}
|
||||||
|
assert(result == b);
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
check(false, "asdf\\qwer", "qwer");
|
||||||
|
check(false, "asdf\\qwer/\\", "qwer");
|
||||||
|
#endif
|
||||||
|
check(true, "////", "/");
|
||||||
|
check(true, "a/b/cdef", "cdef");
|
||||||
|
check(true, "a/b/cdef/", "cdef");
|
||||||
|
check(true, "/", "/");
|
||||||
|
check(true, "", "");
|
||||||
|
check(true, "quack", "quack");
|
||||||
|
}
|
||||||
|
|
||||||
void read_from_file_test()
|
void read_from_file_test()
|
||||||
{
|
{
|
||||||
std::list<std::string> lines = QUtil::read_lines_from_file("other-file");
|
std::list<std::string> lines = QUtil::read_lines_from_file("other-file");
|
||||||
@ -636,6 +659,8 @@ int main(int argc, char* argv[])
|
|||||||
get_whoami_test();
|
get_whoami_test();
|
||||||
std::cout << "---- file" << std::endl;
|
std::cout << "---- file" << std::endl;
|
||||||
same_file_test();
|
same_file_test();
|
||||||
|
std::cout << "---- path" << std::endl;
|
||||||
|
path_test();
|
||||||
std::cout << "---- read from file" << std::endl;
|
std::cout << "---- read from file" << std::endl;
|
||||||
read_from_file_test();
|
read_from_file_test();
|
||||||
std::cout << "---- hex encode/decode" << std::endl;
|
std::cout << "---- hex encode/decode" << std::endl;
|
||||||
|
@ -5283,6 +5283,12 @@ print "\n";
|
|||||||
matrices.
|
matrices.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Add <function>QUtil::path_basename</function> to return the
|
||||||
|
last element of a path.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
Loading…
Reference in New Issue
Block a user