| %# -*- mode: Python -*- |
| %# Ignore the following admonition; it applies to the resulting .def file only |
| //// Automatically Generated From SortedCFDatabase.def.gyb. |
| //// Do Not Edit Directly! |
| //===----------------------------------------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| %{ |
| |
| import re |
| import codecs |
| |
| prologueLines = "" |
| epilogueLines = "" |
| |
| # A dictionary mapping type names to their corresponding lines |
| # in the database. |
| lineForName = {} |
| |
| # Load the data file. |
| with codecs.open(CFDatabaseFile, encoding='utf-8', errors='strict') as f: |
| for line in f: |
| # Pass through preprocessor directives literally. |
| # Assume that they all fall into either a strict prologue or epilogue. |
| if re.match('^#', line): |
| if len(lineForName) == 0: |
| prologueLines += line |
| else: |
| epilogueLines += line |
| continue |
| |
| # Otherwise, check for lines like FOO(BAR) |
| m = re.match('^\w+\((\w+)\)', line) |
| if m: |
| lineForName[m.group(1)] = line |
| }% |
| |
| ${prologueLines} |
| |
| %# Use a quasi-lexicographic order: length first, then string data. |
| %for name in sorted(lineForName.keys(), key=lambda x: (len(x), x)): |
| ${lineForName[name]} |
| %end |
| |
| ${epilogueLines} |