Apparently the code to forestall Tk eating events was too aggressive (Tk user input...
[python/dscho.git] / Lib / linecache.py
blobd6fc28cae301823c037af35bb3a3b26ab3b42697
1 """Cache lines from files.
3 This is intended to read lines from modules imported -- hence if a filename
4 is not found, it will look down the module search path for a file by
5 that name.
6 """
8 import sys
9 import os
10 from stat import *
12 __all__ = ["getline","clearcache","checkcache"]
14 def getline(filename, lineno):
15 lines = getlines(filename)
16 if 1 <= lineno <= len(lines):
17 return lines[lineno-1]
18 else:
19 return ''
22 # The cache
24 cache = {} # The cache
27 def clearcache():
28 """Clear the cache entirely."""
30 global cache
31 cache = {}
34 def getlines(filename):
35 """Get the lines for a file from the cache.
36 Update the cache if it doesn't contain an entry for this file already."""
38 if cache.has_key(filename):
39 return cache[filename][2]
40 else:
41 return updatecache(filename)
44 def checkcache():
45 """Discard cache entries that are out of date.
46 (This is not checked upon each call!)"""
48 for filename in cache.keys():
49 size, mtime, lines, fullname = cache[filename]
50 try:
51 stat = os.stat(fullname)
52 except os.error:
53 del cache[filename]
54 continue
55 if size != stat[ST_SIZE] or mtime != stat[ST_MTIME]:
56 del cache[filename]
59 def updatecache(filename):
60 """Update a cache entry and return its list of lines.
61 If something's wrong, print a message, discard the cache entry,
62 and return an empty list."""
64 if cache.has_key(filename):
65 del cache[filename]
66 if not filename or filename[0] + filename[-1] == '<>':
67 return []
68 fullname = filename
69 try:
70 stat = os.stat(fullname)
71 except os.error, msg:
72 # Try looking through the module search path
73 basename = os.path.split(filename)[1]
74 for dirname in sys.path:
75 fullname = os.path.join(dirname, basename)
76 try:
77 stat = os.stat(fullname)
78 break
79 except os.error:
80 pass
81 else:
82 # No luck
83 ## print '*** Cannot stat', filename, ':', msg
84 return []
85 try:
86 fp = open(fullname, 'r')
87 lines = fp.readlines()
88 fp.close()
89 except IOError, msg:
90 ## print '*** Cannot open', fullname, ':', msg
91 return []
92 size, mtime = stat[ST_SIZE], stat[ST_MTIME]
93 cache[filename] = size, mtime, lines, fullname
94 return lines