| #!/usr/bin/env python | |
| # | |
| # | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| # | |
| # | |
| # | |
| # getversion.py - Parse version numbers from C header files. | |
| # | |
| import os | |
| import re | |
| import sys | |
| import traceback | |
| __all__ = ['Parser', 'Result'] | |
| class Result: | |
| pass | |
| class Parser: | |
| def __init__(self): | |
| self.patterns = {} | |
| def search(self, define_name, value_name): | |
| 'Add the name of a define to the list of search pattenrs.' | |
| self.patterns[define_name] = value_name | |
| def parse(self, file): | |
| 'Parse the file, extracting defines into a Result object.' | |
| stream = open(file, 'rt') | |
| result = Result() | |
| regex = re.compile(r'^\s*#\s*define\s+(\w+)\s+(\d+)') | |
| for line in stream.readlines(): | |
| match = regex.match(line) | |
| if match: | |
| try: | |
| name = self.patterns[match.group(1)] | |
| except: | |
| continue | |
| setattr(result, name, int(match.group(2))) | |
| stream.close() | |
| return result | |
| def svn_extractor(parser, include_file): | |
| '''Pull values from svn.version.h''' | |
| p.search('SVN_VER_MAJOR', 'major') | |
| p.search('SVN_VER_MINOR', 'minor') | |
| p.search('SVN_VER_PATCH', 'patch') | |
| try: | |
| r = p.parse(include_file) | |
| except IOError: | |
| typ, val, tb = sys.exc_info() | |
| msg = ''.join(traceback.format_exception_only(typ, val)) | |
| usage_and_exit(msg) | |
| sys.stdout.write("%d.%d.%d" % (r.major, r.minor, r.patch)) | |
| def sqlite_extractor(parser, include_file): | |
| '''Pull values from sqlite3.h''' | |
| p.search('SQLITE_VERSION_NUMBER', 'version') | |
| try: | |
| r = p.parse(include_file) | |
| except IOError: | |
| typ, val, tb = sys.exc_info() | |
| msg = ''.join(traceback.format_exception_only(typ, val)) | |
| usage_and_exit(msg) | |
| major = r.version / 1000000 | |
| minor = (r.version - (major * 1000000)) / 1000 | |
| micro = (r.version - (major * 1000000) - (minor * 1000)) | |
| sys.stdout.write("%d.%d.%d" % (major, minor, micro)) | |
| extractors = { | |
| 'SVN' : svn_extractor, | |
| # 'SQLITE' : sqlite_extractor, # not used | |
| } | |
| def usage_and_exit(msg): | |
| if msg: | |
| sys.stderr.write("%s\n\n" % msg) | |
| sys.stderr.write("usage: %s [SVN|SQLITE] [header_file]\n" % \ | |
| os.path.basename(sys.argv[0])) | |
| sys.stderr.flush() | |
| sys.exit(1) | |
| if __name__ == '__main__': | |
| if len(sys.argv) == 3: | |
| extractor = extractors[sys.argv[1]] | |
| include_file = sys.argv[2] | |
| else: | |
| usage_and_exit("Incorrect number of arguments") | |
| # Extract and print the version number | |
| p = Parser() | |
| extractor(p, include_file) |