[squeak-dev] The Trunk: Compression-bf.46.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Dec 8 00:35:17 UTC 2014
Bert Freudenberg uploaded a new version of Compression to project The Trunk:
http://source.squeak.org/trunk/Compression-bf.46.mcz
==================== Summary ====================
Name: Compression-bf.46
Author: bf
Time: 8 December 2014, 1:35:04.484 am
UUID: d9f61764-05a9-4109-ae6c-4835e2d04a4a
Ancestors: Compression-nice.45
Restore timestamps lost in assignment conversion.
=============== Diff against Compression-nice.45 ===============
Item was changed:
----- Method: CompressedSourceStream>>contentsOfEntireFile (in category 'access') -----
contentsOfEntireFile
| contents |
self position: 0.
contents := self next: self size.
self close.
^ contents!
Item was changed:
----- Method: CompressedSourceStream>>next (in category 'access') -----
next
<primitive: 65>
position >= readLimit
ifTrue: [^ (self next: 1) at: 1]
ifFalse: [^ collection at: (position := position + 1)]!
Item was changed:
----- Method: CompressedSourceStream>>next: (in category 'access') -----
next: n
| str |
n <= (readLimit - position) ifTrue:
["All characters are available in buffer"
str := collection copyFrom: position + 1 to: position + n.
position := position + n.
^ str].
"Read limit could be segment boundary or real end of file"
(readLimit + self segmentOffset) = endOfFile ifTrue:
["Real end of file -- just return what's available"
^ self next: readLimit - position].
"Read rest of segment. Then (after positioning) read what remains"
str := self next: readLimit - position.
self position: self position.
^ str , (self next: n - str size)
!
Item was changed:
----- Method: CompressedSourceStream>>openOn: (in category 'open/close') -----
openOn: aFile
"Open the receiver."
segmentFile := aFile.
segmentFile binary.
segmentFile size > 0
ifTrue:
[self readHeaderInfo. "If file exists, then read the parameters"]
ifFalse:
[self segmentSize: 20000 maxSize: 34000000. "Otherwise write default values"]!
Item was changed:
----- Method: CompressedSourceStream>>position: (in category 'access') -----
position: newPosition
| compressedBuffer newSegmentIndex |
newPosition > endOfFile ifTrue:
[self error: 'Attempt to position beyond the end of file'].
newSegmentIndex := (newPosition // segmentSize) + 1.
newSegmentIndex ~= segmentIndex ifTrue:
[self flush.
segmentIndex := newSegmentIndex.
newSegmentIndex > nSegments ifTrue:
[self error: 'file size limit exceeded'].
segmentFile position: (segmentTable at: segmentIndex).
(segmentTable at: segmentIndex+1) = 0
ifTrue:
[newPosition ~= endOfFile ifTrue:
[self error: 'Internal logic error'].
collection size = segmentSize ifFalse:
[self error: 'Internal logic error'].
"just leave garbage beyond end of file"]
ifFalse:
[compressedBuffer := segmentFile next: ((segmentTable at: segmentIndex+1) - (segmentTable at: segmentIndex)).
collection := (GZipReadStream on: compressedBuffer) upToEnd asString].
readLimit := collection size min: endOfFile - self segmentOffset].
position := newPosition \\ segmentSize.
!
Item was changed:
----- Method: CompressedSourceStream>>readHeaderInfo (in category 'open/close') -----
readHeaderInfo
| valid a b |
segmentFile position: 0.
segmentSize := segmentFile nextNumber: 4.
nSegments := segmentFile nextNumber: 4.
endOfFile := segmentFile nextNumber: 4.
segmentFile size < (nSegments+1 + 3 * 4) ifTrue: "Check for reasonable segment info"
[self error: 'This file is not in valid compressed source format'].
segmentTable := (1 to: nSegments+1) collect: [:x | segmentFile nextNumber: 4].
segmentTable first ~= self firstSegmentLoc ifTrue:
[self error: 'This file is not in valid compressed source format'].
valid := true.
1 to: nSegments do: "Check that segment offsets are ascending"
[:i | a := segmentTable at: i. b := segmentTable at: i+1.
(a = 0 and: [b ~= 0]) ifTrue: [valid := false].
(a ~= 0 and: [b ~= 0]) ifTrue: [b <= a ifTrue: [valid := false]]].
valid ifFalse:
[self error: 'This file is not in valid compressed source format'].
dirty := false.
self position: 0.!
Item was changed:
----- Method: CompressedSourceStream>>segmentSize:maxSize: (in category 'private') -----
segmentSize: segSize maxSize: maxSize
"Note that this method can be called after the initial open, provided that no
writing has yet taken place. This is how to override the default segmentation."
self size = 0 ifFalse: [self error: 'Cannot set parameters after the first write'].
segmentFile position: 0.
segmentFile nextNumber: 4 put: (segmentSize := segSize).
segmentFile nextNumber: 4 put: (nSegments := maxSize // segSize + 2).
segmentFile nextNumber: 4 put: (endOfFile := 0).
segmentTable := Array new: nSegments+1 withAll: 0.
segmentTable at: 1 put: self firstSegmentLoc. "Loc of first segment, always."
segmentTable do: [:i | segmentFile nextNumber: 4 put: i].
segmentIndex := 1.
collection := String new: segmentSize.
writeLimit := segmentSize.
readLimit := 0.
position := 0.
endOfFile := 0.
self writeSegment.
!
Item was changed:
----- Method: CompressedSourceStream>>writeSegment (in category 'private') -----
writeSegment
"The current segment must be the last in the file."
| compressedSegment |
segmentFile position: (segmentTable at: segmentIndex).
compressedSegment := ByteArray streamContents:
[:strm | (GZipWriteStream on: strm) nextPutAll: collection asByteArray; close].
segmentFile nextPutAll: compressedSegment.
segmentTable at: segmentIndex + 1 put: segmentFile position.
segmentFile position: 2 * 4.
segmentFile nextNumber: 4 put: endOfFile.
segmentFile position: (segmentIndex + 3) * 4.
segmentFile nextNumber: 4 put: (segmentTable at: segmentIndex + 1).
dirty := false!
Item was changed:
----- Method: GZipSurrogateStream>>timeStamp (in category 'as yet unclassified') -----
timeStamp
"Append the current time to the receiver as a String."
self bufferStream nextChunkPut: "double string quotes and !!s"
(String streamContents: [:s | Smalltalk timeStamp: s]) printString.
self bufferStream cr!
More information about the Squeak-dev
mailing list
|