1#!/usr/bin/python 2# Take a .in file and generate : 3# pref.cpp which is a loader/saver file + associated structure 4# (c) Mean 2011 5# 6# const char *name 7# type 8# char *current_val 9# const char *default 10# const char *min 11# const char *max 12# 13import os 14import re 15import sys 16 17structName=r'prefs_list' 18allCTypes=dict() 19allATypes=dict() 20allJTypes=dict() 21 22 23allJTypes["uint32_t"]="json.addUint32(" 24allJTypes["int32_t"]="json.addInt32(" 25allJTypes["bool"]="json.addBool(" 26allJTypes["string"]="json.addString(" 27allJTypes["float"]="json.addFloat(" 28allJTypes["filename"]="json.addString(" 29 30 31allATypes["uint32_t"]="ADM_param_uint32_t" 32allATypes["int32_t"] ="ADM_param_int32_t " 33allATypes["float"] ="ADM_param_float " 34allATypes["bool"] ="ADM_param_bool " 35allATypes["string"] ="ADM_param_stdstring " 36allATypes["filename"]="ADM_param_stdstring " 37 38fullPath="" 39nested=list() 40gotName=False 41def usage(): 42 print("python pref_gen.py xxxx.in") 43######################################################### 44def outputJson(st): 45 jsonFile.write(str(st)+"\n") 46 #print(st) 47 pass 48def outputList(st): 49 listFile.write(str(st)+"\n") 50 #print(st) 51 pass 52 53# 54 55# 56def makeStructure(varType,params): 57 if(len(params)<2): 58 print "Not enough parameter for line "+str(varName) 59 exit(1) 60 min=0 61 max=100 62 default=20 63 #print varType 64 #print params 65 nbParam=len(params) 66 varName=params[0] 67 default=str(params[1]) 68 default=re.sub(r'"',r'',default) 69 default="\""+str(default)+"\"" 70 if(nbParam==2): 71 if(varType!="string" and varType!="filename"): 72 print ("Error "+str(varName)+" has not the good number of parameters,type="+str(varType)) 73 raise 74 min=r"0" 75 max=r'0' 76 elif(nbParam==4): 77 min=str(params[2]) 78 max=str(params[3]) 79 if(not varType in allATypes): 80 print("json:Unknown var type <"+str(varType)+str(">")) 81 exit(1) 82 if(len(fullPath)==0): 83 fullName=varName 84 else: 85 fullName=fullPath+"_"+varName 86 if(len(fullPath2)==0): 87 fullName2=varName 88 else: 89 fullName2=fullPath2+"."+varName 90 out= "{ "+str(fullName.upper())+str(",\"")+str(fullName2)+str("\"") 91 l=len(out) 92 mx=70 93 if(l>mx): 94 pass 95 else: 96 out=out+(mx-l)*" " 97 out=out+","+str(allATypes[varType]) 98 out=out+"\t,"+str(default)+",\t"+str(min)+",\t"+str(max) 99 out=out+"}," 100 outputJson(out) 101 outputList(fullName.upper()+", \t//"+str(varType)) 102################################################################################################################################### 103 104def writeJsonHead(): 105 outputJson("// automatically generated by pref_gen.py, do not edit!") 106 outputJson("#if 0") 107 outputJson("typedef struct") 108 outputJson("{") 109 outputJson(" const char *name;") 110 outputJson(" TYPE type;") 111 outputJson(" const char *defaultValue;") 112 outputJson(" const char *min;") 113 outputJson(" const char *max;") 114 outputJson(" char *Value;") 115 outputJson("}optionDesc;") 116 outputJson("#endif ") 117 outputJson("static optionDesc myOptions[]={") 118def writeJsonFooter(): 119 outputJson("};\n") 120 121################################################################################################################################### 122# Main... 123################################################################################################################################### 124nb=len(sys.argv) 125if(nb!=2): 126 usage() 127 exit(1) 128print("Processing "+str(sys.argv[1])) 129inputFile=sys.argv[1] 130if(not os.path.isfile(inputFile)): 131 print "no such file "+str(inputFile) 132 exit(1) 133jsonFileName=re.sub(r'.conf',r'_pref.h',inputFile) 134listFileName=str("../include/")+re.sub(r'.conf',r'_list.h',inputFile) 135print("Generating "+jsonFileName) 136jsonFile=open(jsonFileName,'w') 137print("Generating "+listFileName) 138listFile=open(listFileName,'w') 139# 140f=open(inputFile,'r') 141while(1): 142 line=f.readline() 143 #print line 144 if(len(line)==0): 145 print "Reached end of file" 146 break # eof 147 line=re.sub(r'#.*$',r'',line).strip() 148 #print(">"+str(line)+":"+str(len(line))) 149 if(len(line)==0): 150 #print "skip" 151 continue # comment 152 # Remove #.... 153 if(line.find(r'{')!=-1): 154 # 155 structs=re.sub(r'{.*$',r'',line).strip() 156 if(len(nested)==0 and gotName==False): # first one = struct Name 157 structName=structs 158 print("Our structure is :"+str(structName)) 159 writeJsonHead() 160 gotName=True 161 else: # else we have structure inside structure 162 #outputHeader("struct "+structs+" {") 163 nested.append(structs) 164 fullPath=".".join(nested) 165 fullPath2=".".join(nested) 166 elif(line.find(r'}')!=-1): 167 if(len(nested)!=0): 168 last=nested.pop() 169 #outputHeader("};") 170 fullPath=".".join(nested) 171 fullPath2=".".join(nested) 172 elif(line.find(':')!=-1): # varname : type,val,min,max 173 if(gotName==False): 174 print "No structure name !" 175 exit(1) 176 line=re.sub(r'#.*$',r'',line) 177 line=re.sub(r'//.*$',r'',line) 178 # split by : 179 (varType,leftOver)=line.split(r':') 180 params=leftOver.split(r',') 181 for i in range(0,len(params)): 182 params[i]=params[i].strip() 183 #print "\t"+params[i]+"\n" 184 makeStructure(varType,params) 185 else: 186 print "Invalid line "+str(line) 187 exit(1) 188f.close() 189writeJsonFooter() 190jsonFile.close() 191listFile.close() 192print "All done" 193