Skip to content

Commit 8d9d247

Browse files
committed
Option to generate non human readable json
1 parent 29a243f commit 8d9d247

11 files changed

+236943
-236920
lines changed

src/mapfile_parser/frontends/jsonify.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
from .. import mapfile
1313

1414

15-
def doJsonify(mapPath: Path, outputPath: Path|None) -> int:
15+
def doJsonify(mapPath: Path, outputPath: Path|None, humanReadable: bool=True) -> int:
1616
mapFile = mapfile.MapFile()
1717
mapFile.readMapFile(mapPath)
1818

19-
jsonStr = json.dumps(mapFile.toJson(), indent=4)
19+
jsonStr = json.dumps(mapFile.toJson(humanReadable=humanReadable), indent=4)
2020

2121
if outputPath is None:
2222
print(jsonStr)
@@ -30,13 +30,15 @@ def doJsonify(mapPath: Path, outputPath: Path|None) -> int:
3030
def processArguments(args: argparse.Namespace):
3131
mapPath: Path = args.mapfile
3232
outputPath: Path|None = Path(args.output) if args.output is not None else None
33+
machine: bool = args.machine
3334

34-
exit(doJsonify(mapPath, outputPath))
35+
exit(doJsonify(mapPath, outputPath, humanReadable=not machine))
3536

3637
def addSubparser(subparser: argparse._SubParsersAction[argparse.ArgumentParser]):
3738
parser = subparser.add_parser("jsonify", help="Converts a mapfile into a json format.")
3839

3940
parser.add_argument("mapfile", help="Path to a map file", type=Path)
4041
parser.add_argument("-o", "--output", help="Output path of for the generated json. If omitted then stdout is used instead.")
42+
parser.add_argument("-m", "--machine", help="Emit numbers as numbers instead of outputting them as pretty strings.", action="store_true")
4143

4244
parser.set_defaults(func=processArguments)

src/mapfile_parser/mapfile.py

+53-32
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,24 @@ def getVromStr(self) -> str:
7878
return "None"
7979
return f"0x{self.vrom:06X}"
8080

81-
def serializeSize(self) -> str|None:
81+
def serializeVram(self, humanReadable: bool=True) -> str|int|None:
82+
if humanReadable:
83+
return f"0x{self.vram:08X}"
84+
return self.vram
85+
86+
def serializeSize(self, humanReadable: bool=True) -> str|int|None:
8287
if self.size is None:
8388
return None
84-
return f"0x{self.size:X}"
89+
if humanReadable:
90+
return f"0x{self.size:X}"
91+
return self.size
8592

86-
def serializeVrom(self) -> str|None:
93+
def serializeVrom(self, humanReadable: bool=True) -> str|int|None:
8794
if self.vrom is None:
8895
return None
89-
return f"0x{self.size:X}"
96+
if humanReadable:
97+
return f"0x{self.vrom:06X}"
98+
return self.vrom
9099

91100
@staticmethod
92101
def printCsvHeader():
@@ -103,12 +112,12 @@ def toCsvHeader() -> str:
103112
def toCsv(self) -> str:
104113
return f"{self.name},{self.vram:08X},{self.size}"
105114

106-
def toJson(self) -> dict[str, Any]:
115+
def toJson(self, humanReadable: bool=True) -> dict[str, Any]:
107116
result: dict[str, Any] = {
108117
"name": self.name,
109-
"vram": self.getVramStr(),
110-
"size": self.serializeSize(),
111-
"vrom": self.serializeVrom(),
118+
"vram": self.serializeVram(humanReadable=humanReadable),
119+
"size": self.serializeSize(humanReadable=humanReadable),
120+
"vrom": self.serializeVrom(humanReadable=humanReadable),
112121
}
113122

114123
return result
@@ -138,16 +147,22 @@ def isNoloadSection(self) -> bool:
138147
return self.sectionType == ".bss"
139148

140149

141-
def serializeVram(self) -> str|None:
142-
return f"0x{self.vram:08X}"
150+
def serializeVram(self, humanReadable: bool=True) -> str|int|None:
151+
if humanReadable:
152+
return f"0x{self.vram:08X}"
153+
return self.vram
143154

144-
def serializeSize(self) -> str|None:
145-
return f"0x{self.size:X}"
155+
def serializeSize(self, humanReadable: bool=True) -> str|int|None:
156+
if humanReadable:
157+
return f"0x{self.size:X}"
158+
return self.size
146159

147-
def serializeVrom(self) -> str|None:
160+
def serializeVrom(self, humanReadable: bool=True) -> str|int|None:
148161
if self.vrom is None:
149162
return None
150-
return f"0x{self.vrom:06X}"
163+
if humanReadable:
164+
return f"0x{self.vrom:06X}"
165+
return self.vrom
151166

152167

153168
def getName(self) -> Path:
@@ -232,18 +247,18 @@ def toCsv(self, printVram: bool=True) -> str:
232247
ret += f"{self.filepath},{self.sectionType},{symCount},{maxSize},{self.size},{averageSize:0.2f}"
233248
return ret
234249

235-
def toJson(self) -> dict[str, Any]:
250+
def toJson(self, humanReadable: bool=True) -> dict[str, Any]:
236251
fileDict: dict[str, Any] = {
237252
"filepath": str(self.filepath),
238253
"sectionType": self.sectionType,
239-
"vram": self.serializeVram(),
240-
"size": self.serializeSize(),
241-
"vrom": self.serializeVrom(),
254+
"vram": self.serializeVram(humanReadable=humanReadable),
255+
"size": self.serializeSize(humanReadable=humanReadable),
256+
"vrom": self.serializeVrom(humanReadable=humanReadable),
242257
}
243258

244259
symbolsList = []
245260
for symbol in self._symbols:
246-
symbolsList.append(symbol.toJson())
261+
symbolsList.append(symbol.toJson(humanReadable=humanReadable))
247262

248263
fileDict["symbols"] = symbolsList
249264
return fileDict
@@ -280,14 +295,20 @@ class Segment:
280295
vrom: int
281296
_filesList: list[File] = dataclasses.field(default_factory=list)
282297

283-
def serializeVram(self) -> str|None:
284-
return f"0x{self.vram:08X}"
298+
def serializeVram(self, humanReadable: bool=True) -> str|int|None:
299+
if humanReadable:
300+
return f"0x{self.vram:08X}"
301+
return self.vram
285302

286-
def serializeSize(self) -> str|None:
287-
return f"0x{self.size:X}"
303+
def serializeSize(self, humanReadable: bool=True) -> str|int|None:
304+
if humanReadable:
305+
return f"0x{self.size:X}"
306+
return self.size
288307

289-
def serializeVrom(self) -> str|None:
290-
return f"0x{self.vrom:06X}"
308+
def serializeVrom(self, humanReadable: bool=True) -> str|int|None:
309+
if humanReadable:
310+
return f"0x{self.vrom:06X}"
311+
return self.vrom
291312

292313

293314
def filterBySectionType(self, sectionType: str) -> Segment:
@@ -384,17 +405,17 @@ def toCsvSymbols(self) -> str:
384405
ret += "\n"
385406
return ret
386407

387-
def toJson(self) -> dict[str, Any]:
408+
def toJson(self, humanReadable: bool=True) -> dict[str, Any]:
388409
segmentDict: dict[str, Any] = {
389410
"name": self.name,
390-
"vram": self.serializeVram(),
391-
"size": self.serializeSize(),
392-
"vrom": self.serializeVrom(),
411+
"vram": self.serializeVram(humanReadable=humanReadable),
412+
"size": self.serializeSize(humanReadable=humanReadable),
413+
"vrom": self.serializeVrom(humanReadable=humanReadable),
393414
}
394415

395416
filesList = []
396417
for file in self._filesList:
397-
filesList.append(file.toJson())
418+
filesList.append(file.toJson(humanReadable=humanReadable))
398419

399420
segmentDict["files"] = filesList
400421

@@ -758,10 +779,10 @@ def toCsvSymbols(self) -> str:
758779
ret += segment.toCsvSymbols()
759780
return ret
760781

761-
def toJson(self) -> dict[str, Any]:
782+
def toJson(self, humanReadable: bool=True) -> dict[str, Any]:
762783
segmentsList = []
763784
for segment in self._segmentsList:
764-
segmentsList.append(segment.toJson())
785+
segmentsList.append(segment.toJson(humanReadable=humanReadable))
765786

766787
result: dict[str, Any] = {
767788
"segments": segmentsList

0 commit comments

Comments
 (0)