1d2a4d1494157e961ba59f62974effec6df4dbe2
[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 insidealltt = "n"
15
16 def ischar(tok,c):
17    if tok._class != "ind":
18       return "n"
19    if len(tok._tex) != 1:
20        return "n"
21    if tok._tex[0] != c:
22        return "n"
23    return "y"
24
25
26 def append_to_out(out,addthese):
27   for a in addthese:
28     out += [a]
29
30 def myjoinlabel(tok):
31   s = ''.join(tok._label)
32   return s
33
34 def doreplace(toks,curtoknum,lasttoknum):
35   if int(curtoknum) + 6 > int(lasttoknum):
36     return "n"
37   if toks[curtoknum+1]._class != "ind" or myjoinlabel(toks[curtoknum+1]) != "{":
38     return "n"
39   if toks[curtoknum+2]._class != "id":
40     return "n"
41   if toks[curtoknum+3]._class != "ind" or myjoinlabel(toks[curtoknum+3]) != "}":
42     return "n"
43   if toks[curtoknum+4]._class != "ind" or myjoinlabel(toks[curtoknum+4]) != "{":
44     return "n"
45   if toks[curtoknum+5]._class != "id":
46     return "n"
47   if toks[curtoknum+6]._class != "ind" or myjoinlabel(toks[curtoknum+6]) != "}":
48     return "n"
49   return "y"
50
51
52 def newt(toks,curtoknum,finalchars,):
53   s = myjoinlabel(toks[curtoknum + 5])
54   s2 = "\\" + s + finalchars
55   t = fileio.dwtoken()
56   t.insertid(s2)
57   return t
58
59 def checkalltt(linetoks,tnumin,lasttoknum,myfile,linenum):
60     global insidealltt
61     if int(tnumin) + 3 < int(lasttoknum):  
62       return "n"
63     t1 = linetoks[tnumin]
64     s1 = myjoinlabel(t1)
65     if  s1 != "\\begin" and s1 != "\\end":
66       return "n"
67     t2 = linetoks[tnumin+1]
68     s2 = myjoinlabel(t2)
69     if  s2 != "{":
70       return "n"
71
72     t3 = linetoks[tnumin+2]
73     s3 = myjoinlabel(t3)
74     if  s3 != "alltt":
75       return "n"
76
77     t4 = linetoks[tnumin+3]
78     s2 = myjoinlabel(t4)
79     if  s2 != "}":
80       return "n"
81
82     if  s1 == "\\begin":
83       if insidealltt =="y":
84         print "nested \\begin{alltt} is an error in",myfile._name, " at ",linenum
85       insidealltt = "y" 
86     if  s1 == "\\end":
87       if insidealltt =="n":
88         print "nested \\end{alltt} is an error in",myfile._name, " at ",linenum
89       insidealltt = "n" 
90
91 def transfunc(linetoks,myfile,linenum):
92   global insidealltt
93   if len(linetoks) < 1:
94     return linetoks
95   tnumin = 0
96   changes = 0
97   lasttoknum = len(linetoks) -1
98   outtoks = []
99   for x in linetoks:
100     if tnumin > lasttoknum:
101       break
102     t = linetoks[tnumin]
103     rawtok = ''.join(t._tex)
104     if  rawtok == "\\newcommand" and tnumin == 0:
105         # Do not touch newcommand stuff
106         return linetoks
107     checkalltt(linetoks,tnumin,lasttoknum,myfile,linenum)
108     if  rawtok == "\\livelink" and "y" == doreplace(linetoks,tnumin,lasttoknum):
109         newtok = newt(linetoks,tnumin,"")
110         outtoks += [newtok]
111         tnumin += 7
112         if int(tnumin)  <= int(lasttoknum):
113           # not at end of line, Check to see if we want a {} or not.
114           if  insidealltt == "n" and linetoks[tnumin]._class == "ind" and  myjoinlabel(linetoks[tnumin]) == " ":
115             newtlb = fileio.dwtoken();
116             newtlb.setIndivid("{")
117             outtoks += [newtlb]
118             newtrb = fileio.dwtoken();
119             newtrb.setIndivid("}")
120             outtoks +=  [newtrb]
121     elif  rawtok == "\\livetarg" and "y" == doreplace(linetoks,tnumin,lasttoknum):
122         newtok = newt(linetoks,tnumin,"TARG")
123         outtoks += [newtok]
124         tnumin += 7
125         if int(tnumin) <= int(lasttoknum):
126           # not at end of line. Check to see if we want a {} or not.
127           if insidealltt == "n" and linetoks[tnumin]._class == "ind" and  myjoinlabel(linetoks[tnumin]) == " ":
128             newtlb = fileio.dwtoken();
129             newtlb.setIndivid("{")
130             outtoks += [newtlb]
131             newtrb = fileio.dwtoken();
132             newtrb.setIndivid("}")
133             outtoks +=  [newtrb]
134     else:
135       tnumin = tnumin+ 1
136       outtoks += [t]
137     # End of for loop.
138   return outtoks
139
140 def read_args():
141   cur = 1
142   filelist = []
143   while  len(sys.argv) > cur:
144     v = sys.argv[cur]
145     filelist += [v]
146     cur = int(cur) + 1
147
148   dwf = fileio.readFilelist(filelist)
149   dwf.dwtransformline(transfunc)
150   dwf.dwwrite()
151
152 if __name__ == '__main__':
153   read_args()
154   
155
156