Imported Upstream version 2.8.9
[platform/upstream/cmake.git] / Source / cmDependsJavaParserHelper.h
1 /*============================================================================
2   CMake - Cross Platform Makefile Generator
3   Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
4
5   Distributed under the OSI-approved BSD License (the "License");
6   see accompanying file Copyright.txt for details.
7
8   This software is distributed WITHOUT ANY WARRANTY; without even the
9   implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10   See the License for more information.
11 ============================================================================*/
12 #ifndef cmDependsJavaParserHelper_h 
13 #define cmDependsJavaParserHelper_h
14
15 #include "cmStandardIncludes.h"
16
17 #define YYSTYPE cmDependsJavaParserHelper::ParserType
18 #define YYSTYPE_IS_DECLARED
19 #define YY_EXTRA_TYPE cmDependsJavaParserHelper*
20 #define YY_DECL int cmDependsJava_yylex(YYSTYPE* yylvalp, yyscan_t yyscanner)
21
22 /** \class cmDependsJavaParserHelper
23  * \brief Helper class for parsing java source files
24  *
25  * Finds dependencies for java file and list of outputs
26  */
27
28 class cmDependsJavaParserHelper
29 {
30 public:
31   typedef struct {
32     char* str;
33   } ParserType;
34
35   cmDependsJavaParserHelper();
36   ~cmDependsJavaParserHelper();
37
38   int ParseString(const char* str, int verb);
39   int ParseFile(const char* file);
40
41   // For the lexer:
42   void AllocateParserType(cmDependsJavaParserHelper::ParserType* pt, 
43     const char* str, int len = 0);
44
45   int LexInput(char* buf, int maxlen);
46   void Error(const char* str);
47
48   // For yacc
49   void AddClassFound(const char* sclass);
50   void PrepareElement(ParserType* opt);
51   void DeallocateParserType(char** pt);
52   void CheckEmpty(int line, int cnt, ParserType* pt);
53   void StartClass(const char* cls);
54   void EndClass();
55   void AddPackagesImport(const char* sclass);
56   void SetCurrentPackage(const char* pkg) { this->CurrentPackage = pkg; }
57   const char* GetCurrentPackage() { return this->CurrentPackage.c_str(); }
58   void SetCurrentCombine(const char* cmb) { this->CurrentCombine = cmb; }
59   const char* GetCurrentCombine() { return this->CurrentCombine.c_str(); }
60   void UpdateCombine(const char* str1, const char* str2);
61
62   std::vector<cmStdString>& GetClassesFound() { return this->ClassesFound; }
63
64   std::vector<cmStdString> GetFilesProduced();
65
66 private:
67   class CurrentClass
68   {
69   public:
70     cmStdString Name;
71     std::vector<CurrentClass>* NestedClasses;
72     CurrentClass() 
73       {
74         this->NestedClasses = new std::vector<CurrentClass>;
75       }
76     ~CurrentClass()
77       {
78         delete this->NestedClasses;
79       }
80     CurrentClass& operator=(CurrentClass const& c) 
81       {
82         this->NestedClasses->clear();
83         this->Name = c.Name;
84         std::copy(
85           c.NestedClasses->begin(),
86           c.NestedClasses->end(),
87           std::back_inserter(
88             *this->NestedClasses)
89           );
90         return *this;
91       }
92     CurrentClass(CurrentClass const& c)
93       {
94         (*this) = c;
95       }
96     void AddFileNamesForPrinting(std::vector<cmStdString> *files, 
97                                  const char* prefix, const char* sep);
98   };
99   cmStdString CurrentPackage;
100   cmStdString::size_type InputBufferPos;
101   cmStdString InputBuffer;
102   std::vector<char> OutputBuffer;
103   std::vector<cmStdString> ClassesFound;
104   std::vector<cmStdString> PackagesImport;
105   cmStdString CurrentCombine;
106
107   std::vector<CurrentClass> ClassStack;
108
109   int CurrentLine;
110   int UnionsAvailable;
111   int LastClassId;
112   int CurrentDepth;
113   int Verbose;
114
115   std::vector<char*> Allocates;
116
117   void PrintClasses();
118
119   void Print(const char* place, const char* str);
120   void CombineUnions(char** out, const char* in1, char** in2, 
121                      const char* sep);
122   void SafePrintMissing(const char* str, int line, int cnt);
123
124   void CleanupParser();
125 };
126
127 #endif
128