1
0
mirror of synced 2024-11-14 09:57:36 +01:00

Give various utilities a bit of a refresh help-wise.

This commit is contained in:
Jennifer Taylor 2021-08-12 15:57:54 +00:00
parent 57ad41202c
commit c457216294
7 changed files with 49 additions and 34 deletions

View File

@ -16,7 +16,7 @@ def main() -> None:
parser = argparse.ArgumentParser(description="An API services provider for eAmusement games, conforming to BEMAPI specs.") parser = argparse.ArgumentParser(description="An API services provider for eAmusement games, conforming to BEMAPI specs.")
parser.add_argument("-p", "--port", help="Port to listen on. Defaults to 80", type=int, default=80) parser.add_argument("-p", "--port", help="Port to listen on. Defaults to 80", type=int, default=80)
parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml") parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml")
parser.add_argument("-r", "--profile", help="Turn on profiling for API", action="store_true") parser.add_argument("-r", "--profile", help="Turn on profiling for API, writing CProfile data to the currenct directory", action="store_true")
args = parser.parse_args() args = parser.parse_args()
# Set up app # Set up app

View File

@ -85,7 +85,7 @@ def main() -> None:
parser = argparse.ArgumentParser(description="A front end services provider for eAmusement games.") parser = argparse.ArgumentParser(description="A front end services provider for eAmusement games.")
parser.add_argument("-p", "--port", help="Port to listen on. Defaults to 80", type=int, default=80) parser.add_argument("-p", "--port", help="Port to listen on. Defaults to 80", type=int, default=80)
parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml") parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml")
parser.add_argument("-r", "--profile", help="Turn on profiling for front end", action="store_true") parser.add_argument("-r", "--profile", help="Turn on profiling for front end, writing CProfile data to the currenct directory", action="store_true")
args = parser.parse_args() args = parser.parse_args()
# Set up app # Set up app

View File

@ -200,7 +200,7 @@ def main() -> None:
) )
parser.add_argument( parser.add_argument(
"--offset", "--offset",
help="Hex offset into the file.", help="Hex offset into the file. This can be specified as either a raw offset into the DLL or as a virtual offset.",
type=str, type=str,
default=None, default=None,
required=True, required=True,
@ -215,7 +215,7 @@ def main() -> None:
) )
parser.add_argument( parser.add_argument(
"--root", "--root",
help="Root node name.", help="Root node name to be used for the generated code.",
type=str, type=str,
default="root", default="root",
) )

View File

@ -130,7 +130,7 @@ def generate_code(infile: str, outfile: str, encoding: str) -> None:
def main() -> None: def main() -> None:
parser = argparse.ArgumentParser(description="A utility to generate code that will generate a packet.") parser = argparse.ArgumentParser(description="A utility to generate code that will generate a packet given an example packet from a log or binary dump.")
parser.add_argument("-i", "--infile", help="File containing an XML or binary node structure. Use - for stdin.", type=str, default=None, required=True) parser.add_argument("-i", "--infile", help="File containing an XML or binary node structure. Use - for stdin.", type=str, default=None, required=True)
parser.add_argument("-o", "--outfile", help="File to write python code to. Use - for stdout.", type=str, default=None, required=True) parser.add_argument("-o", "--outfile", help="File to write python code to. Use - for stdout.", type=str, default=None, required=True)
parser.add_argument("-e", "--encoding", help="Encoding for the packet, defaults to UTF-8.", type=str, default='utf-8') parser.add_argument("-e", "--encoding", help="Encoding for the packet, defaults to UTF-8.", type=str, default='utf-8')

View File

@ -157,7 +157,7 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser(description="A backend services provider for eAmusement games") parser = argparse.ArgumentParser(description="A backend services provider for eAmusement games")
parser.add_argument("-p", "--port", help="Port to listen on. Defaults to 80", type=int, default=80) parser.add_argument("-p", "--port", help="Port to listen on. Defaults to 80", type=int, default=80)
parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml") parser.add_argument("-c", "--config", help="Core configuration. Defaults to server.yaml", type=str, default="server.yaml")
parser.add_argument("-r", "--profile", help="Turn on profiling for front end", action="store_true") parser.add_argument("-r", "--profile", help="Turn on profiling for services, writing CProfile data to the currenct directory", action="store_true")
args = parser.parse_args() args = parser.parse_args()
# Set up global configuration, overriding config port for convenience # Set up global configuration, overriding config port for convenience

View File

@ -5,20 +5,6 @@ import sys
from typing import Optional, Tuple, List, Any from typing import Optional, Tuple, List, Any
"""
Some examples of valid format specifiers and what they do are as follows:
*z&+0x200# = Decodes an array of string pointers, and includes the count
alongside the string, starting at 0x200, and displayed in
hex. Broken down, it has the following parts:
*z = Dereference the current value (*) and treat that integer
as a pointer to a null-terminated string (z).
&+0x200# = Print the current line number (#), offset by the
value 0x200 (+0x200) as a hex number (&).
"""
class LineNumber: class LineNumber:
def __init__(self, offset: int, hex: bool) -> None: def __init__(self, offset: int, hex: bool) -> None:
self.offset = offset self.offset = offset
@ -227,7 +213,29 @@ class StructPrinter:
def main() -> int: def main() -> int:
parser = argparse.ArgumentParser(description="A utility to print structs out of a DLL.") parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description="A utility to print structs out of a DLL.",
epilog=("""
Some examples of valid format specifiers and what they do are as follows:
*h = Decodes an array of short pointers, decoding the resulting shorts for each pointer in the array.
*(hbb) = Decodes an array of pointers to a structure containing a short and two bytes, decoding that short and both bytes for each entry in the array.
*z = Decodes an array null-terminated string pointers.
Ih&h = Decodes an array of structures containing an unsigned integer and two shorts, displaying the second short in hex instead of decimal.
#I = Decodes an array of unsigned integers, displaying the array entry number and the integer.
+64#h = Decodes an array of shorts, displaying the array entry number starting at 64 and the integer.
*z&+0x200# = Decodes an array of null-terminated string pointers, displaying the array entry number in hex starting at 0x200 and string. Broken down, it has the following parts:
*z = Dereference the current value (*) and treat that integer as a pointer to a null-terminated string (z).
&+0x200# = Print the current line number (#), offset by the value 0x200 (+0x200) as a hex number (&).
"""),
)
parser.add_argument( parser.add_argument(
"--file", "--file",
help="DLL file to extract from.", help="DLL file to extract from.",
@ -237,20 +245,20 @@ def main() -> int:
) )
parser.add_argument( parser.add_argument(
"--start", "--start",
help="Hex offset into the file we should start at.", help="Hex offset into the file we should start at. This can be specified as either a raw offset into the DLL or as a virtual offset.",
type=str, type=str,
default=None, default=None,
required=True, required=True,
) )
parser.add_argument( parser.add_argument(
"--end", "--end",
help="Hex offset into the file we should go until. Alternatively you can use --count", help="Hex offset into the file we should go until. Alternatively you can use --count and the end offset will be calclated based on the start and format size.",
type=str, type=str,
default=None, default=None,
) )
parser.add_argument( parser.add_argument(
"--count", "--count",
help="Number of entries to parse, as a decimal or hex integer. Alternatively you can use --end", help="Number of entries to parse, as a decimal or hex integer. Alternatively you can use --end and the count will be calculated based on the start, end and format size.",
type=str, type=str,
default=None, default=None,
) )
@ -259,11 +267,12 @@ def main() -> int:
help=( help=(
"Python struct format we should print using. See https://docs.python.org/3/library/struct.html " "Python struct format we should print using. See https://docs.python.org/3/library/struct.html "
"for details. Additionally, prefixing a format specifier with * allows dereferencing pointers. " "for details. Additionally, prefixing a format specifier with * allows dereferencing pointers. "
"Surround a chunk of format specifiers with parenthesis to dereference complex structures. For " "Surround a chunk of format specifiers with parenthesis to dereference structures. Note that "
"ease of unpacking C string pointers, the specifier \"z\" is recognzied to mean null-terminated " "structures can be arbitrarily nested to decode complex data types. For ease of unpacking C string "
"string. A & preceeding a format specifier means that we should convert to hex before displaying." "pointers, the specifier \"z\" is recognzied to mean null-terminated string. A & preceeding a "
"For the ease of decoding enumerations, the specifier \"#\" is recognized to mean entry number." "format specifier means that we should convert to hex before displaying. For the ease of decoding "
"You can provide it a offset value such as \"+20#\" to start at a certain number." "enumerations, the specifier \"#\" is recognized to mean entry number. You can provide it an "
"offset value such as \"+20#\" to start at a certain number."
), ),
type=str, type=str,
default=None, default=None,

View File

@ -14,20 +14,25 @@ def main() -> None:
parser.add_argument( parser.add_argument(
"-d", "-d",
"--directory", "--directory",
help="Directory to extract to.", help="Directory to extract to. Specify this parameter if you want to extract an existing 2dx file.",
default=None, default=None,
) )
parser.add_argument( parser.add_argument(
"-w", "-w",
"--wavfile", "--wavfile",
help="ADPCM wave file to add to archive.", help=(
"ADPCM wave file to add to a new or existing archive. Specify this parameter to update an "
"existing 2dx file with a new wav file or build a new archive containing a particular wav file. "
"Note that you can specify this parameter multiple times to bundle multiple wav files into one "
"archive."
),
action="append", action="append",
default=[], default=[],
) )
parser.add_argument( parser.add_argument(
"-n", "-n",
"--name", "--name",
help="Name of the archive when updating.", help="Name of the archive when creating a new 2dx file from scratch.",
default=None, default=None,
) )
args = parser.parse_args() args = parser.parse_args()
@ -51,8 +56,7 @@ def main() -> None:
os.makedirs(dirof, exist_ok=True) os.makedirs(dirof, exist_ok=True)
with open(realfn, 'wb') as fp: with open(realfn, 'wb') as fp:
fp.write(twodx.read_file(fn)) fp.write(twodx.read_file(fn))
elif len(args.wavfile) > 0:
if len(args.wavfile) > 0:
try: try:
fp = open(args.file, 'rb') fp = open(args.file, 'rb')
data = fp.read() data = fp.read()
@ -76,6 +80,8 @@ def main() -> None:
fp = open(args.file, 'wb') fp = open(args.file, 'wb')
fp.write(twodx.get_new_data()) fp.write(twodx.get_new_data())
fp.close() fp.close()
else:
raise Exception("Please provide either a directory to extract to, or a wav file to build into a 2dx file!")
if __name__ == '__main__': if __name__ == '__main__':