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_MAIN_H
21 #define T_MAIN_H
22 
23 #include <string>
24 #include <cstdio>
25 
26 #include "thrift/logging.h"
27 
28 #include "thrift/parse/t_const.h"
29 #include "thrift/parse/t_field.h"
30 
31 /**
32  * Defined in the flex library
33  */
34 
35 extern "C" { int yylex(void); }
36 
37 int yyparse(void);
38 
39 /**
40  * Expected to be defined by Flex/Bison
41  */
42 void yyerror(const char* fmt, ...);
43 
44 /**
45  * Check simple identifier names
46  */
47 void validate_simple_identifier(const char* identifier);
48 
49 /**
50  * Check constant types
51  */
52 void validate_const_type(t_const* c);
53 
54 /**
55  * Check constant types
56  */
57 void validate_field_value(t_field* field, t_const_value* cv);
58 
59 /**
60  * Check members of a throws block
61  */
62 bool validate_throws(t_struct* throws);
63 
64 /**
65  * Converts a string filename into a thrift program name
66  */
67 std::string program_name(std::string filename);
68 
69 /**
70  * Gets the directory path of a filename
71  */
72 std::string directory_name(std::string filename);
73 
74 /**
75  * Get the absolute path for an include file
76  */
77 std::string include_file(std::string filename);
78 
79 /**
80  * Clears any previously stored doctext string.
81  */
82 void clear_doctext();
83 
84 /**
85  * Cleans up text commonly found in doxygen-like comments
86  */
87 char* clean_up_doctext(char* doctext);
88 
89 /**
90  * We are sure the program doctext candidate is really the program doctext.
91  */
92 void declare_valid_program_doctext();
93 
94 /**
95  * Emits a warning on list<byte>, binary type is typically a much better choice.
96  */
97 void check_for_list_of_bytes(t_type* list_elem_type);
98 
99 /**
100  * Emits a one-time warning on byte type, promoting the new i8 type instead
101  */
102 void emit_byte_type_warning();
103 
104 /**
105  * Prints deprecation notice for old NS declarations that are no longer supported
106  * If new_form is nullptr, old_form is assumed to be a language identifier, such as "cpp"
107  * If new_form is not nullptr, both arguments are used exactly as given
108  */
109 void error_unsupported_namespace_decl(const char* old_form, const char* new_form = nullptr);
110 
111 /**
112  * Flex utilities
113  */
114 
115 extern int yylineno;
116 extern char yytext[];
117 extern std::FILE* yyin;
118 
119 #endif
120