CmdParser.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. ///----------------------------------------------------------------------------
  7. ///----------------------------------------------------------------------------
  8. ///
  9. /// class CmdLineArgsParser
  10. ///
  11. /// Parses the following grammar
  12. ///
  13. /// range = integer | integer - integer | range,range
  14. /// parameter = integer | string | phase[:range]
  15. /// flag = string
  16. /// phase = string
  17. /// [-|/]flag[:parameter]
  18. ///
  19. ///----------------------------------------------------------------------------
  20. ///----------------------------------------------------------------------------
  21. class CmdLineArgsParser : private ICmdLineArgsParser
  22. {
  23. // Data
  24. private:
  25. static const int MaxTokenSize = 512;
  26. Js::ConfigFlagsTable& flagTable;
  27. LPWSTR pszCurrentArg;
  28. ICustomConfigFlags * pCustomConfigFlags;
  29. // Methods
  30. public:
  31. int Parse(int argc, __in_ecount(argc) LPWSTR argv[]);
  32. int Parse(__in LPWSTR token) throw();
  33. CmdLineArgsParser(ICustomConfigFlags * pCustomConfigFlags = nullptr, Js::ConfigFlagsTable& flagTable = Js::Configuration::Global.flags);
  34. ~CmdLineArgsParser();
  35. // Helper Classes
  36. private:
  37. ///----------------------------------------------------------------------------
  38. ///
  39. /// class Exception
  40. ///
  41. ///----------------------------------------------------------------------------
  42. class Exception {
  43. LPCWSTR pszMsg;
  44. public:
  45. Exception(LPCWSTR message):
  46. pszMsg(message)
  47. {}
  48. operator LPCWSTR () const
  49. {
  50. return this->pszMsg;
  51. }
  52. };
  53. // Implementation
  54. private:
  55. bool ParseBoolean();
  56. LPWSTR ParseString(__inout_ecount(ceBuffer) LPWSTR buffer, size_t ceBuffer = MaxTokenSize, bool fTreatColonAsSeparator = true);
  57. int ParseInteger();
  58. Js::SourceFunctionNode ParseSourceFunctionIds();
  59. void ParsePhase(Js::Phases *pPhase, Js::Phases *oppositePhase);
  60. void ParseRange(Js::Range *range, Js::Range *oppositeRange);
  61. void ParseNumberRange(Js::NumberRange *range);
  62. void ParseFlag();
  63. void ParseNumberSet(Js::NumberSet * numberSet);
  64. void ParseNumberPairSet(Js::NumberPairSet * numberPairSet);
  65. void ParseNumberTrioSet(Js::NumberTrioSet * numberTrioSet);
  66. void PrintUsage();
  67. char16 CurChar()
  68. {
  69. return this->pszCurrentArg[0];
  70. }
  71. char16 PeekChar()
  72. {
  73. return this->pszCurrentArg[1];
  74. }
  75. void NextChar()
  76. {
  77. this->pszCurrentArg++;
  78. }
  79. bool IsDigit()
  80. {
  81. return (CurChar() >='0' && CurChar() <= '9');
  82. }
  83. bool IsHexDigit()
  84. {
  85. return (CurChar() >= '0' && CurChar() <= '9') ||
  86. (CurChar() >= 'A' && CurChar() <= 'F') ||
  87. (CurChar() >= 'a' && CurChar() <= 'f');
  88. }
  89. // Implements ICmdLineArgsParser
  90. virtual BSTR GetCurrentString() override;
  91. virtual bool GetCurrentBoolean() override
  92. {
  93. return ParseBoolean();
  94. }
  95. virtual int GetCurrentInt() override
  96. {
  97. NextChar();
  98. return ParseInteger();
  99. }
  100. };