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