xref: /aosp_15_r20/external/XNNPACK/scripts/sort-filenames.py (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker#!/usr/bin/python3
2*4bdc9457SAndroid Build Coastguard Workerimport re
3*4bdc9457SAndroid Build Coastguard Workerimport argparse
4*4bdc9457SAndroid Build Coastguard Worker
5*4bdc9457SAndroid Build Coastguard Workerparser = argparse.ArgumentParser()
6*4bdc9457SAndroid Build Coastguard Workerparser.add_argument('inputs', nargs='+', help='Input filename')
7*4bdc9457SAndroid Build Coastguard Workerparser.add_argument('--min_lines', type=int, default=1, help='Specify the min number of lines to rearrange')
8*4bdc9457SAndroid Build Coastguard Workerargs = parser.parse_args()
9*4bdc9457SAndroid Build Coastguard Worker
10*4bdc9457SAndroid Build Coastguard Workermin_num_lines = args.min_lines
11*4bdc9457SAndroid Build Coastguard Worker
12*4bdc9457SAndroid Build Coastguard Workerfilename_regex = '(src|source|unit_test|include)/.*$'
13*4bdc9457SAndroid Build Coastguard Worker
14*4bdc9457SAndroid Build Coastguard Worker# caveat: Does fully not handle numbers with different number of digits.
15*4bdc9457SAndroid Build Coastguard Workerdef compare_strs(str1, str2, num_sort=True):
16*4bdc9457SAndroid Build Coastguard Worker    winner = 0 # which one's bigger
17*4bdc9457SAndroid Build Coastguard Worker    num_sort_mode = False
18*4bdc9457SAndroid Build Coastguard Worker    for i in range(min(len(str1),len(str2))):
19*4bdc9457SAndroid Build Coastguard Worker        if winner == 0:
20*4bdc9457SAndroid Build Coastguard Worker            if num_sort:
21*4bdc9457SAndroid Build Coastguard Worker                if str1[i].isdigit() and str2[i].isdigit():
22*4bdc9457SAndroid Build Coastguard Worker                    if num_sort_mode:
23*4bdc9457SAndroid Build Coastguard Worker                        str1_num += str1[i]
24*4bdc9457SAndroid Build Coastguard Worker                        str2_num += str2[i]
25*4bdc9457SAndroid Build Coastguard Worker                    else:
26*4bdc9457SAndroid Build Coastguard Worker                        num_sort_mode = True
27*4bdc9457SAndroid Build Coastguard Worker                        str1_num = str1[i]
28*4bdc9457SAndroid Build Coastguard Worker                        str2_num = str2[i]
29*4bdc9457SAndroid Build Coastguard Worker                elif num_sort_mode:
30*4bdc9457SAndroid Build Coastguard Worker                    if str1[i].isdigit(): str1_num += str1[i]
31*4bdc9457SAndroid Build Coastguard Worker                    if str2[i].isdigit(): str2_num += str2[i]
32*4bdc9457SAndroid Build Coastguard Worker                    winner = int(str1_num) - int(str2_num)
33*4bdc9457SAndroid Build Coastguard Worker                    num_sort_mode = False
34*4bdc9457SAndroid Build Coastguard Worker                    if winner != 0: break
35*4bdc9457SAndroid Build Coastguard Worker            if str1[i] != str2[i] and not num_sort_mode:
36*4bdc9457SAndroid Build Coastguard Worker                if str2[i].isdigit():
37*4bdc9457SAndroid Build Coastguard Worker                    winner = -1
38*4bdc9457SAndroid Build Coastguard Worker                elif str1[i].isdigit() or str1[i] > str2[i]:
39*4bdc9457SAndroid Build Coastguard Worker                    winner = 1
40*4bdc9457SAndroid Build Coastguard Worker                else:
41*4bdc9457SAndroid Build Coastguard Worker                    winner = -1
42*4bdc9457SAndroid Build Coastguard Worker    if num_sort_mode: # if it's still in num_sort_mode then find the results
43*4bdc9457SAndroid Build Coastguard Worker        if len(str1)-1 > i:
44*4bdc9457SAndroid Build Coastguard Worker            i += 1
45*4bdc9457SAndroid Build Coastguard Worker            if str1[i].isdigit(): str1_num += str1[i]
46*4bdc9457SAndroid Build Coastguard Worker        elif len(str2)-1 > i:
47*4bdc9457SAndroid Build Coastguard Worker            i += 1
48*4bdc9457SAndroid Build Coastguard Worker            if str2[i].isdigit(): str2_num += str2[i]
49*4bdc9457SAndroid Build Coastguard Worker        if int(str1_num) > int(str2_num):
50*4bdc9457SAndroid Build Coastguard Worker            winner = 1
51*4bdc9457SAndroid Build Coastguard Worker        elif int(str1_num) < int(str2_num):
52*4bdc9457SAndroid Build Coastguard Worker            winner = -1
53*4bdc9457SAndroid Build Coastguard Worker        num_sort_mode = False
54*4bdc9457SAndroid Build Coastguard Worker
55*4bdc9457SAndroid Build Coastguard Worker    if winner == 0:
56*4bdc9457SAndroid Build Coastguard Worker        if str2[i].isdigit():
57*4bdc9457SAndroid Build Coastguard Worker            winner = -1
58*4bdc9457SAndroid Build Coastguard Worker        elif str1[i].isdigit() or str1[i] > str2[i]:
59*4bdc9457SAndroid Build Coastguard Worker            winner = 1
60*4bdc9457SAndroid Build Coastguard Worker        else:
61*4bdc9457SAndroid Build Coastguard Worker            winner = -1
62*4bdc9457SAndroid Build Coastguard Worker    return winner
63*4bdc9457SAndroid Build Coastguard Worker
64*4bdc9457SAndroid Build Coastguard Worker
65*4bdc9457SAndroid Build Coastguard Workerdef cmp_to_key(mycmp):
66*4bdc9457SAndroid Build Coastguard Worker    'Convert a cmp= function into a key= function'
67*4bdc9457SAndroid Build Coastguard Worker    class K:
68*4bdc9457SAndroid Build Coastguard Worker        def __init__(self, obj, *args):
69*4bdc9457SAndroid Build Coastguard Worker            self.obj = obj
70*4bdc9457SAndroid Build Coastguard Worker        def __lt__(self, other):
71*4bdc9457SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) < 0
72*4bdc9457SAndroid Build Coastguard Worker        def __gt__(self, other):
73*4bdc9457SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) > 0
74*4bdc9457SAndroid Build Coastguard Worker        def __eq__(self, other):
75*4bdc9457SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) == 0
76*4bdc9457SAndroid Build Coastguard Worker        def __le__(self, other):
77*4bdc9457SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) <= 0
78*4bdc9457SAndroid Build Coastguard Worker        def __ge__(self, other):
79*4bdc9457SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) >= 0
80*4bdc9457SAndroid Build Coastguard Worker        def __ne__(self, other):
81*4bdc9457SAndroid Build Coastguard Worker            return mycmp(self.obj, other.obj) != 0
82*4bdc9457SAndroid Build Coastguard Worker    return K
83*4bdc9457SAndroid Build Coastguard Worker
84*4bdc9457SAndroid Build Coastguard Workerdef custom_sort(listy):
85*4bdc9457SAndroid Build Coastguard Worker    for _ in range(len(listy)-1+1):
86*4bdc9457SAndroid Build Coastguard Worker        for i in range(len(listy)-1):
87*4bdc9457SAndroid Build Coastguard Worker            bigger = compare_strs(listy[i], listy[i+1])
88*4bdc9457SAndroid Build Coastguard Worker            if bigger > 0:
89*4bdc9457SAndroid Build Coastguard Worker                tmp_str = listy[i]
90*4bdc9457SAndroid Build Coastguard Worker                listy[i] = listy[i+1]
91*4bdc9457SAndroid Build Coastguard Worker                listy[i+1] = tmp_str
92*4bdc9457SAndroid Build Coastguard Worker    return listy
93*4bdc9457SAndroid Build Coastguard Worker
94*4bdc9457SAndroid Build Coastguard Worker# file_lines = [l.strip(stripchars) for l in file_lines]
95*4bdc9457SAndroid Build Coastguard Worker# currently sorting by first number in filename. smallest numbers first
96*4bdc9457SAndroid Build Coastguard Worker# this thing may need the ability to recognize filenames
97*4bdc9457SAndroid Build Coastguard Worker# file_lines = sorted(file_lines, key=lambda line: int(re.search('\d+', line.split('/')[-1] + ' 0').group(0)))
98*4bdc9457SAndroid Build Coastguard Workerinput_filenames=args.inputs
99*4bdc9457SAndroid Build Coastguard Workerfor input_filename in input_filenames:
100*4bdc9457SAndroid Build Coastguard Worker    with open(input_filename,'r') as file:
101*4bdc9457SAndroid Build Coastguard Worker        file_lines = file.read().split('\n')
102*4bdc9457SAndroid Build Coastguard Worker    output_filename=input_filename
103*4bdc9457SAndroid Build Coastguard Worker    files_range = [] # is a tuple
104*4bdc9457SAndroid Build Coastguard Worker    filenames_ranges = []
105*4bdc9457SAndroid Build Coastguard Worker    for i, line in enumerate(file_lines):
106*4bdc9457SAndroid Build Coastguard Worker        if re.search(filename_regex, line):
107*4bdc9457SAndroid Build Coastguard Worker            if files_range == []:
108*4bdc9457SAndroid Build Coastguard Worker                files_range.append(i)
109*4bdc9457SAndroid Build Coastguard Worker        else:
110*4bdc9457SAndroid Build Coastguard Worker            if files_range != []:
111*4bdc9457SAndroid Build Coastguard Worker                files_range.append(i-1)
112*4bdc9457SAndroid Build Coastguard Worker                # manages min num lines
113*4bdc9457SAndroid Build Coastguard Worker                if files_range[1] - files_range[0] + 1 >= min_num_lines:filenames_ranges.append(files_range)
114*4bdc9457SAndroid Build Coastguard Worker                files_range = []
115*4bdc9457SAndroid Build Coastguard Worker    if files_range != []:
116*4bdc9457SAndroid Build Coastguard Worker        files_range.append(i-1)
117*4bdc9457SAndroid Build Coastguard Worker        # manages min num lines
118*4bdc9457SAndroid Build Coastguard Worker        if files_range[1] - files_range[0] + 1 >= min_num_lines:filenames_ranges.append(files_range)
119*4bdc9457SAndroid Build Coastguard Worker        files_range = []
120*4bdc9457SAndroid Build Coastguard Worker
121*4bdc9457SAndroid Build Coastguard Worker
122*4bdc9457SAndroid Build Coastguard Worker    for x in filenames_ranges:
123*4bdc9457SAndroid Build Coastguard Worker        # accommodate for a close bracket at the end of the last filename
124*4bdc9457SAndroid Build Coastguard Worker        if file_lines[x[1]][-1] == ')':
125*4bdc9457SAndroid Build Coastguard Worker            append_chars = ')'
126*4bdc9457SAndroid Build Coastguard Worker            file_lines[x[1]] = file_lines[x[1]][:-1]
127*4bdc9457SAndroid Build Coastguard Worker        else:
128*4bdc9457SAndroid Build Coastguard Worker            append_chars = ''
129*4bdc9457SAndroid Build Coastguard Worker
130*4bdc9457SAndroid Build Coastguard Worker        new_lines = sorted(file_lines[x[0]:x[1]+1], key=cmp_to_key(compare_strs))
131*4bdc9457SAndroid Build Coastguard Worker        for i, l in enumerate(range(x[0], x[1]+1)):
132*4bdc9457SAndroid Build Coastguard Worker            file_lines[l] = new_lines[i]
133*4bdc9457SAndroid Build Coastguard Worker            if l == x[1]:
134*4bdc9457SAndroid Build Coastguard Worker                file_lines[l] += append_chars
135*4bdc9457SAndroid Build Coastguard Worker
136*4bdc9457SAndroid Build Coastguard Worker    with open(output_filename, 'w') as file:
137*4bdc9457SAndroid Build Coastguard Worker        file.write('\n'.join(file_lines))
138