lib/em-systemcommand/pipe.rb in em-systemcommand-0.0.2 vs lib/em-systemcommand/pipe.rb in em-systemcommand-0.0.3

- old
+ new

@@ -57,34 +57,53 @@ unless recursive receive_data_callbacks.each do |callback| callback.call data.dup end end - @lt2_linebuffer ||= [] + @linebuffer ||= [] + @cr_offset = 0 - ix = data.index("\r") - if ix && data[ix+1] != "\n" - ln = (@lt2_linebuffer << data[0...ix]).join - @lt2_linebuffer.clear - receive_line ln - @outputbuffer.print ln - @outputbuffer.pos -= ln.length - receive_update @outputbuffer.string - receive_data data[(ix+1)..-1], true # receive rest data - else - if ix = data.index("\n") - ln = (@lt2_linebuffer << data[0...ix]).join - @lt2_linebuffer.clear - ln.chomp! - receive_line ln - receive_data data[(ix+1)..-1], true # receive rest data + parse_crlf data + + receive_update @outputbuffer.string unless recursive + end + + def parse_cr data, ix + ln = (@linebuffer << data[0...ix]).join + @linebuffer.clear + receive_line ln + @outputbuffer.print ln + @outputbuffer.pos = @cr_offset + parse_crlf data[(ix+1)..-1] # receive rest data + end + + def parse_lf data, ix + ln = (@linebuffer << data[0...ix]).join + @linebuffer.clear + ln.chomp! + receive_line ln + @outputbuffer.print ln + @outputbuffer.pos = @outputbuffer.length + @outputbuffer.puts + @cr_offset = @outputbuffer.pos + parse_crlf data[(ix+1)..-1] # receive rest data + end + + def parse_crlf data + if ilf = data.index("\n") + # if we find a LF and that LF is after a CR we first handle + # the CR + if icr = data.index("\r") and ilf != (icr+1) and icr < ilf + parse_cr data, icr else - @lt2_linebuffer << data + parse_lf data, ilf end - - unless recursive - @outputbuffer.puts data - receive_update @outputbuffer.string + else + if icr = data.index("\r") + parse_cr data, icr + else + @linebuffer << data + @outputbuffer.print data end end end # Adds a callback for `receive_data` events.