class OpenSSL::Config

def parse_config_lines(io)

def parse_config_lines(io)
  section = 'default'
  data = {section => {}}
  io_stack = [io]
  while definition = get_definition(io_stack)
    definition = clear_comments(definition)
    next if definition.empty?
    case definition
    when /\A\[/
      if /\[([^\]]*)\]/ =~ definition
        section = $1.strip
        data[section] ||= {}
      else
        raise ConfigError, "missing close square bracket"
      end
    when /\A\.include (\s*=\s*)?(.+)\z/
      path = $2
      if File.directory?(path)
        files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB)
      else
        files = [path]
      end
      files.each do |filename|
        begin
          io_stack << StringIO.new(File.read(filename))
        rescue
          raise ConfigError, "could not include file '%s'" % filename
        end
      end
    when /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/
      if $2
        section = $1
        key = $2
      else
        key = $1
      end
      value = unescape_value(data, section, $3)
      (data[section] ||= {})[key] = value.strip
    else
      raise ConfigError, "missing equal sign"
    end
  end
  data
end