#!/usr/bin/env python3 # 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. from __future__ import print_function import os import re import sys from codecs import open from compat import xrange def fix_guards(fpath, checkonly): with open(fpath, 'r', encoding='utf-8') as f: lines = [l.strip('\n') for l in f.readlines()] if any(x.startswith('// fix_include_guards: off') for x in lines): return 0 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('Wrong #include guards in %s' % fpath, file=sys.stderr) return 1 with open(fpath, 'w', encoding='utf-8') 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', 'src/profiling/memory/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())