Skip to content

Commit 78a165b

Browse files
committed
py_lua_helper: extract exported data from binary files created by loader.lua
1 parent 5684096 commit 78a165b

1 file changed

Lines changed: 52 additions & 26 deletions

File tree

python_lua_helper/py_lua_helper.py

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ def __init__(
6767
# Initialize internal state
6868
self._variables: Dict[str, str] = {}
6969
self._metadata: Dict[str, str] = {}
70-
self._export_list: List[str] = []
7170

7271
# Initialize temporary directory
7372
self._setup_temp_dir()
@@ -151,11 +150,10 @@ def _setup_temp_dir(self):
151150
self.temp_dir = tempfile.mkdtemp(
152151
prefix="lua-helper-", dir=self.temp_dir
153152
)
154-
# Create data storage directories in selected temp dir
155-
self.meta_dir = os.path.join(self.temp_dir, "meta")
156-
self.data_dir = os.path.join(self.temp_dir, "data")
157-
os.makedirs(self.meta_dir)
158-
os.makedirs(self.data_dir)
153+
# Define temp files for data exchange
154+
self.meta_file = os.path.join(self.temp_dir, "meta.tmp")
155+
self.data_file = os.path.join(self.temp_dir, "data.tmp")
156+
self.index_file = os.path.join(self.temp_dir, "index.tmp")
159157

160158
def _detect_lua_binary(self):
161159
"""Detect appropriate Lua binary based on version requirements."""
@@ -283,28 +281,56 @@ def _run_lua_loader(self):
283281
except subprocess.TimeoutExpired:
284282
raise RuntimeError("Lua loader timed out")
285283

286-
def _parse_results(self):
287-
"""Parse exported variables from temporary files."""
288-
# Read the list of exported variables
289-
try:
290-
self._export_list = os.listdir(self.data_dir)
291-
except Exception:
292-
self._export_list = []
284+
def _parse_text_fields(self, file_path: str):
285+
"""
286+
Parses a binary file containing UTF-8 text fields generated by loader.lua
293287
294-
# Load each variable
295-
for filename in self._export_list:
296-
try:
297-
# Read data
298-
with open(os.path.join(self.data_dir, filename), "rb") as f:
299-
self._variables[filename] = f.read().decode(
300-
"utf-8", errors="ignore"
288+
Args:
289+
file_path (str): The path to the binary file.
290+
291+
Returns:
292+
list: A list of strings containing the parsed UTF-8 fields.
293+
"""
294+
fields = []
295+
with open(file_path, "rb") as f:
296+
file_content = f.read()
297+
# Locate the start marker, set initial position
298+
header_marker = b"start\xff\x00"
299+
start_pos = file_content.find(header_marker)
300+
if start_pos == -1:
301+
raise ValueError(f"Failed to locate start marker at {file_path}")
302+
current_pos = start_pos + len(header_marker)
303+
# Read UTF8 text fields, separated with special sequence
304+
separator = b"\xff\x00"
305+
while True:
306+
# Find the next separator
307+
sep_pos = file_content.find(separator, current_pos)
308+
if sep_pos != -1:
309+
# Extract the bytes for the current field
310+
field_bytes = file_content[current_pos:sep_pos]
311+
field_str = field_bytes.decode("utf-8")
312+
fields.append(field_str)
313+
# Move pointer past the separator
314+
current_pos = sep_pos + len(separator)
315+
else:
316+
# No separator found, this is the last field (no terminator at the end)
317+
if current_pos < len(file_content):
318+
raise ValueError(
319+
f"Surplus data at the end of file, at pos: {current_pos}"
301320
)
302-
# Read metadata
303-
with open(os.path.join(self.meta_dir, filename), "rb") as f:
304-
self._metadata[filename] = f.read().decode("utf-8", errors="ignore")
305-
except Exception:
306-
# Skip problematic files
307-
continue
321+
break
322+
return fields
323+
324+
def _parse_results(self):
325+
"""Parse exported variables from temporary files."""
326+
# Read exported data
327+
exports = self._parse_text_fields(self.index_file)
328+
meta = self._parse_text_fields(self.meta_file)
329+
data = self._parse_text_fields(self.data_file)
330+
331+
for index, value in enumerate(exports):
332+
self._variables[value] = data[index]
333+
self._metadata[value] = meta[index]
308334

309335
def _cleanup(self):
310336
"""Clean up temporary directory."""

0 commit comments

Comments
 (0)