annotate contrib/header-tools/gcc-order-headers @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 #! /usr/bin/python2
kono
parents:
diff changeset
2 import os
kono
parents:
diff changeset
3 import sys
kono
parents:
diff changeset
4 import shlex
kono
parents:
diff changeset
5 import re
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 from headerutils import *
kono
parents:
diff changeset
8 import Queue
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 file_list = list ()
kono
parents:
diff changeset
11 usage = False
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 ignore_conditional = False
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 order = [
kono
parents:
diff changeset
16 "system.h",
kono
parents:
diff changeset
17 "coretypes.h",
kono
parents:
diff changeset
18 "backend.h",
kono
parents:
diff changeset
19 "target.h",
kono
parents:
diff changeset
20 "rtl.h",
kono
parents:
diff changeset
21 "c-family/c-target.h",
kono
parents:
diff changeset
22 "c-family/c-target-def.h",
kono
parents:
diff changeset
23 "tree.h",
kono
parents:
diff changeset
24 "cp/cp-tree.h",
kono
parents:
diff changeset
25 "c-family/c-common.h", # these must come before diagnostic.h
kono
parents:
diff changeset
26 "c/c-tree.h",
kono
parents:
diff changeset
27 "fortran/gfortran.h",
kono
parents:
diff changeset
28 "gimple.h",
kono
parents:
diff changeset
29 "cfghooks.h",
kono
parents:
diff changeset
30 "df.h",
kono
parents:
diff changeset
31 "tm_p.h",
kono
parents:
diff changeset
32 "gimple-iterators.h",
kono
parents:
diff changeset
33 "ssa.h",
kono
parents:
diff changeset
34 "expmed.h",
kono
parents:
diff changeset
35 "optabs.h",
kono
parents:
diff changeset
36 "regs.h",
kono
parents:
diff changeset
37 "ira.h",
kono
parents:
diff changeset
38 "ira-int.h",
kono
parents:
diff changeset
39 "gimple-streamer.h"
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 ]
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 exclude_special = [ "bversion.h", "obstack.h", "insn-codes.h", "hooks.h" ]
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 # includes is a dictionary indexed by a header files basename.
kono
parents:
diff changeset
46 # it consists of a 2 element tuple:
kono
parents:
diff changeset
47 # [0] - Name of header file which included this header.
kono
parents:
diff changeset
48 # [1] - vector of header file names included by this file.
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 includes = { }
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 # when a header is included multiple times, indexing this dictionary will
kono
parents:
diff changeset
53 # return a vector of all the headers which included it.
kono
parents:
diff changeset
54 dups = { }
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 # When creating the master list, do not descend into these files for what
kono
parents:
diff changeset
57 # they include. Simply put the file itself in the list. This is primarily
kono
parents:
diff changeset
58 # required because the front end files inlcude orders tend to be at odds with
kono
parents:
diff changeset
59 # the order of middle end files, and its impossible to synchronize them.\
kono
parents:
diff changeset
60 # They are ordered such that everything resolves properly.
kono
parents:
diff changeset
61 exclude_processing = [ "tree-vectorizer.h" , "c-target.h", "c-target-def.h", "cp-tree.h", "c-common.h", "c-tree.h", "gfortran.h" ]
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 master_list = list ()
kono
parents:
diff changeset
64 # where include file comes from in src
kono
parents:
diff changeset
65 h_from = { }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 # create the master ordering list... this is the desired order of headers
kono
parents:
diff changeset
68 def create_master_list (fn, verbose):
kono
parents:
diff changeset
69 if fn not in exclude_processing:
kono
parents:
diff changeset
70 for x in includes[fn][1]:
kono
parents:
diff changeset
71 create_master_list (x, verbose)
kono
parents:
diff changeset
72 if not fn in master_list:
kono
parents:
diff changeset
73 # Don't put diagnostic*.h into the ordering list. It is special since
kono
parents:
diff changeset
74 # various front ends have to set GCC_DIAG_STYLE before including it.
kono
parents:
diff changeset
75 # for each file, we'll tailor where it belongs by looking at the include
kono
parents:
diff changeset
76 # list and determine its position appropriately.
kono
parents:
diff changeset
77 if fn != "diagnostic.h" and fn != "diagnostic-core.h":
kono
parents:
diff changeset
78 master_list.append (fn)
kono
parents:
diff changeset
79 if (verbose):
kono
parents:
diff changeset
80 print fn + " included by: " + includes[fn][0]
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 def print_dups ():
kono
parents:
diff changeset
85 if dups:
kono
parents:
diff changeset
86 print "\nduplicated includes"
kono
parents:
diff changeset
87 for i in dups:
kono
parents:
diff changeset
88 string = "dup : " + i + " : "
kono
parents:
diff changeset
89 string += includes[i][0]
kono
parents:
diff changeset
90 for i2 in dups[i]:
kono
parents:
diff changeset
91 string += ", "+i2
kono
parents:
diff changeset
92 print string
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 def process_known_dups ():
kono
parents:
diff changeset
96 # rtl.h gets tagged as a duplicate includer for all of coretypes.h, but that
kono
parents:
diff changeset
97 # is really for only generator files
kono
parents:
diff changeset
98 rtl_remove = includes["coretypes.h"][1] + ["statistics.h", "vec.h"]
kono
parents:
diff changeset
99 if dups:
kono
parents:
diff changeset
100 for i in rtl_remove:
kono
parents:
diff changeset
101 if dups[i] and "rtl.h" in dups[i]:
kono
parents:
diff changeset
102 dups[i].remove("rtl.h")
kono
parents:
diff changeset
103 if not dups[i]:
kono
parents:
diff changeset
104 dups.pop (i, None)
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 # make sure diagnostic.h is the owner of diagnostic-core.h
kono
parents:
diff changeset
107 if includes["diagnostic-core.h"][0] != "diagnostic.h":
kono
parents:
diff changeset
108 dups["diagnostic-core.h"].append (includes["diagnostic-core.h"][0])
kono
parents:
diff changeset
109 includes["diagnostic-core.h"] = ("diagnostic.h", includes["diagnostic-core.h"][1])
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 # This function scans back thorugh the list of headers which included other
kono
parents:
diff changeset
112 # headers to determine what file in HEADER_LIST brought 'HEADER' in.
kono
parents:
diff changeset
113 def indirectly_included (header, header_list):
kono
parents:
diff changeset
114 nm = os.path.basename (header)
kono
parents:
diff changeset
115 while nm and includes.get(nm):
kono
parents:
diff changeset
116 if includes[nm][0] in header_list:
kono
parents:
diff changeset
117 return includes[nm][0]
kono
parents:
diff changeset
118 nm = includes[nm][0]
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 # diagnostic.h and diagnostic-core.h may not show up because we removed them
kono
parents:
diff changeset
121 # from the header list to manually position in an appropriate place. They have
kono
parents:
diff changeset
122 # specific requirements that they need to occur after certain FE files which
kono
parents:
diff changeset
123 # may overide the definition of GCC_DIAG_STYLE.
kono
parents:
diff changeset
124 # Check the dup list for whete they may have been included from and return
kono
parents:
diff changeset
125 # that header.
kono
parents:
diff changeset
126 if header == "diagnostic-core.h":
kono
parents:
diff changeset
127 if dups.get("diagnostic-core.h"):
kono
parents:
diff changeset
128 for f in dups["diagnostic-core.h"]:
kono
parents:
diff changeset
129 if f in header_list:
kono
parents:
diff changeset
130 return f
kono
parents:
diff changeset
131 else:
kono
parents:
diff changeset
132 if header in header_list:
kono
parents:
diff changeset
133 return header
kono
parents:
diff changeset
134 # Now check if diagnostics is included indirectly anywhere
kono
parents:
diff changeset
135 header = "diagnostic.h"
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 if header == "diagnostic.h":
kono
parents:
diff changeset
138 if dups.get("diagnostic.h"):
kono
parents:
diff changeset
139 for f in dups["diagnostic.h"]:
kono
parents:
diff changeset
140 if f in header_list:
kono
parents:
diff changeset
141 return f
kono
parents:
diff changeset
142 else:
kono
parents:
diff changeset
143 if header in header_list:
kono
parents:
diff changeset
144 return header
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 return ""
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 # This function will take a list of headers from a source file and return
kono
parents:
diff changeset
150 # the desired new new order of the canonical headers in DESIRED_ORDER.
kono
parents:
diff changeset
151 def get_new_order (src_h, desired_order):
kono
parents:
diff changeset
152 new_order = list ()
kono
parents:
diff changeset
153 for h in desired_order:
kono
parents:
diff changeset
154 if h in master_list:
kono
parents:
diff changeset
155 # Create the list of nested headers which included this file.
kono
parents:
diff changeset
156 iclist = list ()
kono
parents:
diff changeset
157 ib = includes[h][0]
kono
parents:
diff changeset
158 while ib:
kono
parents:
diff changeset
159 iclist.insert(0, ib)
kono
parents:
diff changeset
160 ib = includes[ib][0]
kono
parents:
diff changeset
161 if iclist:
kono
parents:
diff changeset
162 for x in iclist:
kono
parents:
diff changeset
163 # If header is in the source code, and we are allowed to look inside
kono
parents:
diff changeset
164 if x in src_h and x not in exclude_processing:
kono
parents:
diff changeset
165 if x not in new_order and x[:10] != "diagnostic" and h not in exclude_special:
kono
parents:
diff changeset
166 new_order.append (x)
kono
parents:
diff changeset
167 break;
kono
parents:
diff changeset
168 else:
kono
parents:
diff changeset
169 if h not in new_order:
kono
parents:
diff changeset
170 new_order.append (h)
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 f = ""
kono
parents:
diff changeset
173 if "diagnostic.h" in src_h:
kono
parents:
diff changeset
174 f = "diagnostic.h"
kono
parents:
diff changeset
175 elif "diagnostic-core.h" in src_h:
kono
parents:
diff changeset
176 f = "diagnostic-core.h"
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 # If either diagnostic header was directly included in the main file, check to
kono
parents:
diff changeset
180 # see if its already included indirectly, or whether we need to add it to the
kono
parents:
diff changeset
181 # end of the canonically orders headers.
kono
parents:
diff changeset
182 if f:
kono
parents:
diff changeset
183 ii = indirectly_included (f, src_h)
kono
parents:
diff changeset
184 if not ii or ii == f:
kono
parents:
diff changeset
185 new_order.append (f)
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 return new_order
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 # stack of files to process
kono
parents:
diff changeset
192 process_stack = list ()
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 def process_one (info):
kono
parents:
diff changeset
195 i = info[0]
kono
parents:
diff changeset
196 owner = info[1]
kono
parents:
diff changeset
197 name = os.path.basename(i)
kono
parents:
diff changeset
198 if os.path.exists (i):
kono
parents:
diff changeset
199 if includes.get(name) == None:
kono
parents:
diff changeset
200 l = find_unique_include_list (i)
kono
parents:
diff changeset
201 # create a list which has just basenames in it
kono
parents:
diff changeset
202 new_list = list ()
kono
parents:
diff changeset
203 for x in l:
kono
parents:
diff changeset
204 new_list.append (os.path.basename (x))
kono
parents:
diff changeset
205 process_stack.append((x, name))
kono
parents:
diff changeset
206 includes[name] = (owner, new_list)
kono
parents:
diff changeset
207 elif owner:
kono
parents:
diff changeset
208 if dups.get(name) == None:
kono
parents:
diff changeset
209 dups[name] = [ owner ]
kono
parents:
diff changeset
210 else:
kono
parents:
diff changeset
211 dups[name].append (owner)
kono
parents:
diff changeset
212 else:
kono
parents:
diff changeset
213 # seed tm.h with options.h since it is a build file and won't be seen.
kono
parents:
diff changeset
214 if not includes.get(name):
kono
parents:
diff changeset
215 if name == "tm.h":
kono
parents:
diff changeset
216 includes[name] = (owner, [ "options.h" ])
kono
parents:
diff changeset
217 includes["options.h"] = ("tm.h", list ())
kono
parents:
diff changeset
218 else:
kono
parents:
diff changeset
219 includes[name] = (owner, list ())
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 show_master = False
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 for arg in sys.argv[1:]:
kono
parents:
diff changeset
225 if arg[0:1] == "-":
kono
parents:
diff changeset
226 if arg[0:2] == "-h":
kono
parents:
diff changeset
227 usage = True
kono
parents:
diff changeset
228 elif arg[0:2] == "-i":
kono
parents:
diff changeset
229 ignore_conditional = True
kono
parents:
diff changeset
230 elif arg[0:2] == "-v":
kono
parents:
diff changeset
231 show_master = True
kono
parents:
diff changeset
232 else:
kono
parents:
diff changeset
233 print "Error: unrecognized option " + arg
kono
parents:
diff changeset
234 elif os.path.exists(arg):
kono
parents:
diff changeset
235 file_list.append (arg)
kono
parents:
diff changeset
236 else:
kono
parents:
diff changeset
237 print "Error: file " + arg + " Does not exist."
kono
parents:
diff changeset
238 usage = True
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 if not file_list and not show_master:
kono
parents:
diff changeset
241 usage = True
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 if not usage and not os.path.exists ("coretypes.h"):
kono
parents:
diff changeset
244 usage = True
kono
parents:
diff changeset
245 print "Error: Must run command in main gcc source directory containing coretypes.h\n"
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 # process diagnostic.h first.. it's special since GCC_DIAG_STYLE can be
kono
parents:
diff changeset
248 # overridden by languages, but must be done so by a file included BEFORE it.
kono
parents:
diff changeset
249 # so make sure it isn't seen as included by one of those files by making it
kono
parents:
diff changeset
250 # appear to be included by the src file.
kono
parents:
diff changeset
251 process_stack.insert (0, ("diagnostic.h", ""))
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 # Add the list of files in reverse order since it is processed as a stack later
kono
parents:
diff changeset
254 for i in order:
kono
parents:
diff changeset
255 process_stack.insert (0, (i, "") )
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 # build up the library of what header files include what other files.
kono
parents:
diff changeset
258 while process_stack:
kono
parents:
diff changeset
259 info = process_stack.pop ()
kono
parents:
diff changeset
260 process_one (info)
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 # Now create the master ordering list
kono
parents:
diff changeset
263 for i in order:
kono
parents:
diff changeset
264 create_master_list (os.path.basename (i), show_master)
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 # handle warts in the duplicate list
kono
parents:
diff changeset
267 process_known_dups ()
kono
parents:
diff changeset
268 desired_order = master_list
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 if show_master:
kono
parents:
diff changeset
271 print " Canonical order of gcc include files: "
kono
parents:
diff changeset
272 for x in master_list:
kono
parents:
diff changeset
273 print x
kono
parents:
diff changeset
274 print " "
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 if usage:
kono
parents:
diff changeset
277 print "gcc-order-headers [-i] [-v] file1 [filen]"
kono
parents:
diff changeset
278 print " Ensures gcc's headers files are included in a normalized form with"
kono
parents:
diff changeset
279 print " redundant headers removed. The original files are saved in filename.bak"
kono
parents:
diff changeset
280 print " Outputs a list of files which changed."
kono
parents:
diff changeset
281 print " -i ignore conditional compilation."
kono
parents:
diff changeset
282 print " Use after examining the file to be sure includes within #ifs are safe"
kono
parents:
diff changeset
283 print " Any headers within conditional sections will be ignored."
kono
parents:
diff changeset
284 print " -v Show the canonical order of known headers"
kono
parents:
diff changeset
285 sys.exit(0)
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 didnt_do = list ()
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 for fn in file_list:
kono
parents:
diff changeset
291 nest = 0
kono
parents:
diff changeset
292 src_h = list ()
kono
parents:
diff changeset
293 src_line = { }
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 master_list = list ()
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 includes = { }
kono
parents:
diff changeset
298 dups = { }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 iinfo = process_ii_src (fn)
kono
parents:
diff changeset
301 src = ii_src (iinfo)
kono
parents:
diff changeset
302 include_list = ii_include_list (iinfo)
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 if ii_include_list_cond (iinfo):
kono
parents:
diff changeset
305 if not ignore_conditional:
kono
parents:
diff changeset
306 print fn + ": Cannot process due to conditional compilation of includes"
kono
parents:
diff changeset
307 didnt_do.append (fn)
kono
parents:
diff changeset
308 src = list ()
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 if not src:
kono
parents:
diff changeset
311 continue
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 process_stack = list ()
kono
parents:
diff changeset
314 # prime the stack with headers in the main ordering list so we get them in
kono
parents:
diff changeset
315 # this order.
kono
parents:
diff changeset
316 for d in order:
kono
parents:
diff changeset
317 if d in include_list:
kono
parents:
diff changeset
318 process_stack.insert (0, (d, ""))
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 for d in include_list:
kono
parents:
diff changeset
321 nm = os.path.basename(d)
kono
parents:
diff changeset
322 src_h.append (nm)
kono
parents:
diff changeset
323 iname = d
kono
parents:
diff changeset
324 iname2 = os.path.dirname (fn) + "/" + d
kono
parents:
diff changeset
325 if not os.path.exists (d) and os.path.exists (iname2):
kono
parents:
diff changeset
326 iname = iname2
kono
parents:
diff changeset
327 if iname not in process_stack:
kono
parents:
diff changeset
328 process_stack.insert (0, (iname, ""))
kono
parents:
diff changeset
329 src_line[nm] = ii_src_line(iinfo)[d]
kono
parents:
diff changeset
330 if src_line[nm].find("/*") != -1 and src_line[nm].find("*/") == -1:
kono
parents:
diff changeset
331 # this means we have a multi line comment, abort!'
kono
parents:
diff changeset
332 print fn + ": Cannot process due to a multi-line comment :"
kono
parents:
diff changeset
333 print " " + src_line[nm]
kono
parents:
diff changeset
334 if fn not in didnt_do:
kono
parents:
diff changeset
335 didnt_do.append (fn)
kono
parents:
diff changeset
336 src = list ()
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 if not src:
kono
parents:
diff changeset
339 continue
kono
parents:
diff changeset
340
kono
parents:
diff changeset
341 # Now create the list of includes as seen by the source file.
kono
parents:
diff changeset
342 while process_stack:
kono
parents:
diff changeset
343 info = process_stack.pop ()
kono
parents:
diff changeset
344 process_one (info)
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 for i in include_list:
kono
parents:
diff changeset
347 create_master_list (os.path.basename (i), False)
kono
parents:
diff changeset
348
kono
parents:
diff changeset
349 new_src = list ()
kono
parents:
diff changeset
350 header_added = list ()
kono
parents:
diff changeset
351 new_order = list ()
kono
parents:
diff changeset
352 for line in src:
kono
parents:
diff changeset
353 d = find_pound_include (line, True, True)
kono
parents:
diff changeset
354 if not d or d[-2:] != ".h":
kono
parents:
diff changeset
355 new_src.append (line)
kono
parents:
diff changeset
356 else:
kono
parents:
diff changeset
357 if d == order[0] and not new_order:
kono
parents:
diff changeset
358 new_order = get_new_order (src_h, desired_order)
kono
parents:
diff changeset
359 for i in new_order:
kono
parents:
diff changeset
360 new_src.append (src_line[i])
kono
parents:
diff changeset
361 # if not seen, add it.
kono
parents:
diff changeset
362 if i not in header_added:
kono
parents:
diff changeset
363 header_added.append (i)
kono
parents:
diff changeset
364 else:
kono
parents:
diff changeset
365 nm = os.path.basename(d)
kono
parents:
diff changeset
366 if nm not in header_added:
kono
parents:
diff changeset
367 iby = indirectly_included (nm, src_h)
kono
parents:
diff changeset
368 if not iby:
kono
parents:
diff changeset
369 new_src.append (line)
kono
parents:
diff changeset
370 header_added.append (nm)
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 if src != new_src:
kono
parents:
diff changeset
373 os.rename (fn, fn + ".bak")
kono
parents:
diff changeset
374 fl = open(fn,"w")
kono
parents:
diff changeset
375 for line in new_src:
kono
parents:
diff changeset
376 fl.write (line)
kono
parents:
diff changeset
377 fl.close ()
kono
parents:
diff changeset
378 print fn
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 if didnt_do:
kono
parents:
diff changeset
382 print "\n\n Did not process the following files due to conditional dependencies:"
kono
parents:
diff changeset
383 str = ""
kono
parents:
diff changeset
384 for x in didnt_do:
kono
parents:
diff changeset
385 str += x + " "
kono
parents:
diff changeset
386 print str
kono
parents:
diff changeset
387 print "\n"
kono
parents:
diff changeset
388 print "Please examine to see if they are safe to process, and re-try with -i. "
kono
parents:
diff changeset
389 print "Safeness is determined by checking whether any of the reordered headers are"
kono
parents:
diff changeset
390 print "within a conditional and could be hauled out of the conditional, thus changing"
kono
parents:
diff changeset
391 print "what the compiler will see."
kono
parents:
diff changeset
392 print "Multi-line comments after a #include can also cause failuer, they must be turned"
kono
parents:
diff changeset
393 print "into single line comments or removed."
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397