aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/dtc/string.cc
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/dtc/string.cc')
-rw-r--r--usr.bin/dtc/string.cc27
1 files changed, 14 insertions, 13 deletions
diff --git a/usr.bin/dtc/string.cc b/usr.bin/dtc/string.cc
index afc7bfc456d6..8891556a5493 100644
--- a/usr.bin/dtc/string.cc
+++ b/usr.bin/dtc/string.cc
@@ -31,6 +31,7 @@
*/
#include <string>
+#include <functional>
#include <cstdio>
#include <cstdlib>
#include <ctype.h>
@@ -121,28 +122,28 @@ push_string(byte_buffer &buffer, const string &s, bool escapes)
}
}
-std::string dirname(const string &s)
+namespace {
+string
+dirbasename(std::function<char*(char*)> fn, const string &s)
{
if (s == string())
{
return string();
}
- char *str = strdup(s.c_str());
- string dn(::dirname(str));
- free(str);
+ std::unique_ptr<char, decltype(free)*> str = {strdup(s.c_str()), free};
+ string dn(fn(str.get()));
return dn;
}
+}
-std::string basename(const string &s)
+string dirname(const string &s)
{
- if (s == string())
- {
- return string();
- }
- char *str = strdup(s.c_str());
- string bn(::basename(str));
- free(str);
- return bn;
+ return dirbasename(::dirname, s);
+}
+
+string basename(const string &s)
+{
+ return dirbasename(::basename, s);
}
} // namespace dtc