588455936a67d47bee3f73c591a61d07b7f682eb
[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     return "n"
32   if toks[curtoknum+1]._class != "ind" or ''.join(toks[curtoknum+1]._label) != "{":
33     return "n"
34   if toks[curtoknum+2]._class != "id":
35     return "n"
36   if toks[curtoknum+3]._class != "ind" or ''.join(toks[curtoknum+3]._label) != "}":
37     return "n"
38   if toks[curtoknum+4]._class != "ind" or ''.join(toks[curtoknum+4]._label) != "{":
39     return "n"
40   if toks[curtoknum+5]._class != "id":
41     return "n"
42   if toks[curtoknum+6]._class != "ind" or ''.join(toks[curtoknum+6]._label) != "}":
43     return "n"
44   return "y"
45
46 def newt(toks,curtoknum,finalchars,):
47   s = ''.join(toks[curtoknum + 5]._label)
48   s2 = "\\" + s + finalchars
49   t = fileio.dwtoken()
50   t.insertid(s2)
51   return t
52
53 def transfunc(linetoks,myfile,linenum):
54   if len(linetoks) < 1:
55     return linetoks
56   tnumin = 0
57   changes = 0
58   lasttoknum = len(linetoks) -1
59   outtoks = []
60   for x in linetoks:
61     if tnumin > lasttoknum:
62       break
63     t = linetoks[tnumin]
64     rawtok = ''.join(t._tex)
65     if  rawtok == "\\newcommand" and tnumin == 0:
66         # Do not touch newcommand stuff
67         return linetoks
68     if  rawtok == "\\livelink" and "y" == doreplace(linetoks,tnumin,lasttoknum):
69         newtok = newt(linetoks,tnumin,"")
70         outtoks += [newtok]
71         tnumin += 7
72         if int(tnumin)  <= int(lasttoknum):
73           # not at end of line, Check to see if we want a {} or not.
74           if linetoks[tnumin]._class == "ind" and  ''.join(linetoks[tnumin]._label) == " ":
75             newtlb = fileio.dwtoken();
76             newtlb.setIndivid("{")
77             outtoks += [newtlb]
78             newtrb = fileio.dwtoken();
79             newtrb.setIndivid("}")
80             outtoks +=  [newtrb]
81     elif  rawtok == "\\livetarg" and "y" == doreplace(linetoks,tnumin,lasttoknum):
82         newtok = newt(linetoks,tnumin,"TARG")
83         outtoks += [newtok]
84         tnumin += 7
85         if int(tnumin) <= int(lasttoknum):
86           # not at end of line. Check to see if we want a {} or not.
87           if linetoks[tnumin]._class == "ind" and  ''.join(linetoks[tnumin]._label) == " ":
88             newtlb = fileio.dwtoken();
89             newtlb.setIndivid("{")
90             outtoks += [newtlb]
91             newtrb = fileio.dwtoken();
92             newtrb.setIndivid("}")
93             outtoks +=  [newtrb]
94     else:
95       tnumin = tnumin+ 1
96       outtoks += [t]
97     # End of for loop.
98   return outtoks
99
100 def read_args():
101   cur = 1
102   filelist = []
103   while  len(sys.argv) > cur:
104     v = sys.argv[cur]
105     filelist += [v]
106     cur = int(cur) + 1
107
108   dwf = fileio.readFilelist(filelist)
109   dwf.dwtransformline(transfunc)
110   dwf.dwwrite()
111
112 if __name__ == '__main__':
113   read_args()
114   
115
116