@@ -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