SmaCC__SmaCCLineNumberStream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 07 Dec 2016 13:18:16 +0000
changeset 26 b2c091b8cea1
parent 15 8b8cd1701c33
permissions -rw-r--r--
Fixed initialization of SmaCCEdge There's no `UnicodeString` anymore. Changed: WriteStream on: UnicodeString new to: String new writeStream

"{ Package: 'stx:goodies/smaCC' }"

"{ NameSpace: SmaCC }"

PeekableStream subclass:#SmaCCLineNumberStream
	instanceVariableNames:'sourceStream previousWasCR eolPositions lastPosition'
	classVariableNames:'CR LF'
	poolDictionaries:''
	category:'SmaCC-Runtime'
!


!SmaCCLineNumberStream class methodsFor:'initialization'!

initialize
    CR := Character cr.
    Smalltalk isSmalltalkX ifTrue:[
        CR := Character return.
    ].
    LF := Character nl.

    "
     self initialize
    "
! !

!SmaCCLineNumberStream class methodsFor:'instance creation'!

on: aReadStream 
	^(self basicNew)
		on: aReadStream;
		yourself
! !

!SmaCCLineNumberStream class methodsFor:'accessing'!

zeroPosition

    ^0

    "Created: / 05-04-2006 / 21:27:49 / janfrog"
! !

!SmaCCLineNumberStream methodsFor:'accessing'!

contents
	^sourceStream contents
!

flush
	^sourceStream flush
!

lineNumber
	| index start stop pos |
	pos := sourceStream position.
	pos >= eolPositions last ifTrue: [^eolPositions size].
	start := 1.
	stop := eolPositions size.
	[start + 1 < stop] whileTrue: 
			[index := (start + stop) // 2.
			(eolPositions at: index) <= pos 
				ifTrue: [start := index]
				ifFalse: [stop := index]].
	^start
!

next
        | character |
        character := sourceStream next.
        sourceStream position - 1 == lastPosition 
                ifTrue: 
                        [lastPosition := lastPosition + 1.
                        character == CR 
                                ifTrue: 
                                        [eolPositions add: sourceStream position.
                                        previousWasCR := true]
                                ifFalse: 
                                        [(previousWasCR not and: [character == LF]) 
                                                ifTrue: [eolPositions add: sourceStream position].
                                        previousWasCR := false]].
        ^character
!

nextPut: anObject 
	^sourceStream nextPut: anObject
!

position
	^sourceStream position
!

position: anInteger 
	anInteger > lastPosition 
		ifTrue: 
			[sourceStream position: lastPosition.
			[sourceStream position < anInteger and: [sourceStream atEnd not]] 
				whileTrue: [self next]]
		ifFalse: [sourceStream position: anInteger]
!

skip: anInteger
	^self position: self position + anInteger
! !

!SmaCCLineNumberStream methodsFor:'error handling'!

doesNotUnderstand: aMessage 
	^sourceStream perform: aMessage selector withArguments: aMessage arguments
! !

!SmaCCLineNumberStream methodsFor:'initialize-release'!

on: aReadStream 
	sourceStream := aReadStream.
	eolPositions := OrderedCollection with: aReadStream position.
	lastPosition := aReadStream position.
	previousWasCR := false
! !

!SmaCCLineNumberStream methodsFor:'testing'!

atEnd
	^sourceStream atEnd
!

isReadable
	^sourceStream isReadable
!

isWritable
	^sourceStream isWritable
! !

!SmaCCLineNumberStream class methodsFor:'documentation'!

version
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCLineNumberStream.st,v 1.2 2006-04-05 20:07:51 vranyj1 Exp $'
!

version_SVN
    ^ '$Id$'
! !

SmaCCLineNumberStream initialize!