Changeset 9bd29bb in rtems-source-builder for source-builder/sb/macros.py


Ignore:
Timestamp:
Apr 13, 2013, 12:30:39 AM (6 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, master
Children:
014bfa9
Parents:
06dad0a
Message:

Macros updates to support multiple maps.

Add a read and write map pointer. This means you can read from a
user defined map through to the global map while pointing all
write to only the global map therefore supporting overrides
cleanly.

Print the list of loaded files when printing.

Provide helper calls for type and attributes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source-builder/sb/macros.py

    r06dad0a r9bd29bb  
    5353
    5454    def __init__(self, name = None, original = None, sbdir = '.'):
     55        self.files = []
    5556        self.macro_filter = re.compile(r'%{[^}]+}')
    5657        if original is None:
    5758            self.macros = {}
    58             self.map = 'global'
    59             self.macros[self.map] = {}
    60             self.macros[self.map]['_cwd'] = ('dir', 'required', path.shell(os.getcwd()))
    61             self.macros[self.map]['_sbdir'] = ('dir', 'required', path.shell(sbdir))
     59            self.read_map = 'global'
     60            self.write_map = 'global'
     61            self.macros[self.read_map] = {}
     62            self.macros[self.read_map]['_cwd'] = ('dir', 'required', path.shell(os.getcwd()))
     63            self.macros[self.read_map]['_sbdir'] = ('dir', 'required', path.shell(sbdir))
    6264        else:
    6365            self.macros = {}
     
    6769                for k in original.macros[m]:
    6870                    self.macros[m][k] = original.macros[m][k]
    69             self.map = original.map
     71            self.read_map = original.read_map
     72            self.write_map = original.write_map
    7073        if name is not None:
    7174            self.load(name)
     
    7780        text_len = 80
    7881        text = ''
     82        for f in self.files:
     83            text += '> %s%s' % (f, os.linesep)
    7984        for map in self.macros:
    8085            text += '[%s]%s' % (map, os.linesep)
     
    114119
    115120    def __iter__(self):
    116         return macros.macro_iterator(self.macros[self.map].keys())
     121        return macros.macro_iterator(self.macros[self.read_map].keys())
    117122
    118123    def __getitem__(self, key):
     
    141146        if value[1] not in ['none', 'optional', 'required', 'override']:
    142147            raise TypeError('bad value tuple (attrib field): %s' % (value[1]))
    143         self.macros[self.map][self.key_filter(key)] = value
     148        self.macros[self.write_map][self.key_filter(key)] = value
    144149
    145150    def __delitem__(self, key):
     
    153158
    154159    def keys(self):
    155         k = self.macros[self.map].keys()
     160        k = self.macros[self.read_map].keys()
    156161        if map is not 'global':
    157162            k += self.macros['global'].keys()
     
    162167            raise TypeError('bad key type (want str): %s' % (type(key)))
    163168        key = self.key_filter(key)
    164         if key not in self.macros[self.map].keys():
     169        if key not in self.macros[self.read_map].keys():
    165170            if key not in self.macros['global'].keys():
    166171                return False
    167172        return True
     173
     174    def maps(self):
     175        return self.macros.keys()
    168176
    169177    def key_filter(self, key):
     
    211219                        token = ''
    212220                        state = 'key'
    213                     elif c in string.ascii_letters or c in string.digits:
     221                    elif c in string.printable and c not in string.whitespace:
    214222                        token += c
    215223                    else:
     
    266274                    raise error.internal('bad state: %s' % (state))
    267275                if state is 'macro':
    268                     macros[map][macro[0]] = (macro[1], macro[2], macro[3])
     276                    macros[map][macro[0].lower()] = (macro[1], macro[2], macro[3])
    269277                    macro = []
    270278                    token = ''
     
    279287            raise error.general('opening macro file: %s' % (path.host(name)))
    280288        macros = self.parse(mc)
     289        mc.close()
    281290        for m in macros:
     291            if m not in self.macros:
     292                self.macros[m] = {}
    282293            for mm in macros[m]:
    283294                self.macros[m][mm] = macros[m][mm]
    284         mc.close()
     295        self.files += [name]
    285296
    286297    def get(self, key):
     
    288299            raise TypeError('bad key type: %s' % (type(key)))
    289300        key = self.key_filter(key)
    290         if self.map is not 'global'and key in self.macros[self.map]:
    291             return self.macros[self.map][key]
     301        if self.read_map is not 'global'and key in self.macros[self.read_map]:
     302            return self.macros[self.read_map][key]
    292303        if key in self.macros['global']:
    293304            return self.macros['global'][key]
    294305        return None
     306
     307    def get_type(self, key):
     308        m = self.get(key)
     309        if m is None:
     310            return None
     311        return m[0]
     312
     313    def get_attribute(self, key):
     314        m = self.get(key)
     315        if m is None:
     316            return None
     317        return m[1]
     318
     319    def overridden(self, key):
     320        return self.get_attribute(key) == 'override'
    295321
    296322    def define(self, key, value = '1'):
     
    322348        return _str
    323349
     350    def find(self, regex):
     351        what = re.compile(regex)
     352        keys = []
     353        for key in self.keys():
     354            if what.match(key):
     355                keys += [key]
     356        return keys
     357
     358    def set_read_map(self, map):
     359        if map in self.macros:
     360            self.read_map = map
     361            return True
     362        return False
     363
     364    def set_write_map(self, map):
     365        if map in self.macros:
     366            self.write_map = map
     367            return True
     368        return False
     369
    324370if __name__ == "__main__":
    325371    import copy
Note: See TracChangeset for help on using the changeset viewer.