Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
alexandria
alexandria
Commits
49555427
Commit
49555427
authored
Mar 30, 2012
by
Nikodemus Siivola
Browse files
copy-stream: fix non-standard loops
Added test-case.
parent
209c6e29
Changes
2
Hide whitespace changes
Inline
Side-by-side
io.lisp
View file @
49555427
...
...
@@ -122,31 +122,28 @@ compatible element-types."
(
input-position
0
))
(
unless
(
zerop
start
)
;; FIXME add platform specific optimization to skip seekable streams
(
loop
:while
(
<
input-position
start
)
:for
bytes-read
=
(
read-sequence
buffer
input
:end
(
min
(
length
buffer
)
(
-
start
input-position
)))
:do
(
progn
(
when
(
zerop
bytes-read
)
(
error
"Could not read enough bytes from the input to fulfill the START requirement in ~S"
'copy-stream
))
(
incf
input-position
bytes-read
))))
(
loop
while
(
<
input-position
start
)
do
(
let
((
n
(
read-sequence
buffer
input
:end
(
min
(
length
buffer
)
(
-
start
input-position
)))))
(
when
(
zerop
n
)
(
error
"~@<Could not read enough bytes from the input to fulfill ~
the :START ~S requirement in ~S.~:@>"
'copy-stream
start
))
(
incf
input-position
n
))))
(
assert
(
=
input-position
start
))
(
loop
:while
(
or
(
null
end
)
(
<
input-position
end
))
:for
bytes-read
=
(
read-sequence
buffer
input
:end
(
when
end
(
min
(
length
buffer
)
(
-
end
input-position
))))
:do
(
progn
(
when
(
zerop
bytes-read
)
(
if
end
(
error
"Could not read enough bytes from the input to fulfill the END requirement in ~S"
'copy-stream
)
(
return
)))
(
incf
input-position
bytes-read
)
(
write-sequence
buffer
output
:end
bytes-read
)
(
incf
output-position
bytes-read
)))
(
loop
while
(
or
(
null
end
)
(
<
input-position
end
))
do
(
let
((
n
(
read-sequence
buffer
input
:end
(
when
end
(
min
(
length
buffer
)
(
-
end
input-position
))))))
(
when
(
zerop
n
)
(
if
end
(
error
"~@<Could not read enough bytes from the input to fulfill ~
the :END ~S requirement in ~S.~:@>"
'copy-stream
end
)
(
return
)))
(
incf
input-position
n
)
(
write-sequence
buffer
output
:end
n
)
(
incf
output-position
n
)))
(
when
finish-output
(
finish-output
output
))
output-position
))
tests.lisp
View file @
49555427
...
...
@@ -1807,3 +1807,26 @@
(
deftest
binomial-coefficient.1
(
alexandria:binomial-coefficient
1239
139
)
28794902202288970200771694600561826718847179309929858835480006683522184441358211423695124921058123706380656375919763349913245306834194782172712255592710204598527867804110129489943080460154
)
(
deftest
copy-stream.1
(
let
((
data
"sdkfjhsakfh weior763495ewofhsdfk sdfadlkfjhsadf woif sdlkjfhslkdfh sdklfjh"
))
(
values
(
equal
data
(
with-input-from-string
(
in
data
)
(
with-output-to-string
(
out
)
(
alexandria:copy-stream
in
out
))))
(
equal
(
subseq
data
10
20
)
(
with-input-from-string
(
in
data
)
(
with-output-to-string
(
out
)
(
alexandria:copy-stream
in
out
:start
10
:end
20
))))
(
equal
(
subseq
data
10
)
(
with-input-from-string
(
in
data
)
(
with-output-to-string
(
out
)
(
alexandria:copy-stream
in
out
:start
10
))))
(
equal
(
subseq
data
0
20
)
(
with-input-from-string
(
in
data
)
(
with-output-to-string
(
out
)
(
alexandria:copy-stream
in
out
:end
20
))))))
t
t
t
t
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment