|  | #!/usr/bin/env python | 
|  | # Copyright (C) 2017 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | import os | 
|  | import re | 
|  | import sys | 
|  |  | 
|  | def fix_guards(fpath, checkonly): | 
|  | with open(fpath, 'rb') as f: | 
|  | lines = [l.strip('\n') for l in f.readlines()] | 
|  | res = [] | 
|  | guard = re.sub(r'[^a-zA-Z0-9_-]', '_', fpath.upper()) + '_' | 
|  | replacements = 0 | 
|  |  | 
|  | endif_line_idx = -1 | 
|  | for line_idx in xrange(len(lines) - 1, -1, -1): | 
|  | if lines[line_idx].startswith('#endif'): | 
|  | endif_line_idx = line_idx | 
|  | break | 
|  | assert endif_line_idx > 0, fpath | 
|  |  | 
|  | line_idx = 0 | 
|  | for line in lines: | 
|  | if replacements == 0 and line.startswith('#ifndef '): | 
|  | line = '#ifndef ' + guard | 
|  | replacements = 1 | 
|  | elif replacements == 1 and line.startswith('#define '): | 
|  | line = '#define ' + guard | 
|  | replacements = 2 | 
|  | elif line_idx == endif_line_idx and replacements == 2: | 
|  | assert(line.startswith('#endif')) | 
|  | line = '#endif  // ' + guard | 
|  | res.append(line) | 
|  | line_idx += 1 | 
|  | if res == lines: | 
|  | return 0 | 
|  | if checkonly: | 
|  | print >>sys.stderr, 'Wrong #include guards in %s' % fpath | 
|  | return 1 | 
|  | with open(fpath, 'w') as f: | 
|  | f.write('\n'.join(res) + '\n') | 
|  | return 1 | 
|  |  | 
|  | def main(): | 
|  | checkonly = '--check-only' in sys.argv | 
|  | num_files_changed = 0 | 
|  | for topdir in ('src', 'include', 'test', 'tools'): | 
|  | for root, dirs, files in os.walk(topdir): | 
|  | for name in files: | 
|  | if not name.endswith('.h'): | 
|  | continue | 
|  | fpath = os.path.join(root, name) | 
|  | num_files_changed += fix_guards(fpath, checkonly) | 
|  | if checkonly: | 
|  | return 0 if num_files_changed == 0 else 1 | 
|  | else: | 
|  | print '%d files changed' % num_files_changed | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |