Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: base/file_path.cc

Issue 335042: Revert 30149 - The existing file_util::AbsolutePath() function was already do... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/file_path.h ('k') | base/file_path_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/file_path.h" 5 #include "base/file_path.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 7
8 // These includes are just for the *Hack functions, and should be removed 8 // These includes are just for the *Hack functions, and should be removed
9 // when those functions are removed. 9 // when those functions are removed.
10 #include "base/string_piece.h" 10 #include "base/string_piece.h"
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 } 151 }
152 152
153 bool FilePath::operator!=(const FilePath& that) const { 153 bool FilePath::operator!=(const FilePath& that) const {
154 #if defined(FILE_PATH_USES_DRIVE_LETTERS) 154 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
155 return !EqualDriveLetterCaseInsensitive(this->path_, that.path_); 155 return !EqualDriveLetterCaseInsensitive(this->path_, that.path_);
156 #else // defined(FILE_PATH_USES_DRIVE_LETTERS) 156 #else // defined(FILE_PATH_USES_DRIVE_LETTERS)
157 return path_ != that.path_; 157 return path_ != that.path_;
158 #endif // defined(FILE_PATH_USES_DRIVE_LETTERS) 158 #endif // defined(FILE_PATH_USES_DRIVE_LETTERS)
159 } 159 }
160 160
161 bool FilePath::AppendAndResolveRelative(const FilePath& relative_path,
162 FilePath* path) const {
163 DCHECK(path);
164 if (!path || relative_path.IsAbsolute())
165 return false;
166
167 FilePath full_path = Append(relative_path);
168 // Is it worth looking for parent references?
169 if (!full_path.ReferencesParent()) {
170 *path = full_path;
171 return true;
172 }
173
174 // If the parent has a drive letter, then we must not remove the first
175 // component, which is the drive letter.
176 bool drive_letter = (FindDriveLetter(full_path.path_) !=
177 FilePath::StringType::npos);
178
179 std::vector<FilePath::StringType> components;
180 full_path.GetComponents(&components);
181 std::vector<FilePath::StringType>::iterator it = components.begin();
182 // Start by removing any kCurrentDirectory component, since they may
183 // fool us into not going back to the appropriate parent level.
184 for (; it != components.end(); ++it) {
185 if (*it == kCurrentDirectory) {
186 // erase returns an iterator to the next component.
187 it = components.erase(it);
188 // So now, go back to previous iterator,
189 // so that we can appropriately process the next one as we loop.
190 --it;
191 }
192 }
193
194 // Now parse the component looking for kParentDirectory and remove them as
195 // well as the previous component.
196 it = components.begin();
197 for (; it != components.end(); ++it) {
198 if (*it == kParentDirectory) {
199 // Did we reach the beginning?
200 if (it == components.begin() ||
201 (drive_letter && (it - 1) == components.begin())) {
202 return false;
203 }
204 // Remove the previous component, as well as the current one.
205 std::vector<FilePath::StringType>::iterator previous = it - 1;
206 // Unless the previous is at the beginning.
207 if (previous == components.begin() ||
208 (drive_letter && (previous - 1) == components.begin())) {
209 return false;
210 }
211 // vector::erase doesn't erase _Last, it erases [_First, _Last[,
212 // so we must increment current which we want erased.
213 it = components.erase(previous, it + 1);
214 // And go back to previous so that we can process the next one as we loop.
215 --it;
216 }
217 }
218
219 // Now reconstruct the path with the components that were left in.
220 it = components.begin();
221 // We start with the first component, in case it is absolute
222 // and absolute paths can't be appended.
223 *path = FilePath(*it);
224 for (++it; it != components.end(); ++it)
225 *path = path->Append(*it);
226
227 return true;
228 }
229
161 bool FilePath::IsParent(const FilePath& child) const { 230 bool FilePath::IsParent(const FilePath& child) const {
162 return AppendRelativePath(child, NULL); 231 return AppendRelativePath(child, NULL);
163 } 232 }
164 233
165 bool FilePath::AppendRelativePath(const FilePath& child, 234 bool FilePath::AppendRelativePath(const FilePath& child,
166 FilePath* path) const { 235 FilePath* path) const {
167 std::vector<FilePath::StringType> parent_components; 236 std::vector<FilePath::StringType> parent_components;
168 std::vector<FilePath::StringType> child_components; 237 std::vector<FilePath::StringType> child_components;
169 GetComponents(&parent_components); 238 GetComponents(&parent_components);
170 child.GetComponents(&child_components); 239 child.GetComponents(&child_components);
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 546
478 std::vector<FilePath::StringType>::const_iterator it = components.begin(); 547 std::vector<FilePath::StringType>::const_iterator it = components.begin();
479 for (; it != components.end(); ++it) { 548 for (; it != components.end(); ++it) {
480 const FilePath::StringType& component = *it; 549 const FilePath::StringType& component = *it;
481 if (component == kParentDirectory) 550 if (component == kParentDirectory)
482 return true; 551 return true;
483 } 552 }
484 return false; 553 return false;
485 } 554 }
486 555
OLDNEW
« no previous file with comments | « base/file_path.h ('k') | base/file_path_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698