tools:
[dwarf-doc.git] / dwarf5 / tools / refclassfixup.py
1 # Copyright 2012 DWARF Debugging Information Format Committee
2 # This reads the input tokens and then
3 # writes them out in new files.  
4 # Used to verify that the output matches the input byte-for-byte
5
6 # Transforms certain strings (see refclass below) into livelink commands.
7
8 import sys
9 import fileio
10
11 refclass = { 
12 #"address":"chap:address", 
13 #"block":"chap:block", 
14 #"constant":"chap:constant", 
15 "exprloc":"chap:exprloc", 
16 #"flag":"chap:flag",
17 "lineptr":"chap:lineptr",
18 "loclistptr":"chap:loclistptr",
19 "macptr":"chap:macptr",
20 "rangelistptr":"chap:rangelistptr" }
21 #"reference":"chap:reference",
22 #"string":"chap:string" }
23
24 def ischar(tok,c):
25    if tok._class != "ind":
26       return "n"
27    if len(tok._tex) != 1:
28        return "n"
29    if tok._tex[0] != c:
30        return "n"
31    return "y"
32
33 def transformone(tok, string):
34   label = refclass[string]
35   # output is  \livelink{label}{string}
36   t1=fileio.dwtoken()
37   t1.insertid("\livelink")
38   t2=fileio.dwtoken()
39   t2.setIndivid("{")
40   t3=fileio.dwtoken()
41   t3.insertid(label)
42   t4=fileio.dwtoken()
43   t4.setIndivid("}")
44   t5 = t2
45   t6=fileio.dwtoken()
46   t6.insertid(string) 
47   t7 = t4
48   return [t1,t2,t3,t4,t5,t6,t7]
49
50 def append_to_out(out,addthese):
51   for a in addthese:
52     out += [a]
53
54 def transfunc(linetoks,myfile,linenum):
55   if len(linetoks) < 1:
56     return linetoks
57   tnumin = 0
58   changes = 0
59   lasttoknum = len(linetoks) -1
60   outtoks = []
61   for t in linetoks:
62     rawtok = ''.join(t._tex)
63     if  refclass.has_key(rawtok) == 1:
64       if tnumin == 0 or tnumin == lasttoknum:
65          tmp = transformone(t, rawtok);
66          changes = changes +  1
67          append_to_out(outtoks,tmp)
68       else:
69         if  ischar(linetoks[tnumin - 1],"{") == "n" and ischar(linetoks[tnumin+1],"}") == "n":
70           tmp = transformone(t, rawtok);
71           append_to_out(outtoks,tmp)
72           changes = changes +  1
73         else:
74           outtoks += [t]
75     else:
76       outtoks += [t]
77     tnumin = tnumin+ 1
78     # End of for loop.
79   return outtoks
80
81 def read_args():
82   cur = 1
83   filelist = []
84   while  len(sys.argv) > cur:
85     v = sys.argv[cur]
86     filelist += [v]
87     cur = int(cur) + 1
88
89   dwf = fileio.readFilelist(filelist)
90   dwf.dwtransformline(transfunc)
91   dwf.dwwrite()
92
93 if __name__ == '__main__':
94   read_args()
95   
96
97