diff options
author | Steve Block <steveblock@google.com> | 2009-12-15 10:12:09 +0000 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2009-12-17 17:41:10 +0000 |
commit | 643ca7872b450ea4efacab6188849e5aac2ba161 (patch) | |
tree | 6982576c228bcd1a7efe98afed544d840751094c /WebCore/WebCore.gyp/scripts/rule_bison.py | |
parent | d026980fde6eb3b01c1fe49441174e89cd1be298 (diff) | |
download | external_webkit-643ca7872b450ea4efacab6188849e5aac2ba161.zip external_webkit-643ca7872b450ea4efacab6188849e5aac2ba161.tar.gz external_webkit-643ca7872b450ea4efacab6188849e5aac2ba161.tar.bz2 |
Merge webkit.org at r51976 : Initial merge by git.
Change-Id: Ib0e7e2f0fb4bee5a186610272edf3186f0986b43
Diffstat (limited to 'WebCore/WebCore.gyp/scripts/rule_bison.py')
-rw-r--r-- | WebCore/WebCore.gyp/scripts/rule_bison.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/WebCore/WebCore.gyp/scripts/rule_bison.py b/WebCore/WebCore.gyp/scripts/rule_bison.py new file mode 100644 index 0000000..eb85a4b --- /dev/null +++ b/WebCore/WebCore.gyp/scripts/rule_bison.py @@ -0,0 +1,102 @@ +#!/usr/bin/python +# +# Copyright (C) 2009 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# usage: rule_bison.py INPUT_FILE OUTPUT_DIR +# INPUT_FILE is a path to either CSSGrammar.y or XPathGrammar.y. +# OUTPUT_DIR is where the bison-generated .cpp and .h files should be placed. + +import errno +import os +import os.path +import subprocess +import sys + +assert len(sys.argv) == 3 + +inputFile = sys.argv[1] +outputDir = sys.argv[2] + +inputName = os.path.basename(inputFile) +assert inputName == 'CSSGrammar.y' or inputName == 'XPathGrammar.y' +prefix = {'CSSGrammar.y': 'cssyy', 'XPathGrammar.y': 'xpathyy'}[inputName] + +(inputRoot, inputExt) = os.path.splitext(inputName) + +# The generated .h will be in a different location depending on the bison +# version. +outputHTries = [ + os.path.join(outputDir, inputRoot + '.cpp.h'), + os.path.join(outputDir, inputRoot + '.hpp'), +] + +for outputHTry in outputHTries: + try: + os.unlink(outputHTry) + except OSError, e: + if e.errno != errno.ENOENT: + raise + +outputCpp = os.path.join(outputDir, inputRoot + '.cpp') + +returnCode = subprocess.call(['bison', '-d', '-p', prefix, inputFile, '-o', outputCpp]) +assert returnCode == 0 + +# Find the name that bison used for the generated header file. +outputHTmp = None +for outputHTry in outputHTries: + try: + os.stat(outputHTry) + outputHTmp = outputHTry + break + except OSError, e: + if e.errno != errno.ENOENT: + raise + +assert outputHTmp != None + +# Read the header file in under the generated name and remove it. +outputHFile = open(outputHTmp) +outputHContents = outputHFile.read() +outputHFile.close() +os.unlink(outputHTmp) + +# Rewrite the generated header with #include guards. +outputH = os.path.join(outputDir, inputRoot + '.h') + +outputHFile = open(outputH, 'w') +print >>outputHFile, '#ifndef %sH' % inputRoot +print >>outputHFile, '#define %sH' % inputRoot +print >>outputHFile, outputHContents +print >>outputHFile, '#endif' +outputHFile.close() |