FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[Original HTTPS Page]
cpython/Lib/uu.py at 3.5 · python/cpython · GitHub
python
cpython
Repository navigation
Code
Issues
5k+
(5k+)
Pull requests
2.5k
(2.5k)
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Lib
/
uu.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
executable file
·
206 lines (188 loc) · 6.74 KB
Breadcrumbs
cpython
/
Lib
/
uu.py
Copy path
File metadata and controls
executable file
·
206 lines (188 loc) · 6.74 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#! /usr/bin/env python3
# Copyright 1994 by Lance Ellinghouse
# Cathedral City, California Republic, United States of America.
# All Rights Reserved
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Lance Ellinghouse
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE
# FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# Modified by Jack Jansen, CWI, July 1995:
# - Use binascii module to do the actual line-by-line conversion
# between ascii and binary. This results in a 1000-fold speedup. The C
# version is still 5 times faster, though.
# - Arguments more compliant with python standard
"""Implementation of the UUencode and UUdecode functions.
encode(in_file, out_file [,name, mode])
decode(in_file [, out_file, mode])
"""
import
binascii
import
os
import
sys
__all__
=
[
"Error"
,
"encode"
,
"decode"
]
class
Error
(
Exception
):
pass
def
encode
(
in_file
,
out_file
,
name
=
None
,
mode
=
None
):
"""Uuencode file"""
#
# If in_file is a pathname open it and change defaults
#
opened_files
=
[]
try
:
if
in_file
==
'-'
:
in_file
=
sys
.
stdin
.
buffer
elif
isinstance
(
in_file
,
str
):
if
name
is
None
:
name
=
os
.
path
.
basename
(
in_file
)
if
mode
is
None
:
try
:
mode
=
os
.
stat
(
in_file
).
st_mode
except
AttributeError
:
pass
in_file
=
open
(
in_file
,
'rb'
)
opened_files
.
append
(
in_file
)
#
# Open out_file if it is a pathname
#
if
out_file
==
'-'
:
out_file
=
sys
.
stdout
.
buffer
elif
isinstance
(
out_file
,
str
):
out_file
=
open
(
out_file
,
'wb'
)
opened_files
.
append
(
out_file
)
#
# Set defaults for name and mode
#
if
name
is
None
:
name
=
'-'
if
mode
is
None
:
mode
=
0o666
#
# Remove newline chars from name
#
name
=
name
.
replace
(
'
\n
'
,
'
\\
n'
)
name
=
name
.
replace
(
'
\r
'
,
'
\\
r'
)
#
# Write the data
#
out_file
.
write
((
'begin %o %s
\n
'
%
((
mode
&
0o777
),
name
)).
encode
(
"ascii"
))
data
=
in_file
.
read
(
45
)
while
len
(
data
)
>
0
:
out_file
.
write
(
binascii
.
b2a_uu
(
data
))
data
=
in_file
.
read
(
45
)
out_file
.
write
(
b'
\n
end
\n
'
)
finally
:
for
f
in
opened_files
:
f
.
close
()
def
decode
(
in_file
,
out_file
=
None
,
mode
=
None
,
quiet
=
False
):
"""Decode uuencoded file"""
#
# Open the input file, if needed.
#
opened_files
=
[]
if
in_file
==
'-'
:
in_file
=
sys
.
stdin
.
buffer
elif
isinstance
(
in_file
,
str
):
in_file
=
open
(
in_file
,
'rb'
)
opened_files
.
append
(
in_file
)
try
:
#
# Read until a begin is encountered or we've exhausted the file
#
while
True
:
hdr
=
in_file
.
readline
()
if
not
hdr
:
raise
Error
(
'No valid begin line found in input file'
)
if
not
hdr
.
startswith
(
b'begin'
):
continue
hdrfields
=
hdr
.
split
(
b' '
,
2
)
if
len
(
hdrfields
)
==
3
and
hdrfields
[
0
]
==
b'begin'
:
try
:
int
(
hdrfields
[
1
],
8
)
break
except
ValueError
:
pass
if
out_file
is
None
:
# If the filename isn't ASCII, what's up with that?!?
out_file
=
hdrfields
[
2
].
rstrip
(
b'
\t
\r
\n
\f
'
).
decode
(
"ascii"
)
if
os
.
path
.
exists
(
out_file
):
raise
Error
(
'Cannot overwrite existing file: %s'
%
out_file
)
if
mode
is
None
:
mode
=
int
(
hdrfields
[
1
],
8
)
#
# Open the output file
#
if
out_file
==
'-'
:
out_file
=
sys
.
stdout
.
buffer
elif
isinstance
(
out_file
,
str
):
fp
=
open
(
out_file
,
'wb'
)
try
:
os
.
path
.
chmod
(
out_file
,
mode
)
except
AttributeError
:
pass
out_file
=
fp
opened_files
.
append
(
out_file
)
#
# Main decoding loop
#
s
=
in_file
.
readline
()
while
s
and
s
.
strip
(
b'
\t
\r
\n
\f
'
)
!=
b'end'
:
try
:
data
=
binascii
.
a2b_uu
(
s
)
except
binascii
.
Error
as
v
:
# Workaround for broken uuencoders by /Fredrik Lundh
nbytes
=
(((
s
[
0
]
-
32
)
&
63
)
*
4
+
5
)
//
3
data
=
binascii
.
a2b_uu
(
s
[:
nbytes
])
if
not
quiet
:
sys
.
stderr
.
write
(
"Warning: %s
\n
"
%
v
)
out_file
.
write
(
data
)
s
=
in_file
.
readline
()
if
not
s
:
raise
Error
(
'Truncated input file'
)
finally
:
for
f
in
opened_files
:
f
.
close
()
def
test
():
"""uuencode/uudecode main program"""
import
optparse
parser
=
optparse
.
OptionParser
(
usage
=
'usage: %prog [-d] [-t] [input [output]]'
)
parser
.
add_option
(
'-d'
,
'--decode'
,
dest
=
'decode'
,
help
=
'Decode (instead of encode)?'
,
default
=
False
,
action
=
'store_true'
)
parser
.
add_option
(
'-t'
,
'--text'
,
dest
=
'text'
,
help
=
'data is text, encoded format unix-compatible text?'
,
default
=
False
,
action
=
'store_true'
)
(
options
,
args
)
=
parser
.
parse_args
()
if
len
(
args
)
>
2
:
parser
.
error
(
'incorrect number of arguments'
)
sys
.
exit
(
1
)
# Use the binary streams underlying stdin/stdout
input
=
sys
.
stdin
.
buffer
output
=
sys
.
stdout
.
buffer
if
len
(
args
)
>
0
:
input
=
args
[
0
]
if
len
(
args
)
>
1
:
output
=
args
[
1
]
if
options
.
decode
:
if
options
.
text
:
if
isinstance
(
output
,
str
):
output
=
open
(
output
,
'wb'
)
else
:
print
(
sys
.
argv
[
0
],
': cannot do -t to stdout'
)
sys
.
exit
(
1
)
decode
(
input
,
output
)
else
:
if
options
.
text
:
if
isinstance
(
input
,
str
):
input
=
open
(
input
,
'rb'
)
else
:
print
(
sys
.
argv
[
0
],
': cannot do -t from stdin'
)
sys
.
exit
(
1
)
encode
(
input
,
output
)
if
__name__
==
'__main__'
:
test
()
Back
|
FazBrowse Home
|
New Git URL