1e35fdd936d133bf8a48de140a3c666897588a05shiqian#!/usr/bin/env python
2e35fdd936d133bf8a48de140a3c666897588a05shiqian#
3e35fdd936d133bf8a48de140a3c666897588a05shiqian# Copyright 2007 Neal Norwitz
4e35fdd936d133bf8a48de140a3c666897588a05shiqian# Portions Copyright 2007 Google Inc.
5e35fdd936d133bf8a48de140a3c666897588a05shiqian#
6e35fdd936d133bf8a48de140a3c666897588a05shiqian# Licensed under the Apache License, Version 2.0 (the "License");
7e35fdd936d133bf8a48de140a3c666897588a05shiqian# you may not use this file except in compliance with the License.
8e35fdd936d133bf8a48de140a3c666897588a05shiqian# You may obtain a copy of the License at
9e35fdd936d133bf8a48de140a3c666897588a05shiqian#
10e35fdd936d133bf8a48de140a3c666897588a05shiqian#      http://www.apache.org/licenses/LICENSE-2.0
11e35fdd936d133bf8a48de140a3c666897588a05shiqian#
12e35fdd936d133bf8a48de140a3c666897588a05shiqian# Unless required by applicable law or agreed to in writing, software
13e35fdd936d133bf8a48de140a3c666897588a05shiqian# distributed under the License is distributed on an "AS IS" BASIS,
14e35fdd936d133bf8a48de140a3c666897588a05shiqian# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15e35fdd936d133bf8a48de140a3c666897588a05shiqian# See the License for the specific language governing permissions and
16e35fdd936d133bf8a48de140a3c666897588a05shiqian# limitations under the License.
17e35fdd936d133bf8a48de140a3c666897588a05shiqian
18e35fdd936d133bf8a48de140a3c666897588a05shiqian"""Generic utilities for C++ parsing."""
19e35fdd936d133bf8a48de140a3c666897588a05shiqian
20e35fdd936d133bf8a48de140a3c666897588a05shiqian__author__ = 'nnorwitz@google.com (Neal Norwitz)'
21e35fdd936d133bf8a48de140a3c666897588a05shiqian
22e35fdd936d133bf8a48de140a3c666897588a05shiqian
23e35fdd936d133bf8a48de140a3c666897588a05shiqianimport sys
24e35fdd936d133bf8a48de140a3c666897588a05shiqian
25e35fdd936d133bf8a48de140a3c666897588a05shiqian
26e35fdd936d133bf8a48de140a3c666897588a05shiqian# Set to True to see the start/end token indices.
27e35fdd936d133bf8a48de140a3c666897588a05shiqianDEBUG = True
28e35fdd936d133bf8a48de140a3c666897588a05shiqian
29e35fdd936d133bf8a48de140a3c666897588a05shiqian
30e35fdd936d133bf8a48de140a3c666897588a05shiqiandef ReadFile(filename, print_error=True):
31e35fdd936d133bf8a48de140a3c666897588a05shiqian    """Returns the contents of a file."""
32e35fdd936d133bf8a48de140a3c666897588a05shiqian    try:
33e35fdd936d133bf8a48de140a3c666897588a05shiqian        fp = open(filename)
34e35fdd936d133bf8a48de140a3c666897588a05shiqian        try:
35e35fdd936d133bf8a48de140a3c666897588a05shiqian            return fp.read()
36e35fdd936d133bf8a48de140a3c666897588a05shiqian        finally:
37e35fdd936d133bf8a48de140a3c666897588a05shiqian            fp.close()
38e35fdd936d133bf8a48de140a3c666897588a05shiqian    except IOError:
39e35fdd936d133bf8a48de140a3c666897588a05shiqian        if print_error:
40e35fdd936d133bf8a48de140a3c666897588a05shiqian            print('Error reading %s: %s' % (filename, sys.exc_info()[1]))
41e35fdd936d133bf8a48de140a3c666897588a05shiqian        return None
42