mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 14:20:59 +00:00
124 lines
3 KiB
Python
124 lines
3 KiB
Python
|
import re
|
||
|
import sys
|
||
|
import pprint
|
||
|
import StringIO
|
||
|
import os
|
||
|
|
||
|
cvar_def_re = re.compile(r'^cvar_t\s+(\w+)\s*=\s*\{\s*("[^"]*")\s*,\s*("[^"]*")(\s*,\s*(\w+)(\s*,\s*(\w+))?)?\s*\}\s*;(\s*//\s*(.*))?\n')
|
||
|
cvar_reg_re = re.compile(r'Cvar_RegisterVariable\s*\(\s*&\s*(\w+)\s*\)\s*;\s*')
|
||
|
cvar_val_re = re.compile(r'(\w+)\s*\.\s*(name|string|value)')
|
||
|
cvar_set_re = re.compile(r'(Cvar_Set|Cvar_SetValue)\s*\(\s*"(\w+)"\s*,\s*')
|
||
|
|
||
|
class cvar:
|
||
|
def __init__(self, cv_def):
|
||
|
(self.c_name,
|
||
|
self.name,
|
||
|
self.default,
|
||
|
self.arch,
|
||
|
self.serv,
|
||
|
self.desc) = cv_def
|
||
|
if self.arch==None or self.arch=='false' or self.arch=='0':
|
||
|
self.arch = 0
|
||
|
elif self.arch=='true' or self.arch=='1':
|
||
|
self.arch = 1
|
||
|
if self.serv==None or self.serv=='false' or self.serv=='0':
|
||
|
self.serv = 0
|
||
|
elif self.serv=='true' or self.serv=='1':
|
||
|
self.serv = 1
|
||
|
if self.desc==None:
|
||
|
self.desc='None'
|
||
|
def __repr__(self):
|
||
|
return 'cvar(('+`self.c_name`+','+\
|
||
|
`self.name`+','+\
|
||
|
`self.default`+','+\
|
||
|
`self.arch`+','+\
|
||
|
`self.serv`+','+\
|
||
|
`self.desc`+')'
|
||
|
def __str__(self):
|
||
|
return self.__repr__()
|
||
|
def get(self):
|
||
|
str=StringIO.StringIO()
|
||
|
str.write(self.c_name)
|
||
|
str.write(' = Cvar_Get(')
|
||
|
str.write(self.name)
|
||
|
str.write(', ')
|
||
|
str.write(self.default)
|
||
|
str.write(', ')
|
||
|
if self.arch and self.serv:
|
||
|
str.write('CVAR_ARCHIVE|CVAR_SERVERINFO')
|
||
|
elif self.arch:
|
||
|
str.write('CVAR_ARCHIVE')
|
||
|
elif self.serv:
|
||
|
str.write('CVAR_SERVERINFO')
|
||
|
else:
|
||
|
str.write('CVAR_NONE')
|
||
|
str.write(', "')
|
||
|
str.write(self.desc)
|
||
|
str.write('");')
|
||
|
return str.getvalue()
|
||
|
|
||
|
|
||
|
cvar_dict = {}
|
||
|
files = {}
|
||
|
|
||
|
def get_cvar_defs(fname):
|
||
|
fi=open(fname,'rt')
|
||
|
f=files[fname]=fi.readlines()
|
||
|
for i in range(len(f)):
|
||
|
cv=cvar_def_re.match(f[i])
|
||
|
if cv!=None:
|
||
|
cv=cv.groups()
|
||
|
cv_def=cvar(cv[:3]+(cv[4],)+(cv[6],)+(cv[8],))
|
||
|
if cvar_dict.has_key(cv_def.c_name):
|
||
|
x=cvar_dict[cv_def.c_name]
|
||
|
cv_def.arch = cv_def.arch or x.arch
|
||
|
cv_def.serv = cv_def.serv or x.serv
|
||
|
if cv_def.desc=='None':
|
||
|
cv_def.desc=x.desc
|
||
|
if `cv_def`!=`x`:
|
||
|
print 'old: '+`cvar_dict[cv_def.c_name]`
|
||
|
print 'new: '+`cv_def`
|
||
|
cvar_dict[cv_def.c_name]=cv_def
|
||
|
f[i]='cvar_t\t*'+cv_def.c_name+';'
|
||
|
fi.close()
|
||
|
|
||
|
for f in sys.argv[1:]:
|
||
|
get_cvar_defs(f)
|
||
|
for file in files.items():
|
||
|
fname,f=file
|
||
|
print fname
|
||
|
for i in range(len(f)):
|
||
|
reg=cvar_reg_re.search(f[i])
|
||
|
while reg:
|
||
|
cv=reg.groups(1)[0]
|
||
|
s,e=reg.start(0),reg.end(0)
|
||
|
try:
|
||
|
f[i]=f[i][:s]+cvar_dict[cv].get()+f[i][e:]
|
||
|
reg=cvar_reg_re.search(f[i])
|
||
|
except KeyError:
|
||
|
reg=None
|
||
|
if f[i][-1]!='\n':
|
||
|
f[i]=f[i]+'\n'
|
||
|
val=cvar_val_re.search(f[i])
|
||
|
while val:
|
||
|
cv,field=val.group(1,2)
|
||
|
s,e=val.start(0),val.end(0)
|
||
|
if cvar_dict.has_key(cv):
|
||
|
f[i]=f[i][:s]+cv+'->'+field+f[i][e:]
|
||
|
val=cvar_val_re.search(f[i],e)
|
||
|
else:
|
||
|
val=None
|
||
|
set=cvar_set_re.search(f[i])
|
||
|
while set:
|
||
|
func,cv=set.group(1,2)
|
||
|
s,e=set.start(0),set.end(0)
|
||
|
if cvar_dict.has_key(cv):
|
||
|
f[i]=f[i][:s]+func+'('+cv+', '+f[i][e:]
|
||
|
set=cvar_val_re.search(f[i],e)
|
||
|
else:
|
||
|
set=None
|
||
|
os.rename(fname,fname+'.bak')
|
||
|
fi=open(fname,'wt')
|
||
|
fi.writelines(f)
|
||
|
fi.close()
|