aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmir Gonnen <amirgonnen@gmail.com>2019-03-26 14:53:19 +0200
committerEli Bendersky <eliben@users.noreply.github.com>2019-03-26 05:53:19 -0700
commit96059858252ea3673226a9a4d03a356bd51ba47e (patch)
treeb9372d42024d60bac15c6aa9a8aa66ca24498e5b
parent992715f12aef69eb1351308f14fb5f1ff972ce57 (diff)
downloadpycparser-96059858252ea3673226a9a4d03a356bd51ba47e.tar.gz
Fix array type generation (#312) (#313)
* Fix array type generation (#312) Also added dim_quals handling to _generate_type Exmaple: >>> ast = parser.parse('int g(const int a[const 20]){}') >>> gen.visit(ast.ext[0].decl.type.args.params[0]) 'const int a[const 20]' >>> gen.visit(ast.ext[0].decl.type.args.params[0].type) 'int[const 20]' * Added TypeDecl generation. Added tests
-rw-r--r--.gitignore2
-rw-r--r--pycparser/c_generator.py18
-rw-r--r--tests/test_c_generator.py6
3 files changed, 24 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index 5ce5b00..afa1201 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,4 @@ parser.out
.tox
utils/z.c
*.egg-info
-
+*.swp
diff --git a/pycparser/c_generator.py b/pycparser/c_generator.py
index f789742..bc22946 100644
--- a/pycparser/c_generator.py
+++ b/pycparser/c_generator.py
@@ -291,6 +291,20 @@ class CGenerator(object):
def visit_FuncDecl(self, n):
return self._generate_type(n)
+ def visit_ArrayDecl(self, n):
+ s = ''
+ s += self.visit(n.type) + '['
+ if n.dim_quals: s += ' '.join(n.dim_quals) + ' '
+ if n.dim: s += self.visit(n.dim)
+ s += ']'
+ return s
+
+ def visit_TypeDecl(self, n):
+ s = ''
+ if n.quals: s += ' '.join(n.quals) + ' '
+ s += self.visit(n.type)
+ return s
+
def _generate_struct_union_enum(self, n, name):
""" Generates code for structs, unions, and enums. name should be
'struct', 'union', or 'enum'.
@@ -382,7 +396,9 @@ class CGenerator(object):
if isinstance(modifier, c_ast.ArrayDecl):
if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)):
nstr = '(' + nstr + ')'
- nstr += '[' + self.visit(modifier.dim) + ']'
+ nstr += '['
+ if modifier.dim_quals: nstr += ' '.join(modifier.dim_quals) + ' '
+ nstr += self.visit(modifier.dim) + ']'
elif isinstance(modifier, c_ast.FuncDecl):
if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)):
nstr = '(' + nstr + ')'
diff --git a/tests/test_c_generator.py b/tests/test_c_generator.py
index 3727f91..e2f7bee 100644
--- a/tests/test_c_generator.py
+++ b/tests/test_c_generator.py
@@ -332,6 +332,12 @@ class TestCtoC(unittest.TestCase):
name='',
)
+ def test_array_decl(self):
+ self._assert_ctoc_correct('int g(const int a[const 20]){}')
+ ast = parse_to_ast('const int a[const 20];')
+ generator = c_generator.CGenerator()
+ self.assertEqual(generator.visit(ast.ext[0].type), 'const int[const 20]')
+ self.assertEqual(generator.visit(ast.ext[0].type.type), 'const int')
if __name__ == "__main__":
unittest.main()