return false;
}
- Buffer::iterator rfindSep(void) {
- Buffer::iterator it = buffer.end();
+public:
- // Skip trailing '\0'
- assert(it != buffer.begin());
- --it;
- assert(*it == '\0');
+ Buffer::iterator rfindSep(bool skipTrailing = true) {
+ Buffer::iterator it = end();
// Skip trailing separators
- while (it != buffer.begin()) {
- --it;
- if (isSep(*it)) {
- // Halt if find the root
- if (it == buffer.begin()) {
- return it;
+ if (skipTrailing) {
+ while (it != buffer.begin()) {
+ --it;
+ if (isSep(*it)) {
+ // Halt if find the root
+ if (it == buffer.begin()) {
+ return it;
+ }
+ } else {
+ break;
}
- } else {
- break;
}
}
}
}
- return buffer.end();
+ return end();
}
-
-public:
-
/*
* Constructors
*/
insert(end(), other);
}
+ template <class InputIterator>
+ void erase(InputIterator first, InputIterator last) {
+ buffer.erase(first, last);
+ }
+
char *buf(size_t size) {
buffer.resize(size);
return &buffer[0];
*/
void trimDirectory(void) {
iterator sep = rfindSep();
- if (sep != buffer.end()) {
+ if (sep != end()) {
buffer.erase(buffer.begin(), sep + 1);
}
}
iterator sep = rfindSep();
// No separator found, so return '.'
- if (sep == buffer.end()) {
+ if (sep == end()) {
buffer.resize(2);
buffer[0] = '.';
buffer[1] = 0;
String getProcessName();
String getCurrentDir();
+bool createDirectory(const String &path);
+
bool copyFile(const String &srcFileName, const String &dstFileName, bool override = true);
bool removeFile(const String &fileName);
if (snapshotPrefix[0] == '-' && snapshotPrefix[1] == 0) {
os::setBinaryMode(stdout);
retrace::verbosity = -2;
+ } else {
+ /*
+ * Create the snapshot directory if it does not exist.
+ *
+ * We can't just use trimFilename() because when applied to
+ * "/foo/boo/" it would merely return "/foo".
+ *
+ * XXX: create nested directories.
+ */
+ os::String prefix(snapshotPrefix);
+ os::String::iterator sep = prefix.rfindSep(false);
+ if (sep != prefix.end()) {
+ prefix.erase(sep, prefix.end());
+ if (!os::createDirectory(prefix)) {
+ std::cerr << "error: failed to create " << prefix.str() << "\n";
+ }
+ }
}
break;
case SNAPSHOT_FORMAT_OPT: