#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import subprocess import datetime import argparse import commands import re git_repo_path = os.path.abspath(subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).strip()) string_h_functions = [ "memchr", "memcmp", "memcpy", "memmove", "memset", "strcat", "strchr", "strcmp", "strcoll", "strcpy", "strcspn", "strerror", "strlen", "strncat", "strncmp", "strncpy", "strpbrk", "strrchr", "strspn", "strstr", "strtok", "strxfrm", "strtok_r", "strerror_r", "strdup", "memccpy", "stpcpy", "stpncpy", "strndup", "strnlen", "strsignal", "memset_s", "memmem", "memset_pattern4", "memset_pattern8", "memset_pattern16", "strcasestr", "strnstr", "strlcat", "strlcpy", "strmode", "strsep", "swab", "timingsafe_bcmp", ] def process_if_appropriate(file_path): file_ext = os.path.splitext(file_path)[1] if file_ext.lower() not in ('.c', '.cpp', '.m', '.mm', '.h', '.swift'): return # print 'file_path', file_path, 'file_ext', file_ext with open(file_path, 'rt') as f: text = f.read() has_match = False for string_h_function in string_h_functions: regex = re.compile(string_h_function + r'\s*\(') assert(regex) matches = [] for match in regex.finditer(text): matches.append(match) # matches = regex.findall(text) if not matches: continue if not has_match: has_match = True print 'file_path', file_path, 'file_ext', file_ext for match in matches: # print 'match', match, type(match) print '\t', 'match:', match.group(0) if has_match: print if __name__ == "__main__": parser = argparse.ArgumentParser(description='Precommit script.') parser.add_argument('--path', help='used to specify a path to process.') args = parser.parse_args() if args.path: dir_path = args.path else: dir_path = git_repo_path for rootdir, dirnames, filenames in os.walk(dir_path): for filename in filenames: file_path = os.path.abspath(os.path.join(rootdir, filename)) process_if_appropriate(file_path)