From c5d8faaa4a9f0b5be20f45d36337d1ce716ebbde Mon Sep 17 00:00:00 2001 From: hakril Date: Fri, 17 Jan 2020 21:09:04 +0100 Subject: [PATCH] Winstruct parser accept * in array size expression --- ctypes_generation/struct_parser.py | 4 ++-- ctypes_generation/winstruct.py | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ctypes_generation/struct_parser.py b/ctypes_generation/struct_parser.py index 1a4be4b..994e45f 100644 --- a/ctypes_generation/struct_parser.py +++ b/ctypes_generation/struct_parser.py @@ -17,8 +17,8 @@ class WinStructParser(Parser): nb_rep = ComplexArrayExpression() while type(self.peek()) != CloseSquareBracketToken: tok = self.next_token() - if type(tok) not in (NameToken, PlusToken): - raise ValueError("Array expression only accept names/+") + if type(tok) not in (NameToken, PlusToken, StarToken): + raise ValueError("Array expression only accept names/+/*") is_name = (type(tok) == NameToken) nb_rep.add_token_to_expression(tok.value, is_name) self.assert_token_type(CloseSquareBracketToken) diff --git a/ctypes_generation/winstruct.py b/ctypes_generation/winstruct.py index adbba72..3144264 100644 --- a/ctypes_generation/winstruct.py +++ b/ctypes_generation/winstruct.py @@ -14,8 +14,8 @@ class BitFieldValue(object): def __int__(self): return self.nb_bits - def generate_ctypes(self): - return self.nb_bits + # def generate_ctypes(self): + # return self.nb_bits class ComplexArrayExpression(object): def __init__(self): @@ -131,7 +131,10 @@ class WinStruct(object): res += ["{0}._pack_ = ".format(self.pack)] res += ["{0}._fields_ = [".format(self.name)] for (ftype, name, nb_rep) in self.fields: - if isinstance(nb_rep, (BitFieldValue, ComplexArrayExpression)): + if isinstance(nb_rep, BitFieldValue): + res += [' ("{0}", {1}, {2}),'.format(name, ftype.generate_ctypes(), nb_rep.nb_bits)] + continue + elif isinstance(nb_rep, ComplexArrayExpression): nb_rep = nb_rep.generate_ctypes() if nb_rep == 1: res+= [' ("{0}", {1}),'.format(name, ftype.generate_ctypes())] @@ -157,11 +160,14 @@ class WinStruct(object): res += self.generate_anonymous_union() res += " _fields_ = [\n""" - for (ftype, name, nb_rep) in self.fields: - if isinstance(nb_rep, (BitFieldValue, ComplexArrayExpression)): + if isinstance(nb_rep, BitFieldValue): + res += ' ("{0}", {1}, {2}),\n'.format(name, ftype.generate_ctypes(), nb_rep.nb_bits) + continue + elif isinstance(nb_rep, ComplexArrayExpression): # Should I check 'ftype' somewhere when we have a bitfield ? nb_rep = nb_rep.generate_ctypes() + if nb_rep == 1: res+= ' ("{0}", {1}),\n'.format(name, ftype.generate_ctypes()) else: