SHOW:
|
|
- or go back to the newest paste.
1 | import sys | |
2 | from operator import itemgetter, attrgetter | |
3 | from xml.etree.ElementTree import ElementTree | |
4 | ||
5 | # parsing config | |
6 | - | CONFIG_FILE = "cparser.xml" |
6 | + | CONFIG_FILE = "D:/python/cparser.xml" |
7 | ||
8 | tr = ElementTree() | |
9 | m=tr.parse(CONFIG_FILE) | |
10 | path = m.find("includeDir").text | |
11 | startXML = "" | |
12 | sXML = m.find("startXML") | |
13 | oXML = m.find("outputXML").text | |
14 | - | if sXML.attrib["active"].lower() == "true": |
14 | + | if sXML.attrib["active"] == "true": |
15 | startXML = sXML.text | |
16 | # parsing config | |
17 | ||
18 | inc = [] | |
19 | arr = [] | |
20 | defineID = 2 | |
21 | funcID = 1 | |
22 | ||
23 | def trim(l): | |
24 | nl = [] | |
25 | for i in l: | |
26 | if len(i) > 0: | |
27 | nl.append(i) | |
28 | return nl | |
29 | ||
30 | def stripList(l): | |
31 | for i in range(0,len(l)): | |
32 | l[i] = l[i].strip() | |
33 | return l | |
34 | ||
35 | def contains(lst, srch): | |
36 | for x in lst: | |
37 | if x == srch:return True | |
38 | return False | |
39 | ||
40 | def filter_existant(ar): | |
41 | tmp = [] | |
42 | apTmp = [] | |
43 | for x in range(0,len(ar)): | |
44 | if len(ar[x][1])<3 or str.isdigit(ar[x][1][0]) or ar[x][1].find(" ")>-1 or ar[x][1].find("\t")>=1: | |
45 | continue | |
46 | if not contains(tmp, ar[x][1]): | |
47 | apTmp.append(ar[x]) | |
48 | tmp.append(ar[x][1]) | |
49 | return apTmp | |
50 | ||
51 | ||
52 | ||
53 | ||
54 | tree = ElementTree() | |
55 | try: | |
56 | - | m=m.find("NotepadPlus") |
56 | + | |
57 | m=tree.parse(startXML) | |
58 | #m=m.find("NotepadPlus") | |
59 | l=list(m.iter("KeyWord")) | |
60 | for x in l: | |
61 | name = x.attrib["name"] | |
62 | func = funcID if x.attrib.__contains__("func") else defineID | |
63 | retval = "" | |
64 | parm = [] | |
65 | if func: | |
66 | ov = x.find("Overload") | |
67 | if ov is not None: | |
68 | retval = ov.attrib["retVal"] | |
69 | p = list(ov.iter("Param")) | |
70 | for i in p: | |
71 | parm.append(i.attrib["name"]) | |
72 | - | pass |
72 | + | |
73 | except: | |
74 | if startXML != "": | |
75 | print("loading startXML failed") | |
76 | ||
77 | def parseDefine(s): | |
78 | global arr, defineID, funcID | |
79 | s=s.replace("\t", " ") | |
80 | ls = trim(s.split(" ")) | |
81 | arr.append((defineID, ls[1], '' if len(ls)<3 else ls[2], [])) | |
82 | def parseFunc(s): | |
83 | global arr, defineID, funcID | |
84 | l = s.split("(") | |
85 | ps = l[1].split(")") | |
86 | ps = ')'.join(ps[:len(ps)-1]).split(",") | |
87 | stripList(ps) | |
88 | l[0] = l[0].replace(chr(0x9), ' ') | |
89 | tl = trim(l[0].split(" ")) | |
90 | try: | |
91 | arr.append( (funcID, tl[len(tl)-1], ' '.join(tl[0:len(tl)-1]), ps) ) | |
92 | except: | |
93 | if len(s) == 2: | |
94 | arr.append( (funcID, tl[len(tl)-1], ' ', []) ) | |
95 | ||
96 | def parseC(file): | |
97 | global inc | |
98 | global arr | |
99 | if file not in inc: | |
100 | inc.append(file) | |
101 | else: | |
102 | return | |
103 | nav = False | |
104 | ncom = 0 | |
105 | stInd = 0 | |
106 | ndef = False | |
107 | nusl = 0 | |
108 | s = "" | |
109 | zag = 0 | |
110 | bTyp = False | |
111 | nZag2 = 0 | |
112 | bInc = False | |
113 | ||
114 | try: | |
115 | fl = open(file, "r") | |
116 | print("parsing file: "+file) | |
117 | except: | |
118 | return | |
119 | f = fl.read() | |
120 | fl.close() | |
121 | ||
122 | for i in range(0,len(f)): | |
123 | ||
124 | if f[i:i+2] == "/*": | |
125 | ncom = 1 | |
126 | i+=1 | |
127 | continue | |
128 | ||
129 | if f[i:i+2] == "*/": | |
130 | ncom = 0 | |
131 | i+=1 | |
132 | stInd = i+1 | |
133 | continue | |
134 | ||
135 | if ncom == 1: | |
136 | continue | |
137 | ||
138 | if f[i]=="{" and f[stInd:i].find("extern")==-1: | |
139 | nZag2 += 1 | |
140 | if f[i]=="}": | |
141 | nZag2 -= 1 | |
142 | ||
143 | if nZag2 > 0: | |
144 | continue | |
145 | ||
146 | if f[i]!="\"" and nav: | |
147 | continue | |
148 | ||
149 | if f[i:i+7] == "#define": | |
150 | stInd = i | |
151 | ndef = True | |
152 | ||
153 | if f[i:i+8] == "#include": | |
154 | - | parseFunc(s) |
154 | + | |
155 | stInd = i | |
156 | ||
157 | if f[i]=="#": | |
158 | nusl = 1 | |
159 | ||
160 | if f[i]==";": | |
161 | if zag and not bTyp: | |
162 | s = f[stInd:i] | |
163 | try: | |
164 | - | parseFunc(s) |
164 | + | parseFunc(s) |
165 | except: | |
166 | pass | |
167 | zag = False | |
168 | else: | |
169 | bTyp = False | |
170 | stInd = i+2 | |
171 | ||
172 | if f[i]==")" and zag>0 and not ndef and not nusl and not bTyp: | |
173 | zag -= 1 | |
174 | if zag == 0: | |
175 | s = f[stInd:i+1] | |
176 | try: | |
177 | parseFunc(s) | |
178 | except: | |
179 | pass | |
180 | zag = False | |
181 | stInd = i+1 | |
182 | ||
183 | if f[i]=="\"": | |
184 | nav^=True | |
185 | ||
186 | if (f[i]=="\r" or f[i]=="\n"): | |
187 | nusl = 0 | |
188 | if bInc: | |
189 | s = f[stInd:i] | |
190 | s1 = s.split("<") | |
191 | if len(s1) > 1: | |
192 | parseC(path+s1[1].split(">")[0].strip()) | |
193 | else: | |
194 | spl = s.split("\"") | |
195 | if len(spl) == 3: | |
196 | parseC(spl[1]) | |
197 | if ndef: | |
198 | ndef = False | |
199 | s = f[stInd:i] | |
200 | try: | |
201 | parseDefine(s) | |
202 | except: | |
203 | pass | |
204 | s = "" | |
205 | continue | |
206 | stInd = i+1 | |
207 | ||
208 | ||
209 | if f[i] == "(" and not ndef and not nusl: | |
210 | zag += 1 | |
211 | ||
212 | if f[i:i+7] == "typedef" and not nusl and not ndef: | |
213 | stInd = i | |
214 | bTyp = True | |
215 | ||
216 | parseC(sys.argv[1]) | |
217 | ||
218 | arr = filter_existant(arr) | |
219 | arr = sorted(arr, key=lambda x: x[1].upper()) | |
220 | ||
221 | # export | |
222 | fl = open(oXML, "w") | |
223 | fl.write("<?xml version=\"1.0\" encoding=\"Windows-1252\" ?>\n") | |
224 | fl.write("<NotepadPlus>\n") | |
225 | fl.write("\t<AutoComplete language=\"C\">\n") | |
226 | fl.write("\t\t<Environment ignoreCase=\"yes\" startFunc=\"(\" stopFunc=\")\" paramSeparator=\",\" terminal=\";\" />\n") | |
227 | for i in arr: | |
228 | if(i[0] == defineID): | |
229 | fl.write("\t\t\t<KeyWord name=\""+i[1]+"\"/>\n") | |
230 | if(i[0] == funcID): | |
231 | fl.write("\t\t\t<KeyWord name=\""+i[1]+"\" func=\"yes\">\n") | |
232 | fl.write("\t\t\t\t<Overload retVal=\""+i[2].replace('\n', ' ')+"\">\n") | |
233 | for j in i[3]: | |
234 | fl.write("\t\t\t\t\t<Param name=\""+j.strip()+"\"/>\n") | |
235 | ||
236 | fl.write("\t\t\t\t</Overload>\n") | |
237 | fl.write("\t\t\t</KeyWord>\n") | |
238 | ||
239 | fl.write("\t</AutoComplete>\n") | |
240 | fl.write("</NotepadPlus>\n") | |
241 | fl.close() |