From 88235041a30f34f3d616bd171abd1acde6ef6b31 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Tue, 17 Oct 2023 20:14:45 +0200 Subject: [PATCH] fxconv: add i8/i16/i32, with range checks --- fxconv/fxconv.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/fxconv/fxconv.py b/fxconv/fxconv.py index f765d46..dd9eca0 100644 --- a/fxconv/fxconv.py +++ b/fxconv/fxconv.py @@ -15,7 +15,7 @@ __all__ = [ # Color names "FX_BLACK", "FX_DARK", "FX_LIGHT", "FX_WHITE", "FX_ALPHA", # Conversion mechanisms - "ObjectData", "u8", "u16", "u32", "ref", "sym", + "ObjectData", "u8", "u16", "u32", "i8", "i16", "i32", "ref", "sym", # Functions "quantize", "convert", "elf", # Reusable classes @@ -167,11 +167,30 @@ FX_CHARSETS = { # Conversion mechanisms # -def u8(x): +def u8(x, check=False): + if check and not (0 <= x < 2**8): + raise FxconvError(f"integer {x} out of range for u8") return bytes([ x & 255 ]) -def u16(x): +def u16(x, check=False): + if check and not (0 <= x < 2**16): + raise FxconvError(f"integer {x} out of range for u8") return bytes([ (x >> 8) & 255, x & 255 ]) -def u32(x): +def u32(x, check=False): + if check and not (0 <= x < 2**32): + raise FxconvError(f"integer {x} out of range for u8") + return bytes([ (x >> 24) & 255, (x >> 16) & 255, (x >> 8) & 255, x & 255 ]) + +def i8(x, check=True): + if check and not (-2**7 <= x < 2**7): + raise FxconvError(f"integer {x} out of range for u8") + return bytes([ x & 255 ]) +def i16(x, check=True): + if check and not (-2**15 <= x < 2**15): + raise FxconvError(f"integer {x} out of range for u8") + return bytes([ (x >> 8) & 255, x & 255 ]) +def i32(x, check=True): + if check and not (-2**31 <= x < 2**31): + raise FxconvError(f"integer {x} out of range for u8") return bytes([ (x >> 24) & 255, (x >> 16) & 255, (x >> 8) & 255, x & 255 ]) def ref(base, offset=None, padding=None, prefix_underscore=True, align=None):