# -*- coding: cp1252 -*-
enumkwlist = {
    "a" : "enum_a",
    "ab" : "enum_ab",
    "abba" : "enum_abba",
    "abab" : "enum_abab",
    "aabb" : "enum_aabb",
}

error = "error" #Rückgabewert wenn string nicht gefunden wurde

indentor = "\t" # einrückungszeichen, könnte man durch leerzeichen ersetzen

def seperate(dictionary): #generiert aus dict<string, enum> ein dict<startchar, dict<string, enum>>, wobei die strings mit dem startchar beginnen
    worddict = dict()
    global wordlist
    wordlist = list()
    global char
    char = sorted(dictionary)[0][0]
    for entry in sorted(dictionary):
        if (entry[0] == char):
            wordlist.append(entry)
        else:
            worddict[char] = wordlist
            wordlist = [entry]
            char = entry[0]
    worddict[char] = wordlist
    return worddict

def generateNewDict(dictionary, char): #generiert ein neues dict wo der string mit char beginnen muss und entfernt das erste zeichen
    newdict = dict()
    for entry in dictionary:
        if (entry[0] == char):
            newdict[entry[1:]] = dictionary[entry]
    return newdict

def generate(sel, level): #sel sei "string enum list", generiert das ganze switch/case
    indention = level + 1
    if (len(sel) == 0): #ohne strings kein code
        return
    print indention * indentor+"switch(s["+str(level)+"]){"
    if ("" in sel):
            print indention * indentor + "case 0:"
            print indention * indentor + indentor + "return " + sel.values()[0] + ";"
            del sel[""]
    if (len(sel) == 0): #recheck weil 1 element gelöscht wurde
        print indention * indentor + "}"
        return
    for char in seperate(sel):
        print indention * indentor + "case '"+char+"':"
        generate(generateNewDict(sel, char), level + 1)
        print indention * indentor + indentor + "break;"
    print indention * indentor + "}"

print "my_enum to_enum(const char *s){"
generate(enumkwlist, 0)
print indentor + "return " + error + ";"
print "}"
