Index: chrome/browser/sync/util/path_helpers-posix.cc |
=================================================================== |
--- chrome/browser/sync/util/path_helpers-posix.cc (revision 0) |
+++ chrome/browser/sync/util/path_helpers-posix.cc (revision 0) |
@@ -0,0 +1,99 @@ |
+// 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. |
+ |
+#include <pwd.h> |
+ |
+#include <string.h> |
+ |
+#include "base/port.h" |
+#include "chrome/browser/sync/util/path_helpers.h" |
+#include "strings/strutil.h" |
+ |
+#if ((!defined(OS_LINUX)) && (!defined(OS_MACOSX))) |
+#error Compile this file on Mac OS X or Linux only. |
+#endif |
+ |
+PathString ExpandTilde(const PathString& path) { |
+ if (path.empty()) |
+ return path; |
+ if ('~' != path[0]) |
+ return path; |
+ PathString ret; |
+ // TODO(sync): Consider using getpwuid_r. |
+ ret.insert(0, getpwuid(getuid())->pw_dir); |
+ ret.append(++path.begin(), path.end()); |
+ return ret; |
+} |
+ |
+namespace { |
+// TODO(sync): We really should use char[]. |
+string cache_dir_; |
+} |
+ |
+void set_cache_dir(string cache_dir) { |
+ CHECK(cache_dir_.empty()); |
+ cache_dir_ = cache_dir; |
+} |
+ |
+string get_cache_dir() { |
+ CHECK(!cache_dir_.empty()); |
+ return cache_dir_; |
+} |
+ |
+// On Posix, PathStrings are UTF-8, not UTF-16 as they are on Windows. |
+// Thus, this function is different from the Windows version. |
+PathString TruncatePathString(const PathString& original, int length) { |
+ if (original.size() <= length) |
+ return original; |
+ if (length <= 0) |
+ return original; |
+ PathString ret(original.begin(), original.begin() + length); |
+ COMPILE_ASSERT(sizeof(PathChar) == sizeof(uint8), PathStringNotUTF8); |
+ PathString::reverse_iterator last_char = ret.rbegin(); |
+ |
+ // Values taken from |
+ // http://en.wikipedia.org/w/index.php?title=UTF-8&oldid=252875566 |
+ if (0 == (*last_char & 0x80)) |
+ return ret; |
+ |
+ for (; last_char != ret.rend(); ++last_char) { |
+ if (0 == (*last_char & 0x80)) { |
+ // got malformed UTF-8; bail |
+ return ret; |
+ } |
+ if (0 == (*last_char & 0x40)) { |
+ // got another trailing byte |
+ continue; |
+ } |
+ break; |
+ } |
+ |
+ if (ret.rend() == last_char) { |
+ // We hit the beginning of the string. bail. |
+ return ret; |
+ } |
+ |
+ int last_codepoint_len = last_char - ret.rbegin() + 1; |
+ |
+ if (((0xC0 == (*last_char & 0xE0)) && (2 == last_codepoint_len)) || |
+ ((0xE0 == (*last_char & 0xF0)) && (3 == last_codepoint_len)) || |
+ ((0xF0 == (*last_char & 0xF8)) && (4 == last_codepoint_len))) { |
+ // Valid utf-8. |
+ return ret; |
+ } |
+ |
+ // Invalid utf-8. chop off last "codepoint" and return. |
+ ret.resize(ret.size() - last_codepoint_len); |
+ return ret; |
+} |
+ |
+// Convert /s to :s . |
+PathString MakePathComponentOSLegal(const PathString& component) { |
+ if (PathString::npos == component.find("/")) |
+ return PSTR(""); |
+ PathString new_name; |
+ new_name.reserve(component.size()); |
+ StringReplace(component, "/", ":", true, &new_name); |
+ return new_name; |
+} |
Property changes on: chrome\browser\sync\util\path_helpers-posix.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |