import sys
import getopt
import argparse
import struct


def main(argv):
    outputfile = ""
    opts, args = getopt.getopt(argv,"hpf:o:",["help","print","file=","output="])
    out = ""
    toFile = False
    toPrint = False
    labelArr = ""
    count = 0
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            print("\nThis is an initial tool to quickly parse the data .s files and convert anything which could potentially be float\n")
            print("-f / --file : file name of data .s file to parse")
            print("-o / --output : output file if you want to output to a file")
            print("-p / --print : if used then it will output to terminal\n")
        elif opt in ("-f", "--file"):
            f = open(arg, "r")
            for line in f:
                if "dlabel " in line:
                    if count != 0:
                        if count > 1:
                            out += "[" + str(count) + "] = {\n    " + labelArr + "\n};\n"
                        else:
                            out += " = " + labelArr + ";\n"
                        labelArr = ""
                        count = 0
                    label = line.split("dlabel ", 1)[1]
                    out += "\nf32 "
                    out += label.split("\n",1)[0]
                    # out += "\n"
                elif " .float " in line:
                    if count != 0:
                        labelArr += ", "
                    seg = line.split(" .float ", 1)[1]
                    labelArr += seg.split("\n",1)[0] + ".0f"
                    count += 1
                    # out += "\n"
                elif " .word 0x" in line:
                    if count != 0:
                        labelArr += ", "
                    seg = line.split(" .word 0x", 1)[1]
                    if len(seg) == 9:
                        labelArr += str(struct.unpack('!f', bytes.fromhex(seg))[0]) + "f"
                        count += 1
                        # out += "\n"
                elif " .asciz \"" in line:
                    if count != 0:
                        labelArr += ", "
                    seg = line.split(" .asciz \"", 1)[1].rsplit("\"",1)[0]
                    length = len(seg)
                    if length <= 4:
                        segStr = ""
                        for letter in seg:
                            if letter == '\\':
                                length -= 1
                                continue
                            segStr += format(ord(letter), "x")
                        for a in range(4 - length):
                            segStr += "00"
                        labelArr += str(struct.unpack('!f', bytes.fromhex(segStr))[0]) + "f"
                        count += 1
                        # out += "\n"
                
        elif opt in ("-o", "--output"):
            outputfile = arg
            toFile = True
        elif opt in ("-p", "--print"):
            toPrint = True
    if count > 1:
        out += "[" + str(count) + "] = {\n    " + labelArr + "\n};\n"
    elif count == 1:
        out += " = " + labelArr + ";\n"
    if toPrint:
        print(out)
    if toFile:
        outFile = open(outputfile, "a")
        outFile.write(out)
        outFile.close()
                    
    sys.exit()

if __name__ == "__main__":
    main(sys.argv[1:])