diff options
author | Eli Bendersky <eliben@gmail.com> | 2018-07-25 05:52:21 -0700 |
---|---|---|
committer | Eli Bendersky <eliben@gmail.com> | 2018-07-25 05:52:21 -0700 |
commit | ccd673eaeff0c84c257b62ebddc23d4a6dfe5b38 (patch) | |
tree | e5bd151ba0972e3ea2ced192c00c4822cc99280f | |
parent | 92f65b6bd8539dfe7d3b1e8407d74092e03cb11b (diff) | |
parent | a301cbbd55cd3e73c5476f3c1cc3e355dcf30ff0 (diff) | |
download | pycparser-ccd673eaeff0c84c257b62ebddc23d4a6dfe5b38.tar.gz |
Merge branch 'master' of github.com:eliben/pycparser
32 files changed, 101 insertions, 98 deletions
diff --git a/.travis.yml b/.travis.yml index 0fd8463..25c9df6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ language: python python: - "2.7" - - "3.2" - - "3.3" - "3.4" - "3.5" - "3.6" @@ -2,7 +2,7 @@ pycparser v2.18 =============== -:Author: `Eli Bendersky <http://eli.thegreenplace.net>`_ +:Author: `Eli Bendersky <https://eli.thegreenplace.net/>`_ .. contents:: @@ -79,7 +79,7 @@ Installing Prerequisites ------------- -* **pycparser** was tested on Python 2.7, 3.3-3.6, on both Linux and +* **pycparser** was tested on Python 2.7, 3.4-3.6, on both Linux and Windows. It should work on any later version (in both the 2.x and 3.x lines) as well. @@ -158,7 +158,7 @@ the source is a previously defined type. This is essential in order to be able to parse C correctly. See `this blog post -<http://eli.thegreenplace.net/2015/on-parsing-c-type-declarations-and-fake-headers>`_ +<https://eli.thegreenplace.net/2015/on-parsing-c-type-declarations-and-fake-headers>`_ for more details. Basic usage diff --git a/appveyor.yml b/appveyor.yml index 0329728..05c1c7e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,7 +2,6 @@ environment: matrix: - PYTHON: "C:\\Python27" - - PYTHON: "C:\\Python33" - PYTHON: "C:\\Python34" - PYTHON: "C:\\Python35" - PYTHON: "C:\\Python36" diff --git a/examples/c-to-c.py b/examples/c-to-c.py index 88e66c5..cc14598 100644 --- a/examples/c-to-c.py +++ b/examples/c-to-c.py @@ -4,7 +4,7 @@ # Example of using pycparser.c_generator, serving as a simplistic translator # from C to AST and back to C. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ from __future__ import print_function diff --git a/examples/cdecl.py b/examples/cdecl.py index a510087..351efc2 100644 --- a/examples/cdecl.py +++ b/examples/cdecl.py @@ -29,7 +29,7 @@ # explain_c_declaration(c_decl, expand_struct=True) # => p is a struct P containing {x is a int, y is a int} # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- import copy diff --git a/examples/dump_ast.py b/examples/dump_ast.py index 3b6aae4..2cff874 100644 --- a/examples/dump_ast.py +++ b/examples/dump_ast.py @@ -3,7 +3,7 @@ # # Basic example of parsing a file and dumping its parsed AST. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- from __future__ import print_function diff --git a/examples/explore_ast.py b/examples/explore_ast.py index 3b3205e..1f6e0ae 100644 --- a/examples/explore_ast.py +++ b/examples/explore_ast.py @@ -9,7 +9,7 @@ # information from the AST. # It helps to have the pycparser/_c_ast.cfg file in front of you. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- from __future__ import print_function diff --git a/examples/func_calls.py b/examples/func_calls.py index 2433ffd..ec31fe5 100644 --- a/examples/func_calls.py +++ b/examples/func_calls.py @@ -4,7 +4,7 @@ # Using pycparser for printing out all the calls of some function # in a C file. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- from __future__ import print_function diff --git a/examples/func_defs.py b/examples/func_defs.py index ed64596..8fe9889 100644 --- a/examples/func_defs.py +++ b/examples/func_defs.py @@ -7,7 +7,7 @@ # This is a simple example of traversing the AST generated by # pycparser. Call it from the root directory of pycparser. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- from __future__ import print_function diff --git a/examples/rewrite_ast.py b/examples/rewrite_ast.py index eae6539..2c42f99 100644 --- a/examples/rewrite_ast.py +++ b/examples/rewrite_ast.py @@ -3,7 +3,7 @@ # # Tiny example of rewriting a AST node # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- from __future__ import print_function diff --git a/examples/serialize_ast.py b/examples/serialize_ast.py index 7a71f9b..e0f8aa3 100644 --- a/examples/serialize_ast.py +++ b/examples/serialize_ast.py @@ -4,7 +4,7 @@ # Simple example of serializing AST # # Hart Chu [https://github.com/CtheSky] -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- from __future__ import print_function diff --git a/examples/using_cpp_libc.py b/examples/using_cpp_libc.py index 0c70c88..e930f5b 100644 --- a/examples/using_cpp_libc.py +++ b/examples/using_cpp_libc.py @@ -5,7 +5,7 @@ # the 'real' cpp if you're on Linux/Unix) and "fake" libc includes # to parse a file that includes standard C headers. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- import sys diff --git a/examples/using_gcc_E_libc.py b/examples/using_gcc_E_libc.py index f0d1628..bba4d3d 100644 --- a/examples/using_gcc_E_libc.py +++ b/examples/using_gcc_E_libc.py @@ -5,7 +5,7 @@ # of 'cpp'. The same can be achieved with Clang instead of gcc. If you have # Clang installed, simply replace 'gcc' with 'clang' here. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------- import sys diff --git a/pycparser/__init__.py b/pycparser/__init__.py index b7228d7..e57d5d8 100644 --- a/pycparser/__init__.py +++ b/pycparser/__init__.py @@ -4,12 +4,13 @@ # This package file exports some convenience functions for # interacting with pycparser # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- __all__ = ['c_lexer', 'c_parser', 'c_ast'] __version__ = '2.18' +import io from subprocess import check_output from .c_parser import CParser @@ -81,7 +82,7 @@ def parse_file(filename, use_cpp=False, cpp_path='cpp', cpp_args='', if use_cpp: text = preprocess_file(filename, cpp_path, cpp_args) else: - with open(filename, 'rU') as f: + with io.open(filename) as f: text = f.read() if parser is None: diff --git a/pycparser/_ast_gen.py b/pycparser/_ast_gen.py index 4dab963..5ec2d3d 100644 --- a/pycparser/_ast_gen.py +++ b/pycparser/_ast_gen.py @@ -7,7 +7,7 @@ # The design of this module was inspired by astgen.py from the # Python 2.5 code-base. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- import pprint @@ -180,7 +180,7 @@ r'''#----------------------------------------------------------------- # # AST Node classes. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- diff --git a/pycparser/_build_tables.py b/pycparser/_build_tables.py index a8a9dcf..94a3891 100644 --- a/pycparser/_build_tables.py +++ b/pycparser/_build_tables.py @@ -6,7 +6,7 @@ # Also generates AST code from the configuration file. # Should be called from the pycparser directory. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- diff --git a/pycparser/_c_ast.cfg b/pycparser/_c_ast.cfg index 7dfcd0c..b93d50b 100644 --- a/pycparser/_c_ast.cfg +++ b/pycparser/_c_ast.cfg @@ -9,7 +9,7 @@ # <name>** - a sequence of child nodes # <name> - an attribute # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- diff --git a/pycparser/ast_transforms.py b/pycparser/ast_transforms.py index 623821d..ba50966 100644 --- a/pycparser/ast_transforms.py +++ b/pycparser/ast_transforms.py @@ -3,7 +3,7 @@ # # Some utilities used by the parser to create a friendlier AST. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ diff --git a/pycparser/c_ast.py b/pycparser/c_ast.py index 786e83e..b7bbbee 100644 --- a/pycparser/c_ast.py +++ b/pycparser/c_ast.py @@ -11,7 +11,7 @@ # # AST Node classes. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- diff --git a/pycparser/c_generator.py b/pycparser/c_generator.py index 8f2e69a..f789742 100644 --- a/pycparser/c_generator.py +++ b/pycparser/c_generator.py @@ -3,7 +3,7 @@ # # C code generator from pycparser AST nodes. # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ from . import c_ast diff --git a/pycparser/c_lexer.py b/pycparser/c_lexer.py index 944cbb8..de8445e 100644 --- a/pycparser/c_lexer.py +++ b/pycparser/c_lexer.py @@ -3,7 +3,7 @@ # # CLexer class: lexer for the C language # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ import re diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py index 0ce41bd..5545d3c 100644 --- a/pycparser/c_parser.py +++ b/pycparser/c_parser.py @@ -3,7 +3,7 @@ # # CParser class: Parser and AST builder for the C language # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #------------------------------------------------------------------------------ import re diff --git a/pycparser/ply/cpp.py b/pycparser/ply/cpp.py index 8ff0be1..86273ea 100644 --- a/pycparser/ply/cpp.py +++ b/pycparser/ply/cpp.py @@ -7,8 +7,6 @@ # # This module implements an ANSI-C style lexical preprocessor for PLY. # ----------------------------------------------------------------------------- -from __future__ import generators - import sys # Some Python 3 compatibility shims diff --git a/pycparser/ply/yacc.py b/pycparser/ply/yacc.py index 03bd86e..20b4f28 100644 --- a/pycparser/ply/yacc.py +++ b/pycparser/ply/yacc.py @@ -309,7 +309,7 @@ class LRParser: # certain kinds of advanced parsing situations where the lexer and parser interact with # each other or change states (i.e., manipulation of scope, lexer states, etc.). # - # See: http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html#Default-Reductions + # See: https://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html#Default-Reductions def set_defaulted_states(self): self.defaulted_states = {} for state, actions in self.action.items(): diff --git a/pycparser/plyparser.py b/pycparser/plyparser.py index b6640fa..6222c0e 100644 --- a/pycparser/plyparser.py +++ b/pycparser/plyparser.py @@ -4,7 +4,7 @@ # PLYParser class and other utilites for simplifying programming # parsers with PLY # -# Eli Bendersky [http://eli.thegreenplace.net] +# Eli Bendersky [https://eli.thegreenplace.net/] # License: BSD #----------------------------------------------------------------- @@ -55,12 +55,11 @@ setup( 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', - 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', ], + python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", packages=['pycparser', 'pycparser.ply'], package_data={'pycparser': ['*.cfg']}, cmdclass={'install': install, 'sdist': sdist}, diff --git a/tests/test_c_ast.py b/tests/test_c_ast.py index 8e95d55..6ea3ceb 100644 --- a/tests/test_c_ast.py +++ b/tests/test_c_ast.py @@ -16,11 +16,11 @@ class Test_c_ast(unittest.TestCase): left=c_ast.Constant(type='int', value='6'), right=c_ast.ID(name='joe')) - self.failUnless(isinstance(b1.left, c_ast.Constant)) + self.assertIsInstance(b1.left, c_ast.Constant) self.assertEqual(b1.left.type, 'int') self.assertEqual(b1.left.value, '6') - self.failUnless(isinstance(b1.right, c_ast.ID)) + self.assertIsInstance(b1.right, c_ast.ID) self.assertEqual(b1.right.name, 'joe') def test_weakref_works_on_nodes(self): diff --git a/tests/test_c_parser.py b/tests/test_c_parser.py index d461cb1..90df6c5 100755 --- a/tests/test_c_parser.py +++ b/tests/test_c_parser.py @@ -3,6 +3,7 @@ import pprint import re import os, sys +import io import unittest sys.path[0:0] = ['.', '..'] @@ -118,18 +119,18 @@ class TestCParser_fundamentals(TestCParser_base): def test_FileAST(self): t = self.parse('int a; char c;') - self.assertTrue(isinstance(t, FileAST)) + self.assertIsInstance(t, FileAST) self.assertEqual(len(t.ext), 2) # empty file t2 = self.parse('') - self.assertTrue(isinstance(t2, FileAST)) + self.assertIsInstance(t2, FileAST) self.assertEqual(len(t2.ext), 0) def test_empty_toplevel_decl(self): code = 'int foo;;' t = self.parse(code) - self.assertTrue(isinstance(t, FileAST)) + self.assertIsInstance(t, FileAST) self.assertEqual(len(t.ext), 1) self.assertEqual(self.get_decl(code), ['Decl', 'foo', @@ -458,7 +459,7 @@ class TestCParser_fundamentals(TestCParser_base): d2 = "static char * const p;" assert_qs(d2, 0, [], ['static']) pdecl = self.parse(d2).ext[0].type - self.assertTrue(isinstance(pdecl, PtrDecl)) + self.assertIsInstance(pdecl, PtrDecl) self.assertEqual(pdecl.quals, ['const']) def test_sizeof(self): @@ -476,9 +477,9 @@ class TestCParser_fundamentals(TestCParser_base): compound = self.parse(e).ext[0].body s1 = compound.block_items[0].init - self.assertTrue(isinstance(s1, UnaryOp)) + self.assertIsInstance(s1, UnaryOp) self.assertEqual(s1.op, 'sizeof') - self.assertTrue(isinstance(s1.expr, ID)) + self.assertIsInstance(s1.expr, ID) self.assertEqual(s1.expr.name, 'k') s2 = compound.block_items[1].init @@ -504,15 +505,15 @@ class TestCParser_fundamentals(TestCParser_base): """ compound = self.parse(e).ext[0].body s1 = compound.block_items[0].init - self.assertTrue(isinstance(s1, FuncCall)) - self.assertTrue(isinstance(s1.name, ID)) + self.assertIsInstance(s1, FuncCall) + self.assertIsInstance(s1.name, ID) self.assertEqual(s1.name.name, 'offsetof') - self.assertTrue(isinstance(s1.args.exprs[0], Typename)) - self.assertTrue(isinstance(s1.args.exprs[1], ID)) + self.assertIsInstance(s1.args.exprs[0], Typename) + self.assertIsInstance(s1.args.exprs[1], ID) s3 = compound.block_items[2].init - self.assertTrue(isinstance(s3.args.exprs[1], StructRef)) + self.assertIsInstance(s3.args.exprs[1], StructRef) s4 = compound.block_items[3].init - self.assertTrue(isinstance(s4.args.exprs[1], ArrayRef)) + self.assertIsInstance(s4.args.exprs[1], ArrayRef) def test_compound_statement(self): e = """ @@ -520,7 +521,7 @@ class TestCParser_fundamentals(TestCParser_base): } """ compound = self.parse(e).ext[0].body - self.assertTrue(isinstance(compound, Compound)) + self.assertIsInstance(compound, Compound) self.assert_coord(compound, 2) # The C99 compound literal feature @@ -550,21 +551,21 @@ class TestCParser_fundamentals(TestCParser_base): e1 = "enum mycolor op;" e1_type = self.parse(e1).ext[0].type.type - self.assertTrue(isinstance(e1_type, Enum)) + self.assertIsInstance(e1_type, Enum) self.assertEqual(e1_type.name, 'mycolor') self.assertEqual(e1_type.values, None) e2 = "enum mysize {large=20, small, medium} shoes;" e2_type = self.parse(e2).ext[0].type.type - self.assertTrue(isinstance(e2_type, Enum)) + self.assertIsInstance(e2_type, Enum) self.assertEqual(e2_type.name, 'mysize') e2_elist = e2_type.values - self.assertTrue(isinstance(e2_elist, EnumeratorList)) + self.assertIsInstance(e2_elist, EnumeratorList) for e2_eval in e2_elist.enumerators: - self.assertTrue(isinstance(e2_eval, Enumerator)) + self.assertIsInstance(e2_eval, Enumerator) self.assertEqual(e2_elist.enumerators[0].name, 'large') self.assertEqual(e2_elist.enumerators[0].value.value, '20') @@ -582,12 +583,12 @@ class TestCParser_fundamentals(TestCParser_base): """ e3_type = self.parse(e3).ext[0].type.type - self.assertTrue(isinstance(e3_type, Enum)) + self.assertIsInstance(e3_type, Enum) e3_elist = e3_type.values - self.assertTrue(isinstance(e3_elist, EnumeratorList)) + self.assertIsInstance(e3_elist, EnumeratorList) for e3_eval in e3_elist.enumerators: - self.assertTrue(isinstance(e3_eval, Enumerator)) + self.assertIsInstance(e3_eval, Enumerator) self.assertEqual(e3_elist.enumerators[0].name, 'red') self.assertEqual(e3_elist.enumerators[0].value, None) @@ -1087,7 +1088,7 @@ class TestCParser_fundamentals(TestCParser_base): s3_type = self.parse(s3).ext[1].type - self.assertTrue(isinstance(s3_type, Enum)) + self.assertIsInstance(s3_type, Enum) self.assertEqual(s3_type.name, 'mytag') def test_multi_decls(self): @@ -1373,8 +1374,8 @@ class TestCParser_fundamentals(TestCParser_base): int var2[*]; } ''') - self.assertTrue(isinstance(ps2.ext[0].body.block_items[1].type.dim, Assignment)) - self.assertTrue(isinstance(ps2.ext[0].body.block_items[2].type.dim, ID)) + self.assertIsInstance(ps2.ext[0].body.block_items[1].type.dim, Assignment) + self.assertIsInstance(ps2.ext[0].body.block_items[2].type.dim, ID) def test_pragma(self): s1 = r''' @@ -1389,19 +1390,19 @@ class TestCParser_fundamentals(TestCParser_base): } s; ''' s1_ast = self.parse(s1) - self.assertTrue(isinstance(s1_ast.ext[0], Pragma)) + self.assertIsInstance(s1_ast.ext[0], Pragma) self.assertEqual(s1_ast.ext[0].string, 'bar') self.assertEqual(s1_ast.ext[0].coord.line, 2) - self.assertTrue(isinstance(s1_ast.ext[1].body.block_items[0], Pragma)) + self.assertIsInstance(s1_ast.ext[1].body.block_items[0], Pragma) self.assertEqual(s1_ast.ext[1].body.block_items[0].string, 'foo') self.assertEqual(s1_ast.ext[1].body.block_items[0].coord.line, 4) - self.assertTrue(isinstance(s1_ast.ext[1].body.block_items[2], Pragma)) + self.assertIsInstance(s1_ast.ext[1].body.block_items[2], Pragma) self.assertEqual(s1_ast.ext[1].body.block_items[2].string, '') self.assertEqual(s1_ast.ext[1].body.block_items[2].coord.line, 6) - self.assertTrue(isinstance(s1_ast.ext[2].type.type.decls[0], Pragma)) + self.assertIsInstance(s1_ast.ext[2].type.type.decls[0], Pragma) self.assertEqual(s1_ast.ext[2].type.type.decls[0].string, 'baz') self.assertEqual(s1_ast.ext[2].type.type.decls[0].coord.line, 9) @@ -1432,26 +1433,26 @@ class TestCParser_fundamentals(TestCParser_base): } ''' s1_ast = self.parse(s1) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[1], For)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[1].stmt, Compound)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[1].stmt.block_items[0], Pragma)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[1].stmt.block_items[1], Assignment)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[2], While)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[2].stmt, Compound)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[2].stmt.block_items[0], Pragma)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[2].stmt.block_items[1], Assignment)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[3], Label)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[3].stmt, Compound)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[3].stmt.block_items[0], Pragma)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[3].stmt.block_items[1], Assignment)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[4], If)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[4].iftrue, Compound)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[4].iftrue.block_items[0], Pragma)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[4].iftrue.block_items[1], Assignment)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[5], Switch)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[5].stmt.stmts[0], Compound)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[5].stmt.stmts[0].block_items[0], Pragma)) - self.assertTrue(isinstance(s1_ast.ext[0].body.block_items[5].stmt.stmts[0].block_items[1], Assignment)) + self.assertIsInstance(s1_ast.ext[0].body.block_items[1], For) + self.assertIsInstance(s1_ast.ext[0].body.block_items[1].stmt, Compound) + self.assertIsInstance(s1_ast.ext[0].body.block_items[1].stmt.block_items[0], Pragma) + self.assertIsInstance(s1_ast.ext[0].body.block_items[1].stmt.block_items[1], Assignment) + self.assertIsInstance(s1_ast.ext[0].body.block_items[2], While) + self.assertIsInstance(s1_ast.ext[0].body.block_items[2].stmt, Compound) + self.assertIsInstance(s1_ast.ext[0].body.block_items[2].stmt.block_items[0], Pragma) + self.assertIsInstance(s1_ast.ext[0].body.block_items[2].stmt.block_items[1], Assignment) + self.assertIsInstance(s1_ast.ext[0].body.block_items[3], Label) + self.assertIsInstance(s1_ast.ext[0].body.block_items[3].stmt, Compound) + self.assertIsInstance(s1_ast.ext[0].body.block_items[3].stmt.block_items[0], Pragma) + self.assertIsInstance(s1_ast.ext[0].body.block_items[3].stmt.block_items[1], Assignment) + self.assertIsInstance(s1_ast.ext[0].body.block_items[4], If) + self.assertIsInstance(s1_ast.ext[0].body.block_items[4].iftrue, Compound) + self.assertIsInstance(s1_ast.ext[0].body.block_items[4].iftrue.block_items[0], Pragma) + self.assertIsInstance(s1_ast.ext[0].body.block_items[4].iftrue.block_items[1], Assignment) + self.assertIsInstance(s1_ast.ext[0].body.block_items[5], Switch) + self.assertIsInstance(s1_ast.ext[0].body.block_items[5].stmt.stmts[0], Compound) + self.assertIsInstance(s1_ast.ext[0].body.block_items[5].stmt.stmts[0].block_items[0], Pragma) + self.assertIsInstance(s1_ast.ext[0].body.block_items[5].stmt.stmts[0].block_items[1], Assignment) class TestCParser_whole_code(TestCParser_base): @@ -1667,12 +1668,12 @@ class TestCParser_whole_code(TestCParser_base): def test_switch_statement(self): def assert_case_node(node, const_value): - self.assertTrue(isinstance(node, Case)) - self.assertTrue(isinstance(node.expr, Constant)) + self.assertIsInstance(node, Case) + self.assertIsInstance(node.expr, Constant) self.assertEqual(node.expr.value, const_value) def assert_default_node(node): - self.assertTrue(isinstance(node, Default)) + self.assertIsInstance(node, Default) s1 = r''' int foo(void) { @@ -1780,7 +1781,7 @@ class TestCParser_whole_code(TestCParser_base): testdir = os.path.dirname(__file__) name = os.path.join(testdir, 'c_files', name) assert os.path.exists(name) - return open(name, 'rU') + return io.open(name) def test_whole_file(self): # See how pycparser handles a whole, real C file. @@ -1810,16 +1811,16 @@ class TestCParser_whole_code(TestCParser_base): code = f.read() p = self.parse(code) - self.assertTrue(isinstance(p.ext[0], Typedef)) + self.assertIsInstance(p.ext[0], Typedef) self.assertEqual(p.ext[0].coord.line, 213) self.assertEqual(p.ext[0].coord.file, r"D:\eli\cpp_stuff\libc_include/stddef.h") - self.assertTrue(isinstance(p.ext[-1], FuncDef)) + self.assertIsInstance(p.ext[-1], FuncDef) self.assertEqual(p.ext[-1].coord.line, 15) self.assertEqual(p.ext[-1].coord.file, "example_c_file.c") - self.assertTrue(isinstance(p.ext[-8], Typedef)) - self.assertTrue(isinstance(p.ext[-8].type, TypeDecl)) + self.assertIsInstance(p.ext[-8], Typedef) + self.assertIsInstance(p.ext[-8].type, TypeDecl) self.assertEqual(p.ext[-8].name, 'cookie_io_functions_t') @@ -1849,7 +1850,7 @@ class TestCParser_typenames(TestCParser_base): unsigned TT; } ''' - self.assertTrue(isinstance(self.parse(s2), FileAST)) + self.assertIsInstance(self.parse(s2), FileAST) def test_ambiguous_parameters(self): # From ISO/IEC 9899:TC2, 6.7.5.3.11: @@ -2081,7 +2082,7 @@ class TestCParser_typenames(TestCParser_base): TT x = 10; } ''' - self.assertTrue(isinstance(self.parse(s1), FileAST)) + self.assertIsInstance(self.parse(s1), FileAST) def test_samescope_reuse_name(self): # a typedef name cannot be reused as an object name in the same scope diff --git a/tests/test_general.py b/tests/test_general.py index e5e9d69..18e388c 100644 --- a/tests/test_general.py +++ b/tests/test_general.py @@ -23,7 +23,7 @@ class TestParsing(unittest.TestCase): def test_without_cpp(self): ast = parse_file(self._find_file('example_c_file.c')) - self.assertTrue(isinstance(ast, c_ast.FileAST)) + self.assertIsInstance(ast, c_ast.FileAST) @unittest.skipUnless(platform.system() == 'Linux', 'cpp only works on Linux') @@ -33,7 +33,7 @@ class TestParsing(unittest.TestCase): ast = parse_file(memmgr_path, use_cpp=True, cpp_path=CPPPATH, cpp_args='-I%s' % c_files_path) - self.assertTrue(isinstance(ast, c_ast.FileAST)) + self.assertIsInstance(ast, c_ast.FileAST) fake_libc = os.path.join(c_files_path, '..', '..', 'utils', 'fake_libc_include') @@ -41,7 +41,7 @@ class TestParsing(unittest.TestCase): cpp_path=CPPPATH, cpp_args=[r'-I%s' % fake_libc]) - self.assertTrue(isinstance(ast2, c_ast.FileAST)) + self.assertIsInstance(ast2, c_ast.FileAST) @unittest.skipUnless(platform.system() == 'Linux', 'cpp only works on Linux') @@ -53,14 +53,14 @@ class TestParsing(unittest.TestCase): c_files_path = os.path.join('tests', 'c_files') ast = parse_file(self._find_file('simplemain.c'), use_cpp=True, cpp_path=CPPPATH, cpp_args='-I%s' % c_files_path) - self.assertTrue(isinstance(ast, c_ast.FileAST)) + self.assertIsInstance(ast, c_ast.FileAST) @unittest.skipUnless(platform.system() == 'Linux', 'cpp only works on Linux') def test_no_real_content_after_cpp(self): ast = parse_file(self._find_file('empty.h'), use_cpp=True, cpp_path=CPPPATH) - self.assertTrue(isinstance(ast, c_ast.FileAST)) + self.assertIsInstance(ast, c_ast.FileAST) if __name__ == '__main__': @@ -1,5 +1,5 @@ [tox] -envlist = py27,py34,py35 +envlist = py27,py34,py35,py36 [testenv] commands = diff --git a/utils/fake_libc_include/X11/Intrinsic.h b/utils/fake_libc_include/X11/Intrinsic.h new file mode 100644 index 0000000..ab7ebb3 --- /dev/null +++ b/utils/fake_libc_include/X11/Intrinsic.h @@ -0,0 +1,4 @@ +#include "_fake_defines.h" +#include "_fake_typedefs.h" +#include "_X11_fake_defines.h" +#include "_X11_fake_typedefs.h" diff --git a/utils/fake_libc_include/X11/_X11_fake_defines.h b/utils/fake_libc_include/X11/_X11_fake_defines.h index 1de6f62..c88774b 100644 --- a/utils/fake_libc_include/X11/_X11_fake_defines.h +++ b/utils/fake_libc_include/X11/_X11_fake_defines.h @@ -10,4 +10,7 @@ #define _XFUNCPROTOEND #define _Xconst const +#define _X_RESTRICT_KYWD +#define Cardinal unsigned int +#define Boolean int #endif |