Class: CSV::Parser::InputsScanner

Inherits:
Object
  • Object
show all
Defined in:
lib/csv/parser.rb

Instance Method Summary collapse

Constructor Details

#initialize(inputs, encoding, chunk_size: 8192) ⇒ InputsScanner

Returns a new instance of InputsScanner.



43
44
45
46
47
48
49
50
# File 'lib/csv/parser.rb', line 43

def initialize(inputs, encoding, chunk_size: 8192)
  @inputs = inputs.dup
  @encoding = encoding
  @chunk_size = chunk_size
  @last_scanner = @inputs.empty?
  @keeps = []
  read_chunk
end

Instance Method Details

#eos?Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/csv/parser.rb', line 75

def eos?
  @scanner.eos?
end

#keep_backObject



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/csv/parser.rb', line 93

def keep_back
  start, buffer = @keeps.pop
  if buffer
    string = @scanner.string
    keep = string[start, string.size - start]
    if keep and not keep.empty?
      @inputs.unshift(StringIO.new(keep))
      @last_scanner = false
    end
    @scanner = StringScanner.new(buffer)
  else
    @scanner.pos = start
  end
end

#keep_dropObject



108
109
110
# File 'lib/csv/parser.rb', line 108

def keep_drop
  @keeps.pop
end

#keep_endObject



83
84
85
86
87
88
89
90
91
# File 'lib/csv/parser.rb', line 83

def keep_end
  start, buffer = @keeps.pop
  keep = @scanner.string[start, @scanner.pos - start]
  if buffer
    buffer << keep
    keep = buffer
  end
  keep
end

#keep_startObject



79
80
81
# File 'lib/csv/parser.rb', line 79

def keep_start
  @keeps.push([@scanner.pos, nil])
end

#restObject



112
113
114
# File 'lib/csv/parser.rb', line 112

def rest
  @scanner.rest
end

#scan(pattern) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/csv/parser.rb', line 52

def scan(pattern)
  value = @scanner.scan(pattern)
  return value if @last_scanner

  if value
    read_chunk if @scanner.eos?
    return value
  else
    nil
  end
end

#scan_all(pattern) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/csv/parser.rb', line 64

def scan_all(pattern)
  value = @scanner.scan(pattern)
  return value if @last_scanner

  return nil if value.nil?
  while @scanner.eos? and read_chunk and (sub_value = @scanner.scan(pattern))
    value << sub_value
  end
  value
end