resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmVisualStudioSlnParser.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 <bitset>
8 #include <cstddef>
9 #include <iosfwd>
10 #include <string>
11
12 #include <cm/string_view>
13
14 class cmSlnData;
15
16 class cmVisualStudioSlnParser
17 {
18 public:
19   enum ParseResult
20   {
21     ResultOK = 0,
22
23     ResultInternalError = -1,
24     ResultExternalError = 1,
25
26     ResultErrorOpeningInput = ResultExternalError,
27     ResultErrorReadingInput,
28     ResultErrorInputStructure,
29     ResultErrorInputData,
30
31     ResultErrorBadInternalState = ResultInternalError,
32     ResultErrorUnsupportedDataGroup = ResultInternalError - 1
33   };
34
35   enum DataGroup
36   {
37     DataGroupProjectsBit,
38     DataGroupProjectDependenciesBit,
39     DataGroupSolutionConfigurationsBit,
40     DataGroupProjectConfigurationsBit,
41     DataGroupSolutionFiltersBit,
42     DataGroupGenericGlobalSectionsBit,
43     DataGroupCount
44   };
45
46   using DataGroupSet = std::bitset<DataGroupCount>;
47
48   static const DataGroupSet DataGroupProjects;
49   static const DataGroupSet DataGroupProjectDependencies;
50   static const DataGroupSet DataGroupSolutionConfigurations;
51   static const DataGroupSet DataGroupProjectConfigurations;
52   static const DataGroupSet DataGroupSolutionFilters;
53   static const DataGroupSet DataGroupGenericGlobalSections;
54   static const DataGroupSet DataGroupAll;
55
56   bool Parse(std::istream& input, cmSlnData& output,
57              DataGroupSet dataGroups = DataGroupAll);
58
59   bool ParseFile(const std::string& file, cmSlnData& output,
60                  DataGroupSet dataGroups = DataGroupAll);
61
62   ParseResult GetParseResult() const;
63
64   size_t GetParseResultLine() const;
65
66   bool GetParseHadBOM() const;
67
68 protected:
69   class State;
70
71   friend class State;
72   class ParsedLine;
73
74   struct ResultData
75   {
76     ParseResult Result;
77     size_t ResultLine;
78     bool HadBOM;
79
80     ResultData();
81     void Clear();
82     void SetError(ParseResult error, size_t line);
83   } LastResult;
84
85   bool IsDataGroupSetSupported(DataGroupSet dataGroups) const;
86
87   bool ParseImpl(std::istream& input, cmSlnData& output, State& state);
88
89   bool ParseBOM(std::istream& input, std::string& line, State& state);
90
91   bool ParseMultiValueTag(const std::string& line, ParsedLine& parsedLine,
92                           State& state);
93
94   bool ParseSingleValueTag(const std::string& line, ParsedLine& parsedLine,
95                            State& state);
96
97   bool ParseKeyValuePair(const std::string& line, ParsedLine& parsedLine,
98                          State& state);
99
100   bool ParseTag(cm::string_view fullTag, ParsedLine& parsedLine, State& state);
101
102   bool ParseValue(const std::string& value, ParsedLine& parsedLine);
103 };