author | Danek Duvall <danek.duvall@oracle.com> |
Tue, 22 Apr 2014 11:35:38 -0700 | |
branch | s11-update |
changeset 3112 | a014dcb790bf |
permissions | -rw-r--r-- |
3112
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
1 |
Solaris doesn't deliver a /usr/bin/cpp. We have our own cpp in |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
2 |
/usr/lib/cpp, and we deliver GNU cpp in /usr/bin/gcpp, but we might not |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
3 |
find those simply by looking in $PATH. So if we fail, try extra hard to |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
4 |
execute another cpp. We try GNU's first, since it's more likely what folks |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
5 |
using pycparser will expect (for instance, it handles C++-style comments). |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
6 |
|
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
7 |
--- pycparser-2.10/pycparser/__init__.py Sat Aug 3 06:05:22 2013 |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
8 |
+++ pycparser-2.10/pycparser/__init__.py Fri Apr 11 14:58:36 2014 |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
9 |
@@ -10,6 +10,7 @@ |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
10 |
__all__ = ['c_lexer', 'c_parser', 'c_ast'] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
11 |
__version__ = '2.10' |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
12 |
|
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
13 |
+import errno |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
14 |
from subprocess import Popen, PIPE |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
15 |
from .c_parser import CParser |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
16 |
|
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
17 |
@@ -28,29 +29,41 @@ |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
18 |
When successful, returns the preprocessed file's contents. |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
19 |
Errors from cpp will be printed out. |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
20 |
""" |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
21 |
- path_list = [cpp_path] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
22 |
- if isinstance(cpp_args, list): |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
23 |
- path_list += cpp_args |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
24 |
- elif cpp_args != '': |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
25 |
- path_list += [cpp_args] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
26 |
- path_list += [filename] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
27 |
+ cpp_list = [cpp_path, "/usr/bin/gcpp", "/usr/lib/cpp"] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
28 |
|
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
29 |
- try: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
30 |
- # Note the use of universal_newlines to treat all newlines |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
31 |
- # as \n for Python's purpose |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
32 |
- # |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
33 |
- pipe = Popen( path_list, |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
34 |
- stdout=PIPE, |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
35 |
- universal_newlines=True) |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
36 |
- text = pipe.communicate()[0] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
37 |
- except OSError as e: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
38 |
+ for cpp_path in cpp_list: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
39 |
+ path_list = [cpp_path] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
40 |
+ if isinstance(cpp_args, list): |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
41 |
+ path_list += cpp_args |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
42 |
+ elif cpp_args != '': |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
43 |
+ path_list += [cpp_args] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
44 |
+ path_list += [filename] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
45 |
+ |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
46 |
+ try: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
47 |
+ # Note the use of universal_newlines to treat all newlines |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
48 |
+ # as \n for Python's purpose |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
49 |
+ # |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
50 |
+ pipe = Popen( path_list, |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
51 |
+ stdout=PIPE, |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
52 |
+ universal_newlines=True) |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
53 |
+ text = pipe.communicate()[0] |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
54 |
+ except OSError as e: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
55 |
+ # If cpp couldn't be found, just try the next one. |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
56 |
+ if e.errno == errno.ENOENT: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
57 |
+ continue |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
58 |
+ # If we ran into some other error, raise a RuntimeError. |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
59 |
+ raise RuntimeError("Unable to invoke 'cpp'.\n" + |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
60 |
+ ('Original error: %s' % e)) |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
61 |
+ |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
62 |
+ return text |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
63 |
+ |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
64 |
+ else: |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
65 |
+ # If we couldn't find a cpp, then raise a RuntimeError. |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
66 |
raise RuntimeError("Unable to invoke 'cpp'. " + |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
67 |
'Make sure its path was passed correctly\n' + |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
68 |
('Original error: %s' % e)) |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
69 |
|
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
70 |
- return text |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
71 |
|
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
72 |
- |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
73 |
def parse_file(filename, use_cpp=False, cpp_path='cpp', cpp_args='', |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
74 |
parser=None): |
a014dcb790bf
PSARC/2014/108 pycparser: complete C99 parser in pure Python
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
75 |
""" Parse a C file using pycparser. |