def read_lines_until options = {}
result = []
advance if options[:skip_first_line]
if @process_lines && options[:skip_processing]
@process_lines = false
restore_process_lines = true
else
restore_process_lines = false
end
if (terminator = options[:terminator])
break_on_blank_lines = false
break_on_list_continuation = false
else
break_on_blank_lines = options[:break_on_blank_lines]
break_on_list_continuation = options[:break_on_list_continuation]
end
skip_comments = options[:skip_line_comments]
line_read = false
line_restored = false
complete = false
while !complete && (line = read_line)
complete = while true
break true if terminator && line == terminator
break true if break_on_blank_lines && line.empty?
if break_on_list_continuation && line_read && line == LIST_CONTINUATION
options[:preserve_last_line] = true
break true
end
break true if block_given? && (yield line)
break false
end
if complete
if options[:read_last_line]
result << line
line_read = true
end
if options[:preserve_last_line]
unshift line
line_restored = true
end
else
unless skip_comments && line.start_with?('//') && CommentLineRx =~ line
result << line
line_read = true
end
end
end
if restore_process_lines
@process_lines = true
@look_ahead -= 1 if line_restored && !terminator
end
result
end