The Trunk: Files-nice.73.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Files-nice.73.mcz

commits-2
Nicolas Cellier uploaded a new version of Files to project The Trunk:
http://source.squeak.org/trunk/Files-nice.73.mcz

==================== Summary ====================

Name: Files-nice.73
Author: nice
Time: 15 March 2010, 9:08:50.767 pm
UUID: 8fbca3e6-5426-f548-bc7c-c076635533ab
Ancestors: Files-nice.72

Let #readInto:startingAt:count: handle the buffer and answer number of byte reads and always avoid a copy, and #next:into:startingAt: use it and eventually use a copy if number of bytes read less than requested count.

=============== Diff against Files-nice.72 ===============

Item was changed:
  ----- Method: StandardFileStream>>readInto:startingAt:count: (in category 'read, write, position') -----
  readInto: byteArray startingAt: startIndex count: count
  "Read into the given array as specified, and return the count
  actually transferred.  index and count are in units of bytes or
  longs depending on whether the array is Bitmap, String or ByteArray"
 
+ | nRead newN newStartIndex |
+ collection
+ ifNil: [
+ newN := count.
+ newStartIndex := startIndex ]
+ ifNotNil: [
+ byteArray class isBytes
+ ifFalse: [
+ position < readLimit ifTrue: [ self flushReadBuffer ].
+ newN := count.
+ newStartIndex := startIndex ]
+ ifTrue: [
+ | available |
+ (available := readLimit - position) > 0
+ ifFalse: [ available := 0 ]
+ ifTrue: [
+ | bufferedCount |
+ bufferedCount := count min: available.
+ byteArray
+ replaceFrom: startIndex
+ to: startIndex + bufferedCount - 1
+ with: collection
+ startingAt: position + 1.
+ position := position + bufferedCount.
+ bufferedCount = count ifTrue: [ ^count ] ].
+ newN := count - available.
+ newStartIndex := startIndex + available ] ].
+ nRead := self primRead: fileID into: byteArray startingAt: newStartIndex count: newN.
+ ^nRead + (count - newN)!
- ^(self next: count into: byteArray startingAt: startIndex) size - startIndex + 1 min: count
- !

Item was changed:
  ----- Method: StandardFileStream>>next:into:startingAt: (in category 'read, write, position') -----
  next: n into: aString startingAt: startIndex
  "Read n bytes into the given string.
  Return aString or a partial copy if less than
  n elements have been read."
 
+ | count |
+ count := self readInto: aString startingAt: startIndex count: n.
+ count = n
- | count  newN newStartIndex |
- collection
- ifNil: [
- newN := n.
- newStartIndex := startIndex ]
- ifNotNil: [
- aString class isBytes
- ifFalse: [
- position < readLimit ifTrue: [ self flushReadBuffer ].
- newN := n.
- newStartIndex := startIndex ]
- ifTrue: [
- | available |
- (available := readLimit - position) > 0
- ifFalse: [ available := 0 ]
- ifTrue: [
- | bufferedCount |
- bufferedCount := n min: available.
- aString
- replaceFrom: startIndex
- to: startIndex + bufferedCount - 1
- with: collection
- startingAt: position + 1.
- position := position + bufferedCount.
- bufferedCount = n ifTrue: [ ^aString ] ].
- newN := n - available.
- newStartIndex := startIndex + available ] ].
- count := self primRead: fileID into: aString
- startingAt: newStartIndex count: newN.
- count = newN
  ifTrue:[ ^aString ]
+ ifFalse:[ ^aString copyFrom: 1 to: startIndex + count - 1 ]!
- ifFalse:[ ^aString copyFrom: 1 to: newStartIndex + count - 1 ]!