import string


class TokenizedFile:

    def __init__(self, file):
	self.fd = open(file)
	self.filename = file
	self.token_list = []
	self.opened = 1
	self.peeked = ""

    def close(self):
	self.fd.close()
	self.opened = 0;

    def _token_aux(self):
	if (self.opened == 0): raise IOError, "File closed"
	# while no tokens, read a line
	while (len(self.token_list) == 0):
	    s = self.fd.readline()
	    if (s == ""): return ""
	    self.token_list = string.split(s)
	# take next token
	r = self.token_list[0]
	self.token_list = self.token_list[1:]
	return r

    def token(self):
	if (self.peeked != ""): 
	    r = self.peeked
	    self.peeked = ""
	    return r
	else:
	    return self._token_aux()

    def peek(self):
	if (self.peeked != ""): raise IOError, "You peeked twice in a row!"
	else:
	    self.peeked = self._token_aux()
	    return self.peeked

class RPMGroup:

    def __init__(self, name):
	self._packages = []     # An array of package names
	self._subgroups = []    # An array of RPM_Group objects
	self._name = name
	self._parent = None        # 0 or the parent group

    def load(self, file):
	tf = TokenizedFile(file)
	self._load_aux(tf, "")

    def setParent(self, parent):
        self._parent = parent

    def parent(self):
        return self._parent

    def packages(self):
        return self._packages

    def subgroups(self):
        return self._subgroups

    def name(self):
        return self._name

    def _load_aux(self, tf, term):
	word = tf.token()
	while (word):
	    if (word == term): break
	    if (word == "{"): error("{ without preceeding group name")
	    if (tf.peek() == "{"):
		tf.token()  # crunch the open bracket
		g = RPMGroup(word)
                g.setParent(self)
		g._load_aux(tf, "}")
		self._subgroups.append(g)
	    else:
		self._packages.append(word)
	    word = tf.token()

    def findSubgroup(self, name):
	for g in self._subgroups:
	    if (g._name == name): return g
	raise NoGroup, "Group not found"

    def getPath(self):
	if (self._parent == None):
	    return "main"
	else:
	    return self._parent.getPath() + ":" + self._name

#group_spec = RPM_Group("main")
#group_spec.load("spec")

#print group_spec.packages
#print group_spec.subgroups



#tf = Tokenized_File("spec")
#word = tf.token()
#while (word):
#    print word
#    peek = tf.peek()
#    print "PEEK: ", peek
#    word = tf.token()
