Arg.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //===--- Arg.cpp - Argument Implementations -------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/Option/Arg.h"
  10. #include "llvm/ADT/SmallString.h"
  11. #include "llvm/ADT/Twine.h"
  12. #include "llvm/Option/ArgList.h"
  13. #include "llvm/Option/Option.h"
  14. #include "llvm/Support/raw_ostream.h"
  15. using namespace llvm;
  16. using namespace llvm::opt;
  17. Arg::Arg(const Option Opt, StringRef S, unsigned Index, const Arg *BaseArg)
  18. : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
  19. OwnsValues(false) {}
  20. Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
  21. const Arg *BaseArg)
  22. : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
  23. OwnsValues(false) {
  24. Values.push_back(Value0);
  25. }
  26. Arg::Arg(const Option Opt, StringRef S, unsigned Index, const char *Value0,
  27. const char *Value1, const Arg *BaseArg)
  28. : Opt(Opt), BaseArg(BaseArg), Spelling(S), Index(Index), Claimed(false),
  29. OwnsValues(false) {
  30. Values.push_back(Value0);
  31. Values.push_back(Value1);
  32. }
  33. Arg::~Arg() {
  34. if (OwnsValues) {
  35. for (unsigned i = 0, e = Values.size(); i != e; ++i)
  36. delete[] Values[i];
  37. }
  38. }
  39. void Arg::dump() const {
  40. llvm::errs() << "<";
  41. llvm::errs() << " Opt:";
  42. Opt.dump();
  43. llvm::errs() << " Index:" << Index;
  44. llvm::errs() << " Values: [";
  45. for (unsigned i = 0, e = Values.size(); i != e; ++i) {
  46. if (i) llvm::errs() << ", ";
  47. llvm::errs() << "'" << Values[i] << "'";
  48. }
  49. llvm::errs() << "]>\n";
  50. }
  51. std::string Arg::getAsString(const ArgList &Args) const {
  52. SmallString<256> Res;
  53. llvm::raw_svector_ostream OS(Res);
  54. ArgStringList ASL;
  55. render(Args, ASL);
  56. for (ArgStringList::iterator
  57. it = ASL.begin(), ie = ASL.end(); it != ie; ++it) {
  58. if (it != ASL.begin())
  59. OS << ' ';
  60. OS << *it;
  61. }
  62. return OS.str();
  63. }
  64. void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
  65. if (!getOption().hasNoOptAsInput()) {
  66. render(Args, Output);
  67. return;
  68. }
  69. Output.append(Values.begin(), Values.end());
  70. }
  71. void Arg::render(const ArgList &Args, ArgStringList &Output) const {
  72. switch (getOption().getRenderStyle()) {
  73. case Option::RenderValuesStyle:
  74. Output.append(Values.begin(), Values.end());
  75. break;
  76. case Option::RenderCommaJoinedStyle: {
  77. SmallString<256> Res;
  78. llvm::raw_svector_ostream OS(Res);
  79. OS << getSpelling();
  80. for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
  81. if (i) OS << ',';
  82. OS << getValue(i);
  83. }
  84. Output.push_back(Args.MakeArgString(OS.str()));
  85. break;
  86. }
  87. case Option::RenderJoinedStyle:
  88. Output.push_back(Args.GetOrMakeJoinedArgString(
  89. getIndex(), getSpelling(), getValue(0)));
  90. Output.append(Values.begin() + 1, Values.end());
  91. break;
  92. case Option::RenderSeparateStyle:
  93. Output.push_back(Args.MakeArgString(getSpelling()));
  94. Output.append(Values.begin(), Values.end());
  95. break;
  96. }
  97. }