annotate Lib/quopri.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 56dba037b8d6
children 4579a7701949
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2742
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Conversions to/from quoted-printable transport encoding as per RFC-XXXX
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # (Dec 1991 version).
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 ESCAPE = '='
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 MAXLINESIZE = 76
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 HEX = '0123456789ABCDEF'
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 def needsquoting(c, quotetabs):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 if c == '\t':
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 return not quotetabs
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 return c == ESCAPE or not(' ' <= c <= '~')
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 def quote(c):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 if c == ESCAPE:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 return ESCAPE * 2
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 else:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 i = ord(c)
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 return ESCAPE + HEX[i/16] + HEX[i%16]
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 def encode(input, output, quotetabs):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 while 1:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 line = input.readline()
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 if not line: break
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 new = ''
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 last = line[-1:]
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 if last == '\n': line = line[:-1]
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 else: last = ''
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 prev = ''
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 for c in line:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 if needsquoting(c, quotetabs):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 c = quote(c)
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 if len(new) + len(c) >= MAXLINESIZE:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 output.write(new + ESCAPE + '\n')
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 new = ''
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 new = new + c
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 prev = c
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 if prev in (' ', '\t'):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 output.write(new + ESCAPE + '\n\n')
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 else:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 output.write(new + '\n')
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 def decode(input, output):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 new = ''
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 while 1:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 line = input.readline()
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 if not line: break
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 i, n = 0, len(line)
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 if n > 0 and line[n-1] == '\n':
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 partial = 0; n = n-1
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 # Strip trailing whitespace
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 while n > 0 and line[n-1] in (' ', '\t'):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 n = n-1
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 else:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 partial = 1
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 while i < n:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 c = line[i]
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 if c <> ESCAPE:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 new = new + c; i = i+1
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 elif i+1 == n and not partial:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 partial = 1; break
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 elif i+1 < n and line[i+1] == ESCAPE:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 new = new + ESCAPE; i = i+2
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 elif i+2 < n and ishex(line[i+1]) and ishex(line[i+2]):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 new = new + chr(unhex(line[i+1:i+3])); i = i+3
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 else: # Bad escape sequence -- leave it in
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 new = new + c; i = i+1
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 if not partial:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 output.write(new + '\n')
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 new = ''
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 if new:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 output.write(new)
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 def ishex(c):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 return '0' <= c <= '9' or 'a' <= c <= 'f' or 'A' <= c <= 'F'
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
75
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 def unhex(s):
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 bits = 0
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 for c in s:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 if '0' <= c <= '9':
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 i = ord('0')
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 elif 'a' <= c <= 'f':
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 i = ord('a')-10
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 elif 'A' <= c <= 'F':
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 i = ord('A')-10
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 else:
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 break
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 bits = bits*16 + (ord(c) - i)
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 return bits
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 def test():
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 import sys
3104
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
92 import getopt
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
93 try:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
94 opts, args = getopt.getopt(sys.argv[1:], 'td')
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
95 except getopt.error, msg:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
96 sys.stdout = sys.stderr
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
97 print msg
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
98 print "usage: quopri [-t | -d] [file] ..."
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
99 print "-t: quote tabs"
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
100 print "-d: decode; default encode"
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
101 sys.exit(2)
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
102 deco = 0
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
103 tabs = 0
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
104 for o, a in opts:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
105 if o == '-t': tabs = 1
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
106 if o == '-d': deco = 1
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
107 if tabs and deco:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
108 sys.stdout = sys.stderr
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
109 print "-t and -d are mutually exclusive"
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
110 sys.exit(2)
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
111 if not args: args = ['-']
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
112 sts = 0
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
113 for file in args:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
114 if file == '-':
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
115 fp = sys.stdin
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
116 else:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
117 try:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
118 fp = open(file)
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
119 except IOError, msg:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
120 sys.stderr.write("%s: can't open (%s)\n" % (file, msg))
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
121 sts = 1
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
122 continue
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
123 if deco:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
124 decode(fp, sys.stdout)
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
125 else:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
126 encode(fp, sys.stdout, tabs)
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
127 if fp is not sys.stdin:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
128 fp.close()
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
129 if sts:
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
130 sys.exit(sts)
2742
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
a827801ed963 two mime encoding schemes
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 if __name__ == '__main__':
3104
56dba037b8d6 improved test/main program
Guido van Rossum <guido@python.org>
parents: 2742
diff changeset
133 test()