summaryrefslogtreecommitdiff
path: root/tools/progress.py
blob: c4e99a4e58d833cfd64308387e3dafbf5630b00e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python3

# SPDX-FileCopyrightText: © 2023 ZeldaRET
# SPDX-License-Identifier: MIT

from __future__ import annotations

import argparse
import mapfile_parser
from pathlib import Path


ASMPATH = Path("asm")
NONMATCHINGS = "nonmatchings"


def getProgressFromMapFile(mapFile: mapfile_parser.MapFile, asmPath: Path, nonmatchings: Path, aliases: dict[str, str]=dict(), pathIndex: int=2) -> tuple[mapfile_parser.ProgressStats, dict[str, mapfile_parser.ProgressStats]]:
    totalStats = mapfile_parser.ProgressStats()
    progressPerFolder: dict[str, mapfile_parser.ProgressStats] = dict()

    for segment in mapFile:
        for file in segment:
            if len(file) == 0:
                continue

            folder = file.filepath.parts[pathIndex]

            if folder in aliases:
                folder = aliases[folder]

            if folder not in progressPerFolder:
                progressPerFolder[folder] = mapfile_parser.ProgressStats()

            originalFilePath = Path(*file.filepath.parts[pathIndex:])

            extensionlessFilePath = originalFilePath
            while extensionlessFilePath.suffix:
                extensionlessFilePath = extensionlessFilePath.with_suffix("")

            fullAsmFile = asmPath / extensionlessFilePath.with_suffix(".s")

            handwrittenAsmFiles = [Path("boot/libc64/fp.o"), Path("makerom/entry.o")]
            
            if originalFilePath in handwrittenAsmFiles:
                wholeFileIsUndecomped = False
            else:
                wholeFileIsUndecomped = fullAsmFile.exists()


            for func in file:
                funcAsmPath = nonmatchings / extensionlessFilePath / f"{func.name}.s"

                symSize = 0
                if func.size is not None:
                    symSize = func.size

                if wholeFileIsUndecomped:
                    totalStats.undecompedSize += symSize
                    progressPerFolder[folder].undecompedSize += symSize
                elif funcAsmPath.exists():
                    totalStats.undecompedSize += symSize
                    progressPerFolder[folder].undecompedSize += symSize
                else:
                    totalStats.decompedSize += symSize
                    progressPerFolder[folder].decompedSize += symSize

    return totalStats, progressPerFolder


def getProgress(mapPath: Path, version: str) -> tuple[mapfile_parser.ProgressStats, dict[str, mapfile_parser.ProgressStats]]:
    mapFile = mapfile_parser.MapFile()
    mapFile.readMapFile(mapPath)

    for segment in mapFile:
        for file in segment:
            if len(file) == 0:
                continue

            filepathParts = list(file.filepath.parts)
            if version in filepathParts:
                filepathParts.remove(version)
            file.filepath = Path(*filepathParts)

    nonMatchingsPath = ASMPATH / version / NONMATCHINGS

    return getProgressFromMapFile(mapFile.filterBySectionType(".text"), ASMPATH / version, nonMatchingsPath, aliases={"ultralib": "libultra"})

def getAssetProgress(mapPath: Path, version: str):
    totalStats = mapfile_parser.ProgressStats()
    progressPerFolder: dict[str, mapfile_parser.ProgressStats] = dict()
    progressPerFolder["objects"] = mapfile_parser.ProgressStats()
    progressPerFolder["unidentified"] = mapfile_parser.ProgressStats()

    mapFile = mapfile_parser.MapFile()
    mapFile.readMapFile(mapPath)
    mapFile = mapFile.filterBySectionType(".data")

    for segment in mapFile:
        for file in segment:

            if len(file) == 0:
                continue

            if str(file.filepath).startswith("build/src/objects"):
                totalStats.decompedSize += file.size
                progressPerFolder["objects"].decompedSize += file.size
            elif str(file.filepath).startswith("build/assets/" + version + "/objects"):
                totalStats.undecompedSize += file.size
                progressPerFolder["objects"].undecompedSize += file.size
            elif str(file.filepath).startswith("build/assets/" + version):
                progressPerFolder["unidentified"].undecompedSize += file.size
                totalStats.undecompedSize += file.size
    
    return totalStats, progressPerFolder

def progressMain():
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--version", help="version to process", default="jp")

    args = parser.parse_args()

    mapPath = Path("build") / f"animalforest-{args.version}.map"

    codeTotalStats, codeProgressPerFolder = getProgress(mapPath, args.version)
    assetTotalStats, assetProgressPerFolder = getAssetProgress(mapPath, args.version)
    print("code:")
    mapfile_parser.progress_stats.printStats(codeTotalStats, codeProgressPerFolder)
    print("\n\nassets:")
    mapfile_parser.progress_stats.printStats(assetTotalStats, assetProgressPerFolder)

if __name__ == "__main__":
    progressMain()