summaryrefslogtreecommitdiffstats
path: root/include/clang/Frontend/CommandLineSourceLoc.h
diff options
context:
space:
mode:
authorrdivacky <rdivacky@FreeBSD.org>2009-12-01 11:08:04 +0000
committerrdivacky <rdivacky@FreeBSD.org>2009-12-01 11:08:04 +0000
commit4b08eb6308ca90a6c08e2fc79d100821b1b1f6aa (patch)
tree867cbbe32a66fd7d62dd9ce9df23a23fefdb8290 /include/clang/Frontend/CommandLineSourceLoc.h
parent6df2408694f81a03eb8b0e3b013272042233c061 (diff)
downloadFreeBSD-src-4b08eb6308ca90a6c08e2fc79d100821b1b1f6aa.zip
FreeBSD-src-4b08eb6308ca90a6c08e2fc79d100821b1b1f6aa.tar.gz
Update clang to r90226.
Diffstat (limited to 'include/clang/Frontend/CommandLineSourceLoc.h')
-rw-r--r--include/clang/Frontend/CommandLineSourceLoc.h49
1 files changed, 22 insertions, 27 deletions
diff --git a/include/clang/Frontend/CommandLineSourceLoc.h b/include/clang/Frontend/CommandLineSourceLoc.h
index d5a0598..bea468b 100644
--- a/include/clang/Frontend/CommandLineSourceLoc.h
+++ b/include/clang/Frontend/CommandLineSourceLoc.h
@@ -16,7 +16,7 @@
#define LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H
#include "llvm/Support/CommandLine.h"
-#include <cstdio>
+#include "llvm/Support/raw_ostream.h"
namespace clang {
@@ -25,6 +25,23 @@ struct ParsedSourceLocation {
std::string FileName;
unsigned Line;
unsigned Column;
+
+public:
+ /// Construct a parsed source location from a string; the Filename is empty on
+ /// error.
+ static ParsedSourceLocation FromString(llvm::StringRef Str) {
+ ParsedSourceLocation PSL;
+ std::pair<llvm::StringRef, llvm::StringRef> ColSplit = Str.rsplit(':');
+ std::pair<llvm::StringRef, llvm::StringRef> LineSplit =
+ ColSplit.first.rsplit(':');
+
+ // If both tail splits were valid integers, return success.
+ if (!ColSplit.second.getAsInteger(10, PSL.Column) &&
+ !LineSplit.second.getAsInteger(10, PSL.Line))
+ PSL.FileName = LineSplit.first;
+
+ return PSL;
+ }
};
}
@@ -48,35 +65,13 @@ namespace llvm {
clang::ParsedSourceLocation &Val) {
using namespace clang;
- const char *ExpectedFormat
- = "source location must be of the form filename:line:column";
- StringRef::size_type SecondColon = ArgValue.rfind(':');
- if (SecondColon == std::string::npos) {
- std::fprintf(stderr, "%s\n", ExpectedFormat);
- return true;
- }
-
- unsigned Column;
- if (ArgValue.substr(SecondColon + 1).getAsInteger(10, Column)) {
- std::fprintf(stderr, "%s\n", ExpectedFormat);
- return true;
- }
- ArgValue = ArgValue.substr(0, SecondColon);
-
- StringRef::size_type FirstColon = ArgValue.rfind(':');
- if (FirstColon == std::string::npos) {
- std::fprintf(stderr, "%s\n", ExpectedFormat);
- return true;
- }
- unsigned Line;
- if (ArgValue.substr(FirstColon + 1).getAsInteger(10, Line)) {
- std::fprintf(stderr, "%s\n", ExpectedFormat);
+ Val = ParsedSourceLocation::FromString(ArgValue);
+ if (Val.FileName.empty()) {
+ errs() << "error: "
+ << "source location must be of the form filename:line:column\n";
return true;
}
- Val.FileName = ArgValue.substr(0, FirstColon);
- Val.Line = Line;
- Val.Column = Column;
return false;
}
}
OpenPOWER on IntegriCloud