Commit | Line | Data |
---|---|---|
34e49164 | 1 | (*****************************************************************************) |
708f4980 | 2 | (* convenient globals. *) |
34e49164 | 3 | (*****************************************************************************) |
ae4735db | 4 | let path = ref |
485bce71 C |
5 | (try (Sys.getenv "YACFE_HOME") |
6 | with Not_found-> "/home/pad/c-yacfe" | |
7 | ) | |
708f4980 C |
8 | |
9 | (*****************************************************************************) | |
10 | (* macros *) | |
11 | (*****************************************************************************) | |
12 | ||
ae4735db C |
13 | let macro_dir = "config/macros/" |
14 | let mk_macro_path ~cocci_path file = | |
15 | Filename.concat cocci_path (macro_dir ^ file) | |
708f4980 C |
16 | |
17 | ||
18 | (* to pass to parse_c.init_defs *) | |
19 | let std_h = ref (mk_macro_path ~cocci_path:!path "standard.h") | |
20 | let common_h = ref (mk_macro_path ~cocci_path:!path "common_macros.h") | |
485bce71 | 21 | |
34e49164 | 22 | |
ae4735db | 23 | let cmdline_flags_macrofile () = |
34e49164 | 24 | [ |
708f4980 | 25 | "-macro_file_builtins", Arg.Set_string std_h, |
34e49164 | 26 | " <file> (default=" ^ !std_h ^ ")"; |
485bce71 C |
27 | ] |
28 | ||
29 | ||
30 | (*****************************************************************************) | |
31 | (* used only by cpp_ast_c, not by the parser *) | |
32 | (*****************************************************************************) | |
33 | let cpp_i_opts = ref [] | |
34 | let cpp_d_opts = ref [] | |
35 | ||
36 | let cmdline_flags_cpp () = [ | |
37 | "-D", Arg.String (fun s -> Common.push2 s cpp_d_opts), | |
38 | " <x=y>"; | |
39 | "-I", Arg.String (fun s -> Common.push2 s cpp_i_opts), | |
40 | " <dir>" | |
34e49164 C |
41 | ] |
42 | ||
91eba41f C |
43 | (*****************************************************************************) |
44 | (* types *) | |
45 | (*****************************************************************************) | |
46 | let std_envir = ref (Filename.concat !path "config/envos/environment_splint.h") | |
47 | ||
ae4735db | 48 | let cmdline_flags_envfile () = |
91eba41f C |
49 | [ |
50 | "-env_file", Arg.Set_string std_envir, | |
51 | " <file> (default=" ^ !std_envir ^ ")"; | |
52 | ] | |
53 | ||
708f4980 C |
54 | (*****************************************************************************) |
55 | (* show *) | |
56 | (*****************************************************************************) | |
57 | ||
58 | let show_parsing_error = ref true | |
91eba41f | 59 | |
34e49164 C |
60 | (*****************************************************************************) |
61 | (* verbose *) | |
62 | (*****************************************************************************) | |
63 | ||
64 | let verbose_lexing = ref true | |
65 | let verbose_parsing = ref true | |
66 | let verbose_type = ref true | |
708f4980 | 67 | let verbose_cfg = ref true |
91eba41f | 68 | let verbose_annotater = ref true |
708f4980 C |
69 | let verbose_unparsing = ref true |
70 | let verbose_visit = ref true | |
71 | let verbose_cpp_ast = ref true | |
34e49164 C |
72 | |
73 | let filter_msg = ref false | |
485bce71 C |
74 | let filter_msg_define_error = ref false |
75 | ||
34e49164 | 76 | let filter_define_error = ref false |
485bce71 C |
77 | |
78 | let filter_passed_level = ref 0 | |
34e49164 C |
79 | |
80 | let pretty_print_type_info = ref false | |
0708f913 | 81 | let pretty_print_comment_info = ref false |
708f4980 | 82 | let pretty_print_typedef_value = ref false |
34e49164 C |
83 | |
84 | (* cocci specific *) | |
85 | let show_flow_labels = ref true | |
86 | ||
87 | ||
ae4735db | 88 | let cmdline_flags_verbose () = |
34e49164 | 89 | [ |
34e49164 C |
90 | "-no_verbose_parsing", Arg.Clear verbose_parsing , " "; |
91 | "-no_verbose_lexing", Arg.Clear verbose_lexing , " "; | |
91eba41f C |
92 | "-no_verbose_annotater", Arg.Clear verbose_annotater , " "; |
93 | ||
94 | "-no_parse_error_msg", Arg.Clear verbose_parsing, " "; | |
34e49164 | 95 | "-no_type_error_msg", Arg.Clear verbose_type, " "; |
ae4735db C |
96 | |
97 | ||
98 | "-filter_msg", Arg.Set filter_msg , | |
34e49164 | 99 | " filter some cpp message when the macro is a \"known\" cpp construct"; |
485bce71 C |
100 | "-filter_msg_define_error",Arg.Set filter_msg_define_error, |
101 | " filter the error msg"; | |
102 | ||
103 | "-filter_define_error",Arg.Set filter_define_error, | |
104 | " filter the error, which will not be added in the stat"; | |
105 | "-filter_passed_level",Arg.Set_int filter_passed_level," "; | |
34e49164 C |
106 | ] |
107 | ||
108 | ||
109 | (*****************************************************************************) | |
110 | (* debugging *) | |
111 | (*****************************************************************************) | |
112 | ||
113 | let debug_lexer = ref false | |
114 | let debug_etdt = ref false | |
115 | let debug_typedef = ref false | |
116 | let debug_cpp = ref false | |
117 | ||
708f4980 C |
118 | let debug_cpp_ast = ref false |
119 | ||
34e49164 C |
120 | let debug_unparsing = ref false |
121 | ||
122 | let debug_cfg = ref false | |
123 | ||
124 | (* "debug C parsing/unparsing", "" *) | |
ae4735db | 125 | let cmdline_flags_debugging () = |
34e49164 C |
126 | [ |
127 | "-debug_cpp", Arg.Set debug_cpp, " "; | |
128 | "-debug_lexer", Arg.Set debug_lexer , " "; | |
129 | "-debug_etdt", Arg.Set debug_etdt , " "; | |
130 | "-debug_typedef", Arg.Set debug_typedef, " "; | |
131 | ||
132 | "-debug_cfg", Arg.Set debug_cfg , " "; | |
133 | "-debug_unparsing", Arg.Set debug_unparsing, " "; | |
134 | ] | |
135 | ||
91eba41f C |
136 | (*****************************************************************************) |
137 | (* checks *) | |
138 | (*****************************************************************************) | |
139 | ||
140 | let check_annotater = ref true | |
ae4735db | 141 | let cmdline_flags_checks () = |
91eba41f C |
142 | [ |
143 | "-disable_check_annotater", Arg.Clear check_annotater, " "; | |
144 | "-enable_check_annotater", Arg.Set check_annotater, " "; | |
145 | ] | |
146 | ||
34e49164 C |
147 | (*****************************************************************************) |
148 | (* change algo *) | |
149 | (*****************************************************************************) | |
150 | ||
34e49164 C |
151 | (* cocci specific *) |
152 | let label_strategy_2 = ref false | |
153 | ||
154 | let cmdline_flags_algos () = | |
155 | [ | |
485bce71 C |
156 | "-l1", Arg.Clear label_strategy_2, " "; |
157 | ] | |
158 | ||
159 | (*****************************************************************************) | |
160 | (* Disable parsing feature (for CC09 and also to see if useful) *) | |
161 | (*****************************************************************************) | |
162 | ||
163 | let cpp_directive_passing = ref false | |
ae4735db | 164 | let ifdef_directive_passing = ref false |
485bce71 | 165 | |
708f4980 | 166 | let disable_multi_pass = ref false |
485bce71 C |
167 | let disable_add_typedef = ref false |
168 | ||
169 | let if0_passing = ref true | |
170 | let add_typedef_root = ref true | |
171 | ||
172 | let cmdline_flags_parsing_algos () = [ | |
173 | ||
ae4735db | 174 | "-directive_passing", Arg.Set cpp_directive_passing, |
485bce71 | 175 | " pass most cpp directives, especially when inside function"; |
ae4735db | 176 | "-ifdef_passing", Arg.Set ifdef_directive_passing, |
485bce71 C |
177 | " pass ifdef directives "; |
178 | ||
ae4735db | 179 | "-noif0_passing", Arg.Clear if0_passing, |
34e49164 C |
180 | " "; |
181 | "-noadd_typedef_root", Arg.Clear add_typedef_root, " "; | |
485bce71 | 182 | "-noadd_typedef", Arg.Set disable_add_typedef, " "; |
34e49164 | 183 | |
708f4980 | 184 | "-disable_multi_pass", Arg.Set disable_multi_pass, " "; |
485bce71 | 185 | ] |
34e49164 C |
186 | |
187 | (*****************************************************************************) | |
188 | (* other *) | |
189 | (*****************************************************************************) | |
190 | ||
191 | (* for compare_c *) | |
192 | let diff_lines = ref (None : string option) (* number of lines of context *) | |
193 | ||
194 | (* for parse_c *) | |
195 | let use_cache = ref false | |
196 | ||
ae4735db | 197 | let cmdline_flags_other () = |
34e49164 | 198 | [ |
ae4735db | 199 | "-U", Arg.Int (fun n -> diff_lines := Some (Common.i_to_s n)), |
34e49164 | 200 | " set number of diff context lines"; |
ae4735db C |
201 | |
202 | "-use_cache", Arg.Set use_cache, | |
34e49164 C |
203 | " use .ast_raw pre-parsed cached C file"; |
204 | ] | |
205 | ||
34e49164 | 206 | (*****************************************************************************) |
708f4980 C |
207 | (* for lexing of integer constants *) |
208 | (*****************************************************************************) | |
209 | ||
210 | let int_thresholds = | |
211 | ref (None : | |
212 | (int (*int_sz*) * int (*long_sz*) * | |
213 | Big_int.big_int (*uint threshold*) * | |
214 | Big_int.big_int (*long threshold*) * | |
215 | Big_int.big_int (*ulong threshold*)) option) | |
216 | ||
217 | let set_int_bits n = | |
218 | match !int_thresholds with | |
219 | None -> | |
220 | (*assume long is 2*int; this can be corrected by a subsequent long_bits*) | |
221 | let uint_threshold = Big_int.power_int_positive_int 2 (n-1) in | |
222 | let long_threshold = Big_int.power_int_positive_int 2 n in | |
223 | let ulong_threshold = Big_int.power_int_positive_int 2 ((2*n)-1) in | |
224 | int_thresholds := | |
225 | Some (n,2*n,uint_threshold,long_threshold,ulong_threshold) | |
226 | | Some(int_sz,long_sz,uint_threshold,long_threshold,ulong_threshold) -> | |
227 | let uint_threshold = Big_int.power_int_positive_int 2 (n-1) in | |
228 | let long_threshold = Big_int.power_int_positive_int 2 n in | |
229 | int_thresholds := | |
230 | Some (n,long_sz,uint_threshold,long_threshold,ulong_threshold) | |
231 | ||
232 | let set_long_bits n = | |
233 | match !int_thresholds with | |
234 | None -> | |
235 | (*assume int is 1/2*int; this can be corrected by a subsequent int_bits*) | |
236 | set_int_bits (n/2) | |
237 | | Some(int_sz,long_sz,uint_threshold,long_threshold,ulong_threshold) -> | |
238 | let ulong_threshold = Big_int.power_int_positive_int 2 (n-1) in | |
239 | int_thresholds := | |
240 | Some (int_sz,n,uint_threshold,long_threshold,ulong_threshold) | |
241 | ||
242 | (*****************************************************************************) | |
243 | (* unparsing strategy *) | |
244 | (*****************************************************************************) | |
245 | ||
246 | type spacing = LINUX | SMPL | |
247 | let spacing = ref LINUX | |
248 | ||
249 | let set_linux_spacing _ = spacing := LINUX (*follow the conventions of Linux*) | |
250 | let set_smpl_spacing _ = spacing := SMPL (*use spacing from the SP*) | |
251 | ||
252 | (*****************************************************************************) | |
978fd7e5 C |
253 | |
254 | (* drop back edges made by proper loop constructs - | |
255 | unsafe but more efficient *) | |
256 | let no_loops = ref false | |
951c7801 | 257 | let no_gotos = ref false |
7f004419 C |
258 | |
259 | let keep_comments = ref false (* unparsing *) |