resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmCommandArgumentParserHelper.h
1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #pragma once
4
5 #include "cmConfigure.h" // IWYU pragma: keep
6
7 #include <memory>
8 #include <string>
9 #include <vector>
10
11 class cmMakefile;
12
13 class cmCommandArgumentParserHelper
14 {
15 public:
16   struct ParserType
17   {
18     const char* str;
19   };
20
21   cmCommandArgumentParserHelper();
22   ~cmCommandArgumentParserHelper();
23
24   cmCommandArgumentParserHelper(cmCommandArgumentParserHelper const&) = delete;
25   cmCommandArgumentParserHelper& operator=(
26     cmCommandArgumentParserHelper const&) = delete;
27
28   int ParseString(std::string const& str, int verb);
29
30   // For the lexer:
31   void AllocateParserType(cmCommandArgumentParserHelper::ParserType* pt,
32                           const char* str, int len = 0);
33   bool HandleEscapeSymbol(cmCommandArgumentParserHelper::ParserType* pt,
34                           char symbol);
35
36   void Error(const char* str);
37
38   // For yacc
39   const char* CombineUnions(const char* in1, const char* in2);
40
41   const char* ExpandSpecialVariable(const char* key, const char* var);
42   const char* ExpandVariable(const char* var);
43   const char* ExpandVariableForAt(const char* var);
44   void SetResult(const char* value);
45
46   void SetMakefile(const cmMakefile* mf);
47
48   void UpdateInputPosition(int tokenLength);
49
50   std::string& GetResult() { return this->Result; }
51
52   void SetLineFile(long line, const char* file);
53   void SetEscapeQuotes(bool b) { this->EscapeQuotes = b; }
54   void SetNoEscapeMode(bool b) { this->NoEscapeMode = b; }
55   void SetReplaceAtSyntax(bool b) { this->ReplaceAtSyntax = b; }
56   void SetRemoveEmpty(bool b) { this->RemoveEmpty = b; }
57
58   const char* GetError() { return this->ErrorString.c_str(); }
59
60 private:
61   std::string::size_type InputBufferPos{ 1 };
62   std::string::size_type LastTokenLength{};
63   std::string::size_type InputSize{};
64   std::vector<char> OutputBuffer;
65
66   void Print(const char* place, const char* str);
67   void SafePrintMissing(const char* str, int line, int cnt);
68
69   const char* AddString(const std::string& str);
70
71   void CleanupParser();
72   void SetError(std::string const& msg);
73
74   std::vector<std::unique_ptr<char[]>> Variables;
75   const cmMakefile* Makefile;
76   std::string Result;
77   std::string ErrorString;
78   const char* FileName;
79   long FileLine;
80   int Verbose;
81   bool EscapeQuotes;
82   bool NoEscapeMode;
83   bool ReplaceAtSyntax;
84   bool RemoveEmpty;
85 };
86
87 #define YYSTYPE cmCommandArgumentParserHelper::ParserType
88 #define YYSTYPE_IS_DECLARED
89 #define YY_EXTRA_TYPE cmCommandArgumentParserHelper*
90 #define YY_DECL                                                               \
91   int cmCommandArgument_yylex(YYSTYPE* yylvalp, yyscan_t yyscanner)