mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-01-23 13:35:11 +03:00
Initial float-convert tool (#75)
* 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
This commit is contained in:
parent
921bceb967
commit
3dfa02af80
88
tools/float-convert.py
Normal file
88
tools/float-convert.py
Normal file
@ -0,0 +1,88 @@
|
||||
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:])
|
Loading…
Reference in New Issue
Block a user