1
1
import sys
2
- from struct import Struct , unpack
3
2
import re
4
- from typing import List , Union
5
- from io import BytesIO , BufferedIOBase , IOBase , BufferedReader
3
+ from struct import Struct , unpack
4
+ from io import IOBase , BufferedReader
5
+
6
+ import builtins
7
+ from typing import Callable , List , Optional , Tuple , Union
6
8
7
9
reNot0 = re .compile (b"(.*?)\x00 " , re .S )
8
10
@@ -43,13 +45,13 @@ class EndianBinaryReader:
43
45
44
46
def __new__ (
45
47
cls ,
46
- item : Union [bytes , bytearray , memoryview , BytesIO , str ],
48
+ item : Union [bytes , bytearray , memoryview , IOBase , str ],
47
49
endian : str = ">" ,
48
50
offset : int = 0 ,
49
51
):
50
52
if isinstance (item , (bytes , bytearray , memoryview )):
51
53
obj = super (EndianBinaryReader , cls ).__new__ (EndianBinaryReader_Memoryview )
52
- elif isinstance (item , ( IOBase , BufferedIOBase ) ):
54
+ elif isinstance (item , IOBase ):
53
55
obj = super (EndianBinaryReader , cls ).__new__ (EndianBinaryReader_Streamable )
54
56
elif isinstance (item , str ):
55
57
item = open (item , "rb" )
@@ -75,17 +77,17 @@ def __new__(
75
77
obj .__init__ (item , endian )
76
78
return obj
77
79
78
- def __init__ (self , item , endian = ">" , offset = 0 ):
80
+ def __init__ (self , item , endian : str = ">" , offset : int = 0 ):
79
81
self .endian = endian
80
82
self .BaseOffset = offset
81
83
self .Position = 0
82
84
83
85
@property
84
- def bytes (self ):
86
+ def bytes (self ) -> builtins . bytes :
85
87
# implemented by Streamable and Memoryview versions
86
88
return b""
87
89
88
- def read (self , * args ):
90
+ def read (self , * args ) -> builtins . bytes :
89
91
# implemented by Streamable and Memoryview versions
90
92
return b""
91
93
@@ -95,7 +97,7 @@ def read_byte(self) -> int:
95
97
def read_u_byte (self ) -> int :
96
98
return unpack (self .endian + "B" , self .read (1 ))[0 ]
97
99
98
- def read_bytes (self , num ) -> bytes :
100
+ def read_bytes (self , num ) -> builtins . bytes :
99
101
return self .read (num )
100
102
101
103
def read_short (self ) -> int :
@@ -191,54 +193,54 @@ def read_color4(self) -> Color:
191
193
self .read_float (), self .read_float (), self .read_float (), self .read_float ()
192
194
)
193
195
194
- def read_byte_array (self ) -> bytes :
196
+ def read_byte_array (self ) -> builtins . bytes :
195
197
return self .read (self .read_int ())
196
198
197
199
def read_matrix (self ) -> Matrix4x4 :
198
200
return Matrix4x4 (self .read_float_array (16 ))
199
201
200
- def read_array (self , command , length : int ) -> list :
202
+ def read_array (self , command : Callable , length : int ) -> list :
201
203
return [command () for _ in range (length )]
202
204
203
- def read_array_struct (self , param : str , length : int = None ) -> list :
205
+ def read_array_struct (self , param : str , length : Optional [ int ] = None ) -> tuple :
204
206
if length is None :
205
207
length = self .read_int ()
206
208
struct = Struct (f"{ self .endian } { length } { param } " )
207
209
return struct .unpack (self .read (struct .size ))
208
210
209
- def read_boolean_array (self , length : int = None ) -> List [bool ]:
211
+ def read_boolean_array (self , length : Optional [ int ] = None ) -> Tuple [bool ]:
210
212
return self .read_array_struct ("?" , length )
211
213
212
- def read_u_byte_array (self , length : int = None ) -> List [int ]:
214
+ def read_u_byte_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
213
215
return self .read_array_struct ("B" , length )
214
216
215
- def read_u_short_array (self , length : int = None ) -> List [int ]:
217
+ def read_u_short_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
216
218
return self .read_array_struct ("h" , length )
217
219
218
- def read_short_array (self , length : int = None ) -> List [int ]:
220
+ def read_short_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
219
221
return self .read_array_struct ("H" , length )
220
222
221
- def read_int_array (self , length : int = None ) -> List [int ]:
223
+ def read_int_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
222
224
return self .read_array_struct ("i" , length )
223
225
224
- def read_u_int_array (self , length : int = None ) -> List [int ]:
226
+ def read_u_int_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
225
227
return self .read_array_struct ("I" , length )
226
228
227
- def read_long_array (self , length : int = None ) -> List [int ]:
229
+ def read_long_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
228
230
return self .read_array_struct ("q" , length )
229
231
230
- def read_u_long_array (self , length : int = None ) -> List [int ]:
232
+ def read_u_long_array (self , length : Optional [ int ] = None ) -> Tuple [int ]:
231
233
return self .read_array_struct ("Q" , length )
232
234
233
- def read_u_int_array_array (self , length : int = None ) -> List [List [int ]]:
235
+ def read_u_int_array_array (self , length : Optional [ int ] = None ) -> List [Tuple [int ]]:
234
236
return self .read_array (
235
237
self .read_u_int_array , length if length is not None else self .read_int ()
236
238
)
237
239
238
- def read_float_array (self , length : int = None ) -> List [float ]:
240
+ def read_float_array (self , length : Optional [ int ] = None ) -> Tuple [float ]:
239
241
return self .read_array_struct ("f" , length )
240
242
241
- def read_double_array (self , length : int = None ) -> List [float ]:
243
+ def read_double_array (self , length : Optional [ int ] = None ) -> Tuple [float ]:
242
244
return self .read_array_struct ("d" , length )
243
245
244
246
def read_string_array (self ) -> List [str ]:
@@ -259,7 +261,7 @@ def real_offset(self) -> int:
259
261
"""
260
262
return self .BaseOffset + self .Position
261
263
262
- def read_the_rest (self , obj_start : int , obj_size : int ) -> bytes :
264
+ def read_the_rest (self , obj_start : int , obj_size : int ) -> builtins . bytes :
263
265
"""Returns the rest of the current reader bytes."""
264
266
return self .read_bytes (obj_size - (self .Position - obj_start ))
265
267
@@ -268,7 +270,7 @@ class EndianBinaryReader_Memoryview(EndianBinaryReader):
268
270
__slots__ = ("view" , "_endian" , "BaseOffset" , "Position" , "Length" )
269
271
view : memoryview
270
272
271
- def __init__ (self , view , endian = ">" , offset = 0 ):
273
+ def __init__ (self , view , endian : str = ">" , offset : int = 0 ):
272
274
self ._endian = ""
273
275
super ().__init__ (view , endian = endian , offset = offset )
274
276
self .view = memoryview (view )
@@ -293,20 +295,20 @@ def endian(self, value: str):
293
295
self ._endian = value
294
296
295
297
@property
296
- def bytes (self ):
298
+ def bytes (self ) -> memoryview :
297
299
return self .view
298
300
299
- def dispose (self ):
301
+ def dispose (self ) -> None :
300
302
self .view .release ()
301
303
302
- def read (self , length : int ):
304
+ def read (self , length : int ) -> memoryview :
303
305
if not length :
304
- return b""
306
+ return memoryview ( b"" )
305
307
ret = self .view [self .Position : self .Position + length ]
306
308
self .Position += length
307
309
return ret
308
310
309
- def read_aligned_string (self ):
311
+ def read_aligned_string (self ) -> str :
310
312
length = self .read_int ()
311
313
if 0 < length <= self .Length - self .Position :
312
314
string_data = self .read_bytes (length )
@@ -315,7 +317,7 @@ def read_aligned_string(self):
315
317
return result
316
318
return ""
317
319
318
- def read_string_to_null (self , max_length = 32767 ) -> str :
320
+ def read_string_to_null (self , max_length : int = 32767 ) -> str :
319
321
match = reNot0 .search (self .view , self .Position , self .Position + max_length )
320
322
if not match :
321
323
if self .Position + max_length >= self .Length :
0 commit comments