aboutsummaryrefslogtreecommitdiff
path: root/lib/actions/parseactions.py
blob: 4ab71af79aa306cc47a9953e9ea658c66798ec38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# takes a header file, outputs action ids

import tokenize, sys, string

def filter(g):
	while 1:
		t = g.next()
		if t[1] == "/*":
			while g.next()[1] != "*/":
				pass
			continue
		if t[1] == "//":
			while g.next()[1] != "\n":
				pass
			continue
		
		if t[1] != "\n":
#			print t
			yield t[1]

def do_file(f, mode):
	tokens = filter(tokenize.generate_tokens(open(f, 'r').readline))
	
	sys.stderr.write("parsing %s\n" % f)
	
	state = 0
	
	classstate = 0
	
	firsthit = 1
	
	while 1:
		try:
			t = tokens.next()
		except:
			break
		
		if t == "class":
			classname = tokens.next()
			classstate = state
		
		if t == "{":
			state = state + 1
		
		if t == "}":
			state = state - 1
		
		if t == "enum" and state == classstate + 1:
			actionname = tokens.next()
			
			if actionname == "{":
				while tokens.next() != "}":
					pass
				continue
			
			if actionname[-7:] == "Actions":
				if tokens.next() != "{":
					try:
						print classname
					except:
						pass
				
					try:
						print actionname
					except:
						pass
				
					raise "action enum must be simple."
			
				counter = 0
			
				while 1:
	
					t = tokens.next()
					
					if t == "=":
						tokens.next()
						t = tokens.next()
	
					if t == "}":
						break
					
					if counter:
						if t != ",":
							raise "no comma"
						t = tokens.next()
				
					if firsthit:

						if mode == "include":
							# hack hack hack!!
							print "#include <lib" + f[2:] + ">"
						else:
							print "\t// " + f

						firsthit = 0

					if mode == "parse":
						print "{\"" + actionname + "\", \"" + t + "\", " + string.join((classname, t), "::") + "},"


					counter = counter + 1

mode = sys.argv[1]

if mode == "parse":
	print """
	/* generated by parseactions.py - do not modify! */
struct eActionList
{
	const char *m_context, *m_action;
	int m_id;
} actions[]={"""

for x in sys.argv[2:]:
	do_file(x, mode)

if mode == "parse":
	print "};"