-
Notifications
You must be signed in to change notification settings - Fork 190
Expand file tree
/
Copy pathlineref
More file actions
executable file
·126 lines (116 loc) · 3.6 KB
/
lineref
File metadata and controls
executable file
·126 lines (116 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/env python3
import os
import re
import sys
if len(sys.argv) < 2:
print("error: too few arguments", file=sys.stderr)
xv6src = sys.argv[2]
xv6booklet = sys.argv[3]
# format line in lions booklet style
def fmt_line(i):
return f"{i:04d}"
def line_number(path, i, line):
if path == xv6booklet:
return int(line[0:4])
else:
return i
def lookup_fileref_booklet(fname):
p = xv6booklet
try:
with open(p +'/'+fname) as f:
line = f.readline()
return line_number(p, 1, line)
except IOError:
print("error: cannot open %s" % fname, file=sys.stderr)
return None
def lookup_regex_booklet(fname, pat1, pat2=None):
pat1 = pat1.replace(r"^", r"\d\d\d\d ")
if pat2 != None:
pat2 = pat2.replace(r"^", r"\d\d\d\d ")
return lookup_regex(xv6booklet, fname, pat1, pat2)
def lookup_regex(path, fname, pat1, pat2=None):
fname = fname.replace(r"\_", "_")
p1 = re.compile(pat1)
if pat2 != None:
p2 = re.compile(pat2)
else:
p2 = None
cnt = 1
i = None
j = None
p = p1
try:
with open(path+'/'+fname) as f:
line = f.readline()
while line:
m = p.search(line)
if m != None:
if p2 == None:
cnt = line_number(path, cnt, line)
return (cnt, None)
else:
if i == None:
i = line_number(path, cnt, line)
p = p2
else:
j = line_number(path, cnt, line)
return (i, j)
cnt += 1
line = f.readline()
if i == None:
print("%s: cannot find pat %s" % (fname, p1), file=sys.stderr)
else:
print("%s: cannot find pat %s" % (fname, p2), file=sys.stderr)
return (None, None)
except IOError:
print("error: cannot open %s" % fname, file=sys.stderr)
return (None, None)
def lineref(l):
# file:/pattern/delta
p = re.compile(r'\\lineref{(.*):\/(.*)\/([+-]?\d+)?}')
m = p.search(l)
if m != None:
f = m.groups()[0]
(i, j) = lookup_regex(xv6src, f, m.groups()[1])
(i0, j0) = lookup_regex_booklet(f, m.groups()[1])
# print(f, m.groups()[1], i, i0, file=sys.stderr)
delta = 0
if m.groups()[2] != None:
delta = int(m.groups()[2])
if i != None:
l = p.sub(r'\\showlineref{%s}{%s}{%s}' % (f,str(i+delta),fmt_line(i0+delta)), l)
print(l, end="")
return
# fileref
p = re.compile(r'\\fileref\{([^}]*)\}')
m = p.search(l)
if m != None:
f = m.groups()[0]
n0 = lookup_fileref_booklet(f)
print("fileref", f, n0, file=sys.stderr)
l = p.sub(r'\\showfileref{%s}{%s}' % (f, fmt_line(n0)), l)
print(l, end="")
return
# file:/pattern/delta,pattern/delta
p = re.compile(r'\\linerefs{(.*):\/(.*)\/([+-]?\d+)?,\/(.*)\/([+-]?\d+)?}')
m = p.search(l)
if m != None:
f = m.groups()[0]
(i, j) = lookup_regex(xv6src, f, m.groups()[1], m.groups()[3])
(i0, j0) = lookup_regex_booklet(f, m.groups()[1], m.groups()[3])
delta1 = 0
if m.groups()[2] != None:
delta1 = int(m.groups()[2])
delta2 = 0
if m.groups()[4] != None:
delta2 = int(m.groups()[4])
if i != None and j != None:
l = p.sub(r'\\showlinerefs{%s}{%s}{%s}{%s}{%s}' % (f, str(i+delta1), str(j+delta2), fmt_line(i0+delta1), fmt_line(j0+delta2)), l)
print(l, end="")
return
print(l, end="")
with open(sys.argv[1]) as f:
line = f.readline()
while line:
lineref(line)
line = f.readline()