Using tohyphen.py, change all the DW_* entries to allow
[dwarf-doc.git] / dwarf5 / tools / taglink.py
1 # Copyright 2012 DWARF Debugging Information Format Committee
2 #
3 # All DW_TAG_* entries not in {} are turned into \livelink.
4
5 import sys
6 import fileio
7
8 def ischar(tok,c):
9    if tok._class != "ind":
10       return "n"
11    if len(tok._tex) != 1:
12        return "n"
13    if tok._tex[0] != c:
14        return "n"
15    return "y"
16
17 def transformone(tok,stdname,labelname):
18
19   # output is  \livelink{label}{string}
20   t1=fileio.dwtoken()
21   t1.insertid("\livelink")
22   t2=fileio.dwtoken()
23   t2.setIndivid("{")
24   t3=fileio.dwtoken()
25   t3.insertid(labelname)
26   t4=fileio.dwtoken()
27   t4.setIndivid("}")
28   t5 = t2
29   t6=fileio.dwtoken()
30   t6.insertid(''.join(tok._tex)) 
31   t7 = t4
32   return [t1,t2,t3,t4,t5,t6,t7]
33
34 def append_to_out(out,addthese):
35   for a in addthese:
36     out += [a]
37
38 def isdesiredname(stdname):
39   """ If it is DW_TAG_* we return "y".
40       Else return "n"
41       We don't want something like plain DW_TAG  or 
42       plain DW_TAG_ to get modified.
43   """
44   if stdname.startswith("DW_TAG_"):
45     if len(stdname) > 7:
46       return "y"
47   return "n"
48
49 def dwspace(tok):
50   if ischar(tok," ") == "y":
51     return "y"
52   if ischar(tok,"\t") == "y":
53     return "y"
54   return "n"
55   
56 # Here we are a bit careful, in that accidental spaces
57 # after { or before } should not be confused with
58 # not having a {} around a name.
59 def leaderislbrace(linetoks,num):
60   cnum = num - 1
61   while cnum >= 1:
62     tok = linetoks[cnum]
63     if dwspace(tok) == "y":
64       cnum = cnum - 1
65       continue
66     if ischar(tok,"{") == "y":
67       return "y"
68     return "n"
69   return "n"
70   
71 def trailerisrbrace(linetoks,num):
72   cnum = num + 1
73   while cnum < len(linetoks) :
74     tok = linetoks[cnum]
75     if dwspace(tok) == "y":
76       cnum = cnum + 1
77       continue
78     if ischar(tok,"}") == "y":
79       return "y"
80     return "n"
81   return "n"
82
83 def transfunc(linetoks):
84   if len(linetoks) < 1:
85     return linetoks
86   tnumin = 0
87   changes = 0
88   lasttoknum = len(linetoks) -1
89   outtoks = []
90   for t in linetoks:
91     rawtok = ''.join(t._tex)
92     stdname= ''.join(t._std)
93     linkname = "chap:" + ''.join(t._label)
94     if isdesiredname(stdname) == "y":
95       #Look past spaces when looking for { or }
96       if leaderislbrace(linetoks,tnumin) == "n" or trailerisrbrace(linetoks,tnumin) == "n":
97         tmp = transformone(t,stdname,linkname);
98         append_to_out(outtoks,tmp)
99         changes = changes +  1
100       else:
101         outtoks += [t]
102     else:
103       outtoks += [t]
104     tnumin = tnumin+ 1
105     # End of for loop.
106   return outtoks
107
108 def read_args():
109   cur = 1
110   filelist = []
111   while  len(sys.argv) > cur:
112     v = sys.argv[cur]
113     filelist += [v]
114     cur = int(cur) + 1
115
116   dwf = fileio.readFilelist(filelist)
117   dwf.dwtransformline(transfunc)
118   dwf.dwwrite()
119
120 if __name__ == '__main__':
121   read_args()
122   
123
124