Seemingly dellivelink.py works properly now, though
[dwarf-doc.git] / dwarf5 / tools / anylink.py
1 # Copyright 2012 DWARF Debugging Information Format Committee
2 #
3 # Handles the testing and update for all DW_* prefixes.
4 # Called by taglink and other convenience apps to do their work.
5 #
6 # Run as an app itself, the options are
7 #    python anylink [-t prefix] ... [-all] [file] ...
8 #    Use either -all or one or more -t, as in examples:
9 #    python anylink -t DW_ACCESS_ -t DW_OP_   test.in test2.in
10 #    python anylink -all    test.in test2.in 
11
12 import sys
13 import fileio
14
15 global mytarglist
16
17 def ischar(tok,c):
18    if tok._class != "ind":
19       return "n"
20    if len(tok._tex) != 1:
21        return "n"
22    if tok._tex[0] != c:
23        return "n"
24    return "y"
25
26 def transformone(tok,stdname,labelname):
27
28   # output is  \livelink{label}{string}
29   t1=fileio.dwtoken()
30   t1.insertid("\livelink")
31   t2=fileio.dwtoken()
32   t2.setIndivid("{")
33   t3=fileio.dwtoken()
34   t3.insertid(labelname)
35   t4=fileio.dwtoken()
36   t4.setIndivid("}")
37   t5 = t2
38   t6=fileio.dwtoken()
39   t6.insertid(''.join(tok._tex)) 
40   t7 = t4
41   return [t1,t2,t3,t4,t5,t6,t7]
42
43 def append_to_out(out,addthese):
44   for a in addthese:
45     out += [a]
46
47 def isdesiredname(stdname):
48   """ If it is DW_TAG_* we return "y".
49       Else return "n"
50       We don't want something like plain DW_TAG  or 
51       plain DW_TAG_ to get modified.
52   """
53   global mytarglist
54   for mt  in mytarglist:
55     if stdname.startswith(mt):
56       if len(stdname) > len(mt):
57         return "y"
58   return "n"
59
60 def dwspace(tok):
61   if ischar(tok," ") == "y":
62     return "y"
63   if ischar(tok,"\t") == "y":
64     return "y"
65   return "n"
66   
67 # Here we are a bit careful, in that accidental spaces
68 # after { or before } should not be confused with
69 # not having a {} around a name.
70 def leaderislbrace(linetoks,num):
71   cnum = num - 1
72   while cnum >= 1:
73     tok = linetoks[cnum]
74     if dwspace(tok) == "y":
75       cnum = cnum - 1
76       continue
77     if ischar(tok,"{") == "y":
78       return "y"
79     return "n"
80   return "n"
81   
82 def trailerisrbrace(linetoks,num):
83   cnum = num + 1
84   while cnum < len(linetoks) :
85     tok = linetoks[cnum]
86     if dwspace(tok) == "y":
87       cnum = cnum + 1
88       continue
89     if ischar(tok,"}") == "y":
90       return "y"
91     return "n"
92   return "n"
93
94 def transfunc(linetoks,myfile,linenum):
95   if len(linetoks) < 1:
96     return linetoks
97   tnumin = 0
98   changes = 0
99   lasttoknum = len(linetoks) -1
100   outtoks = []
101   for t in linetoks:
102     rawtok = ''.join(t._tex)
103     stdname= ''.join(t._std)
104     linkname = "chap:" + ''.join(t._label)
105     if isdesiredname(stdname) == "y":
106       #Look past spaces when looking for { or }
107       if leaderislbrace(linetoks,tnumin) == "n" or trailerisrbrace(linetoks,tnumin) == "n":
108         tmp = transformone(t,stdname,linkname);
109         append_to_out(outtoks,tmp)
110         changes = changes +  1
111       else:
112         outtoks += [t]
113     else:
114       outtoks += [t]
115     tnumin = tnumin+ 1
116     # End of for loop.
117   return outtoks
118
119 def process_files(targlist,filelist):
120   global mytarglist
121   mytarglist = targlist
122   dwf = fileio.readFilelist(filelist)
123   dwf.dwtransformline(transfunc)
124   dwf.dwwrite()
125
126 def read_file_args(targlist):
127   cur = 1
128   filelist = []
129   while  len(sys.argv) > cur:
130     v = sys.argv[cur]
131     filelist += [v]
132     cur = int(cur) + 1
133   process_files(targlist,filelist)
134   
135
136
137 legalprefix = ["DW_ACCESS_",
138 "DW_ADDR_",
139 "DW_AT_",
140 "DW_ATE_",
141 "DW_CC_",
142 "DW_CFA_",
143 "DW_CHILDREN_",
144 "DW_DSC_",
145 "DW_DS_",
146 "DW_END_",
147 "DW_FORM_",
148 "DW_ID_",
149 "DW_INL_",
150 "DW_LANG_",
151 "DW_LNE_",
152 "DW_LNS_",
153 "DW_MACINFO_",
154 "DW_OP_",
155 "DW_ORD_",
156 "DW_TAG_",
157 "DW_VIRTUALITY_",
158 "DW_VIS_" ]
159
160 def islegalprefix(prefix):
161   for t in legalprefix:
162     if t == prefix:
163       # All is ok.
164       return "y"
165   return "n"
166
167 def printlegals():
168   print >>sys.stderr,"legal targets  for -t options are: "
169   for t in legalprefix:
170     print >>sys.stderr, t
171   
172
173 def read_all_args():
174   filelist = []
175   targlist = []
176   cur = 1
177   while  len(sys.argv) > cur:
178     v = sys.argv[cur]
179     if v == "-all":
180       targlist = legalprefix
181     elif v == "-t":
182       cur = int(cur) + 1
183       if cur >= len(sys.argv):
184         print >> sys.stderr , "A -t has no target list entry"
185         sys.exit(1)
186       v2 = sys.argv[cur]
187       if islegalprefix(v2) == "y":
188         targlist += [v2]
189       else:
190         print >> sys.stderr , "A -t has invalid target list entry", v2
191         printlegals()
192         sys.exit(1)
193     else:
194       filelist += [v]
195     cur = int(cur) + 1
196   if len(targlist) < 1:
197     print >> sys.stderr , "No targets specified."
198     printlegals()
199     sys.exit(1)
200   if len(filelist) < 1:
201     print >> sys.stderr , "No files specified."
202     printlegals()
203     sys.exit(1)
204   process_files(targlist,filelist)
205
206 #  anylink [-t <class>] ... [file] ...
207
208 if __name__ == '__main__':
209   read_all_args()
210