source: SHX/trunk/sandbox/scanshc.py @ 166

Revision 166, 3.3 KB checked in by marcus, 11 years ago (diff)
  • improved command detection with contain colons
  • list of commands sorted by their's commonness
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Rev Id Date
Line 
1# -*- coding: utf-8 -*-
2
3import os
4import sys
5import re
6from glob import glob
7from copy import copy
8
9seen = []
10
11commands = {}
12procedure = {}
13
14class scanfile(object):
15    def __init__(self, name):
16        self.filename = name
17        self.path, self.name = os.path.split(name)
18
19        self.scan()
20
21    def scan(self):
22        try:
23            data = open(self.filename).readlines()
24            self.procedure = True
25            print >> sys.stderr, "open command procedure '%s'" % self.name
26        except IOError:
27            self.procedure = False
28            return False
29
30        regex = re.compile("[; /]")
31
32        cmds = {}
33        for line in data:
34            line = line.strip(" @").strip().lower()
35
36            # skip all comments, commands from variables, concatenated commands, empty lines
37            if line.startswith("!") or \
38               line.startswith("#") or \
39               line.startswith("-") or \
40               line.startswith('"') or \
41               line.startswith('|') or \
42               not line:
43                continue
44
45            # get first word
46            cmd = re.split(regex, line)[0]
47
48            # skip goto targets and abandoned commands (they may contain an colon)
49            if ":" in cmd:
50                continue
51
52            # check for command procedure of that name
53            new_proc = False
54            if cmd not in seen:
55                x = scanfile(os.path.join(self.path, cmd.upper() + ".SHC"))
56
57                seen.append(cmd)
58
59                if x.procedure:
60                    procedure[cmd] = x.cmds
61                    proc = True
62                    new_proc = True
63                else:
64                    proc = False
65            else:
66                proc = cmd in procedure
67
68            if proc:
69                tobeadded = procedure[cmd]
70            else:
71                tobeadded = {cmd: 1}
72
73            try:
74                cmds[cmd] += 1
75            except KeyError:
76                cmds[cmd] = 1
77
78            # save only if not a command procedure
79            if not new_proc:
80                # check for nested command procedures
81                tobeadded = self.resolveNested(tobeadded)
82
83                for cmd in tobeadded:
84                    try:
85                        commands[cmd] += tobeadded[cmd]
86                    except KeyError:
87                        commands[cmd] = tobeadded[cmd]
88
89        self.cmds = cmds
90        return True
91
92    def resolveNested(self, cmds, weight=1):
93        ret = {}
94        for cmd in copy(cmds):
95            if cmd in procedure:
96                for c in self.resolveNested(procedure[cmd], cmds[cmd]):
97                    cmds.update({c:cmds[cmd]+1*weight})
98
99                del cmds[cmd]
100            else:
101                ret.update({cmd:cmds[cmd]})
102
103        return ret
104
105class scandir(object):
106    def __init__(self, name):
107        self.name = name
108
109        for f in glob(os.path.join(name, "*.SHC")):
110            scanfile(f)
111
112if __name__ == "__main__":
113    try:
114        if os.path.isfile(sys.argv[1]):
115            a = scanfile(sys.argv[1])
116        else:
117            a = scandir(sys.argv[1])
118    except IndexError:
119        quit("please enter file or directory to be checked!")
120
121    ordered = commands.items()
122    ordered.sort(key=lambda x: x[1], reverse=True)
123
124    for cmd in ordered:
125        print cmd[0], cmd[1]
Note: See TracBrowser for help on using the repository browser.