mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-01-23 13:35:11 +03:00
3dfa02af80
* Initial float-convert tool * Change formatting output * remove arg needed for print * dont always print * printing option works * add help option * add semi-colon * always print help if option * properly format non arrays * better ascii parsing
88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
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:]) |