1c86804bc9c3f1953520b59084c9ad75104aba123Daniel Dunbar
234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//===--- CommandLineSourceLoc.h - Parsing for source locations-*- C++ -*---===//
334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//
434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//
634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//
934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
1034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//
1134d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// Command line parsing for source locations.
1234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//
1334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
1434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
1534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#ifndef LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H
1634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#define LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H
1734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
18686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h"
1934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#include "llvm/Support/CommandLine.h"
206453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar#include "llvm/Support/raw_ostream.h"
2134d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
2234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidisnamespace clang {
2334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
2434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis/// \brief A source location that has been parsed on the command line.
2534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidisstruct ParsedSourceLocation {
2634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis  std::string FileName;
2734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis  unsigned Line;
2834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis  unsigned Column;
296453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar
306453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbarpublic:
316453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar  /// Construct a parsed source location from a string; the Filename is empty on
326453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar  /// error.
33686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static ParsedSourceLocation FromString(StringRef Str) {
346453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar    ParsedSourceLocation PSL;
35686775deca8b8685eb90801495880e3abdd844c2Chris Lattner    std::pair<StringRef, StringRef> ColSplit = Str.rsplit(':');
36686775deca8b8685eb90801495880e3abdd844c2Chris Lattner    std::pair<StringRef, StringRef> LineSplit =
376453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar      ColSplit.first.rsplit(':');
386453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar
396453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar    // If both tail splits were valid integers, return success.
406453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar    if (!ColSplit.second.getAsInteger(10, PSL.Column) &&
4190d9081cacb4b0163f2c7527f666d6515257067cDan Gohman        !LineSplit.second.getAsInteger(10, PSL.Line)) {
426453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar      PSL.FileName = LineSplit.first;
436453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar
4490d9081cacb4b0163f2c7527f666d6515257067cDan Gohman      // On the command-line, stdin may be specified via "-". Inside the
4590d9081cacb4b0163f2c7527f666d6515257067cDan Gohman      // compiler, stdin is called "<stdin>".
4690d9081cacb4b0163f2c7527f666d6515257067cDan Gohman      if (PSL.FileName == "-")
4790d9081cacb4b0163f2c7527f666d6515257067cDan Gohman        PSL.FileName = "<stdin>";
4890d9081cacb4b0163f2c7527f666d6515257067cDan Gohman    }
4990d9081cacb4b0163f2c7527f666d6515257067cDan Gohman
506453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar    return PSL;
516453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar  }
5234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis};
5334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
5434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis}
5534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
5634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidisnamespace llvm {
5734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis  namespace cl {
5834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    /// \brief Command-line option parser that parses source locations.
5934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    ///
6034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    /// Source locations are of the form filename:line:column.
6134d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    template<>
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    class parser<clang::ParsedSourceLocation>
6334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis      : public basic_parser<clang::ParsedSourceLocation> {
6434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    public:
65c86804bc9c3f1953520b59084c9ad75104aba123Daniel Dunbar      inline bool parse(Option &O, StringRef ArgName, StringRef ArgValue,
6634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis                 clang::ParsedSourceLocation &Val);
6734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    };
6834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool
7034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    parser<clang::ParsedSourceLocation>::
7159b2172751e78ef7c0895d9a5d1359b61ab63a33Chris Lattner    parse(Option &O, StringRef ArgName, StringRef ArgValue,
7234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis          clang::ParsedSourceLocation &Val) {
7334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis      using namespace clang;
7434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
756453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar      Val = ParsedSourceLocation::FromString(ArgValue);
766453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar      if (Val.FileName.empty()) {
776453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar        errs() << "error: "
786453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar               << "source location must be of the form filename:line:column\n";
7934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis        return true;
8034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis      }
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis      return false;
8334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis    }
8434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis  }
8534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis}
8634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis
8734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#endif
88