From: Evan Martin Date: Fri, 15 Apr 2011 19:26:45 +0000 (-0700) Subject: Merge branch 'master' of github.com:martine/ninja X-Git-Tag: release-120715~451 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e5891f73fea0879851312fbaec8f32490fa4638c;p=platform%2Fupstream%2Fninja.git Merge branch 'master' of github.com:martine/ninja Conflicts: src/util.cc src/util.h --- e5891f73fea0879851312fbaec8f32490fa4638c diff --cc src/util.cc index d0236bc,a2e080f..b68227b --- a/src/util.cc +++ b/src/util.cc @@@ -18,11 -18,9 +18,11 @@@ #include #include +#include + void Fatal(const char* msg, ...) { va_list ap; - fprintf(stderr, "FATAL: "); + fprintf(stderr, "ninja: FATAL: "); va_start(ap, msg); vfprintf(stderr, msg, ap); va_end(ap); @@@ -30,54 -28,11 +30,63 @@@ exit(1); } + void Error(const char* msg, ...) { + va_list ap; + fprintf(stderr, "ninja: error: "); + va_start(ap, msg); + vfprintf(stderr, msg, ap); + va_end(ap); + fprintf(stderr, "\n"); + } ++ +bool CanonicalizePath(std::string* path, std::string* err) { + // Try to fast-path out the common case. + if (path->find("/.") == std::string::npos && + path->find("./") == std::string::npos) { + return true; + } + + std::string inpath = *path; + std::vector parts; + for (std::string::size_type start = 0; start < inpath.size(); ++start) { + std::string::size_type end = inpath.find('/', start); + if (end == std::string::npos) + end = inpath.size(); + else + inpath[end] = 0; + parts.push_back(inpath.data() + start); + start = end; + } + + std::vector::iterator i = parts.begin(); + while (i != parts.end()) { + const char* part = *i; + if (part[0] == '.') { + if (part[1] == 0) { + // "."; strip. + parts.erase(i); + continue; + } else if (part[1] == '.' && part[2] == 0) { + // ".."; go up one. + if (i == parts.begin()) { + *err = "can't canonicalize path '" + *path + "' that reaches " + "above its directory"; + return false; + } + --i; + parts.erase(i, i + 2); + continue; + } + } + ++i; + } + path->clear(); + + for (i = parts.begin(); i != parts.end(); ++i) { + if (!path->empty()) + path->push_back('/'); + path->append(*i); + } + + return true; +} diff --cc src/util.h index efbb88b,30544ca..dc3e40f --- a/src/util.h +++ b/src/util.h @@@ -21,7 -23,7 +21,10 @@@ // Log a fatal message, dump a backtrace, and exit. void Fatal(const char* msg, ...); + // Log an error message. + void Error(const char* msg, ...); + -#endif // NINJA_UTIL_H_ +// Canonicalize a path like "foo/../bar.h" into just "bar.h". +bool CanonicalizePath(std::string* path, std::string* err); + +#endif // NINJA_UTIL_H_