diff --git a/source/cvar.py b/source/cvar.py new file mode 100644 index 0000000..4fa5304 --- /dev/null +++ b/source/cvar.py @@ -0,0 +1,123 @@ +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()