diff --git a/data/Pedt/codeStrip.py b/data/Pedt/codeStrip.py index ec3b8ff..946ab67 100755 --- a/data/Pedt/codeStrip.py +++ b/data/Pedt/codeStrip.py @@ -2,7 +2,7 @@ import re class CodeStrip: @classmethod - def remove_if0_blocks(cls,code): + def c_remove_if0_blocks(cls,code): stack = [] lines = code.split('\n') result = [] @@ -23,7 +23,7 @@ class CodeStrip: return '\n'.join(result) @classmethod - def remove_comments_and_spaces(cls, code): + def c_remove_comments_and_spaces(cls, code): pattern_single_comment = r'//.*' pattern_multi_comment = r'/\*[\s\S]*?\*/' code = re.sub(pattern_single_comment, '', code, flags=re.MULTILINE) @@ -31,15 +31,16 @@ class CodeStrip: code = re.sub(r'\n\s*\n', '\n', code) return code.strip() @classmethod - def code_strip(cls, code): - code=cls.remove_comments_and_spaces(code) - code=cls.remove_if0_blocks(code) - return code + def code_strip(cls,code,type): + if type == "c" or type == "cpp": + code=cls.c_remove_comments_and_spaces(code) + code=cls.c_remove_if0_blocks(code) + return code + else: + return "" -with open('source.c', 'r') as file: - code = file.read() - -processed_code = CodeStrip.code_strip(code) - -with open('source_processed.c', 'w') as file: - file.write(processed_code) \ No newline at end of file +#with open('source.c', 'r') as file: +# code = file.read() +#processed_code = CodeStrip.code_strip(code,"c") +#with open('source_processed.c', 'w') as file: +# file.write(processed_code) \ No newline at end of file diff --git a/data/Pedt/pedt.py b/data/Pedt/pedt.py index 26b0d56..e12e6ca 100755 --- a/data/Pedt/pedt.py +++ b/data/Pedt/pedt.py @@ -92,37 +92,18 @@ def parse_patch(patch_file): patch_fragment="" return patch_changes -def strip_compare(source_code,patch): - Debug.info("################before strip##############") - Debug.info(source_code) - Debug.info("#########################################") - code=CodeStrip.remove_comments_and_spaces(source_code) - source_code=CodeStrip.remove_if0_blocks(source_code) - Debug.info("################after strip##############") - Debug.info(source_code) - Debug.info("#########################################") +def fuzzy_compare(source_code,patch): return False def linebyline_compare(source_code,patch): return False -def tokens_compare(source_file,source_code,patch): - Debug.info(source_file) - if source_file.endswith(".c"): - tokens=Tokenize(patch,"c").get_tokens() - elif source_file.endswith(".cpp"): - tokens=Tokenize(patch,"cpp").get_tokens() - else: - return False +def tokens_compare(code_type,source_code,patch): + tokens=Tokenize(patch,code_type).get_tokens() Debug.info(tokens) return False -# 简单匹配 def simple_compare(source_code, patch): - #Debug.debug("#####################src######################") - #Debug.debug(source_code) - #Debug.debug("#####################patch######################") - #Debug.debug(patch) if patch in source_code: Debug.debug("patch find") return True @@ -130,23 +111,53 @@ def simple_compare(source_code, patch): Debug.debug("patch not find") return False +def source_strip(code_type,file_content,fragment): + file_content_strip="" + fragment_strip="" + file_content_strip=CodeStrip.code_strip(file_content,code_type) + fragment_strip=CodeStrip.code_strip(fragment,code_type) + return file_content_strip,fragment_strip + def compare_patch(source_file,patch): + code_type="" + if source_file.endswith(".c"): + code_type="c" + elif source_file.endswith(".cpp"): + code_type="cpp" with open(source_file, 'r') as file: file_content = file.read() for code_change in patch["changes"]: start_line = code_change["start_line"] num_lines = code_change["num_lines"] fragment = code_change["patch_fragment"] + + Debug.debug("#####################src######################") + Debug.debug(file_content) + Debug.debug("#####################src end######################") + Debug.debug("#####################patch######################") + Debug.debug(fragment) + Debug.debug("#####################patch end######################") + if simple_compare(file_content,fragment): - return True - elif strip_compare(file_content,fragment): - return True - elif tokens_compare(source_file,file_content,fragment): - return True - elif linebyline_compare(file_content,fragment): - return True - else: - return False + continue + + file_content_strip,fragment_strip=source_strip(code_type,file_content,fragment) + + if file_content_strip and fragment_strip: + if simple_compare(file_content_strip,fragment_strip): + continue + if code_type: + if tokens_compare(code_type,file_content_strip,fragment_strip): + continue + if linebyline_compare(file_content_strip,fragment_strip): + continue + + if fuzzy_compare(file_content,fragment): + continue + + return False + + return True def sacn_dir(project_dir,patch_changes): # 遍历项目目录下的所有文件