annotate Lib/multifile.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents 1940892d2fe3
children e29029029414
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
915
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # A class that makes each part of a multipart message "feel" like an
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # ordinary file, as long as you use fp.readline(). Allows recursive
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # use, for nested multipart messages. Probably best used together
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # with module mimetools.
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # Suggested use:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # real_fp = open(...)
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 915
diff changeset
9 # fp = MultiFile(real_fp)
915
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # "read some lines from fp"
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # fp.push(separator)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # while 1:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 # "read lines from fp until it returns an empty string" (A)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # if not fp.next(): break
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 # fp.pop()
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # "read remaining lines from fp until it returns an empty string"
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # The latter sequence may be used recursively at (A).
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 # It is also allowed to use multiple push()...pop() sequences.
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 # Note that if a nested multipart message is terminated by a separator
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # for an outer message, this is not reported, even though it is really
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # illegal input.
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 import sys
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 import string
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 err = sys.stderr.write
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 Error = 'multifile.Error'
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 class MultiFile:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 915
diff changeset
34 def __init__(self, fp):
915
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 self.fp = fp
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 self.stack = [] # Grows down
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 self.level = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 self.last = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 self.start = self.fp.tell()
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 self.posstack = [] # Grows down
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 def tell(self):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 if self.level > 0:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 return self.lastpos
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 return self.fp.tell() - self.start
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 def seek(self, pos):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 if not 0 <= pos <= self.tell() or \
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 self.level > 0 and pos > self.lastpos:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 raise Error, 'bad MultiFile.seek() call'
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 self.fp.seek(pos + self.start)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 self.level = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 self.last = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 def readline(self):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if self.level > 0: return ''
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 line = self.fp.readline()
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 if not line:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 self.level = len(self.stack)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 self.last = (self.level > 0)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 if self.last:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 err('*** Sudden EOF in MultiFile.readline()\n')
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 return ''
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 if line[:2] <> '--': return line
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 n = len(line)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 k = n
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 while k > 0 and line[k-1] in string.whitespace: k = k-1
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 mark = line[2:k]
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 if mark[-2:] == '--': mark1 = mark[:-2]
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 else: mark1 = None
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 for i in range(len(self.stack)):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 sep = self.stack[i]
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 if sep == mark:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 self.last = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 break
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 elif mark1 <> None and sep == mark1:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 self.last = 1
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 break
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 else:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 return line
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 # Get here after break out of loop
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 self.lastpos = self.tell() - len(line)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 self.level = i+1
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 if self.level > 1:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 err('*** Missing endmarker in MultiFile.readline()\n')
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 return ''
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 #
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
88 def readlines(self):
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
89 list = []
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
90 while 1:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
91 line = self.readline()
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
92 if not line: break
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
93 list.append(line)
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
94 return list
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
95 #
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
96 def read(self): # Note: no size argument -- read until EOF only!
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
97 return string.joinfields(self.readlines(), '')
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
98 #
915
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 def next(self):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 while self.readline(): pass
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 if self.level > 1 or self.last:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 return 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 self.level = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 self.last = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 self.start = self.fp.tell()
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 return 1
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 def push(self, sep):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 if self.level > 0:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 raise Error, 'bad MultiFile.push() call'
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 self.stack.insert(0, sep)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 self.posstack.insert(0, self.start)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 self.start = self.fp.tell()
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 #
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 def pop(self):
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 if self.stack == []:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 raise Error, 'bad MultiFile.pop() call'
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 if self.level <= 1:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 self.last = 0
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 else:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 abslastpos = self.lastpos + self.start
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 self.level = max(0, self.level - 1)
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 del self.stack[0]
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 self.start = self.posstack[0]
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 del self.posstack[0]
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 if self.level > 0:
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 self.lastpos = abslastpos - self.start
39ee7de74750 New module to support decoding multipart messages (also see mimetools).
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 #