//===--- CommandLineSourceLoc.h - Parsing for source locations-*- C++ -*---===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Command line parsing for source locations. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H #define LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H #include "llvm/Support/CommandLine.h" #include namespace clang { /// \brief A source location that has been parsed on the command line. struct ParsedSourceLocation { std::string FileName; unsigned Line; unsigned Column; }; } namespace llvm { namespace cl { /// \brief Command-line option parser that parses source locations. /// /// Source locations are of the form filename:line:column. template<> class parser : public basic_parser { public: bool parse(Option &O, const char *ArgName, const std::string &ArgValue, clang::ParsedSourceLocation &Val); }; bool parser:: parse(Option &O, const char *ArgName, const std::string &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(':'); 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()) { std::fprintf(stderr, "%s\n", ExpectedFormat); return true; } std::string::size_type FirstColon = ArgValue.rfind(':', SecondColon-1); 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) { std::fprintf(stderr, "%s\n", ExpectedFormat); return true; } Val.FileName = ArgValue.substr(0, FirstColon); Val.Line = Line; Val.Column = Column; return false; } } } #endif