quakeforge/tools/misc/cvar.py

124 lines
3.0 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()