count := 0.
stream do: [ :character | (character = Character cr and: [stream peek =
Character lf]) ifTrue: [  count := count + 1 ]].
count.

Snippet with example:

| count crlftext stream |
stream := (String
streamContents: [ :s |
s
nextPutAll: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
crlf;
nextPutAll: 'Phasellus sollicitudin lorem ac nunc varius aliquam.';
crlf;
nextPutAll: 'Quisque posuere augue in quam suscipit eleifend.';
crlf;
nextPutAll: 'Donec non tempor ex.';
crlf;
nextPutAll: 'Phasellus placerat leo augue, eu placerat augue luctus quis. ';
crlf;
lf;
cr;
cr ]) readStream.
count := 0.
stream
do: [ :char |
(char = Character cr and: [ stream peek = Character lf ])
ifTrue: [ count := count + 1 ] ].
count

On 13 July 2017 at 09:31, Cyril Ferlicot <cyril.ferli...@gmail.com> wrote:

> Hello everyone,
>
> I often needs to read some streams these days and to get some infos
> related to the lines returns for example.
> Because of the CRLF it is a little complicated sometimes.
>
> I have an example of code here:
>
> | lfShouldBeCounted char count remaining |
> lfShouldBeCounted := false.
> remaining := 0.
> count := 0.
> stream position: startPos.
> [ stream position = endPos ]
>   whileFalse: [
>     "13 is a CR, 10 a LF"
>     (char := stream next asInteger) = 13
>       ifTrue: [ count := count + 1. remaining := 0. lfShouldBeCounted :=
> false ]
>       ifFalse: [
>         char = 10
>           ifTrue: [
>             lfShouldBeCounted
>               ifTrue: [ count := count + 1. remaining := 0 ]
>               ifFalse: [ lfShouldBeCounted := true ] ]
>           ifFalse: [ remaining := remaining + 1 ] ] ]
>
> With this example I know how many lines where passed between the
> startPos and the endPos in a stream. I also know how many char there
> is between the last line return and the endPos.
>
>  I wanted to know if you had a better way to do that? The way need to
> be as performant than this snippet. I know some people here can
> produce a snippet more readable and easier to maintain :)
>
> --
> Cyril Ferlicot
> https://ferlicot.fr
>
> http://www.synectique.eu
> 2 rue Jacques Prévert 01,
> 59650 Villeneuve d'ascq France
>
>

Reply via email to