[Seaside] Encoding problem

Sven Van Caekenberghe sven at stfx.eu
Tue May 20 21:45:18 UTC 2014


On 20 May 2014, at 23:15, Sven Van Caekenberghe <sven at stfx.eu> wrote:

> The error is in 
> 
> GRPharoUtf8CodecStream>>#greaseNext:putAllFast:startingAt:
> 
> the first escape clause in the whileFalse computes a wrong first argument to #greaseNext:putAllFast:startingAt:
> 
> however, it is a bit hard to say what the correct one should be, I will try with
> 
> startIndex + anInteger - lastIndex
> 
> I hope there are enough tests.

I added an extra assert

	self assert: 'ab', umlaut next: 1 startingAt: 1 gives:  'a'.

to GRPharoCodecTest>>#testGreaseNextPutAllStartingAt so that it now reads:

  	| umlaut encodedUmlaut |
	umlaut := String with: (Character value: 228).
	encodedUmlaut := String with: (Character value: 195) with: (Character value: 164).
	self assert: 'ab' next: 1 startingAt: 1 gives:  'a'.
	self assert: 'a', umlaut, 'b' next: 1 startingAt: 1 gives:  'a'.
	self assert: 'ab', umlaut next: 1 startingAt: 1 gives:  'a'.
	self assert: 'a', umlaut, 'b' next: 2 startingAt: 1 gives:  'a', encodedUmlaut.
	self assert: 'a', umlaut, 'b' next: 1 startingAt: 2 gives:  encodedUmlaut.
	self assert: 'a', umlaut, 'b' next: 2 startingAt: 2 gives:  encodedUmlaut, 'b'.
	self assert: 'a', umlaut, umlaut next: 2 startingAt: 2 gives:  encodedUmlaut, encodedUmlaut.
	self assert: 'ab', umlaut, 'b', umlaut next: 3 startingAt: 2 gives:  'b', encodedUmlaut, 'b'

it fails before the proposed change, it succeeds after it - and the functional test now passes.

Final code of GRPharoUtf8CodecStream>>#greaseNext:putAllFast:startingAt:

	| lastIndex nextIndex |
	lastIndex := startIndex.
	nextIndex := ByteString findFirstInString: aByteString inSet: Latin1ToUtf8Map startingAt: lastIndex.
	nextIndex = 0 ifTrue: [ ^ stream greaseNext: anInteger putAll: aByteString startingAt: startIndex ].
	[	
		nextIndex >= (startIndex + anInteger) ifTrue: [
			^ stream greaseNext: startIndex + anInteger - lastIndex putAll: aByteString startingAt: lastIndex ].
		nextIndex > lastIndex ifTrue: [
			stream greaseNext: nextIndex - lastIndex putAll: aByteString startingAt: lastIndex ].
		stream nextPutAll: (Latin1ToUtf8Encodings at: (aByteString byteAt: nextIndex) + 1).
		lastIndex := nextIndex + 1.
		nextIndex := ByteString findFirstInString: aByteString inSet: Latin1ToUtf8Map startingAt: lastIndex.
		(nextIndex = 0 or: [ nextIndex >= (startIndex + anInteger) ]) ] whileFalse.
	lastIndex >= (startIndex + anInteger) ifFalse: [
		stream greaseNext: startIndex + anInteger - lastIndex putAll: aByteString startingAt: lastIndex ]

But this certainly needs another pair of eyes.

Sven



More information about the seaside mailing list