1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  *   http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 #ifndef T_GLOBALS_H
21 #define T_GLOBALS_H
22 
23 #include <set>
24 #include <queue>
25 #include <stack>
26 #include <vector>
27 #include <string>
28 
29 /**
30  * This module contains all the global variables (slap on the wrist) that are
31  * shared throughout the program. The reason for this is to facilitate simple
32  * interaction between the parser and the rest of the program. Before calling
33  * yyparse(), the main.cc program will make necessary adjustments to these
34  * global variables such that the parser does the right thing and puts entries
35  * into the right containers, etc.
36  *
37  */
38 
39 /**
40  * Hooray for forward declaration of types!
41  */
42 
43 class t_program;
44 class t_scope;
45 class t_type;
46 
47 /**
48  * Parsing mode, two passes up in this gin rummy!
49  */
50 
51 enum PARSE_MODE { INCLUDES = 1, PROGRAM = 2 };
52 
53 /**
54  * Strictness level
55  */
56 extern int g_strict;
57 
58 /**
59  * The master program parse tree. This is accessed from within the parser code
60  * to build up the program elements.
61  */
62 extern t_program* g_program;
63 
64 /**
65  * The scope that we are currently parsing into
66  */
67 extern t_scope* g_scope;
68 
69 /**
70  * The parent scope to also load symbols into
71  */
72 extern t_scope* g_parent_scope;
73 
74 /**
75  * The prefix for the parent scope entries
76  */
77 extern std::string g_parent_prefix;
78 
79 /**
80  * The parsing pass that we are on. We do different things on each pass.
81  */
82 extern PARSE_MODE g_parse_mode;
83 
84 /**
85  * Global time string, used in formatting error messages etc.
86  */
87 extern char* g_time_str;
88 
89 /**
90  * The last parsed doctext comment.
91  */
92 extern char* g_doctext;
93 
94 /**
95  * The location of the last parsed doctext comment.
96  */
97 extern int g_doctext_lineno;
98 
99 /**
100  * Status of program level doctext candidate
101  */
102 enum PROGDOCTEXT_STATUS {
103   INVALID = 0,
104   STILL_CANDIDATE = 1,   // the text may or may not be the program doctext
105   ALREADY_PROCESSED = 2, // doctext has been used and is no longer available
106   ABSOLUTELY_SURE = 3,   // this is the program doctext
107   NO_PROGRAM_DOCTEXT = 4 // there is no program doctext
108 };
109 
110 /**
111  * The program level doctext. Stored separately to make parsing easier.
112  */
113 extern char* g_program_doctext_candidate;
114 extern int g_program_doctext_lineno;
115 extern PROGDOCTEXT_STATUS g_program_doctext_status;
116 
117 /**
118  * Whether or not negative field keys are accepted.
119  *
120  * When a field does not have a user-specified key, thrift automatically
121  * assigns a negative value.  However, this is fragile since changes to the
122  * file may unintentionally change the key numbering, resulting in a new
123  * protocol that is not backwards compatible.
124  *
125  * When g_allow_neg_field_keys is enabled, users can explicitly specify
126  * negative keys.  This way they can write a .thrift file with explicitly
127  * specified keys that is still backwards compatible with older .thrift files
128  * that did not specify key values.
129  */
130 extern int g_allow_neg_field_keys;
131 
132 /**
133  * Whether or not 64-bit constants will generate a warning.
134  *
135  * Some languages don't support 64-bit constants, but many do, so we can
136  * suppress this warning for projects that don't use any non-64-bit-safe
137  * languages.
138  */
139 extern int g_allow_64bit_consts;
140 
141 #endif
142