]> granicus.if.org Git - clang/commitdiff
switch command line 'parse' methods to use StringRef for efficiency, which
authorChris Lattner <sabre@nondot.org>
Sun, 20 Sep 2009 00:39:15 +0000 (00:39 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 20 Sep 2009 00:39:15 +0000 (00:39 +0000)
is also required for an llvm-side change.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82344 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/CommandLineSourceLoc.h
tools/clang-cc/clang-cc.cpp

index 4092724372931bb25c5ea2f184e1d3902e20b9de..59f70ede9129df43f36b7c26318cb6ff557fe092 100644 (file)
@@ -37,39 +37,38 @@ namespace llvm {
     class parser<clang::ParsedSourceLocation>
       : public basic_parser<clang::ParsedSourceLocation> {
     public:
-      bool parse(Option &O, const char *ArgName,
-                 const std::string &ArgValue,
+      bool parse(Option &O, StringRef ArgName, StringRef ArgValue,
                  clang::ParsedSourceLocation &Val);
     };
 
     bool
     parser<clang::ParsedSourceLocation>::
-    parse(Option &O, const char *ArgName, const std::string &ArgValue,
+    parse(Option &O, StringRef ArgName, StringRef ArgValue,
           clang::ParsedSourceLocation &Val) {
       using namespace clang;
 
       const char *ExpectedFormat
         = "source location must be of the form filename:line:column";
-      std::string::size_type SecondColon = ArgValue.rfind(':');
+      StringRef::size_type SecondColon = ArgValue.rfind(':');
       if (SecondColon == std::string::npos) {
         std::fprintf(stderr, "%s\n", ExpectedFormat);
         return true;
       }
-      char *EndPtr;
-      long Column
-        = std::strtol(ArgValue.c_str() + SecondColon + 1, &EndPtr, 10);
-      if (EndPtr != ArgValue.c_str() + ArgValue.size()) {
+
+      unsigned Column;
+      if (ArgValue.substr(SecondColon + 1).getAsInteger(10, Column)) {
         std::fprintf(stderr, "%s\n", ExpectedFormat);
         return true;
       }
+      ArgValue = ArgValue.substr(0, SecondColon);
 
-      std::string::size_type FirstColon = ArgValue.rfind(':', SecondColon-1);
+      StringRef::size_type FirstColon = ArgValue.rfind(':');
       if (FirstColon == std::string::npos) {
         std::fprintf(stderr, "%s\n", ExpectedFormat);
         return true;
       }
-      long Line = std::strtol(ArgValue.c_str() + FirstColon + 1, &EndPtr, 10);
-      if (EndPtr != ArgValue.c_str() + SecondColon) {
+      unsigned Line;
+      if (ArgValue.substr(FirstColon + 1).getAsInteger(10, Line)) {
         std::fprintf(stderr, "%s\n", ExpectedFormat);
         return true;
       }
index 4d8db2399d680c886618deca02a9dbf6f979f83e..89ca5db86521db793013201e9461263b18efdeee 100644 (file)
@@ -667,8 +667,8 @@ TargetABI("target-abi",
 
 // It might be nice to add bounds to the CommandLine library directly.
 struct OptLevelParser : public llvm::cl::parser<unsigned> {
-  bool parse(llvm::cl::Option &O, const char *ArgName,
-             const std::string &Arg, unsigned &Val) {
+  bool parse(llvm::cl::Option &O, llvm::StringRef ArgName,
+             llvm::StringRef Arg, unsigned &Val) {
     if (llvm::cl::parser<unsigned>::parse(O, ArgName, Arg, Val))
       return true;
     if (Val > 3)