import sys

toolchain_list = ["ARM", "GCC"]
core_list      = ["cortexM0l", "cortexM3l", "cortexM4l", "cortexM4lf", "cortexM7l", "cortexM7lfsp", "cortexM7lfdp", 
                  "ARMv8MBLl", "ARMv8MMLl", "ARMv8MMLlfsp", "ARMv8MMLlfdp", "ARMv8MMLld", "ARMv8MMLldfsp", "ARMv8MMLldfdp" ]
test_list      = ["MPS2", "FVP", "Simulator"]
error          = 1


def parseLog(toolchain, core, test):
    if toolchain not in toolchain_list:
        print "Error: Unkown toolchain '{0}'".format(toolchain)
        return error

    if core not in core_list:
        print "Error: Unkown core '{0}'".format(core)
        return error

    if test not in test_list:
        print "Error: Unkown test '{0}'".format(test)
        return error

    inFileName  = ".\DspLibTest_{2}\{0}\Logs\DspLibTest_{2}_{1}.log".format(toolchain, core, test)
    outFileName = ".\DspLibTest_{2}\{0}\Logs\DspLibTest_{2}_{1}_parsed.log".format(toolchain, core, test)

    infile = open(inFileName).read()
    infile = infile.split('\n')

    outfile = open(outFileName, 'w')

    count = 0
    strName = ""
    strNr = -1
    strFUT = ""
    coverageInfo = 0

    for line in infile:
        if line.find("==================================================") != -1:
            continue
        if line.find("--------------------------------------------------") != -1:
            continue
        if line.find("Start: Group") != -1:
            outfile.write("\n")
            continue
        if line.find("End: Group") != -1:
            outfile.write("\n")
            continue
        if line.find("Start: Test") != -1:
            outfile.write("\n")
            continue
        if line.find("End: Test") != -1:
            outfile.write("\n")
            continue
        if line.find("Start Dump: String") != -1:
            continue
        if line.find("End Dump: String")   != -1:
            strName = strName.rstrip("\n")
            outfile.write(strName)
            if strNr == 3:
                strFUT = strName
#            else:
#                strFUT == ""
            if   strName == "Group Name:":
                strNr = 1
                outfile.write("  ")
            elif strName == "Test Name:":
                strNr = 2
                outfile.write("  ")
            elif strName == "Function Under Test:":
                strNr = 3
                outfile.write("  ")
            else:
                strNr = 4
                if len(strName) < 128:
                    outfile.write("\n")
            strName = ""
            continue
        if line.find("Start: Coverage Information") != -1:
            coverageInfo = 1
            outfile.write(line)
            outfile.write("\n")
        if line.find("End: Coverage Information")   != -1:
            strFUT == ""
            coverageInfo = 0
        if coverageInfo == 1:
#            if line.find(strFUT) == -1: #this line contains no relevant coverage info
#                continue
            if line.find("- 0%") == -1 and line.find("src") == -1 and line.find("Functions") != -1:
                outfile.write(line + "\n")
            continue
        if line.find("0x") == 0: #this is a line to translate
            line = line[12:35] + line[37:61]
            nums = line.split(' ')
            for num in nums:
                intNum = int(num, base=16)
#                if intNum == 10:
#                    continue
                if intNum == 0:
                    continue
                strName += str(chr(intNum))
            continue
        outfile.write(line)
        outfile.write("\n")

def print_usage(sys_argv):
    script_name    = sys_argv[0]
    usage_str      = "Syntax: {0} toolchain core test\n".format(sys.argv[0])
    argument_desc  = "\n  toolchain: {0}".format(" ".join(toolchain_list))
    argument_desc += "\n  core:      {0}".format(" ".join(core_list))
    argument_desc += "\n  test:      {0}".format(" ".join(test_list))
    argument_desc += "\n\ne.g.: parseLog ARM cortexM3l FVP"

    print usage_str + argument_desc

def exit_on_error(sys_argv):
    print_usage(sys_argv)
    exit(1)

if __name__ == '__main__':
    arg_len = len(sys.argv)

    if arg_len != 4:
        exit_on_error(sys.argv)

    if error == parseLog(sys.argv[1], sys.argv[2], sys.argv[3]):
        exit_on_error(sys.argv)
