nillerusr
3 years ago
committed by
GitHub
3 changed files with 185 additions and 3 deletions
@ -0,0 +1,181 @@ |
|||||||
|
# It looks like shit, but I'm not particularly worried about such scripts. |
||||||
|
|
||||||
|
import os |
||||||
|
import re |
||||||
|
|
||||||
|
token_list = [ |
||||||
|
re.compile(r'&&'), |
||||||
|
re.compile(r'\|\|'), |
||||||
|
re.compile(r'\!'), |
||||||
|
re.compile(r'[a-zA-Z0-9_.]*') |
||||||
|
] |
||||||
|
|
||||||
|
match_statement = re.compile(r'\[.*\]') |
||||||
|
|
||||||
|
def compute_statement( defines, statement ): |
||||||
|
vars = {} |
||||||
|
for define in defines: |
||||||
|
d=define.split('=')[0] |
||||||
|
vars.update({d:True}) |
||||||
|
|
||||||
|
def t( op ): |
||||||
|
if op == '1': return True |
||||||
|
elif op == '0': return False |
||||||
|
elif op not in vars: return False |
||||||
|
|
||||||
|
return vars[op] |
||||||
|
|
||||||
|
pos = 0 |
||||||
|
|
||||||
|
statement = re.sub(r'\[|\]| |\$', '', statement) |
||||||
|
|
||||||
|
l = [] |
||||||
|
|
||||||
|
final = True |
||||||
|
final_init = False |
||||||
|
|
||||||
|
while pos < len(statement): |
||||||
|
for token in token_list: |
||||||
|
r = token.search(statement, pos) |
||||||
|
if r and r.start() == pos: |
||||||
|
l += [r.group(0)] |
||||||
|
pos = r.end() |
||||||
|
|
||||||
|
k = 0 |
||||||
|
for i in range(len(l)): |
||||||
|
j = i-k |
||||||
|
if l[j] == '!' and j+1 < len(l): |
||||||
|
df = l[j+1] |
||||||
|
if df in vars: |
||||||
|
vars[df] = not vars[df] |
||||||
|
else: vars.update({df:True}) |
||||||
|
del l[j] |
||||||
|
k += 1 |
||||||
|
|
||||||
|
k = 0 |
||||||
|
for i in range(len(l)): |
||||||
|
j = i-k |
||||||
|
if l[j] == '&&' and j+1 < len(l) and j-1 >= 0: |
||||||
|
val = 0 |
||||||
|
if t(l[j-1]) and t(l[j+1]): |
||||||
|
val = 1 |
||||||
|
del l[j+1], l[j], l[j-1] |
||||||
|
l.insert(j, str(val)) |
||||||
|
k += 2 |
||||||
|
|
||||||
|
k = 0 |
||||||
|
for i in range(len(l)): |
||||||
|
j = i-k |
||||||
|
if l[j] == '||' and j+1 < len(l) and j-1 >= 0: |
||||||
|
val = 0 |
||||||
|
if t(l[j-1]) or t(l[j+1]): |
||||||
|
val = 1 |
||||||
|
del l[j+1], l[j], l[j-1] |
||||||
|
l.insert(j, str(val)) |
||||||
|
k += 2 |
||||||
|
|
||||||
|
return t(l[0]) |
||||||
|
|
||||||
|
def project_key(l): |
||||||
|
for k in l.keys(): |
||||||
|
if '$Project' in k: |
||||||
|
return k |
||||||
|
|
||||||
|
def fix_dos_path( path ): |
||||||
|
|
||||||
|
path = path.replace('\\', '/') |
||||||
|
p = path.split('/') |
||||||
|
|
||||||
|
filename = p[-1] |
||||||
|
find_path = '/'.join(p[0:len(p)-1]) |
||||||
|
if find_path == '': find_path = './' |
||||||
|
else: find_path += '/' |
||||||
|
|
||||||
|
dirlist = os.listdir(find_path) |
||||||
|
for file in dirlist: |
||||||
|
if file == filename: |
||||||
|
return find_path+file |
||||||
|
elif file.lower() == filename.lower(): |
||||||
|
return find_path+file |
||||||
|
return find_path+filename |
||||||
|
|
||||||
|
def parse_vpcs( env ,vpcs, basedir ): |
||||||
|
back_path = os.path.abspath('.') |
||||||
|
os.chdir(env.SUBPROJECT_PATH[0]) |
||||||
|
|
||||||
|
sources = [] |
||||||
|
defines = [] |
||||||
|
includes = [] |
||||||
|
|
||||||
|
for vpc in vpcs: |
||||||
|
f=open(vpc, 'r').read().replace('\\\n', ';') |
||||||
|
|
||||||
|
l = f.split('\n') |
||||||
|
|
||||||
|
iBrackets = 0 |
||||||
|
|
||||||
|
next_br = False |
||||||
|
ret = {} |
||||||
|
cur_key = '' |
||||||
|
|
||||||
|
for i in l: |
||||||
|
if i == '': continue |
||||||
|
|
||||||
|
s = match_statement.search(i) |
||||||
|
if s and not compute_statement(env.DEFINES+defines, s.group(0)): |
||||||
|
continue |
||||||
|
|
||||||
|
if i.startswith('$') and iBrackets == 0: |
||||||
|
ret.update({i:[]}) |
||||||
|
cur_key = i |
||||||
|
next_br = True |
||||||
|
elif i == '{': |
||||||
|
iBrackets += 1 |
||||||
|
next_br = False |
||||||
|
elif i == '}': |
||||||
|
iBrackets -= 1 |
||||||
|
elif iBrackets > 0: |
||||||
|
ret[cur_key].append(i) |
||||||
|
|
||||||
|
if next_br: |
||||||
|
next_br = False |
||||||
|
|
||||||
|
key = project_key(ret) |
||||||
|
l=ret[key] |
||||||
|
|
||||||
|
for i in l: |
||||||
|
if '-$File' in i and '.h"' not in i: |
||||||
|
for k in i.split(';'): |
||||||
|
k = k.replace('$SRCDIR', basedir) |
||||||
|
s = fix_dos_path(k.split('"')[1]) |
||||||
|
|
||||||
|
for j in range(len(sources)): |
||||||
|
if sources[j] == s: |
||||||
|
del sources[j] |
||||||
|
break |
||||||
|
|
||||||
|
elif '$File' in i and '.h"' not in i: |
||||||
|
for j in i.split(';'): |
||||||
|
j = j.replace('$SRCDIR', basedir) |
||||||
|
s = fix_dos_path(j.split('"')[1]) |
||||||
|
sources.append(s) |
||||||
|
|
||||||
|
for i in ret['$Configuration']: |
||||||
|
if '$PreprocessorDefinitions' in i: |
||||||
|
i = i.replace('$BASE', '') |
||||||
|
s = i.split('"')[1] |
||||||
|
s = re.split(';|,', s) |
||||||
|
for j in s: |
||||||
|
if j != '' and j not in defines: |
||||||
|
defines.append(j) |
||||||
|
if '$AdditionalIncludeDirectories' in i: |
||||||
|
i = i.replace('$BASE', '').replace('$SRCDIR', basedir) |
||||||
|
s = i.split('"')[1] |
||||||
|
s = re.split(';|,', s) |
||||||
|
for j in s: |
||||||
|
j = j.replace('\\','/') |
||||||
|
if j != '' and j not in includes: |
||||||
|
includes.append(j) |
||||||
|
os.chdir(back_path) |
||||||
|
|
||||||
|
return {'defines':defines, 'includes':includes, 'sources': sources} |
Loading…
Reference in new issue