Index: src/trusted/validator_x86/enum_gen.py |
diff --git a/src/trusted/validator_x86/enum_gen.py b/src/trusted/validator_x86/enum_gen.py |
deleted file mode 100755 |
index ef7272622f11c6e73dd2ec117509312afe8a9e0e..0000000000000000000000000000000000000000 |
--- a/src/trusted/validator_x86/enum_gen.py |
+++ /dev/null |
@@ -1,281 +0,0 @@ |
-#!/usr/bin/python2.4 |
-# Copyright (c) 2011 The Native Client Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
-# |
-# 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. |
- |
-""" Generates C header/source files for an enumerated type. |
- |
-Usage: python enum_gen.py <enum_spec>.enum |
-""" |
- |
-import getopt |
-import logging |
-import os |
-import re |
-import sys |
- |
-logging.getLogger().setLevel(logging.INFO) |
- |
-def _Usage(): |
- print >>sys.stderr, 'Usage: enum_gen [options] <enum_spec>.enum' |
- |
-# Command line options, and thier default values. |
-_ClOptions = { |
- # Header file to generate - default is <enum_spec>.h |
- 'header': None, |
- # Source file to generate - default is <enum_spec>.c |
- 'source': None, |
- # Name of enumerated type - default is <enum_spec> |
- 'name': None, |
- # Prefix to remove print print names - default is None |
- 'name_prefix': None, |
- # Path prefix to remove from descriptions of generated source. |
- 'path_prefix': None, |
- # Sort enumerated constants |
- 'sort': 0, |
- # Add a "EnumSize" constant at the end of the list. |
- 'add_size': 0 |
- } |
- |
-# Pattern expected for enumerated values to generate. |
-_filename_form = re.compile(r'^(.*)\.enum$') |
- |
-# Verify that the enumeration filename matches expectations. |
-def _ValidateFilename(filename): |
- if not _filename_form.match(filename): |
- logging.error("Enum argument of wrong form: %s", filename) |
- sys.exit(1) |
- |
-# Given the enumeration filename, return the corresponding header |
-# file that contains the enumeration and the name function declaration. |
-def _GetHeaderFilename(filename): |
- # Use command line specification if defined. |
- header = _ClOptions['header'] |
- if header is None: |
- # Replace the .enum suffix of with .h |
- for prefix in _filename_form.findall(filename): |
- return prefix + ".h" |
- # This should not be reached. |
- logging.error("Unable to generate header file name: %s", filename) |
- sys.exit(1) |
- else: |
- return header |
- |
-# Given the enumeration filename, return the name of the enumerated type |
-# being defined. |
-def _GetEnumName(filename): |
- # Use the command line specification if defined. |
- name = _ClOptions['name'] |
- if name is None: |
- # Use the filename without the suffix. |
- for prefix in _filename_form.findall(filename): |
- return prefix |
- # This should not be reached. |
- logging.error("Unable to generate enum name: %s", filename) |
- sys.exit(1) |
- else: |
- return name |
- |
-# Generate the enumeration constant name to use for the constant |
-# specified in the enumeration file. |
-def _GetPrintName(constant): |
- # See if the command line specifies a prefix. If so, add it to the |
- # constant name. |
- prefix = _ClOptions['name_prefix'] |
- if prefix is None: |
- return constant |
- else: |
- return prefix + constant |
- |
-# Given the enumeration filename, return the name of the file containing |
-# the implementation of the enumeration. |
-def _GetSourceFilename(filename): |
- # Use the comand line specification if defined. |
- source = _ClOptions['source'] |
- if source is None: |
- # Replace the .enum suffix with .c |
- for prefix in _filename_form.findall(filename): |
- return prefix + ".c" |
- # This should not be reached. |
- logging.error("Unable to generate source file name: %s", filename) |
- sys.exit(1) |
- else: |
- return source |
- |
-# Given a filename, remove the path_prefix if possible. |
-def _GetSimplifiedFilename(filename): |
- # Use the path prefix specified on the command line. |
- path_prefix = _ClOptions['path_prefix'] |
- if path_prefix is not None: |
- if filename.startswith(path_prefix): |
- filename = filename[len(path_prefix):] |
- return filename |
- |
-# Given the list of enumerated constants from the given enumeration file, |
-# update the constants based on command line options. |
-def _ApplyFilters(constants): |
- if _ClOptions['sort']: |
- constants.sort() |
- return constants |
- |
-# Given the enumeration file name, open the file and return the list of |
-# constants defined in the file. |
-def _ReadConstants(filename): |
- name_pattern = re.compile(r'^(\w+)\s*\#?') |
- infile = open(filename, "r") |
- constants = [] |
- for line in infile: |
- line = line.rstrip() |
- trimmed_line = line.lstrip() |
- if len(trimmed_line) > 0 and not trimmed_line.startswith("#"): |
- if name_pattern.match(trimmed_line): |
- for name in name_pattern.findall(trimmed_line): |
- constants.append(name) |
- else: |
- logging.error("Line not understood: %s", line) |
- sys.exit(1) |
- if constants == []: |
- logging.error("No enumerated values found") |
- sys.exit(1) |
- return constants |
- |
-# Generate a DO NOT EDIT banner in the given file. |
-# file - The file to put the banner |
-# filename - The name of the file to put the banner in. |
-# enumfile - The name of the enumeration file. |
-def _AddDoNotEditMessage(file, filename, enumfile): |
- print >>file, "/* %s" % _GetSimplifiedFilename(filename) |
- print >>file, " * THIS FILE IS AUTO_GENERATED DO NOT EDIT." |
- print >>file, " *" |
- print >>file, " * This file was auto-generated by enum_gen.py" |
- print >>file, " * from file %s" % os.path.basename(enumfile) |
- print >>file, " */" |
- print >>file, "" |
- |
-# Given a file name, convert it to the DEFINE name to use to make sure |
-# the file is included at most once. |
-def _GetDefineName(filename): |
- return filename.replace(".", "_").replace( |
- "/", "_").replace("\\", "_").replace("-","_").upper() |
- |
-# Given the enumeration file name, and the constants defined within that file, |
-# Generate a header file defining the enumeration, and the corresponding function |
-# to print out symbolic names for each constant. |
-def _GenerateHeader(enumfile, constants): |
- filename = _GetHeaderFilename(enumfile) |
- outfile = open(filename, "w") |
- simplified_filename = _GetSimplifiedFilename(filename) |
- _AddDoNotEditMessage(outfile, filename, enumfile) |
- enumname = _GetEnumName(enumfile) |
- print >>outfile, "#ifndef %s__" % _GetDefineName(simplified_filename) |
- print >>outfile, "#define %s__" % _GetDefineName(simplified_filename) |
- print >>outfile, "" |
- print >>outfile, '#include "native_client/src/include/portability.h"' |
- print >>outfile, "" |
- print >>outfile, "EXTERN_C_BEGIN" |
- print >>outfile, "typedef enum %s {" % enumname |
- enum_value = 0 |
- for constant in constants: |
- print >>outfile, " %s = %d," % (_GetPrintName(constant), enum_value) |
- enum_value += 1 |
- if _ClOptions['add_size']: |
- print >>outfile, (" %sEnumSize = %d, " + |
- "/* special size marker */") % (enumname, enum_value) |
- print >>outfile, "} %s;" % enumname |
- print >>outfile, "" |
- print >>outfile, "/* Returns the name of an %s constant. */" % enumname |
- print >>outfile, "extern const char* %sName(%s name);" % (enumname, enumname) |
- print >>outfile, "" |
- print >>outfile, "EXTERN_C_END" |
- print >>outfile, "" |
- print >>outfile, "#endif /* %s__ */" % _GetDefineName(simplified_filename) |
- |
-# Given the enumeration file name, and the constants defined within that file, |
-# Generate an implementation file defining the corresponding function to print |
-# out symbolic names for each constant. |
-def _GenerateSource(enumfile, constants): |
- filename = _GetSourceFilename(enumfile) |
- outfile = open(filename, "w") |
- _AddDoNotEditMessage(outfile, filename, enumfile) |
- enumname = _GetEnumName(enumfile) |
- sizename = constants[-1] |
- if _ClOptions['add_size']: |
- sizename = enumname + 'EnumSize' |
- print >>outfile, "/* Define the corresponding names of %s. */" % enumname |
- print >>outfile, ("static const char* " + |
- "const g_%sName[%s + 1] = {") % (enumname, sizename) |
- for constant in constants: |
- print >>outfile, ' "%s",' % constant |
- if _ClOptions['add_size']: |
- print >>outfile, ' "%sEnumSize"' % enumname |
- print >>outfile, "};" |
- print >>outfile, "" |
- print >>outfile, "const char* %sName(%s name) {" % (enumname, enumname) |
- print >>outfile, " return name <= %s" % sizename |
- print >>outfile, " ? g_%sName[name]" % enumname |
- print >>outfile, ' : "%s???";' % enumname |
- print >>outfile, "}" |
- |
-# Given an array of command line arguments, process command line options, and |
-# return a list of arguments that aren't command line options. |
-def _ProcessOptions(argv): |
- """Process command line options and return the unprocessed left overs.""" |
- try: |
- opts, args = getopt.getopt(argv, '', [x + '=' for x in _ClOptions]) |
- except getopt.GetoptError, err: |
- print(str(err)) # will print something like 'option -a not recognized' |
- sys.exit(-1) |
- |
- for o, a in opts: |
- # strip the leading '--' |
- option = o[2:] |
- assert option in _ClOptions |
- if type(_ClOptions[option]) == int: |
- _ClOptions[option] = int(a) |
- else: |
- _ClOptions[option] = a |
- # return the unprocessed options, i.e. the command |
- return args |
- |
-# Given an enumeration file to generate, build the corresponding header/source |
-# files implementing the enumerated type. |
-def main(argv): |
- command = _ProcessOptions(argv) |
- if len(command) != 1: |
- _Usage() |
- return 1 |
- enumfile = command[0] |
- _ValidateFilename(enumfile) |
- constants = _ApplyFilters(_ReadConstants(enumfile)) |
- _GenerateHeader(enumfile, constants) |
- _GenerateSource(enumfile, constants) |
- return 0 |
- |
-if __name__ == '__main__': |
- sys.exit(main(sys.argv[1:])) |