summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/util/path_helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/util/path_helpers.h')
-rw-r--r--chrome/browser/sync/util/path_helpers.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/chrome/browser/sync/util/path_helpers.h b/chrome/browser/sync/util/path_helpers.h
new file mode 100644
index 0000000..d8b4663
--- /dev/null
+++ b/chrome/browser/sync/util/path_helpers.h
@@ -0,0 +1,105 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SYNC_UTIL_PATH_HELPERS_H_
+#define CHROME_BROWSER_SYNC_UTIL_PATH_HELPERS_H_
+
+#include <algorithm>
+#include <iterator>
+#include <string>
+
+#include "chrome/browser/sync/util/compat-file.h"
+#include "chrome/browser/sync/util/sync_types.h"
+
+template <typename StringType>
+class PathSegmentIterator : public std::iterator<std::forward_iterator_tag,
+ StringType> {
+ public:
+ explicit PathSegmentIterator(const StringType& path) :
+ path_(path), segment_begin_(0), segment_end_(0) {
+ ++(*this);
+ }
+
+ PathSegmentIterator() : segment_begin_(0), segment_end_(0) { }
+
+ // Default copy constructors, constructors, etc. will all do the right thing.
+ PathSegmentIterator& operator ++() {
+ segment_begin_ =
+ std::min(path_.size(),
+ path_.find_first_not_of(kPathSeparator, segment_end_));
+ segment_end_ =
+ std::min(path_.size(),
+ path_.find_first_of(kPathSeparator, segment_begin_));
+ value_.assign(path_, segment_begin_, segment_end_ - segment_begin_);
+ return *this;
+ }
+
+ PathSegmentIterator operator ++(int) {
+ PathSegmentIterator i(*this);
+ return ++i;
+ }
+
+ const StringType& operator * () const {
+ return value_;
+ }
+ const StringType* operator -> () const {
+ return &value_;
+ }
+
+ // If the current value and remaining path are equal, then we
+ // call the iterators equal.
+ bool operator == (const PathSegmentIterator& i) const {
+ return 0 == path_.compare(segment_begin_,
+ path_.size() - segment_begin_,
+ i.path_, i.segment_begin_, i.path_.size() - i.segment_begin_);
+ }
+
+ bool operator != (const PathSegmentIterator& i) const {
+ return !(*this == i);
+ }
+
+ protected:
+ StringType path_;
+ typename StringType::size_type segment_begin_;
+ typename StringType::size_type segment_end_;
+ StringType value_;
+};
+
+// NOTE: The functions (Strip)LastPathSegment always return values without a
+// trailing slash.
+PathString LastPathSegment(const PathString& path);
+std::string LastPathSegment(const std::string& path);
+PathString AppendSlash(const PathString& path);
+PathString GetFullPath(const PathString& path);
+PathString LowercasePath(const PathString& path);
+PathString ExpandTilde(const PathString& path);
+
+inline bool HasSuffixPathString(const PathString& str,
+ const PathString& suffix) {
+ return str.find(suffix, str.size() - suffix.size()) != PathString::npos;
+}
+
+inline PathString StripSuffixPathString(const PathString& str,
+ const PathString& suffix) {
+ PathString ret(str);
+ if (HasSuffixPathString(str, suffix)) {
+ ret.resize(str.size() - suffix.size());
+ }
+ return ret;
+}
+
+// Returns a string with length or fewer elements, careful to
+// not truncate a string mid-surrogate pair.
+PathString TruncatePathString(const PathString& original, int length);
+
+// Makes a path component legal for your OS, but doesn't handle collisions
+// with other files in the same directory. it can do this by removing
+// illegal characters and adding ~1 before the first '.' in the filename.
+// returns PSTR("") if the name is fine as-is
+// on mac/linux we let names stay unicode normalization form C in the system
+// and convert to another normal form in fuse handlers. but, if a '/' is in
+// a filename, we handle it here.
+PathString MakePathComponentOSLegal(const PathString& component);
+
+#endif // CHROME_BROWSER_SYNC_UTIL_PATH_HELPERS_H_