[squeak-dev] The Trunk: Regex-Core-ul.41.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Aug 23 13:21:36 UTC 2015


Levente Uzonyi uploaded a new version of Regex-Core to project The Trunk:
http://source.squeak.org/trunk/Regex-Core-ul.41.mcz

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

Name: Regex-Core-ul.41
Author: ul
Time: 23 August 2015, 2:03:57.377 am
UUID: b2a59557-016e-41f5-86ab-3dcd33ce0954
Ancestors: Regex-Core-ul.40

Got rid of the reversal of the OrderedCollections in RxMatcher's markerPositions.

=============== Diff against Regex-Core-ul.40 ===============

Item was changed:
  ----- Method: RxMatcher>>copyStream:to:replacingMatchesWith: (in category 'match enumeration') -----
  copyStream: aStream to: writeStream replacingMatchesWith: aString
  	"Copy the contents of <aStream> on the <writeStream>, except for the matches. Replace each match with <aString>."
  
  	| searchStart matchStart matchEnd |
  	stream := aStream.
  	oldMarkerPositions := markerPositions := nil.
  	[searchStart := aStream position.
  	self proceedSearchingStream: aStream] whileTrue:
+ 		[matchStart := (self subBeginning: 1) last.
+ 		matchEnd := (self subEnd: 1) last.
- 		[matchStart := (self subBeginning: 1) first.
- 		matchEnd := (self subEnd: 1) first.
  		aStream position: searchStart.
  		searchStart to: matchStart - 1 do:
  			[:ignoredPos | writeStream nextPut: aStream next].
  		writeStream nextPutAll: aString.
  		aStream position: matchEnd.
  		"Be extra careful about successful matches which consume no input.
  		After those, make sure to advance or finish if already at end."
  		matchEnd = searchStart ifTrue: 
  			[aStream atEnd
  				ifTrue:	[^self "rest after end of whileTrue: block is a no-op if atEnd"]
  				ifFalse:	[writeStream nextPut: aStream next]]].
  	aStream position: searchStart.
  	[aStream atEnd] whileFalse: [writeStream nextPut: aStream next]!

Item was changed:
  ----- Method: RxMatcher>>copyStream:to:translatingMatchesUsing: (in category 'match enumeration') -----
  copyStream: aStream to: writeStream translatingMatchesUsing: aBlock
  	"Copy the contents of <aStream> on the <writeStream>, except for the matches. For each match, evaluate <aBlock> passing the matched substring as the argument.  Expect the block to answer a String, and write the answer to <writeStream> in place of the match."
  
  	| searchStart matchStart matchEnd match |
  	stream := aStream.	
  	oldMarkerPositions := markerPositions := nil.
  	[searchStart := aStream position.
  	self proceedSearchingStream: aStream] whileTrue:
+ 		[matchStart := (self subBeginning: 1) last.
+ 		matchEnd := (self subEnd: 1) last.
- 		[matchStart := (self subBeginning: 1) first.
- 		matchEnd := (self subEnd: 1) first.
  		aStream position: searchStart.
  		searchStart to: matchStart - 1 do:
  			[:ignoredPos | writeStream nextPut: aStream next].
  		match := (String new: matchEnd - matchStart + 1) writeStream.
  		matchStart to: matchEnd - 1 do:
  			[:ignoredPos | match nextPut: aStream next].
  		writeStream nextPutAll: (aBlock value: match contents).
  		"Be extra careful about successful matches which consume no input.
  		After those, make sure to advance or finish if already at end."
  		matchEnd = searchStart ifTrue: 
  			[aStream atEnd
  				ifTrue:	[^self "rest after end of whileTrue: block is a no-op if atEnd"]
  				ifFalse:	[writeStream nextPut: aStream next]]].
  	aStream position: searchStart.
  	[aStream atEnd] whileFalse: [writeStream nextPut: aStream next]!

Item was changed:
  ----- Method: RxMatcher>>markerPositionAt:add: (in category 'privileged') -----
  markerPositionAt: anIndex add: position
  	"Remember position of another instance of the given marker."
  
+ 	(markerPositions at: anIndex) addLast: position!
- 	(markerPositions at: anIndex) addFirst: position!

Item was changed:
  ----- Method: RxMatcher>>subexpressions: (in category 'accessing') -----
  subexpressions: subIndex
  	"Answer an array of all matches of the subexpression at the given index.
  	The answer is always an array; it is empty if there are no matches."
  
  	| originalPosition startPositions stopPositions reply |
  	originalPosition := stream position.
  	startPositions := self subBeginning: subIndex.
  	stopPositions := self subEnd: subIndex.
  	(startPositions isEmpty or: [stopPositions isEmpty]) ifTrue: [^Array new].
  	reply := Array new: startPositions size.
  	1 to: reply size do: [ :index |
  		| start stop |
  		start := startPositions at: index.
  		stop := stopPositions at: index.
  		stream position: start.
+ 		reply at: reply size - index + 1 put: (stream next: stop - start) ].
- 		reply at: index put: (stream next: stop - start) ].
  	stream position: originalPosition.
  	^reply!

Item was changed:
  ----- Method: RxMatcher>>tryMatch (in category 'private') -----
  tryMatch
  	"Match thyself against the current stream."
  
  	| newMarkerPositions |
  	newMarkerPositions := oldMarkerPositions.
  	oldMarkerPositions := markerPositions.
  	markerPositions := newMarkerPositions.
  	markerPositions
  		ifNil: [
  			markerPositions := Array new: markerCount.
  			1 to: markerCount do: [ :i |
+ 				"There are usually 0 or 1 objects to store."
+ 				markerPositions at: i put: (OrderedCollection new: 2) ] ]
- 				| collection |
- 				collection := OrderedCollection new: 2. "There are usually 0 or 1 objects to store."
- 				collection resetTo: 3. "We'll add elements to the beginning, so make room there."
- 				markerPositions at: i put: collection ] ]
  		ifNotNil: [
  			1 to: markerCount do: [ :i |
+ 				(markerPositions at: i) resetTo: 1 ] ].
- 				| collection |
- 				collection := markerPositions at: i.
- 				collection resetTo: collection capacity + 1 ] ].
  	lastResult := startOptimizer
  		ifNil: [ matcher matchAgainst: self]
  		ifNotNil: [ (startOptimizer canStartMatch: stream peek in: self) and: [ matcher matchAgainst: self ] ].
  	"check for duplicates"
  	lastResult ifFalse: [ ^false ].
  	oldMarkerPositions ifNil: [ ^true ].
  	(oldMarkerPositions hasEqualElements: markerPositions) ifFalse: [ ^true ].
+ 	"this is a duplicate match"
- 	"this is a duplicate"
  	^ lastResult := false!



More information about the Squeak-dev mailing list