166 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python3
 | 
						|
# pylint: disable=locally-disabled, line-too-long, unused-argument, unused-variable, pointless-string-statement, too-many-locals, missing-docstring, too-many-statements, invalid-name, wrong-import-position, too-many-arguments, too-many-branches
 | 
						|
# Copyright Novatek Microelectronics Corp. 2016.  All rights reserved.
 | 
						|
 | 
						|
"""Implements a test item for script """
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import re
 | 
						|
 | 
						|
def count_format(format_line):
 | 
						|
    format_list = list()
 | 
						|
    for i in range(len(format_line)-2):
 | 
						|
        ch0 = format_line[i]
 | 
						|
        ch1 = format_line[i+1]
 | 
						|
        if i < len(format_line)-2:
 | 
						|
            ch2 = format_line[i+2]
 | 
						|
        else:
 | 
						|
            ch2 = ''
 | 
						|
        if i < len(format_line)-3:
 | 
						|
            ch3 = format_line[i+3]
 | 
						|
        else:
 | 
						|
            ch3 = ''
 | 
						|
        if ch0 == r'%':
 | 
						|
            if ch1 == 's' or ch1 == 'S':
 | 
						|
                format_list.append('s')
 | 
						|
            elif ch1 == 'd' or ch1 == 'D':
 | 
						|
                format_list.append('d')
 | 
						|
            elif ch1 == 'u' or ch1 == 'U':
 | 
						|
                format_list.append('u')
 | 
						|
            elif ch1 == 'x' or ch1 == 'X':
 | 
						|
                format_list.append('x')
 | 
						|
            elif ch1 == 'l' or ch1 == 'L':
 | 
						|
                if ch2 == 'd' or ch2 == 'D':
 | 
						|
                    format_list.append('ld')
 | 
						|
                elif ch2 == 'u' or ch2 == 'U':
 | 
						|
                    format_list.append('lu')
 | 
						|
                elif ch2 == 'x' or ch2 == 'X':
 | 
						|
                    format_list.append('lx')
 | 
						|
                elif ch2 == 'l' or ch2 == 'L':
 | 
						|
                    if ch3 == 'd' or ch3 == 'D':
 | 
						|
                        format_list.append('lld')
 | 
						|
                    elif ch3 == 'u' or ch3 == 'U':
 | 
						|
                        format_list.append('llu')
 | 
						|
                    elif ch3 == 'x' or ch3 == 'X':
 | 
						|
                        format_list.append('llx')
 | 
						|
    return format_list
 | 
						|
 | 
						|
def count_param(param_line):
 | 
						|
    param_list = list()
 | 
						|
    re_param_list = [
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*),(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*),(.*)'),
 | 
						|
        re.compile(r'(.*),(.*)'),
 | 
						|
        re.compile(r'(.*)')
 | 
						|
    ]
 | 
						|
 | 
						|
    for re_param in re_param_list:
 | 
						|
        match = re.search(re_param, param_line)
 | 
						|
        if match:
 | 
						|
            for i in range(re_param.groups):
 | 
						|
                param_list.append(match.group(i+1).strip())
 | 
						|
            break
 | 
						|
    return param_list
 | 
						|
 | 
						|
def modify_line(format_line, format_list, param_list):
 | 
						|
    line_changed = False
 | 
						|
    new_line = None
 | 
						|
    for i in range(len(format_list)):
 | 
						|
        format_tag = format_list[i]
 | 
						|
        format_param = param_list[i]
 | 
						|
        if format_tag == 's':
 | 
						|
            continue
 | 
						|
        if "int)"in format_param:
 | 
						|
            continue
 | 
						|
        if format_tag == 'd':
 | 
						|
            param_list[i] = "(int)(" + format_param + ")"
 | 
						|
        elif format_tag == 'u' or format_tag == 'x':
 | 
						|
            param_list[i] = "(unsigned int)(" + format_param + ")"
 | 
						|
        elif format_tag == 'ld':
 | 
						|
            param_list[i] = "(long)(" + format_param + ")"
 | 
						|
        elif format_tag == 'lu' or format_tag == 'lx':
 | 
						|
            param_list[i] = "(unsigned long)(" + format_param + ")"
 | 
						|
        elif format_tag == 'lld':
 | 
						|
            param_list[i] = "(long long)(" + format_param + ")"
 | 
						|
        elif format_tag == 'llu' or format_tag == 'llx':
 | 
						|
            param_list[i] = "(unsigned long long)(" + format_param + ")"
 | 
						|
        if param_list[i] != format_param:                        
 | 
						|
            #print(format_param, param_list[i])
 | 
						|
            line_changed = True
 | 
						|
    if line_changed:
 | 
						|
        new_line = '("' + format_line + '", '
 | 
						|
        for i in range(len(format_list)):
 | 
						|
            format_param = param_list[i]
 | 
						|
            new_line = new_line + format_param
 | 
						|
            if i != len(format_list)-1:
 | 
						|
                new_line = new_line + ", "
 | 
						|
            else:
 | 
						|
                new_line = new_line + ")"
 | 
						|
    return new_line
 | 
						|
 | 
						|
def refine(file_path):
 | 
						|
    context_changed = False
 | 
						|
    re_quotation = re.compile(r'\("(.*)",(.*)\)')
 | 
						|
    with open(file_path, 'rt',encoding="Big5", errors='ignore') as fin:
 | 
						|
        with open(file_path+".new", 'wt',encoding="Big5", errors='ignore') as fout:
 | 
						|
            line = fin.readline()
 | 
						|
            line = line.encode("ascii", errors="ignore").decode("ascii", errors="ignore")
 | 
						|
            while line:            
 | 
						|
                line_changed = False
 | 
						|
                match = re.search(re_quotation, line)
 | 
						|
                if not match:
 | 
						|
                    fout.write(line)
 | 
						|
                    line = fin.readline()
 | 
						|
                    continue
 | 
						|
                #print("{}, {}".format(match.group(1), match.group(2)))
 | 
						|
                syntax_line = match.group(0)
 | 
						|
                format_line = match.group(1)
 | 
						|
                param_line = match.group(2)
 | 
						|
                # check if sscanf or define
 | 
						|
                if '&' in param_line or '#define' in line:
 | 
						|
                    fout.write(line)
 | 
						|
                    line = fin.readline()
 | 
						|
                    continue
 | 
						|
                # count fromat number of % and number of param should be matched
 | 
						|
                format_list = count_format(format_line)
 | 
						|
                param_list = count_param(param_line)           
 | 
						|
                if len(format_list) == len(param_list):
 | 
						|
                    #print("{}, {}, {}".format(line, format_list, param_list))
 | 
						|
                    new_line = modify_line(format_line, format_list, param_list)
 | 
						|
                    if new_line is not None:
 | 
						|
                        line = line.replace(syntax_line, new_line)
 | 
						|
                        context_changed = True
 | 
						|
                fout.write(line)
 | 
						|
                line = fin.readline()
 | 
						|
    if not context_changed:
 | 
						|
        os.remove(file_path+".new")
 | 
						|
    else:
 | 
						|
        os.remove(file_path)
 | 
						|
        os.rename(file_path+".new", file_path)            
 | 
						|
    return 0
 | 
						|
 | 
						|
def main(argv):
 | 
						|
    print("processing {}".format(sys.argv[1]))
 | 
						|
    refine(sys.argv[1])
 | 
						|
    return 0
 | 
						|
 | 
						|
# ============================================================================================
 | 
						|
# DO NOT EDIT FOLLOWING CODES
 | 
						|
# ============================================================================================
 | 
						|
if __name__ == "__main__":
 | 
						|
    def local_run():
 | 
						|
        if len (sys.argv) != 2:
 | 
						|
            print("Usage: python3 refine_format.py [c file]");
 | 
						|
            print("e.g: python3 refine_format.py myfile.c");
 | 
						|
            return -1
 | 
						|
        err = main(sys.argv)
 | 
						|
        return err
 | 
						|
    sys.exit(local_run())
 | 
						|
# ============================================================================================
 |