Staging
v0.5.1
v0.5.1
https://github.com/python/cpython
Revision 011287854a180abf88effd5cc113e7575f5431a3 authored by Anthony Baxter on 07 January 2002, 06:42:37 UTC, committed by Anthony Baxter on 07 January 2002, 06:42:37 UTC
manually with, e.g.: CC='gcc -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64' ./configure
1 parent 355b98a
Tip revision: 011287854a180abf88effd5cc113e7575f5431a3 authored by Anthony Baxter on 07 January 2002, 06:42:37 UTC
MvL's patch to fix up large file support. You still need to enable it
MvL's patch to fix up large file support. You still need to enable it
Tip revision: 0112878
linecache.py
"""Cache lines from files.
This is intended to read lines from modules imported -- hence if a filename
is not found, it will look down the module search path for a file by
that name.
"""
import sys
import os
from stat import *
__all__ = ["getline","clearcache","checkcache"]
def getline(filename, lineno):
lines = getlines(filename)
if 1 <= lineno <= len(lines):
return lines[lineno-1]
else:
return ''
# The cache
cache = {} # The cache
def clearcache():
"""Clear the cache entirely."""
global cache
cache = {}
def getlines(filename):
"""Get the lines for a file from the cache.
Update the cache if it doesn't contain an entry for this file already."""
if cache.has_key(filename):
return cache[filename][2]
else:
return updatecache(filename)
def checkcache():
"""Discard cache entries that are out of date.
(This is not checked upon each call!)"""
for filename in cache.keys():
size, mtime, lines, fullname = cache[filename]
try:
stat = os.stat(fullname)
except os.error:
del cache[filename]
continue
if size != stat[ST_SIZE] or mtime != stat[ST_MTIME]:
del cache[filename]
def updatecache(filename):
"""Update a cache entry and return its list of lines.
If something's wrong, print a message, discard the cache entry,
and return an empty list."""
if cache.has_key(filename):
del cache[filename]
if not filename or filename[0] + filename[-1] == '<>':
return []
fullname = filename
try:
stat = os.stat(fullname)
except os.error, msg:
# Try looking through the module search path
basename = os.path.split(filename)[1]
for dirname in sys.path:
fullname = os.path.join(dirname, basename)
try:
stat = os.stat(fullname)
break
except os.error:
pass
else:
# No luck
## print '*** Cannot stat', filename, ':', msg
return []
try:
fp = open(fullname, 'r')
lines = fp.readlines()
fp.close()
except IOError, msg:
## print '*** Cannot open', fullname, ':', msg
return []
size, mtime = stat[ST_SIZE], stat[ST_MTIME]
cache[filename] = size, mtime, lines, fullname
return lines
Computing file changes ...