1*38e38f23SMatthias Ringwald#!/usr/bin/env python3 2*38e38f23SMatthias Ringwald 3*38e38f23SMatthias Ringwald# requires https://github.com/terryyin/lizard 4*38e38f23SMatthias Ringwald 5*38e38f23SMatthias Ringwaldimport lizard 6*38e38f23SMatthias Ringwaldimport os 7*38e38f23SMatthias Ringwaldimport sys 8*38e38f23SMatthias Ringwald 9*38e38f23SMatthias Ringwaldfolders = [ 10*38e38f23SMatthias Ringwald'src', 11*38e38f23SMatthias Ringwald'src/ble', 12*38e38f23SMatthias Ringwald'src/ble/gatt-service', 13*38e38f23SMatthias Ringwald'src/classic', 14*38e38f23SMatthias Ringwald] 15*38e38f23SMatthias Ringwald 16*38e38f23SMatthias Ringwaldmetrics = {} 17*38e38f23SMatthias Ringwaldtargets = {} 18*38e38f23SMatthias Ringwald 19*38e38f23SMatthias Ringwaldtargets['CCN'] = 10 20*38e38f23SMatthias Ringwaldtargets['PARAM'] = 7 21*38e38f23SMatthias Ringwald 22*38e38f23SMatthias Ringwalddef metric_count(name): 23*38e38f23SMatthias Ringwald global metrics 24*38e38f23SMatthias Ringwald value = 0 25*38e38f23SMatthias Ringwald if name in metrics: 26*38e38f23SMatthias Ringwald value = metrics[name] 27*38e38f23SMatthias Ringwald metrics[name] = value + 1 28*38e38f23SMatthias Ringwald 29*38e38f23SMatthias Ringwald 30*38e38f23SMatthias Ringwalddef metric_list(name, item): 31*38e38f23SMatthias Ringwald global metrics 32*38e38f23SMatthias Ringwald value = [] 33*38e38f23SMatthias Ringwald if name in metrics: 34*38e38f23SMatthias Ringwald value = metrics[name] 35*38e38f23SMatthias Ringwald value.append(item) 36*38e38f23SMatthias Ringwald metrics[name] = value 37*38e38f23SMatthias Ringwald 38*38e38f23SMatthias Ringwalddef metric_max(name, max): 39*38e38f23SMatthias Ringwald global metrics 40*38e38f23SMatthias Ringwald if name in metrics: 41*38e38f23SMatthias Ringwald if metrics[name] > max: 42*38e38f23SMatthias Ringwald return 43*38e38f23SMatthias Ringwald metrics[name] = max 44*38e38f23SMatthias Ringwald 45*38e38f23SMatthias Ringwalddef metric_measure(metric_name, functino_name, actual): 46*38e38f23SMatthias Ringwald metric_max(metric_name + '_MAX', actual) 47*38e38f23SMatthias Ringwald if metric_name in targets: 48*38e38f23SMatthias Ringwald if actual > targets[metric_name]: 49*38e38f23SMatthias Ringwald metric_count(metric_name + '_DEVIATIONS') 50*38e38f23SMatthias Ringwald metric_list(metric_name + '_LIST', functino_name) 51*38e38f23SMatthias Ringwald 52*38e38f23SMatthias Ringwalddef analyze_file(path): 53*38e38f23SMatthias Ringwald l = lizard.analyze_file(path) 54*38e38f23SMatthias Ringwald for f in l.function_list: 55*38e38f23SMatthias Ringwald metric_count('FUNC') 56*38e38f23SMatthias Ringwald metric_measure('PARAM', f.name, f.parameter_count) 57*38e38f23SMatthias Ringwald metric_measure('CCN', f.name, f.cyclomatic_complexity ) 58*38e38f23SMatthias Ringwald 59*38e38f23SMatthias Ringwalddef analyze_folder(folder_path): 60*38e38f23SMatthias Ringwald for file in sorted(os.listdir(folder_path)): 61*38e38f23SMatthias Ringwald if file.endswith(".c"): 62*38e38f23SMatthias Ringwald analyze_file(folder_path+'/'+file) 63*38e38f23SMatthias Ringwald 64*38e38f23SMatthias Ringwald# find root 65*38e38f23SMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../..') 66*38e38f23SMatthias Ringwald 67*38e38f23SMatthias Ringwaldprint ("Targets:") 68*38e38f23SMatthias Ringwaldfor key,value in sorted(targets.items()): 69*38e38f23SMatthias Ringwald print ('- %-20s: %u' % (key, value)) 70*38e38f23SMatthias Ringwald 71*38e38f23SMatthias Ringwaldprint ("\nAnalyzing:") 72*38e38f23SMatthias Ringwaldfor path in folders: 73*38e38f23SMatthias Ringwald print('- %s' % path) 74*38e38f23SMatthias Ringwald analyze_folder(btstack_root + "/" + path) 75*38e38f23SMatthias Ringwald 76*38e38f23SMatthias Ringwaldprint ("\nResult:") 77*38e38f23SMatthias Ringwald 78*38e38f23SMatthias Ringwaldfor key,value in sorted(metrics.items()): 79*38e38f23SMatthias Ringwald if key.endswith('LIST'): 80*38e38f23SMatthias Ringwald continue 81*38e38f23SMatthias Ringwald print ('- %-20s: %4u' % (key, value)) 82*38e38f23SMatthias Ringwald 83*38e38f23SMatthias Ringwaldfor key,value in sorted(metrics.items()): 84*38e38f23SMatthias Ringwald if not key.endswith('LIST'): 85*38e38f23SMatthias Ringwald continue 86*38e38f23SMatthias Ringwald print ("\n%s" % key) 87*38e38f23SMatthias Ringwald print ('\n'.join(value)) 88*38e38f23SMatthias Ringwald 89