Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 4 # (Dec 1991 version). |
| 5 | |
| 6 ESCAPE = '=' | |
| 7 MAXLINESIZE = 76 | |
| 8 HEX = '0123456789ABCDEF' | |
| 9 | |
| 10 def needsquoting(c, quotetabs): | |
| 11 if c == '\t': | |
| 12 return not quotetabs | |
| 13 return c == ESCAPE or not(' ' <= c <= '~') | |
| 14 | |
| 15 def quote(c): | |
| 16 if c == ESCAPE: | |
| 17 return ESCAPE * 2 | |
| 18 else: | |
| 19 i = ord(c) | |
| 20 return ESCAPE + HEX[i/16] + HEX[i%16] | |
| 21 | |
| 22 def encode(input, output, quotetabs): | |
| 23 while 1: | |
| 24 line = input.readline() | |
| 25 if not line: break | |
| 26 new = '' | |
| 27 last = line[-1:] | |
| 28 if last == '\n': line = line[:-1] | |
| 29 else: last = '' | |
| 30 prev = '' | |
| 31 for c in line: | |
| 32 if needsquoting(c, quotetabs): | |
| 33 c = quote(c) | |
| 34 if len(new) + len(c) >= MAXLINESIZE: | |
| 35 output.write(new + ESCAPE + '\n') | |
| 36 new = '' | |
| 37 new = new + c | |
| 38 prev = c | |
| 39 if prev in (' ', '\t'): | |
| 40 output.write(new + ESCAPE + '\n\n') | |
| 41 else: | |
| 42 output.write(new + '\n') | |
| 43 | |
| 44 def decode(input, output): | |
| 45 new = '' | |
| 46 while 1: | |
| 47 line = input.readline() | |
| 48 if not line: break | |
| 49 i, n = 0, len(line) | |
| 50 if n > 0 and line[n-1] == '\n': | |
| 51 partial = 0; n = n-1 | |
| 52 # Strip trailing whitespace | |
| 53 while n > 0 and line[n-1] in (' ', '\t'): | |
| 54 n = n-1 | |
| 55 else: | |
| 56 partial = 1 | |
| 57 while i < n: | |
| 58 c = line[i] | |
| 59 if c <> ESCAPE: | |
| 60 new = new + c; i = i+1 | |
| 61 elif i+1 == n and not partial: | |
| 62 partial = 1; break | |
| 63 elif i+1 < n and line[i+1] == ESCAPE: | |
| 64 new = new + ESCAPE; i = i+2 | |
| 65 elif i+2 < n and ishex(line[i+1]) and ishex(line[i+2]): | |
| 66 new = new + chr(unhex(line[i+1:i+3])); i = i+3 | |
| 67 else: # Bad escape sequence -- leave it in | |
| 68 new = new + c; i = i+1 | |
| 69 if not partial: | |
| 70 output.write(new + '\n') | |
| 71 new = '' | |
| 72 if new: | |
| 73 output.write(new) | |
| 74 | |
| 75 def ishex(c): | |
| 76 return '0' <= c <= '9' or 'a' <= c <= 'f' or 'A' <= c <= 'F' | |
| 77 | |
| 78 def unhex(s): | |
| 79 bits = 0 | |
| 80 for c in s: | |
| 81 if '0' <= c <= '9': | |
| 82 i = ord('0') | |
| 83 elif 'a' <= c <= 'f': | |
| 84 i = ord('a')-10 | |
| 85 elif 'A' <= c <= 'F': | |
| 86 i = ord('A')-10 | |
| 87 else: | |
| 88 break | |
| 89 bits = bits*16 + (ord(c) - i) | |
| 90 return bits | |
| 91 | |
| 92 def test(): | |
| 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 | 133 |
| 134 if __name__ == '__main__': | |
|
3104
56dba037b8d6
improved test/main program
Guido van Rossum <guido@python.org>
parents:
2742
diff
changeset
|
135 test() |
