annotate Lib/quopri.py @ 5817:48b94de85bf3 legacy-trunk

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