fcf843d1bb748a3c80943853109389a17a951f39
[dwarf-doc.git] / dwarf5 / tools / dellivelink.py
1 # Copyright 2013 DWARF Debugging Information Format Committee
2 # This reads the input tokens and then
3 # writes them out in new files.  
4
5 # October 5, 2013. 
6 # This replaces \livelink and \livetarg with 
7 # a simpler \DWXXXyyy, per Rob Brender email of Oct 4, 2013
8 # It strives to be idempotent, so rerunning makes no 
9 # further changes.
10
11 import sys
12 import fileio
13
14 def ischar(tok,c):
15    if tok._class != "ind":
16       return "n"
17    if len(tok._tex) != 1:
18        return "n"
19    if tok._tex[0] != c:
20        return "n"
21    return "y"
22
23
24 def append_to_out(out,addthese):
25   for a in addthese:
26     out += [a]
27
28
29 def doreplace(toks,curtoknum,lasttoknum):
30   if int(curtoknum) + 6 > int(lasttoknum):
31     print "n1"
32     return "n"
33   if toks[curtoknum+1]._class != "ind" or ''.join(toks[curtoknum+1]._label) != "{":
34     print "n2"
35     return "n"
36   if toks[curtoknum+2]._class != "id":
37     print "n3"
38     return "n"
39   if toks[curtoknum+3]._class != "ind" or ''.join(toks[curtoknum+3]._label) != "}":
40     print "n4"
41     return "n"
42   if toks[curtoknum+4]._class != "ind" or ''.join(toks[curtoknum+4]._label) != "{":
43     print "n5"
44     return "n"
45   if toks[curtoknum+5]._class != "id":
46     print "n6"
47     return "n"
48   if toks[curtoknum+6]._class != "ind" or ''.join(toks[curtoknum+6]._label) != "}":
49     print "n7"
50     return "n"
51   print "Found something needing replacing"
52   return "y"
53
54 def newt(toks,curtoknum,finalchars,):
55   s = ''.join(toks[curtoknum + 5]._label)
56   s2 = "\\" + s + finalchars
57   t = fileio.dwtoken()
58   t.insertid(s2)
59   print " Final new token string '", s2, "'"
60   return t
61
62 def transfunc(linetoks,myfile,linenum):
63   if len(linetoks) < 1:
64     return linetoks
65   print " "
66   tnumin = 0
67   changes = 0
68   lasttoknum = len(linetoks) -1
69   outtoks = []
70   for x in linetoks:
71     print tnumin
72     if tnumin > lasttoknum:
73       break
74     t = linetoks[tnumin]
75     rawtok = ''.join(t._tex)
76     t.dwprint()
77     if  rawtok == "\\newcommand" and tnumin == 0:
78         # Do not touch newcommand stuff
79         return linetoks
80     if  rawtok == "\\livelink" and "y" == doreplace(linetoks,tnumin,lasttoknum):
81         newtok = newt(linetoks,tnumin,"")
82         outtoks += [newtok]
83         tnumin += 7
84         if int(tnumin)  <= int(lasttoknum):
85           # not at end of line, Check to see if we want a {} or not.
86           if linetoks[tnumin]._class == "ind" and  ''.join(linetoks[tnumin]._label) == " ":
87             newtlb = fileio.dwtoken();
88             newtlb.setIndivid("{")
89             outtoks += [newtlb]
90             newtrb = fileio.dwtoken();
91             newtrb.setIndivid("}")
92             outtoks +=  [newtrb]
93     elif  rawtok == "\\livetarg" and "y" == doreplace(linetoks,tnumin,lasttoknum):
94         newtok = newt(linetoks,tnumin,"TARG")
95         outtoks += [newtok]
96         tnumin += 7
97         if int(tnumin) <= int(lasttoknum):
98           # not at end of line. Check to see if we want a {} or not.
99           if linetoks[tnumin]._class == "ind" and  ''.join(linetoks[tnumin]._label) == " ":
100             newtlb = fileio.dwtoken();
101             newtlb.setIndivid("{")
102             outtoks += [newtlb]
103             newtrb = fileio.dwtoken();
104             newtrb.setIndivid("}")
105             outtoks +=  [newtrb]
106     else:
107       tnumin = tnumin+ 1
108       outtoks += [t]
109     # End of for loop.
110   print "output toks"
111   for y in outtoks:
112     y.dwprint()
113   print "end output toks"
114   return outtoks
115
116 def read_args():
117   cur = 1
118   filelist = []
119   while  len(sys.argv) > cur:
120     v = sys.argv[cur]
121     filelist += [v]
122     cur = int(cur) + 1
123
124   dwf = fileio.readFilelist(filelist)
125   dwf.dwtransformline(transfunc)
126   dwf.dwwrite()
127
128 if __name__ == '__main__':
129   read_args()
130   
131
132