Modified:
/trunk/ctypesgencore/parser/cgrammar.py
/trunk/ctypesgencore/parser/ctypesparser.py
/trunk/ctypesgencore/printer_python/printer.py
=======================================
--- /trunk/ctypesgencore/parser/cgrammar.py Mon Sep 26 11:54:12 2011
+++ /trunk/ctypesgencore/parser/cgrammar.py Fri Feb 17 03:38:04 2012
@@ -622,6 +622,12 @@
cdeclarations.apply_specifiers(p[1], declaration)
declaration.declarator = declarator
r += (declaration,)
+ else:
+ # anonymous field (C11/GCC extension)
+ declaration = cdeclarations.Declaration()
+ cdeclarations.apply_specifiers(p[1], declaration)
+ r = (declaration,)
+
p[0] = r
def p_specifier_qualifier_list(p):
=======================================
--- /trunk/ctypesgencore/parser/ctypesparser.py Thu Feb 16 11:09:33 2012
+++ /trunk/ctypesgencore/parser/ctypesparser.py Fri Feb 17 03:38:04 2012
@@ -73,11 +73,12 @@
check_qualifiers=True)
declarator = declaration.declarator
if declarator is None:
- # XXX TEMPORARY while struct with no typedef not
filled in
- break
- while declarator.pointer:
- declarator = declarator.pointer
- name = declarator.identifier
+ # Anonymous field in nested union/struct (C11/GCC).
+ name = None
+ else:
+ while declarator.pointer:
+ declarator = declarator.pointer
+ name = declarator.identifier
members.append((name, remove_function_pointer(t)))
else:
members = None
=======================================
--- /trunk/ctypesgencore/printer_python/printer.py Mon Sep 26 11:55:15 2011
+++ /trunk/ctypesgencore/printer_python/printer.py Fri Feb 17 03:38:04 2012
@@ -170,10 +170,37 @@
def print_struct_members(self, struct):
if struct.opaque: return
+
+ # handle unnamed fields.
+ unnamed_fields = []
+ names = set([x[0] for x in struct.members])
+ anon_prefix = "unnamed_"
+ n = 1
+ for mi in range(len(struct.members)):
+ mem = list(struct.members[mi])
+ if mem[0] is None:
+ while True:
+ name = "%s%i" % (anon_prefix, n)
+ n += 1
+ if name not in names:
+ break
+ mem[0] = name
+ names.add(name)
+ unnamed_fields.append(name)
+ struct.members[mi] = mem
+
print >>self.file, '%s_%s.__slots__ = [' % (struct.variety,
struct.tag)
for name,ctype in struct.members:
print >>self.file, " '%s'," % name
print >>self.file, ']'
+
+ if len(unnamed_fields) > 0:
+ print >>self.file, '%s_%s._anonymous_ = [' % (struct.variety,
+ struct.tag)
+ for name in unnamed_fields:
+ print >>self.file, " '%s'," % name
+ print >>self.file, ']'
+
print >>self.file, '%s_%s._fields_ = [' % (struct.variety,
struct.tag)
for name,ctype in struct.members:
if isinstance(ctype,CtypesBitfield):