tools/fileio.py was not tokenizing
[dwarf-doc.git] / dwarf5 / tools / repeats.py
1 # Copyright 2014 DWARF Debugging Information Format Committee
2 # This reads the a text file, usually
3 # the output of   pdftotext dwarf5.txt
4 # looks at each word in turn, keeping a window
5 # of words, looking for repeated words and short
6 # phrases
7
8 import sys
9
10 global checkwindow
11 checkwindow = []
12
13 # Eliminates lots of stuff 
14 # But allows plain numbers through.
15 def strisasciialpha(s):
16   ok = "y"
17   for c in s:
18     if c >= 'a' and c <= 'z':
19        continue
20     elif c >= 'A' and c <= 'Z':
21        continue
22     # Pure numbers will be eliminated 
23     # later
24     elif c >= '0' and c <= '9':
25        continue
26     elif c == '-':
27        continue
28     elif c == '_':
29        continue
30     elif c == '\\':
31        continue
32     elif c == '/':
33        continue
34     else:
35        return "n"
36   return "y"
37
38 def checkdup(filename,line,checkwindow,phrasewindow,winlen,phraselen):
39   iw = -1 
40   winlen = len(checkwindow)
41   phraselen = len(phrasewindow)
42   # Numbers -- we claim we can never match
43   for w in phrasewindow:
44     if strisasciialpha(w) == "n":
45       return "n"
46     # If it is just a number, do not match
47     try: float(w)
48     except ValueError: continue 
49     else: return "n"
50   for winword in checkwindow:
51     match = 0
52     iw = iw + 1
53     if (iw + phraselen) < winlen:
54       ip = -1
55       match = 0
56       for pw in phrasewindow:
57         ip = ip + 1
58         if checkwindow[iw+ip] == phrasewindow[ip]:
59           match = match +1
60     if match == phraselen:
61       print "duplicated: ",phrasewindow," file ", filename,"line",line
62       return "y"
63   return "n"
64    
65       
66       
67 def updatewindow(winin,word,winlen):
68    if len(winin) < winlen:
69       out = winin + [word]
70       return out
71    if winlen == 1:
72       out = [word]
73       return out
74    tmp = winin[1:]
75    out = tmp + [word]
76    return out
77
78 def procrecords(filename,recs,winlen,phraselen):
79   global checkwindow
80   phrasewindow = []
81   curline=0
82   for r in recs:
83     curline = curline +1
84     line = r.split()
85     wdct = len(line)
86     if wdct > 0:
87       ct = 0
88       while ct < wdct:
89         w = line[ct]
90         ct = ct + 1
91         pw2 = updatewindow(phrasewindow,w,phraselen)
92         phrasewindow = pw2
93         if len(phrasewindow) < phraselen:
94           pw3 = updatewindow(checkwindow,w,winlen)
95           checkwindow = pw3
96           continue
97         res = checkdup(filename,curline,checkwindow,phrasewindow,winlen,phraselen)
98         pw3 = updatewindow(checkwindow,w,winlen)
99         checkwindow = pw3
100
101 def procfile(file,filename,winlen,phraselen):
102   records = file.readlines()
103   procrecords(filename,records,int(winlen),int(phraselen))
104   
105
106 def read_args():
107   cur = 1
108   filelist = []
109   if len(sys.argv) != 4:
110     print "Expect 3 arguments N N <file>"
111     sys.exit(1)
112   
113   w = sys.argv[1]
114   p = sys.argv[2]
115   if p > w :
116     winlen = p
117     phraselen = w
118   else:
119     phraselen = p
120     winlen = w
121   v = sys.argv[3]
122   try:
123       file = open(v,"r")
124   except IOError:
125       print "Unable to open ",v
126       sys.exit(1)
127   procfile(file,v,int(winlen),int(phraselen))
128
129 if __name__ == '__main__':
130   read_args()
131   
132
133