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