# Parser for Windows INI-style config files. Hopefully slightly less sucky than
# the built-in ConfigParser module...
# Copyright 2006, 2013 Adam Sampson <ats@offog.org>

import sys, re

class Section:
	def __init__(self, name, super):
		self.values = {}
		self.name = name
		self.super = super

	def __contains__(self, key):
		if key in self.values:
			return True
		if self.super is not None:
			return key in self.super
		return False

	def getall(self, key):
		if self.values.has_key(key):
			return self.values[key]
		if self.super is not None:
			return self.super.getall(key)
		return []

	def __getitem__(self, key):
		ls = self.getall(key)
		if ls == []:
			return None
		else:
			return ls[0]

	def get(self, key, default = None):
		if key in self:
			return self[key]
		else:
			return default

	def set(self, key, value):
		if not self.values.has_key(key):
			self.values[key] = []
		self.values[key].append(value)

class Config:
	def __init__(self, filename = None):
		self.default = Section("default", None)
		self.sections = {}
		if filename is not None:
			self.load(filename)

	def load(self, filename):
		f = open(filename, "r")
		section = self.default
		for l in f.readlines():
			l = l.strip()
			if l == "" or l[0] == "#":
				continue
			elif l[0] == "[" and l[-1] == "]":
				section = Section(l[1:-1], self.default)
				self.sections[section.name] = section
			else:
				m = re.match(r'^([^=]+)=(.*)$', l)
				if m is None:
					sys.stderr.write("Ignoring bad line in config file " + filename + ": " + l)
				else:
					section.set(m.group(1).strip(), m.group(2).strip())
		f.close()

	def get(self, section, default = None):
		return self.sections.get(section, default)

	def keys(self):
		return self.sections.keys()

