def __init__(self, lineiter, path): try: lineno, line = lineiter.next() Data.__init__(self, parserdata.Location(path, lineno + 1, 0), line) self.lineiter = lineiter except StopIteration: self.data = None
def get(self, name, expand=True): """ Get the value of a named variable. Returns a tuple (flavor, source, value) If the variable is not present, returns (None, None, None) @param expand If true, the value will be returned as an expansion. If false, it will be returned as an unexpanded string. """ flavor, source, valuestr, valueexp = self._map.get(name, (None, None, None, None)) if flavor is not None: if expand and flavor != self.FLAVOR_SIMPLE and valueexp is None: d = parser.Data.fromstring(valuestr, parserdata.Location("Expansion of variables '%s'" % (name,), 1, 0)) valueexp, t, o = parser.parsemakesyntax(d, 0, (), parser.iterdata) self._map[name] = flavor, source, valuestr, valueexp if flavor == self.FLAVOR_APPEND: if self.parent: pflavor, psource, pvalue = self.parent.get(name, expand) else: pflavor, psource, pvalue = None, None, None if pvalue is None: flavor = self.FLAVOR_RECURSIVE # fall through else: if source > psource: # TODO: log a warning? return pflavor, psource, pvalue if not expand: return pflavor, psource, pvalue + ' ' + valuestr pvalue = pvalue.clone() pvalue.appendstr(' ') pvalue.concat(valueexp) return pflavor, psource, pvalue if not expand: return flavor, source, valuestr if flavor == self.FLAVOR_RECURSIVE: val = valueexp else: val = Expansion.fromstring(valuestr, "Expansion of variable '%s'" % (name,)) return flavor, source, val if self.parent is not None: return self.parent.get(name, expand) return (None, None, None)
def enumeratelines(s, filename): """ Enumerate lines in a string as Data objects, joining line continuations. """ off = 0 lineno = 1 curlines = 0 for m in _linere.finditer(s): curlines += 1 start, end = m.span(0) if (start - end) % 2 == 0: # odd number of backslashes is a continuation continue yield Data(s, off, end - 1, parserdata.Location(filename, lineno, 0)) lineno += curlines curlines = 0 off = end yield Data(s, off, len(s), parserdata.Location(filename, lineno, 0))
def append(self, name, source, value, variables, makefile): assert source in (self.SOURCE_OVERRIDE, self.SOURCE_MAKEFILE, self.SOURCE_AUTOMATIC) assert isinstance(value, str) if name not in self._map: self._map[name] = self.FLAVOR_APPEND, source, value, None return prevflavor, prevsource, prevvalue, valueexp = self._map[name] if source > prevsource: # TODO: log a warning? return if prevflavor == self.FLAVOR_SIMPLE: d = parser.Data.fromstring(value, parserdata.Location("Expansion of variables '%s'" % (name,), 1, 0)) valueexp, t, o = parser.parsemakesyntax(d, 0, (), parser.iterdata) val = valueexp.resolvestr(makefile, variables, [name]) self._map[name] = prevflavor, prevsource, prevvalue + ' ' + val, None return newvalue = prevvalue + ' ' + value self._map[name] = prevflavor, prevsource, newvalue, None
def fromstring(s, path): return Data(s, 0, len(s), parserdata.Location(path, 1, 0))
def fromstring(s, path): return StringExpansion(s, parserdata.Location(path, 1, 0))
def fromstring(str, path): return Data(parserdata.Location(path, 1, 0), str)