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

Side by Side Diff: base/file_path.cc

Issue 267051: Minimize dependency of user scripts.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months 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
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,
Mark Mentovai 2009/10/23 21:29:40 This is wrong and we need to remove it. We can't
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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 return FilePath(component); 450 return FilePath(component);
382 } 451 }
383 452
384 FilePath new_path(path_); 453 FilePath new_path(path_);
385 new_path.StripTrailingSeparatorsInternal(); 454 new_path.StripTrailingSeparatorsInternal();
386 455
387 // Don't append a separator if the path is empty (indicating the current 456 // Don't append a separator if the path is empty (indicating the current
388 // directory) or if the path component is empty (indicating nothing to 457 // directory) or if the path component is empty (indicating nothing to
389 // append). 458 // append).
390 if (component.length() > 0 && new_path.path_.length() > 0) { 459 if (component.length() > 0 && new_path.path_.length() > 0) {
391
392 // Don't append a separator if the path still ends with a trailing 460 // Don't append a separator if the path still ends with a trailing
393 // separator after stripping (indicating the root directory). 461 // separator after stripping (indicating the root directory).
394 if (!IsSeparator(new_path.path_[new_path.path_.length() - 1])) { 462 if (!IsSeparator(new_path.path_[new_path.path_.length() - 1])) {
395
396 // Don't append a separator if the path is just a drive letter. 463 // Don't append a separator if the path is just a drive letter.
397 if (FindDriveLetter(new_path.path_) + 1 != new_path.path_.length()) { 464 if (FindDriveLetter(new_path.path_) + 1 != new_path.path_.length()) {
398 new_path.path_.append(1, kSeparators[0]); 465 new_path.path_.append(1, kSeparators[0]);
399 } 466 }
400 } 467 }
401 } 468 }
402 469
403 new_path.path_.append(component); 470 new_path.path_.append(component);
404 return new_path; 471 return new_path;
405 } 472 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 546
480 std::vector<FilePath::StringType>::const_iterator it = components.begin(); 547 std::vector<FilePath::StringType>::const_iterator it = components.begin();
481 for (; it != components.end(); ++it) { 548 for (; it != components.end(); ++it) {
482 const FilePath::StringType& component = *it; 549 const FilePath::StringType& component = *it;
483 if (component == kParentDirectory) 550 if (component == kParentDirectory)
484 return true; 551 return true;
485 } 552 }
486 return false; 553 return false;
487 } 554 }
488 555
OLDNEW
« base/file_path.h ('K') | « 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