diff options
author | Richard Purdie <richard@openedhand.com> | 2006-05-09 15:44:08 +0000 |
---|---|---|
committer | Richard Purdie <richard@openedhand.com> | 2006-05-09 15:44:08 +0000 |
commit | 27dba1e6247ae48349aee1bce141a9eefaafaad1 (patch) | |
tree | 822235005ccbd2707f7874ad680dedc4df36760c /bitbake | |
parent | ed234aca98d0867c7b32801fc63820b19cf67df9 (diff) | |
download | openembedded-core-27dba1e6247ae48349aee1bce141a9eefaafaad1.tar.gz openembedded-core-27dba1e6247ae48349aee1bce141a9eefaafaad1.tar.bz2 openembedded-core-27dba1e6247ae48349aee1bce141a9eefaafaad1.tar.xz openembedded-core-27dba1e6247ae48349aee1bce141a9eefaafaad1.zip |
Update to bitbake 1.4.2 (latest stable branch release). This includes the caching speedups
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@371 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'bitbake')
28 files changed, 2431 insertions, 1674 deletions
diff --git a/bitbake/AUTHORS b/bitbake/AUTHORS index 4129e4c52..ef119cce2 100644 --- a/bitbake/AUTHORS +++ b/bitbake/AUTHORS @@ -1,5 +1,6 @@ +Phil Blundell <pb@handhelds.org> Holger Freyther <zecke@handhelds.org> Chris Larson <kergoth@handhelds.org> Mickey Lauer <mickey@Vanille.de> +Richard Purdie <rpurdie@rpsys.net> Holger Schurig <holgerschurig@gmx.de> -Phil Blundell <pb@handhelds.org> diff --git a/bitbake/ChangeLog b/bitbake/ChangeLog index 3dfba1ed8..93cc45aaf 100644 --- a/bitbake/ChangeLog +++ b/bitbake/ChangeLog @@ -1,9 +1,26 @@ -Changes in BitBake 1.3.x: +Changes in BitBake 1.4.2: + - Send logs to oe.pastebin.com instead of pastebin.com + fixes #856 + - Copy the internal bitbake data before building the + dependency graph. This fixes nano not having a + virtual/libc dependency + - Allow multiple TARBALL_STASH entries + - Cache, check if the directory exists before changing + into it + - git speedup cloning by not doing a checkout + - allow to have spaces in filenames (.conf, .bb, .bbclass) + +Changes in BitBake 1.4.0: - Fix to check both RDEPENDS and RDEPENDS_${PN} - Fix a RDEPENDS parsing bug in utils:explode_deps() - Update git fetcher behaviour to match git changes - ASSUME_PROVIDED allowed to include runtime packages - git fetcher cleanup and efficency improvements + - Change the format of the cache + - Update usermanual to document the Fetchers + - Major changes to caching with a new strategy + giving a major performance increase when reparsing + with few data changes Changes in BitBake 1.3.3: - Create a new Fetcher module to ease the diff --git a/bitbake/MANIFEST b/bitbake/MANIFEST index 14a21d7bf..5823cd070 100644 --- a/bitbake/MANIFEST +++ b/bitbake/MANIFEST @@ -2,10 +2,12 @@ AUTHORS ChangeLog MANIFEST setup.py +bin/bitdoc bin/bbimage bin/bitbake lib/bb/__init__.py lib/bb/build.py +lib/bb/cache.py lib/bb/data.py lib/bb/data_smart.py lib/bb/event.py @@ -18,6 +20,7 @@ lib/bb/fetch/svk.py lib/bb/fetch/svn.py lib/bb/fetch/wget.py lib/bb/manifest.py +lib/bb/methodpool.py lib/bb/parse/__init__.py lib/bb/parse/parse_py/BBHandler.py lib/bb/parse/parse_py/ConfHandler.py @@ -30,5 +33,6 @@ doc/manual/html.css doc/manual/Makefile doc/manual/usermanual.xml contrib/bbdev.sh +contrib/vim/syntax/bitbake.vim conf/bitbake.conf classes/base.bbclass diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake index 457fbb752..10cf4bd00 100755 --- a/bitbake/bin/bitbake +++ b/bitbake/bin/bitbake @@ -24,14 +24,14 @@ import sys, os, getopt, glob, copy, os.path, re, time sys.path.insert(0,os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib')) import bb -from bb import utils, data, parse, debug, event, fatal +from bb import utils, data, parse, debug, event, fatal, cache from sets import Set import itertools, optparse parsespin = itertools.cycle( r'|/-\\' ) bbdebug = 0 -__version__ = "1.3.3.2" +__version__ = "1.4.3" #============================================================================# # BBParsingStatus @@ -44,7 +44,6 @@ class BBParsingStatus: """ def __init__(self): - self.cache_dirty = False self.providers = {} self.rproviders = {} self.packages = {} @@ -60,34 +59,35 @@ class BBParsingStatus: self.pkg_dp = {} self.pn_provides = {} self.all_depends = Set() + self.build_all = {} + self.rundeps = {} + self.runrecs = {} + self.stamp = {} - def handle_bb_data(self, file_name, bb_data, cached): + def handle_bb_data(self, file_name, bb_cache, cached): """ We will fill the dictionaries with the stuff we need for building the tree more fast """ - if bb_data == None: - return - - if not cached: - self.cache_dirty = True - - pn = bb.data.getVar('PN', bb_data, True) - pv = bb.data.getVar('PV', bb_data, True) - pr = bb.data.getVar('PR', bb_data, True) - dp = int(bb.data.getVar('DEFAULT_PREFERENCE', bb_data, True) or "0") - provides = Set([pn] + (bb.data.getVar("PROVIDES", bb_data, 1) or "").split()) - depends = (bb.data.getVar("DEPENDS", bb_data, True) or "").split() - packages = (bb.data.getVar('PACKAGES', bb_data, True) or "").split() - packages_dynamic = (bb.data.getVar('PACKAGES_DYNAMIC', bb_data, True) or "").split() - rprovides = (bb.data.getVar("RPROVIDES", bb_data, 1) or "").split() + pn = bb_cache.getVar('PN', file_name, True) + pv = bb_cache.getVar('PV', file_name, True) + pr = bb_cache.getVar('PR', file_name, True) + dp = int(bb_cache.getVar('DEFAULT_PREFERENCE', file_name, True) or "0") + provides = Set([pn] + (bb_cache.getVar("PROVIDES", file_name, True) or "").split()) + depends = (bb_cache.getVar("DEPENDS", file_name, True) or "").split() + packages = (bb_cache.getVar('PACKAGES', file_name, True) or "").split() + packages_dynamic = (bb_cache.getVar('PACKAGES_DYNAMIC', file_name, True) or "").split() + rprovides = (bb_cache.getVar("RPROVIDES", file_name, True) or "").split() # build PackageName to FileName lookup table if pn not in self.pkg_pn: self.pkg_pn[pn] = [] self.pkg_pn[pn].append(file_name) + self.build_all[file_name] = int(bb_cache.getVar('BUILD_ALL_DEPS', file_name, True) or "0") + self.stamp[file_name] = bb_cache.getVar('STAMP', file_name, True) + # build FileName to PackageName lookup table self.pkg_fn[file_name] = pn self.pkg_pvpr[file_name] = (pv,pr) @@ -114,7 +114,7 @@ class BBParsingStatus: if not package in self.packages: self.packages[package] = [] self.packages[package].append(file_name) - rprovides += (bb.data.getVar("RPROVIDES_%s" % package, bb_data, 1) or "").split() + rprovides += (bb_cache.getVar("RPROVIDES_%s" % package, file_name, 1) or "").split() for package in packages_dynamic: if not package in self.packages_dynamic: @@ -126,9 +126,32 @@ class BBParsingStatus: self.rproviders[rprovide] = [] self.rproviders[rprovide].append(file_name) + # Build hash of runtime depeneds and rececommends + + def add_dep(deplist, deps): + for dep in deps: + if not dep in deplist: + deplist[dep] = "" + + if not file_name in self.rundeps: + self.rundeps[file_name] = {} + if not file_name in self.runrecs: + self.runrecs[file_name] = {} + + for package in packages + [pn]: + if not package in self.rundeps[file_name]: + self.rundeps[file_name][package] = {} + if not package in self.runrecs[file_name]: + self.runrecs[file_name][package] = {} + + add_dep(self.rundeps[file_name][package], bb.utils.explode_deps(bb_cache.getVar('RDEPENDS', file_name, True) or "")) + add_dep(self.runrecs[file_name][package], bb.utils.explode_deps(bb_cache.getVar('RRECOMMENDS', file_name, True) or "")) + add_dep(self.rundeps[file_name][package], bb.utils.explode_deps(bb_cache.getVar("RDEPENDS_%s" % package, file_name, True) or "")) + add_dep(self.runrecs[file_name][package], bb.utils.explode_deps(bb_cache.getVar("RRECOMMENDS_%s" % package, file_name, True) or "")) + # Collect files we may need for possible world-dep # calculations - if not bb.data.getVar('BROKEN', bb_data, True) and not bb.data.getVar('EXCLUDE_FROM_WORLD', bb_data, True): + if not bb_cache.getVar('BROKEN', file_name, True) and not bb_cache.getVar('EXCLUDE_FROM_WORLD', file_name, True): self.possible_world.append(file_name) @@ -166,7 +189,6 @@ class BBConfiguration( object ): def __init__( self, options ): for key, val in options.__dict__.items(): setattr( self, key, val ) - self.data = data.init() #============================================================================# # BBCooker @@ -190,8 +212,8 @@ class BBCooker: self.stats = BBStatistics() self.status = None - self.pkgdata = None self.cache = None + self.bb_cache = None def tryBuildPackage( self, fn, item, the_data ): """Build one package""" @@ -226,10 +248,11 @@ class BBCooker: If build_depends is empty, we're dealing with a runtime depends """ - the_data = self.pkgdata[fn] + the_data = self.bb_cache.loadDataFull(fn, self) - if not buildAllDeps: - buildAllDeps = bb.data.getVar('BUILD_ALL_DEPS', the_data, True) or False + # Only follow all (runtime) dependencies if doing a build + if not buildAllDeps and self.configuration.cmd is "build": + buildAllDeps = self.status.build_all[fn] # Error on build time dependency loops if build_depends and build_depends.count(fn) > 1: @@ -402,12 +425,15 @@ class BBCooker: print "%-30s %20s %20s" % (p, latest[0][0] + "-" + latest[0][1], prefstr) + def showEnvironment( self ): """Show the outer or per-package environment""" if self.configuration.buildfile: + self.cb = None + self.bb_cache = bb.cache.init(self) try: - self.configuration.data, fromCache = self.load_bbfile( self.configuration.buildfile ) + self.configuration.data = self.bb_cache.loadDataFull(self.configuration.buildfile, self) except IOError, e: fatal("Unable to read %s: %s" % ( self.configuration.buildfile, e )) except Exception, e: @@ -457,11 +483,10 @@ class BBCooker: # look to see if one of them is already staged, or marked as preferred. # if so, bump it to the head of the queue for p in providers: - the_data = self.pkgdata[p] - pn = bb.data.getVar('PN', the_data, 1) - pv = bb.data.getVar('PV', the_data, 1) - pr = bb.data.getVar('PR', the_data, 1) - stamp = '%s.do_populate_staging' % bb.data.getVar('STAMP', the_data, 1) + pn = self.status.pkg_fn[p] + pv, pr = self.status.pkg_pvpr[p] + + stamp = '%s.do_populate_staging' % self.status.stamp[p] if os.path.exists(stamp): (newvers, fn) = preferred_versions[pn] if not fn in eligible: @@ -470,11 +495,11 @@ class BBCooker: oldver = "%s-%s" % (pv, pr) newver = '-'.join(newvers) if (newver != oldver): - extra_chat = "; upgrading from %s to %s" % (oldver, newver) + extra_chat = "%s (%s) already staged but upgrading to %s to satisfy %s" % (pn, oldver, newver, item) else: - extra_chat = "" + extra_chat = "Selecting already-staged %s (%s) to satisfy %s" % (pn, oldver, item) if self.configuration.verbose: - bb.note("selecting already-staged %s to satisfy %s%s" % (pn, item, extra_chat)) + bb.note("%s" % extra_chat) eligible.remove(fn) eligible = [fn] + eligible discriminated = True @@ -656,20 +681,11 @@ class BBCooker: rdepends = [] self.rbuild_cache.append(item) - the_data = self.pkgdata[fn] - pn = self.status.pkg_fn[fn] - - if (item == pn): - rdepends += bb.utils.explode_deps(bb.data.getVar('RDEPENDS', the_data, True) or "") - rdepends += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS', the_data, True) or "") - rdepends += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % pn, the_data, True) or "") - rdepends += bb.utils.explode_deps(bb.data.getVar('RRECOMMENDS_%s' % pn, the_data, True) or "") - else: - packages = (bb.data.getVar('PACKAGES', the_data, 1).split() or "") - for package in packages: - if package == item: - rdepends += bb.utils.explode_deps(bb.data.getVar("RDEPENDS_%s" % package, the_data, True) or "") - rdepends += bb.utils.explode_deps(bb.data.getVar("RRECOMMENDS_%s" % package, the_data, True) or "") + + if fn in self.status.rundeps and item in self.status.rundeps[fn]: + rdepends += self.status.rundeps[fn][item].keys() + if fn in self.status.runrecs and item in self.status.runrecs[fn]: + rdepends += self.status.runrecs[fn][item].keys() bb.debug(2, "Additional runtime dependencies for %s are: %s" % (item, " ".join(rdepends))) @@ -684,6 +700,9 @@ class BBCooker: all_depends = self.status.all_depends pn_provides = self.status.pn_provides + localdata = data.createCopy(self.configuration.data) + bb.data.update_data(localdata) + def calc_bbfile_priority(filename): for (regex, pri) in self.status.bbfile_config_priorities: if regex.match(filename): @@ -691,17 +710,22 @@ class BBCooker: return 0 # Handle PREFERRED_PROVIDERS - for p in (bb.data.getVar('PREFERRED_PROVIDERS', self.configuration.data, 1) or "").split(): + for p in (bb.data.getVar('PREFERRED_PROVIDERS', localdata, 1) or "").split(): (providee, provider) = p.split(':') if providee in self.preferred and self.preferred[providee] != provider: bb.error("conflicting preferences for %s: both %s and %s specified" % (providee, provider, self.preferred[providee])) self.preferred[providee] = provider # Calculate priorities for each file - for p in self.pkgdata.keys(): + for p in self.status.pkg_fn.keys(): self.status.bbfile_priority[p] = calc_bbfile_priority(p) - # Build package list for "bitbake world" + def buildWorldTargetList(self): + """ + Build package list for "bitbake world" + """ + all_depends = self.status.all_depends + pn_provides = self.status.pn_provides bb.debug(1, "collating packages for \"world\"") for f in self.status.possible_world: terminal = True @@ -724,9 +748,10 @@ class BBCooker: self.status.possible_world = None self.status.all_depends = None - def myProgressCallback( self, x, y, f, file_data, from_cache ): + def myProgressCallback( self, x, y, f, bb_cache, from_cache ): # feed the status with new input - self.status.handle_bb_data(f, file_data, from_cache) + + self.status.handle_bb_data(f, bb_cache, from_cache) if bbdebug > 0: return @@ -755,6 +780,13 @@ class BBCooker: def parseConfigurationFile( self, afile ): try: self.configuration.data = bb.parse.handle( afile, self.configuration.data ) + + # Add the handlers we inherited by INHERITS + # FIXME: This assumes that we included at least one .inc file + for var in bb.data.keys(self.configuration.data): + if bb.data.getVarFlag(var, 'handler', self.configuration.data): + bb.event.register(var,bb.data.getVar(var,self.configuration.data)) + except IOError: bb.fatal( "Unable to open %s" % afile ) except bb.parse.ParseError, details: @@ -786,6 +818,12 @@ class BBCooker: def cook( self, configuration, args ): + """ + We are building stuff here. We do the building + from here. By default we try to execute task + build. + """ + self.configuration = configuration if not self.configuration.cmd: @@ -801,6 +839,13 @@ class BBCooker: self.parseConfigurationFile( os.path.join( "conf", "bitbake.conf" ) ) + + # + # Special updated configuration we use for firing events + # + self.configuration.event_data = bb.data.createCopy(self.configuration.data) + bb.data.update_data(self.configuration.event_data) + if self.configuration.show_environment: self.showEnvironment() sys.exit( 0 ) @@ -876,18 +921,18 @@ class BBCooker: print "Requested parsing .bb files only. Exiting." return - bb.data.update_data( self.configuration.data ) self.buildDepgraph() if self.configuration.show_versions: self.showVersions() sys.exit( 0 ) if 'world' in pkgs_to_build: + self.buildWorldTargetList() pkgs_to_build.remove('world') for t in self.status.world_target: pkgs_to_build.append(t) - bb.event.fire(bb.event.BuildStarted(buildname, pkgs_to_build, self.configuration.data)) + bb.event.fire(bb.event.BuildStarted(buildname, pkgs_to_build, self.configuration.event_data)) failures = 0 for k in pkgs_to_build: @@ -905,7 +950,7 @@ class BBCooker: if self.configuration.abort: sys.exit(1) - bb.event.fire(bb.event.BuildCompleted(buildname, pkgs_to_build, self.configuration.data, failures)) + bb.event.fire(bb.event.BuildCompleted(buildname, pkgs_to_build, self.configuration.event_data, failures)) sys.exit( self.stats.show() ) @@ -932,77 +977,12 @@ class BBCooker: return [] return finddata.readlines() - def deps_clean(self, d): - depstr = data.getVar('__depends', d) - if depstr: - deps = depstr.split(" ") - for dep in deps: - (f,old_mtime_s) = dep.split("@") - old_mtime = int(old_mtime_s) - new_mtime = parse.cached_mtime(f) - if (new_mtime > old_mtime): - return False - return True - - def load_bbfile( self, bbfile ): - """Load and parse one .bb build file""" - - if not self.cache in [None, '']: - # get the times - cache_mtime = data.init_db_mtime(self.cache, bbfile) - file_mtime = parse.cached_mtime(bbfile) - - if file_mtime > cache_mtime: - #print " : '%s' dirty. reparsing..." % bbfile - pass - else: - #print " : '%s' clean. loading from cache..." % bbfile - cache_data = data.init_db( self.cache, bbfile, False ) - if self.deps_clean(cache_data): - return cache_data, True - - topdir = data.getVar('TOPDIR', self.configuration.data) - if not topdir: - topdir = os.path.abspath(os.getcwd()) - # set topdir to here - data.setVar('TOPDIR', topdir, self.configuration) - bbfile = os.path.abspath(bbfile) - bbfile_loc = os.path.abspath(os.path.dirname(bbfile)) - # expand tmpdir to include this topdir - data.setVar('TMPDIR', data.getVar('TMPDIR', self.configuration.data, 1) or "", self.configuration.data) - # set topdir to location of .bb file - topdir = bbfile_loc - #data.setVar('TOPDIR', topdir, cfg) - # go there - oldpath = os.path.abspath(os.getcwd()) - os.chdir(topdir) - bb = data.init_db(self.cache,bbfile, True, self.configuration.data) - try: - parse.handle(bbfile, bb) # read .bb data - if not self.cache in [None, '']: - bb.commit(parse.cached_mtime(bbfile)) # write cache - os.chdir(oldpath) - return bb, False - finally: - os.chdir(oldpath) - def collect_bbfiles( self, progressCallback ): """Collect all available .bb build files""" self.cb = progressCallback parsed, cached, skipped, masked = 0, 0, 0, 0 - self.cache = bb.data.getVar( "CACHE", self.configuration.data, 1 ) - self.pkgdata = data.pkgdata( not self.cache in [None, ''], self.cache, self.configuration.data ) + self.bb_cache = bb.cache.init(self) - if not self.cache in [None, '']: - if self.cb is not None: - print "NOTE: Using cache in '%s'" % self.cache - try: - os.stat( self.cache ) - except OSError: - bb.mkdirhier( self.cache ) - else: - if self.cb is not None: - print "NOTE: Not using a cache. Set CACHE = <directory> to enable." files = (data.getVar( "BBFILES", self.configuration.data, 1 ) or "").split() data.setVar("BBFILES", " ".join(files), self.configuration.data) @@ -1037,43 +1017,49 @@ class BBCooker: # read a file's metadata try: - bb_data, fromCache = self.load_bbfile(f) - if fromCache: cached += 1 + fromCache, skip = self.bb_cache.loadData(f, self) + if skip: + skipped += 1 + #bb.note("Skipping %s" % f) + self.bb_cache.skip(f) + continue + elif fromCache: cached += 1 else: parsed += 1 deps = None - if bb_data is not None: - # allow metadata files to add items to BBFILES - #data.update_data(self.pkgdata[f]) - addbbfiles = data.getVar('BBFILES', bb_data) or None - if addbbfiles: - for aof in addbbfiles.split(): - if not files.count(aof): - if not os.path.isabs(aof): - aof = os.path.join(os.path.dirname(f),aof) - files.append(aof) - for var in bb_data.keys(): - if data.getVarFlag(var, "handler", bb_data) and data.getVar(var, bb_data): - event.register(data.getVar(var, bb_data)) - self.pkgdata[f] = bb_data + + # allow metadata files to add items to BBFILES + #data.update_data(self.pkgdata[f]) + addbbfiles = self.bb_cache.getVar('BBFILES', f, False) or None + if addbbfiles: + for aof in addbbfiles.split(): + if not files.count(aof): + if not os.path.isabs(aof): + aof = os.path.join(os.path.dirname(f),aof) + files.append(aof) # now inform the caller if self.cb is not None: - self.cb( i + 1, len( newfiles ), f, bb_data, fromCache ) + self.cb( i + 1, len( newfiles ), f, self.bb_cache, fromCache ) except IOError, e: + self.bb_cache.remove(f) bb.error("opening %s: %s" % (f, e)) pass - except bb.parse.SkipPackage: - skipped += 1 - pass except KeyboardInterrupt: + self.bb_cache.sync() raise except Exception, e: + self.bb_cache.remove(f) bb.error("%s while parsing %s" % (e, f)) + except: + self.bb_cache.remove(f) + raise if self.cb is not None: print "\rNOTE: Parsing finished. %d cached, %d parsed, %d skipped, %d masked." % ( cached, parsed, skipped, masked ), + self.bb_cache.sync() + #============================================================================# # main #============================================================================# diff --git a/bitbake/bin/bitbakec b/bitbake/bin/bitbakec Binary files differdeleted file mode 100644 index db6a16030..000000000 --- a/bitbake/bin/bitbakec +++ /dev/null diff --git a/bitbake/conf/bitbake.conf b/bitbake/conf/bitbake.conf index fd216a326..d288fee78 100644 --- a/bitbake/conf/bitbake.conf +++ b/bitbake/conf/bitbake.conf @@ -51,5 +51,5 @@ T = "${WORKDIR}/temp" TARGET_ARCH = "${BUILD_ARCH}" TMPDIR = "${TOPDIR}/tmp" UPDATECOMMAND = "" -UPDATECOMMAND_cvs = "/usr/bin/env cvs update ${CVSCOOPTS}" +UPDATECOMMAND_cvs = "/usr/bin/env cvs -d${CVSROOT} update ${CVSCOOPTS}" WORKDIR = "${TMPDIR}/work/${PF}" diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index c6c0beb79..c3e7a1665 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py @@ -23,7 +23,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. """ -__version__ = "1.3.3.4" +__version__ = "1.4.3" __all__ = [ @@ -60,7 +60,9 @@ __all__ = [ "event", "build", "fetch", - "manifest" + "manifest", + "methodpool", + "cache", ] whitespace = '\t\n\x0b\x0c\r ' diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py new file mode 100644 index 000000000..921a9f758 --- /dev/null +++ b/bitbake/lib/bb/cache.py @@ -0,0 +1,306 @@ +#!/usr/bin/env python +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +""" +BitBake 'Event' implementation + +Caching of bitbake variables before task execution + +# Copyright (C) 2006 Richard Purdie + +# but small sections based on code from bin/bitbake: +# Copyright (C) 2003, 2004 Chris Larson +# Copyright (C) 2003, 2004 Phil Blundell +# Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer +# Copyright (C) 2005 Holger Hans Peter Freyther +# Copyright (C) 2005 ROAD GmbH + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA. + +""" + +import os, re +import bb.data +import bb.utils + +try: + import cPickle as pickle +except ImportError: + import pickle + print "NOTE: Importing cPickle failed. Falling back to a very slow implementation." + +# __cache_version__ = "123" +__cache_version__ = "124" # changes the __depends structure + +class Cache: + """ + BitBake Cache implementation + """ + def __init__(self, cooker): + + + self.cachedir = bb.data.getVar("CACHE", cooker.configuration.data, True) + self.clean = {} + self.depends_cache = {} + self.data = None + self.data_fn = None + + if self.cachedir in [None, '']: + self.has_cache = False + if cooker.cb is not None: + print "NOTE: Not using a cache. Set CACHE = <directory> to enable." + else: + self.has_cache = True + self.cachefile = os.path.join(self.cachedir,"bb_cache.dat") + + if cooker.cb is not None: + print "NOTE: Using cache in '%s'" % self.cachedir + try: + os.stat( self.cachedir ) + except OSError: + bb.mkdirhier( self.cachedir ) + + if self.has_cache and (self.mtime(self.cachefile)): + try: + p = pickle.Unpickler( file(self.cachefile,"rb")) + self.depends_cache, version_data = p.load() + if version_data['CACHE_VER'] != __cache_version__: + raise ValueError, 'Cache Version Mismatch' + if version_data['BITBAKE_VER'] != bb.__version__: + raise ValueError, 'Bitbake Version Mismatch' + except (ValueError, KeyError): + bb.note("Invalid cache found, rebuilding...") + self.depends_cache = {} + + if self.depends_cache: + for fn in self.depends_cache.keys(): + self.clean[fn] = "" + self.cacheValidUpdate(fn) + + def getVar(self, var, fn, exp = 0): + """ + Gets the value of a variable + (similar to getVar in the data class) + + There are two scenarios: + 1. We have cached data - serve from depends_cache[fn] + 2. We're learning what data to cache - serve from data + backend but add a copy of the data to the cache. + """ + + if fn in self.clean: + return self.depends_cache[fn][var] + + if not fn in self.depends_cache: + self.depends_cache[fn] = {} + + if fn != self.data_fn: + # We're trying to access data in the cache which doesn't exist + # yet setData hasn't been called to setup the right access. Very bad. + bb.error("Parsing error data_fn %s and fn %s don't match" % (self.data_fn, fn)) + + result = bb.data.getVar(var, self.data, exp) + self.depends_cache[fn][var] = result + return result + + def setData(self, fn, data): + """ + Called to prime bb_cache ready to learn which variables to cache. + Will be followed by calls to self.getVar which aren't cached + but can be fulfilled from self.data. + """ + self.data_fn = fn + self.data = data + + # Make sure __depends makes the depends_cache + self.getVar("__depends", fn, True) + self.depends_cache[fn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn) + + def loadDataFull(self, fn, cooker): + """ + Return a complete set of data for fn. + To do this, we need to parse the file. + """ + bb_data, skipped = self.load_bbfile(fn, cooker) + return bb_data + + def loadData(self, fn, cooker): + """ + Load a subset of data for fn. + If the cached data is valid we do nothing, + To do this, we need to parse the file and set the system + to record the variables accessed. + Return the cache status and whether the file was skipped when parsed + """ + if self.cacheValid(fn): + if "SKIPPED" in self.depends_cache[fn]: + return True, True + return True, False + + bb_data, skipped = self.load_bbfile(fn, cooker) + self.setData(fn, bb_data) + return False, skipped + + def cacheValid(self, fn): + """ + Is the cache valid for fn? + Fast version, no timestamps checked. + """ + # Is cache enabled? + if not self.has_cache: + return False + if fn in self.clean: + return True + return False + + def cacheValidUpdate(self, fn): + """ + Is the cache valid for fn? + Make thorough (slower) checks including timestamps. + """ + # Is cache enabled? + if not self.has_cache: + return False + + # Check file still exists + if self.mtime(fn) == 0: + bb.debug(2, "Cache: %s not longer exists" % fn) + self.remove(fn) + return False + + # File isn't in depends_cache + if not fn in self.depends_cache: + bb.debug(2, "Cache: %s is not cached" % fn) + self.remove(fn) + return False + + # Check the file's timestamp + if bb.parse.cached_mtime(fn) > self.getVar("CACHETIMESTAMP", fn, True): + bb.debug(2, "Cache: %s changed" % fn) + self.remove(fn) + return False + + # Check dependencies are still valid + depends = self.getVar("__depends", fn, True) + for f,old_mtime in depends: + new_mtime = bb.parse.cached_mtime(f) + if (new_mtime > old_mtime): + bb.debug(2, "Cache: %s's dependency %s changed" % (fn, f)) + self.remove(fn) + return False + + bb.debug(2, "Depends Cache: %s is clean" % fn) + if not fn in self.clean: + self.clean[fn] = "" + + return True + + def skip(self, fn): + """ + Mark a fn as skipped + Called from the parser + """ + if not fn in self.depends_cache: + self.depends_cache[fn] = {} + self.depends_cache[fn]["SKIPPED"] = "1" + + def remove(self, fn): + """ + Remove a fn from the cache + Called from the parser in error cases + """ + bb.debug(1, "Removing %s from cache" % fn) + if fn in self.depends_cache: + del self.depends_cache[fn] + if fn in self.clean: + del self.clean[fn] + + def sync(self): + """ + Save the cache + Called from the parser when complete (or exitting) + """ + + if not self.has_cache: + return + + version_data = {} + version_data['CACHE_VER'] = __cache_version__ + version_data['BITBAKE_VER'] = bb.__version__ + + p = pickle.Pickler(file(self.cachefile, "wb" ), -1 ) + p.dump([self.depends_cache, version_data]) + + def mtime(self, cachefile): + try: + return os.stat(cachefile)[8] + except OSError: + return 0 + + def load_bbfile( self, bbfile , cooker): + """ + Load and parse one .bb build file + Return the data and whether parsing resulted in the file being skipped + """ + + import bb + from bb import utils, data, parse, debug, event, fatal + + topdir = data.getVar('TOPDIR', cooker.configuration.data) + if not topdir: + topdir = os.path.abspath(os.getcwd()) + # set topdir to here + data.setVar('TOPDIR', topdir, cooker.configuration) + bbfile = os.path.abspath(bbfile) + bbfile_loc = os.path.abspath(os.path.dirname(bbfile)) + # expand tmpdir to include this topdir + data.setVar('TMPDIR', data.getVar('TMPDIR', cooker.configuration.data, 1) or "", cooker.configuration.data) + # set topdir to location of .bb file + topdir = bbfile_loc + #data.setVar('TOPDIR', topdir, cfg) + # go there + oldpath = os.path.abspath(os.getcwd()) + if self.mtime(topdir): + os.chdir(topdir) + bb_data = data.init_db(cooker.configuration.data) + try: + parse.handle(bbfile, bb_data) # read .bb data + os.chdir(oldpath) + return bb_data, False + except bb.parse.SkipPackage: + os.chdir(oldpath) + return bb_data, True + except: + os.chdir(oldpath) + raise + +def init(cooker): + """ + The Objective: Cache the minimum amount of data possible yet get to the + stage of building packages (i.e. tryBuild) without reparsing any .bb files. + + To do this, we intercept getVar calls and only cache the variables we see + being accessed. We rely on the cache getVar calls being made for all + variables bitbake might need to use to reach this stage. For each cached + file we need to track: + + * Its mtime + * The mtimes of all its dependencies + * Whether it caused a parse.SkipPackage exception + + Files causing parsing errors are evicted from the cache. + + """ + return Cache(cooker) + diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index 56ee977f6..55d1cc905 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -7,6 +7,18 @@ BitBake 'Data' implementations Functions for interacting with the data structure used by the BitBake build tools. +The expandData and update_data are the most expensive +operations. At night the cookie monster came by and +suggested 'give me cookies on setting the variables and +things will work out'. Taking this suggestion into account +applying the skills from the not yet passed 'Entwurf und +Analyse von Algorithmen' lecture and the cookie +monster seems to be right. We will track setVar more carefully +to have faster update_data and expandKeys operations. + +This is a treade-off between speed and memory again but +the speed is more critical here. + Copyright (C) 2003, 2004 Chris Larson Copyright (C) 2005 Holger Hans Peter Freyther @@ -36,88 +48,15 @@ sys.path.insert(0,path) from bb import note, debug, data_smart _dict_type = data_smart.DataSmart -_dict_p_type = data_smart.DataSmartPackage - -class DataDictFull(dict): - """ - This implements our Package Data Storage Interface. - setDirty is a no op as all items are held in memory - """ - def setDirty(self, bbfile, data): - """ - No-Op we assume data was manipulated as some sort of - reference - """ - if not bbfile in self: - raise Exception("File %s was not in dictionary before" % bbfile) - - self[bbfile] = data - -class DataDictCache: - """ - Databacked Dictionary implementation - """ - def __init__(self, cache_dir, config): - self.cache_dir = cache_dir - self.files = [] - self.dirty = {} - self.config = config - - def has_key(self,key): - return key in self.files - - def keys(self): - return self.files - - def __setitem__(self, key, data): - """ - Add the key to the list of known files and - place the data in the cache? - """ - if key in self.files: - return - - self.files.append(key) - - def __getitem__(self, key): - if not key in self.files: - return None - - # if it was dirty we will - if key in self.dirty: - return self.dirty[key] - - # not cached yet - return _dict_p_type(self.cache_dir, key,False,self.config) - - def setDirty(self, bbfile, data): - """ - Only already added items can be declared dirty!!! - """ - - if not bbfile in self.files: - raise Exception("File %s was not in dictionary before" % bbfile) - - self.dirty[bbfile] = data - - def init(): return _dict_type() -def init_db(cache,name,clean,parent = None): - return _dict_p_type(cache,name,clean,parent) - -def init_db_mtime(cache,cache_bbfile): - return _dict_p_type.mtime(cache,cache_bbfile) - -def pkgdata(use_cache, cache, config = None): - """ - Return some sort of dictionary to lookup parsed dictionaires - """ - if use_cache: - return DataDictCache(cache, config) - return DataDictFull() +def init_db(parent = None): + if parent: + return parent.createCopy() + else: + return _dict_type() def createCopy(source): """Link the source set to the destination @@ -273,6 +212,27 @@ def setData(newData, d): """Sets the data object to the supplied value""" d = newData + +## +## Cookie Monsters' query functions +## +def _get_override_vars(d, override): + """ + Internal!!! + + Get the Names of Variables that have a specific + override. This function returns a iterable + Set or an empty list + """ + return [] + +def _get_var_flags_triple(d): + """ + Internal!!! + + """ + return [] + __expand_var_regexp__ = re.compile(r"\${[^{}]+}") __expand_python_regexp__ = re.compile(r"\${@.+?}") @@ -303,43 +263,7 @@ def expand(s, d, varname = None): >>> print expand('${SRC_URI}', d) http://somebug.${TARGET_MOO} """ - def var_sub(match): - key = match.group()[2:-1] - if varname and key: - if varname == key: - raise Exception("variable %s references itself!" % varname) - var = getVar(key, d, 1) - if var is not None: - return var - else: - return match.group() - - def python_sub(match): - import bb - code = match.group()[3:-1] - locals()['d'] = d - s = eval(code) - if type(s) == types.IntType: s = str(s) - return s - - if type(s) is not types.StringType: # sanity check - return s - - while s.find('$') != -1: - olds = s - try: - s = __expand_var_regexp__.sub(var_sub, s) - s = __expand_python_regexp__.sub(python_sub, s) - if s == olds: break - if type(s) is not types.StringType: # sanity check - import bb - bb.error('expansion of %s returned non-string %s' % (olds, s)) - except KeyboardInterrupt: - raise - except: - note("%s:%s while evaluating:\n%s" % (sys.exc_info()[0], sys.exc_info()[1], s)) - raise - return s + return d.expand(s, varname) def expandKeys(alterdata, readdata = None): if readdata == None: @@ -356,7 +280,7 @@ def expandKeys(alterdata, readdata = None): # setVarFlags(ekey, copy.copy(getVarFlags(key, readdata)), alterdata) setVar(ekey, val, alterdata) - for i in ('_append', '_prepend', '_delete'): + for i in ('_append', '_prepend'): dest = getVarFlag(ekey, i, alterdata) or [] src = getVarFlag(key, i, readdata) or [] dest.extend(src) @@ -507,67 +431,76 @@ def update_data(d): >>> print getVar('TEST', d) local """ - debug(2, "update_data()") -# can't do delete env[...] while iterating over the dictionary, so remember them - dodel = [] + # now ask the cookie monster for help + #print "Cookie Monster" + #print "Append/Prepend %s" % d._special_values + #print "Overrides %s" % d._seen_overrides + overrides = (getVar('OVERRIDES', d, 1) or "").split(':') or [] - def applyOverrides(var, d): - if not overrides: - debug(1, "OVERRIDES not defined, nothing to do") - return - val = getVar(var, d) - for o in overrides: - if var.endswith("_" + o): - l = len(o)+1 - name = var[:-l] - d[name] = d[var] + # + # Well let us see what breaks here. We used to iterate + # over each variable and apply the override and then + # do the line expanding. + # If we have bad luck - which we will have - the keys + # where in some order that is so important for this + # method which we don't have anymore. + # Anyway we will fix that and write test cases this + # time. + + # + # First we apply all overrides + # Then we will handle _append and _prepend + # + + for o in overrides: + # calculate '_'+override + l = len(o)+1 + + # see if one should even try + if not o in d._seen_overrides: + continue - for s in keys(d): - applyOverrides(s, d) - sval = getVar(s, d) or "" - -# Handle line appends: - for (a, o) in getVarFlag(s, '_append', d) or []: - # maybe the OVERRIDE was not yet added so keep the append - if (o and o in overrides) or not o: - delVarFlag(s, '_append', d) - if o: - if not o in overrides: + vars = d._seen_overrides[o] + for var in vars: + name = var[:-l] + try: + d[name] = d[var] + except: + note ("Untracked delVar") + + # now on to the appends and prepends + if '_append' in d._special_values: + appends = d._special_values['_append'] or [] + for append in appends: + for (a, o) in getVarFlag(append, '_append', d) or []: + # maybe the OVERRIDE was not yet added so keep the append + if (o and o in overrides) or not o: + delVarFlag(append, '_append', d) + if o and not o in overrides: continue - sval+=a - setVar(s, sval, d) - -# Handle line prepends - for (a, o) in getVarFlag(s, '_prepend', d) or []: - # maybe the OVERRIDE was not yet added so keep the append - if (o and o in overrides) or not o: - delVarFlag(s, '_prepend', d) - if o: - if not o in overrides: + + sval = getVar(append,d) or "" + sval+=a + setVar(append, sval, d) + + + if '_prepend' in d._special_values: + prepends = d._special_values['_prepend'] or [] + + for prepend in prepends: + for (a, o) in getVarFlag(prepend, '_prepend', d) or []: + # maybe the OVERRIDE was not yet added so keep the prepend + if (o and o in overrides) or not o: + delVarFlag(prepend, '_prepend', d) + if o and not o in overrides: continue - sval=a+sval - setVar(s, sval, d) - -# Handle line deletions - name = s + "_delete" - nameval = getVar(name, d) - if nameval: - sval = getVar(s, d) - if sval: - new = '' - pattern = nameval.replace('\n','').strip() - for line in sval.split('\n'): - if line.find(pattern) == -1: - new = new + '\n' + line - setVar(s, new, d) - dodel.append(name) - -# delete all environment vars no longer needed - for s in dodel: - delVar(s, d) + + sval = a + (getVar(prepend,d) or "") + setVar(prepend, sval, d) + def inherits_class(klass, d): val = getVar('__inherit_cache', d) or "" diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index 52f391dec..fbd4167fe 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -8,7 +8,7 @@ BitBake build tools. Copyright (C) 2003, 2004 Chris Larson Copyright (C) 2004, 2005 Seb Frankengul -Copyright (C) 2005 Holger Hans Peter Freyther +Copyright (C) 2005, 2006 Holger Hans Peter Freyther Copyright (C) 2005 Uli Luckas Copyright (C) 2005 ROAD GmbH @@ -29,7 +29,8 @@ Based on functions from the base bb module, Copyright 2003 Holger Schurig """ import copy, os, re, sys, time, types -from bb import note, debug, fatal, utils +from bb import note, debug, error, fatal, utils, methodpool +from sets import Set try: import cPickle as pickle @@ -37,9 +38,8 @@ except ImportError: import pickle print "NOTE: Importing cPickle failed. Falling back to a very slow implementation." - -__setvar_keyword__ = ["_append","_prepend","_delete"] -__setvar_regexp__ = re.compile('(?P<base>.*?)(?P<keyword>_append|_prepend|_delete)(_(?P<add>.*))?') +__setvar_keyword__ = ["_append","_prepend"] +__setvar_regexp__ = re.compile('(?P<base>.*?)(?P<keyword>_append|_prepend)(_(?P<add>.*))?') __expand_var_regexp__ = re.compile(r"\${[^{}]+}") __expand_python_regexp__ = re.compile(r"\${@.+?}") @@ -48,6 +48,10 @@ class DataSmart: def __init__(self): self.dict = {} + # cookie monster tribute + self._special_values = {} + self._seen_overrides = {} + def expand(self,s, varname): def var_sub(match): key = match.group()[2:-1] @@ -78,8 +82,7 @@ class DataSmart: s = __expand_python_regexp__.sub(python_sub, s) if s == olds: break if type(s) is not types.StringType: # sanity check - import bb - bb.error('expansion of %s returned non-string %s' % (olds, s)) + error('expansion of %s returned non-string %s' % (olds, s)) except KeyboardInterrupt: raise except: @@ -91,18 +94,6 @@ class DataSmart: if not var in self.dict: self.dict[var] = {} - def pickle_prep(self, cfg): - if "_data" in self.dict: - if self.dict["_data"] == cfg: - self.dict["_data"] = "cfg"; - else: # this is an unknown array for the moment - pass - - def unpickle_prep(self, cfg): - if "_data" in self.dict: - if self.dict["_data"] == "cfg": - self.dict["_data"] = cfg; - def _findVar(self,var): _dest = self.dict @@ -116,14 +107,6 @@ class DataSmart: return _dest[var] return None - def _copyVar(self,var,name): - local_var = self._findVar(var) - if local_var: - self.dict[name] = copy.copy(local_var) - else: - debug(1,"Warning, _copyVar %s to %s, %s does not exists" % (var,name,var)) - - def _makeShadowCopy(self, var): if var in self.dict: return @@ -142,11 +125,20 @@ class DataSmart: keyword = match.group("keyword") override = match.group('add') l = self.getVarFlag(base, keyword) or [] - if override == 'delete': - if l.count([value, None]): - del l[l.index([value, None])] l.append([value, override]) - self.setVarFlag(base, match.group("keyword"), l) + self.setVarFlag(base, keyword, l) + + # pay the cookie monster + try: + self._special_values[keyword].add( base ) + except: + self._special_values[keyword] = Set() + self._special_values[keyword].add( base ) + + # SRC_URI_append_simpad is both a flag and a override + #if not override in self._seen_overrides: + # self._seen_overrides[override] = Set() + #self._seen_overrides[override].add( base ) return if not var in self.dict: @@ -155,6 +147,13 @@ class DataSmart: self.delVarFlag(var, 'matchesenv') self.setVarFlag(var, 'export', 1) + # more cookies for the cookie monster + if '_' in var: + override = var[var.rfind('_')+1:] + if not override in self._seen_overrides: + self._seen_overrides[override] = Set() + self._seen_overrides[override].add( var ) + # setting var self.dict[var]["content"] = value @@ -237,6 +236,8 @@ class DataSmart: # we really want this to be a DataSmart... data = DataSmart() data.dict["_data"] = self.dict + data._seen_overrides = copy.deepcopy(self._seen_overrides) + data._special_values = copy.deepcopy(self._special_values) return data @@ -254,98 +255,11 @@ class DataSmart: return keytab.keys() def __getitem__(self,item): - start = self.dict - while start: - if item in start: - return start[item] - elif "_data" in start: - start = start["_data"] - else: - start = None - return None + #print "Warning deprecated" + return self.getVar(item, False) def __setitem__(self,var,data): - self._makeShadowCopy(var) - self.dict[var] = data - - -class DataSmartPackage(DataSmart): - """ - Persistent Data Storage - """ - def sanitize_filename(bbfile): - return bbfile.replace( '/', '_' ) - sanitize_filename = staticmethod(sanitize_filename) + #print "Warning deprecated" + self.setVar(var,data) - def unpickle(self): - """ - Restore the dict from memory - """ - cache_bbfile = self.sanitize_filename(self.bbfile) - p = pickle.Unpickler( file("%s/%s"%(self.cache,cache_bbfile),"rb")) - self.dict = p.load() - self.unpickle_prep() - funcstr = self.getVar('__functions__', 0) - if funcstr: - comp = utils.better_compile(funcstr, "<pickled>", self.bbfile) - utils.better_exec(comp, __builtins__, funcstr, self.bbfile) - - def linkDataSet(self): - if not self.parent == None: - # assume parent is a DataSmartInstance - self.dict["_data"] = self.parent.dict - - - def __init__(self,cache,name,clean,parent): - """ - Construct a persistent data instance - """ - #Initialize the dictionary - DataSmart.__init__(self) - - self.cache = cache - self.bbfile = os.path.abspath( name ) - self.parent = parent - - # Either unpickle the data or do copy on write - if clean: - self.linkDataSet() - else: - self.unpickle() - - def commit(self, mtime): - """ - Save the package to a permanent storage - """ - self.pickle_prep() - - cache_bbfile = self.sanitize_filename(self.bbfile) - p = pickle.Pickler(file("%s/%s" %(self.cache,cache_bbfile), "wb" ), -1 ) - p.dump( self.dict ) - - self.unpickle_prep() - def mtime(cache,bbfile): - cache_bbfile = DataSmartPackage.sanitize_filename(bbfile) - try: - return os.stat( "%s/%s" % (cache,cache_bbfile) )[8] - except OSError: - return 0 - mtime = staticmethod(mtime) - - def pickle_prep(self): - """ - If self.dict contains a _data key and it is a configuration - we will remember we had a configuration instance attached - """ - if "_data" in self.dict: - if self.dict["_data"] == self.parent: - dest["_data"] = "cfg" - - def unpickle_prep(self): - """ - If we had a configuration instance attached, we will reattach it - """ - if "_data" in self.dict: - if self.dict["_data"] == "cfg": - self.dict["_data"] = self.parent diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index cbe6d2a11..b1d12177c 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py @@ -44,7 +44,13 @@ class Event: NotHandled = 0 Handled = 1 -handlers = [] + +Registered = 10 +AlreadyRegistered = 14 + +# Internal +_handlers = [] +_handlers_dict = {} def tmpHandler(event): """Default handler for code events""" @@ -57,7 +63,7 @@ def defaultTmpHandler(): def fire(event): """Fire off an Event""" - for h in handlers: + for h in _handlers: if type(h).__name__ == "code": exec(h) if tmpHandler(event) == Handled: @@ -67,15 +73,22 @@ def fire(event): return Handled return NotHandled -def register(handler): +def register(name, handler): """Register an Event handler""" + + # already registered + if name in _handlers_dict: + return AlreadyRegistered + if handler is not None: # handle string containing python code if type(handler).__name__ == "str": - return _registerCode(handler) -# prevent duplicate registration - if not handler in handlers: - handlers.append(handler) + _registerCode(handler) + else: + _handlers.append(handler) + + _handlers_dict[name] = 1 + return Registered def _registerCode(handlerStr): """Register a 'code' Event. @@ -88,24 +101,23 @@ def _registerCode(handlerStr): tmp = "def tmpHandler(e):\n%s" % handlerStr comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode") # prevent duplicate registration - if not comp in handlers: - handlers.append(comp) + _handlers.append(comp) -def remove(handler): +def remove(name, handler): """Remove an Event handler""" - for h in handlers: - if type(handler).__name__ == "str": - return _removeCode(handler) - if handler is h: - handlers.remove(handler) + _handlers_dict.pop(name) + if type(handler).__name__ == "str": + return _removeCode(handler) + else: + _handlers.remove(handler) def _removeCode(handlerStr): """Remove a 'code' Event handler Deprecated interface; call remove instead.""" tmp = "def tmpHandler(e):\n%s" % handlerStr comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._removeCode") - handlers.remove(comp) + _handlers.remove(comp) def getName(e): """Returns the name of a class or class instance""" diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index 0515f2a5e..ac698a0d1 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py @@ -168,10 +168,6 @@ class Fetch(object): d Is a bb.data instance tarfn is the name of the tarball """ - tarpath = os.path.join(data.getVar("DL_DIR", d, 1), tarfn) - if os.access(tarpath, os.R_OK): - return True - pn = data.getVar('PN', d, True) src_tarball_stash = None if pn: diff --git a/bitbake/lib/bb/fetch/git.py b/bitbake/lib/bb/fetch/git.py index f30ae2360..49235c141 100644 --- a/bitbake/lib/bb/fetch/git.py +++ b/bitbake/lib/bb/fetch/git.py @@ -129,7 +129,7 @@ class Git(Fetch): os.chdir(repodir) rungitcmd("tar -xzf %s" % (repofile),d) else: - rungitcmd("git clone %s://%s%s %s" % (proto, host, path, repodir),d) + rungitcmd("git clone -n %s://%s%s %s" % (proto, host, path, repodir),d) os.chdir(repodir) rungitcmd("git pull %s://%s%s" % (proto, host, path),d) diff --git a/bitbake/lib/bb/methodpool.py b/bitbake/lib/bb/methodpool.py new file mode 100644 index 000000000..d7434ed33 --- /dev/null +++ b/bitbake/lib/bb/methodpool.py @@ -0,0 +1,101 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# +# Copyright (C) 2006 Holger Hans Peter Freyther +# All rights reserved. +# +# 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 Holger Hans Peter Freyther 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. + + +""" + What is a method pool? + + BitBake has a global method scope where .bb, .inc and .bbclass + files can install methods. These methods are parsed from strings. + To avoid recompiling and executing these string we introduce + a method pool to do this task. + + This pool will be used to compile and execute the functions. It + will be smart enough to +""" + +from bb.utils import better_compile, better_exec +from bb import error + +# A dict of modules we have handled +# it is the number of .bbclasses + x in size +_parsed_methods = { } +_parsed_fns = { } + +def insert_method(modulename, code, fn): + """ + Add code of a module should be added. The methods + will be simply added, no checking will be done + """ + comp = better_compile(code, "<bb>", fn ) + better_exec(comp, __builtins__, code, fn) + + # hack hack hack XXX + return + + # now some instrumentation + code = comp.co_names + for name in code: + if name in ['None', 'False']: + continue + elif name in _parsed_fns and not _parsed_fns[name] == modulename: + error( "Error Method already seen: %s in' %s' now in '%s'" % (name, _parsed_fns[name], modulename)) + else: + _parsed_fns[name] = modulename + +def check_insert_method(modulename, code, fn): + """ + Add the code if it wasnt added before. The module + name will be used for that + + Variables: + @modulename a short name e.g. base.bbclass + @code The actual python code + @fn The filename from the outer file + """ + if not modulename in _parsed_methods: + return insert_method(modulename, code, fn) + +def parsed_module(modulename): + """ + Inform me file xyz was parsed + """ + return modulename in _parsed_methods + + +def get_parsed_dict(): + """ + shortcut + """ + return _parsed_methods diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py index cb2741606..58e17d154 100644 --- a/bitbake/lib/bb/parse/__init__.py +++ b/bitbake/lib/bb/parse/__init__.py @@ -46,9 +46,9 @@ def update_mtime(f): def mark_dependency(d, f): if f.startswith('./'): f = "%s/%s" % (os.getcwd(), f[2:]) - deps = (bb.data.getVar('__depends', d) or "").split() - deps.append("%s@%s" % (f, cached_mtime(f))) - bb.data.setVar('__depends', " ".join(deps), d) + deps = bb.data.getVar('__depends', d) or [] + deps.append( (f, cached_mtime(f)) ) + bb.data.setVar('__depends', deps, d) def supports(fn, data): """Returns true if we have a handler for this file, false otherwise""" diff --git a/bitbake/lib/bb/parse/parse_c/BBHandler.py b/bitbake/lib/bb/parse/parse_c/BBHandler.py index 300871d9e..d9f48db17 100644 --- a/bitbake/lib/bb/parse/parse_c/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_c/BBHandler.py @@ -1,29 +1,42 @@ # ex:ts=4:sw=4:sts=4:et # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -# -# Copyright (C) 2006 Holger Hans Peter Freyther -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -# THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# +"""class for handling .bb files (using a C++ parser) + + Reads a .bb file and obtains its metadata (using a C++ parser) + + Copyright (C) 2006 Tim Robert Ansell + Copyright (C) 2006 Holger Hans Peter Freyther + + This program is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any later + version. -from bb import data -from bb.parse import ParseError + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT + SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" + +import os + +# The Module we will use here +import bb + +from bitbakec import parsefile # # This is the Python Part of the Native Parser Implementation. @@ -34,29 +47,64 @@ from bb.parse import ParseError # # The rest of the methods are internal implementation details. - - -# -# internal -# - +def _init(fn, d): + """ + Initialize the data implementation with values of + the environment and data from the file. + """ + pass # # public # def supports(fn, data): - return fn[-3:] == ".bb" or fn[-8:] == ".bbclass" or fn[-4:] == ".inc" + return fn[-3:] == ".bb" or fn[-8:] == ".bbclass" or fn[-4:] == ".inc" or fn[-5:] == ".conf" def init(fn, data): - print "Init" + if not data.getVar('TOPDIR'): + bb.error('TOPDIR is not set') + if not data.getVar('BBPATH'): + bb.error('BBPATH is not set') + -def handle(fn, data, include): +def handle(fn, d, include): print "" print "fn: %s" % fn - print "data: %s" % data + print "data: %s" % d + print dir(d) + print d.getVar.__doc__ print "include: %s" % include - pass + # check if we include or are the beginning + if include: + oldfile = d.getVar('FILE') + else: + #d.inheritFromOS() + oldfile = None + + # find the file + if not os.path.isabs(fn): + bb.error("No Absolute FILE name") + abs_fn = bb.which(d.getVar('BBPATH'), fn) + else: + abs_fn = fn + + # check if the file exists + if not os.path.exists(abs_fn): + raise IOError("file '%(fn)' not found" % locals() ) + + # now we know the file is around mark it as dep + if include: + parse.mark_dependency(d, abs_fn) + + # now parse this file - by defering it to C++ + parsefile(fn, d) + + # restore the original FILE + if oldfile: + d.setVar('FILE', oldfile) + + return d # Inform bitbake that we are a parser # We need to define all three diff --git a/bitbake/lib/bb/parse/parse_c/Makefile b/bitbake/lib/bb/parse/parse_c/Makefile new file mode 100644 index 000000000..9eb7ce9d0 --- /dev/null +++ b/bitbake/lib/bb/parse/parse_c/Makefile @@ -0,0 +1,36 @@ + +test: bitbakec.so + python test.py + +bitbakescanner.cc: bitbakescanner.l + flex -t bitbakescanner.l > bitbakescanner.cc + +bitbakeparser.cc: bitbakeparser.y python_output.h + lemon bitbakeparser.y + mv bitbakeparser.c bitbakeparser.cc + +bitbakec.c: bitbakec.pyx + pyrexc bitbakec.pyx + +bitbakec-processed.c: bitbakec.c + cat bitbakec.c | sed -e"s/__pyx_f_8bitbakec_//" > bitbakec-processed.c + +bitbakec.o: bitbakec-processed.c + gcc -c bitbakec-processed.c -o bitbakec.o -fPIC -I/usr/include/python2.4 + +bitbakeparser.o: bitbakeparser.cc + g++ -c bitbakeparser.cc -fPIC -I/usr/include/python2.4 + +bitbakescanner.o: bitbakescanner.cc + g++ -c bitbakescanner.cc -fPIC -I/usr/include/python2.4 + +bitbakec.so: bitbakec.o bitbakeparser.o bitbakescanner.o + g++ -shared -fPIC bitbakeparser.o bitbakescanner.o bitbakec.o -o bitbakec.so + +clean: + rm *.out + rm *.cc + rm bitbakec.c + rm bitbakec-processed.c + rm *.o + rm *.so diff --git a/bitbake/lib/bb/parse/parse_c/bitbakec.pyx b/bitbake/lib/bb/parse/parse_c/bitbakec.pyx new file mode 100644 index 000000000..362cc2021 --- /dev/null +++ b/bitbake/lib/bb/parse/parse_c/bitbakec.pyx @@ -0,0 +1,180 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- + +cdef extern from "stdio.h": + ctypedef int FILE + FILE *fopen(char*, char*) + int fclose(FILE *fp) + + +cdef extern from "lexerc.h": + ctypedef struct lex_t: + void* parser + void* scanner + FILE* file + void* data + + int lineError + int errorParse + + cdef extern void parse(FILE*, object) + +def parsefile(object file, object data): + print "parsefile: 1", file, data + + # Open the file + cdef FILE* f + + f = fopen(file, "r") + print "parsefile: 2 opening file" + if (f == NULL): + raise IOError("No such file %s." % file) + + print "parsefile: 3 parse" + parse(f, data) + + # Close the file + print "parsefile: 4 closing" + fclose(f) + + +cdef public void e_assign(lex_t* container, char* key, char* what): + print "e_assign", key, what + d = <object>container.data + d.setVar(key, what) + +cdef public void e_export(lex_t* c, char* what): + print "e_export", what + #exp: + # bb.data.setVarFlag(key, "export", 1, data) + d = <object>container.data + d.setVarFlag(key, "export", 1) + +cdef public void e_immediate(lex_t* c, char* key, char* what): + print "e_immediate", key, what + #colon: + # val = bb.data.expand(groupd["value"], data) + d = <object>c.data + d.setVar(key, d.expand(what)) + +cdef public void e_cond(lex_t* c, char* key, char* what): + print "e_cond", key, what + #ques: + # val = bb.data.getVar(key, data) + # if val == None: + # val = groupd["value"] + d = <object>c.data + d.setVar(key, (d.getVar(key) or what)) + +cdef public void e_prepend(lex_t* c, char* key, char* what): + print "e_prepend", key, what + #prepend: + # val = "%s %s" % (groupd["value"], (bb.data.getVar(key, data) or "")) + d = <object>c.data + d.setVar(key, what + " " + (d.getVar(key) or "")) + +cdef public void e_append(lex_t* c, char* key, char* what): + print "e_append", key, what + #append: + # val = "%s %s" % ((bb.data.getVar(key, data) or ""), groupd["value"]) + d = <object>c.data + d.setVar(key, (d.getVar(key) or "") + " " + what) + +cdef public void e_precat(lex_t* c, char* key, char* what): + print "e_precat", key, what + #predot: + # val = "%s%s" % (groupd["value"], (bb.data.getVar(key, data) or "")) + d = <object>c.data + d.setVar(key, what + (d.getVar(key) or "")) + +cdef public void e_postcat(lex_t* c, char* key, char* what): + print "e_postcat", key, what + #postdot: + # val = "%s%s" % ((bb.data.getVar(key, data) or ""), groupd["value"]) + d = <object>c.data + d.setVar(key, (d.getVar(key) or "") + what) + +cdef public void e_addtask(lex_t* c, char* name, char* before, char* after): + print "e_addtask", name, before, after + # func = m.group("func") + # before = m.group("before") + # after = m.group("after") + # if func is None: + # return + # var = "do_" + func + # + # data.setVarFlag(var, "task", 1, d) + # + # if after is not None: + # # set up deps for function + # data.setVarFlag(var, "deps", after.split(), d) + # if before is not None: + # # set up things that depend on this func + # data.setVarFlag(var, "postdeps", before.split(), d) + # return + + do = "do_%s" % name + d = <object>c.data + d.setVarFlag(do, "task", 1) + + if strlen(before) > 0: + d.setVarFlag(do, "deps", ("%s" % after).split()) + if strlen(after) > 0: + d.setVarFlag(do, "deps", ("%s" % before).split()) + + +cdef public void e_addhandler(lex_t* c, char* h): + print "e_addhandler", h + # data.setVarFlag(h, "handler", 1, d) + d = <object>c.data + d.setVarFlag(h, "handler", 1) + +cdef public void e_export_func(lex_t* c, char* function): + print "e_export_func", function + pass + +cdef public void e_inherit(lex_t* c, char* file): + print "e_inherit", file + pass + +cdef public void e_include(lex_t* c, char* file): + print "e_include", file + d = <object>c.data + d.expand(file) + + try: + parsefile(file, d) + except IOError: + print "Could not include required file %s" % file + + +cdef public void e_require(lex_t* c, char* file): + print "e_require", file + d = <object>c.data + d.expand(file) + + try: + parsefile(file, d) + except IOError: + raise CParseError("Could not include required file %s" % file) + +cdef public void e_proc(lex_t* c, char* key, char* what): + print "e_proc", key, what + pass + +cdef public void e_proc_python(lex_t* c, char* key, char* what): + print "e_proc_python", key, what + pass + +cdef public void e_proc_fakeroot(lex_t* c, char* key, char* what): + print "e_fakeroot", key, what + pass + +cdef public void e_def(lex_t* c, char* a, char* b, char* d): + print "e_def", key, what + pass + +cdef public void e_parse_error(lex_t* c): + print "e_parse_error", "line:", lineError, "parse:", errorParse + raise CParseError("There was an parse error, sorry unable to give more information at the current time.") + diff --git a/bitbake/lib/bb/parse/parse_c/bitbakeparser.cc b/bitbake/lib/bb/parse/parse_c/bitbakeparser.cc index 3a3c53dd4..ee9a901b7 100644 --- a/bitbake/lib/bb/parse/parse_c/bitbakeparser.cc +++ b/bitbake/lib/bb/parse/parse_c/bitbakeparser.cc @@ -59,22 +59,22 @@ ** defined, then do no error processing. */ #define YYCODETYPE unsigned char -#define YYNOCODE 42 +#define YYNOCODE 44 #define YYACTIONTYPE unsigned char #define bbparseTOKENTYPE token_t typedef union { bbparseTOKENTYPE yy0; - int yy83; + int yy87; } YYMINORTYPE; #define YYSTACKDEPTH 100 #define bbparseARG_SDECL lex_t* lex; #define bbparseARG_PDECL ,lex_t* lex #define bbparseARG_FETCH lex_t* lex = yypParser->lex #define bbparseARG_STORE yypParser->lex = lex -#define YYNSTATE 74 -#define YYNRULE 41 -#define YYERRORSYMBOL 28 -#define YYERRSYMDT yy83 +#define YYNSTATE 82 +#define YYNRULE 45 +#define YYERRORSYMBOL 30 +#define YYERRSYMDT yy87 #define YY_NO_ACTION (YYNSTATE+YYNRULE+2) #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) #define YY_ERROR_ACTION (YYNSTATE+YYNRULE) @@ -127,53 +127,63 @@ typedef union { ** yy_default[] Default action for each state. */ static const YYACTIONTYPE yy_action[] = { - /* 0 */ 28, 47, 5, 57, 33, 58, 30, 25, 24, 37, - /* 10 */ 45, 14, 2, 29, 41, 3, 16, 4, 23, 39, - /* 20 */ 69, 8, 11, 17, 26, 48, 47, 32, 21, 42, - /* 30 */ 31, 57, 57, 73, 44, 10, 66, 7, 34, 38, - /* 40 */ 57, 51, 72, 116, 1, 62, 6, 49, 52, 35, - /* 50 */ 36, 59, 54, 9, 20, 64, 43, 22, 40, 50, - /* 60 */ 46, 71, 67, 60, 15, 65, 61, 70, 53, 56, - /* 70 */ 27, 12, 68, 63, 84, 55, 18, 84, 13, 84, - /* 80 */ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - /* 90 */ 84, 19, + /* 0 */ 82, 3, 7, 8, 38, 22, 39, 24, 26, 32, + /* 10 */ 34, 28, 30, 128, 1, 40, 53, 70, 55, 5, + /* 20 */ 60, 65, 67, 2, 21, 36, 69, 77, 9, 7, + /* 30 */ 11, 6, 13, 15, 17, 19, 12, 52, 50, 4, + /* 40 */ 74, 42, 46, 59, 57, 10, 64, 62, 38, 14, + /* 50 */ 73, 16, 38, 38, 76, 81, 18, 20, 23, 25, + /* 60 */ 27, 29, 31, 33, 35, 37, 56, 51, 90, 54, + /* 70 */ 58, 71, 41, 43, 63, 45, 44, 47, 72, 48, + /* 80 */ 75, 78, 80, 61, 90, 49, 66, 90, 90, 68, + /* 90 */ 90, 90, 90, 90, 90, 79, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 1, 2, 3, 21, 4, 23, 6, 7, 8, 9, - /* 10 */ 31, 32, 13, 14, 1, 16, 39, 18, 19, 20, - /* 20 */ 37, 38, 22, 24, 25, 1, 2, 4, 10, 6, - /* 30 */ 7, 21, 21, 23, 23, 22, 35, 36, 11, 12, - /* 40 */ 21, 5, 23, 29, 30, 33, 34, 5, 5, 10, - /* 50 */ 12, 10, 5, 22, 39, 15, 40, 11, 10, 5, - /* 60 */ 26, 17, 17, 10, 32, 35, 33, 17, 5, 5, - /* 70 */ 1, 22, 37, 1, 41, 5, 39, 41, 27, 41, - /* 80 */ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - /* 90 */ 41, 39, + /* 0 */ 0, 1, 2, 3, 23, 4, 25, 6, 7, 8, + /* 10 */ 9, 10, 11, 31, 32, 15, 16, 1, 18, 42, + /* 20 */ 20, 21, 22, 33, 34, 24, 26, 27, 1, 2, + /* 30 */ 4, 28, 6, 7, 8, 9, 5, 35, 36, 29, + /* 40 */ 24, 13, 14, 37, 38, 34, 39, 40, 23, 5, + /* 50 */ 25, 5, 23, 23, 25, 25, 5, 5, 5, 5, + /* 60 */ 5, 5, 5, 5, 5, 41, 17, 35, 43, 1, + /* 70 */ 37, 24, 12, 12, 39, 12, 14, 12, 41, 13, + /* 80 */ 41, 1, 41, 19, 43, 12, 19, 43, 43, 19, + /* 90 */ 43, 43, 43, 43, 43, 24, }; -#define YY_SHIFT_USE_DFLT (-19) -#define YY_SHIFT_MAX 43 +#define YY_SHIFT_USE_DFLT (-20) static const signed char yy_shift_ofst[] = { - /* 0 */ -19, -1, 18, 40, 45, 24, 18, 40, 45, -19, - /* 10 */ -19, -19, -19, -19, 0, 23, -18, 13, 19, 10, - /* 20 */ 11, 27, 53, 50, 63, 64, 69, 49, 51, 72, - /* 30 */ 70, 36, 42, 43, 39, 38, 41, 47, 48, 44, - /* 40 */ 46, 31, 54, 34, + /* 0 */ -20, 0, -20, 10, -20, 3, -20, -20, 27, -20, + /* 10 */ 26, 31, -20, 44, -20, 46, -20, 51, -20, 52, + /* 20 */ -20, 1, 53, -20, 54, -20, 55, -20, 56, -20, + /* 30 */ 57, -20, 58, -20, 59, -20, -20, -19, -20, -20, + /* 40 */ 60, 28, 61, 62, 63, -20, 65, 66, 73, -20, + /* 50 */ 60, -20, -20, 68, -20, 49, -20, 49, -20, -20, + /* 60 */ 64, -20, 64, -20, -20, 67, -20, 70, -20, 16, + /* 70 */ 47, -20, 25, -20, -20, 29, -20, 80, 71, -20, + /* 80 */ 30, -20, }; #define YY_REDUCE_USE_DFLT (-24) -#define YY_REDUCE_MAX 13 static const signed char yy_reduce_ofst[] = { - /* 0 */ 14, -21, 12, 1, -17, 32, 33, 30, 35, 37, - /* 10 */ 52, -23, 15, 16, + /* 0 */ -18, -10, -24, -24, -23, -24, -24, -24, 11, -24, + /* 10 */ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + /* 20 */ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + /* 30 */ -24, -24, -24, -24, -24, -24, 24, -24, -24, -24, + /* 40 */ 2, -24, -24, -24, -24, -24, -24, -24, -24, -24, + /* 50 */ 32, -24, -24, -24, -24, 6, -24, 33, -24, -24, + /* 60 */ 7, -24, 35, -24, -24, -24, -24, -24, -24, -24, + /* 70 */ -24, 37, -24, -24, 39, -24, -24, -24, -24, 41, + /* 80 */ -24, -24, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 76, 74, 115, 115, 115, 115, 94, 99, 103, 107, - /* 10 */ 107, 107, 107, 113, 115, 115, 115, 115, 115, 115, - /* 20 */ 115, 89, 115, 115, 115, 115, 115, 115, 77, 115, - /* 30 */ 115, 115, 115, 115, 115, 90, 115, 115, 115, 115, - /* 40 */ 91, 115, 115, 114, 111, 75, 112, 78, 77, 79, - /* 50 */ 80, 81, 82, 83, 84, 85, 86, 106, 108, 87, - /* 60 */ 88, 92, 93, 95, 96, 97, 98, 100, 101, 102, - /* 70 */ 104, 105, 109, 110, + /* 0 */ 84, 127, 83, 85, 125, 126, 124, 86, 127, 85, + /* 10 */ 127, 127, 87, 127, 88, 127, 89, 127, 90, 127, + /* 20 */ 91, 127, 127, 92, 127, 93, 127, 94, 127, 95, + /* 30 */ 127, 96, 127, 97, 127, 98, 119, 127, 118, 120, + /* 40 */ 127, 101, 127, 102, 127, 99, 127, 103, 127, 100, + /* 50 */ 106, 104, 105, 127, 107, 127, 108, 111, 109, 110, + /* 60 */ 127, 112, 115, 113, 114, 127, 116, 127, 117, 127, + /* 70 */ 127, 119, 127, 121, 119, 127, 122, 127, 127, 119, + /* 80 */ 127, 123, }; #define YY_SZ_ACTTAB (sizeof(yy_action)/sizeof(yy_action[0])) @@ -260,16 +270,16 @@ void bbparseTrace(FILE *TraceFILE, char *zTracePrompt){ ** are required. The following table supplies these names */ static const char *const yyTokenName[] = { "$", "SYMBOL", "VARIABLE", "EXPORT", - "OP_ASSIGN", "STRING", "OP_IMMEDIATE", "OP_COND", - "OP_PREPEND", "OP_APPEND", "TSYMBOL", "BEFORE", - "AFTER", "ADDTASK", "ADDHANDLER", "FSYMBOL", - "EXPORT_FUNC", "ISYMBOL", "INHERIT", "INCLUDE", - "REQUIRE", "PROC_BODY", "PROC_OPEN", "PROC_CLOSE", - "PYTHON", "FAKEROOT", "DEF_BODY", "DEF_ARGS", - "error", "program", "statements", "statement", - "variable", "task", "tasks", "func", - "funcs", "inherit", "inherits", "proc_body", - "def_body", + "OP_ASSIGN", "STRING", "OP_PREDOT", "OP_POSTDOT", + "OP_IMMEDIATE", "OP_COND", "OP_PREPEND", "OP_APPEND", + "TSYMBOL", "BEFORE", "AFTER", "ADDTASK", + "ADDHANDLER", "FSYMBOL", "EXPORT_FUNC", "ISYMBOL", + "INHERIT", "INCLUDE", "REQUIRE", "PROC_BODY", + "PROC_OPEN", "PROC_CLOSE", "PYTHON", "FAKEROOT", + "DEF_BODY", "DEF_ARGS", "error", "program", + "statements", "statement", "variable", "task", + "tasks", "func", "funcs", "inherit", + "inherits", "proc_body", "def_body", }; #endif /* NDEBUG */ @@ -283,41 +293,45 @@ static const char *const yyRuleName[] = { /* 3 */ "variable ::= SYMBOL", /* 4 */ "variable ::= VARIABLE", /* 5 */ "statement ::= EXPORT variable OP_ASSIGN STRING", - /* 6 */ "statement ::= EXPORT variable OP_IMMEDIATE STRING", - /* 7 */ "statement ::= EXPORT variable OP_COND STRING", - /* 8 */ "statement ::= variable OP_ASSIGN STRING", - /* 9 */ "statement ::= variable OP_PREPEND STRING", - /* 10 */ "statement ::= variable OP_APPEND STRING", - /* 11 */ "statement ::= variable OP_IMMEDIATE STRING", - /* 12 */ "statement ::= variable OP_COND STRING", - /* 13 */ "task ::= TSYMBOL BEFORE TSYMBOL AFTER TSYMBOL", - /* 14 */ "task ::= TSYMBOL AFTER TSYMBOL BEFORE TSYMBOL", - /* 15 */ "task ::= TSYMBOL", - /* 16 */ "task ::= TSYMBOL BEFORE TSYMBOL", - /* 17 */ "task ::= TSYMBOL AFTER TSYMBOL", - /* 18 */ "tasks ::= tasks task", - /* 19 */ "tasks ::= task", - /* 20 */ "statement ::= ADDTASK tasks", - /* 21 */ "statement ::= ADDHANDLER SYMBOL", - /* 22 */ "func ::= FSYMBOL", - /* 23 */ "funcs ::= funcs func", - /* 24 */ "funcs ::= func", - /* 25 */ "statement ::= EXPORT_FUNC funcs", - /* 26 */ "inherit ::= ISYMBOL", - /* 27 */ "inherits ::= inherits inherit", - /* 28 */ "inherits ::= inherit", - /* 29 */ "statement ::= INHERIT inherits", - /* 30 */ "statement ::= INCLUDE ISYMBOL", - /* 31 */ "statement ::= REQUIRE ISYMBOL", - /* 32 */ "proc_body ::= proc_body PROC_BODY", - /* 33 */ "proc_body ::=", - /* 34 */ "statement ::= variable PROC_OPEN proc_body PROC_CLOSE", - /* 35 */ "statement ::= PYTHON SYMBOL PROC_OPEN proc_body PROC_CLOSE", - /* 36 */ "statement ::= PYTHON PROC_OPEN proc_body PROC_CLOSE", - /* 37 */ "statement ::= FAKEROOT SYMBOL PROC_OPEN proc_body PROC_CLOSE", - /* 38 */ "def_body ::= def_body DEF_BODY", - /* 39 */ "def_body ::=", - /* 40 */ "statement ::= SYMBOL DEF_ARGS def_body", + /* 6 */ "statement ::= EXPORT variable OP_PREDOT STRING", + /* 7 */ "statement ::= EXPORT variable OP_POSTDOT STRING", + /* 8 */ "statement ::= EXPORT variable OP_IMMEDIATE STRING", + /* 9 */ "statement ::= EXPORT variable OP_COND STRING", + /* 10 */ "statement ::= variable OP_ASSIGN STRING", + /* 11 */ "statement ::= variable OP_PREDOT STRING", + /* 12 */ "statement ::= variable OP_POSTDOT STRING", + /* 13 */ "statement ::= variable OP_PREPEND STRING", + /* 14 */ "statement ::= variable OP_APPEND STRING", + /* 15 */ "statement ::= variable OP_IMMEDIATE STRING", + /* 16 */ "statement ::= variable OP_COND STRING", + /* 17 */ "task ::= TSYMBOL BEFORE TSYMBOL AFTER TSYMBOL", + /* 18 */ "task ::= TSYMBOL AFTER TSYMBOL BEFORE TSYMBOL", + /* 19 */ "task ::= TSYMBOL", + /* 20 */ "task ::= TSYMBOL BEFORE TSYMBOL", + /* 21 */ "task ::= TSYMBOL AFTER TSYMBOL", + /* 22 */ "tasks ::= tasks task", + /* 23 */ "tasks ::= task", + /* 24 */ "statement ::= ADDTASK tasks", + /* 25 */ "statement ::= ADDHANDLER SYMBOL", + /* 26 */ "func ::= FSYMBOL", + /* 27 */ "funcs ::= funcs func", + /* 28 */ "funcs ::= func", + /* 29 */ "statement ::= EXPORT_FUNC funcs", + /* 30 */ "inherit ::= ISYMBOL", + /* 31 */ "inherits ::= inherits inherit", + /* 32 */ "inherits ::= inherit", + /* 33 */ "statement ::= INHERIT inherits", + /* 34 */ "statement ::= INCLUDE ISYMBOL", + /* 35 */ "statement ::= REQUIRE ISYMBOL", + /* 36 */ "proc_body ::= proc_body PROC_BODY", + /* 37 */ "proc_body ::=", + /* 38 */ "statement ::= variable PROC_OPEN proc_body PROC_CLOSE", + /* 39 */ "statement ::= PYTHON SYMBOL PROC_OPEN proc_body PROC_CLOSE", + /* 40 */ "statement ::= PYTHON PROC_OPEN proc_body PROC_CLOSE", + /* 41 */ "statement ::= FAKEROOT SYMBOL PROC_OPEN proc_body PROC_CLOSE", + /* 42 */ "def_body ::= def_body DEF_BODY", + /* 43 */ "def_body ::=", + /* 44 */ "statement ::= SYMBOL DEF_ARGS def_body", }; #endif /* NDEBUG */ @@ -402,9 +416,11 @@ static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){ case 25: case 26: case 27: + case 28: + case 29: #line 50 "bitbakeparser.y" { (yypminor->yy0).release_this (); } -#line 409 "bitbakeparser.c" +#line 425 "bitbakeparser.c" break; default: break; /* If no destructor action specified: do nothing */ } @@ -473,7 +489,9 @@ static int yy_find_shift_action( int i; int stateno = pParser->yystack[pParser->yyidx].stateno; - if( stateno>YY_SHIFT_MAX || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){ + /* if( pParser->yyidx<0 ) return YY_NO_ACTION; */ + i = yy_shift_ofst[stateno]; + if( i==YY_SHIFT_USE_DFLT ){ return yy_default[stateno]; } if( iLookAhead==YYNOCODE ){ @@ -515,8 +533,8 @@ static int yy_find_reduce_action( int i; /* int stateno = pParser->yystack[pParser->yyidx].stateno; */ - if( stateno>YY_REDUCE_MAX || - (i = yy_reduce_ofst[stateno])==YY_REDUCE_USE_DFLT ){ + i = yy_reduce_ofst[stateno]; + if( i==YY_REDUCE_USE_DFLT ){ return yy_default[stateno]; } if( iLookAhead==YYNOCODE ){ @@ -578,47 +596,51 @@ static const struct { YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ unsigned char nrhs; /* Number of right-hand side symbols in the rule */ } yyRuleInfo[] = { - { 29, 1 }, - { 30, 2 }, - { 30, 0 }, - { 32, 1 }, - { 32, 1 }, - { 31, 4 }, - { 31, 4 }, - { 31, 4 }, - { 31, 3 }, - { 31, 3 }, - { 31, 3 }, - { 31, 3 }, - { 31, 3 }, - { 33, 5 }, - { 33, 5 }, - { 33, 1 }, + { 31, 1 }, + { 32, 2 }, + { 32, 0 }, + { 34, 1 }, + { 34, 1 }, + { 33, 4 }, + { 33, 4 }, + { 33, 4 }, + { 33, 4 }, + { 33, 4 }, { 33, 3 }, { 33, 3 }, - { 34, 2 }, - { 34, 1 }, - { 31, 2 }, - { 31, 2 }, + { 33, 3 }, + { 33, 3 }, + { 33, 3 }, + { 33, 3 }, + { 33, 3 }, + { 35, 5 }, + { 35, 5 }, { 35, 1 }, + { 35, 3 }, + { 35, 3 }, { 36, 2 }, { 36, 1 }, - { 31, 2 }, + { 33, 2 }, + { 33, 2 }, { 37, 1 }, { 38, 2 }, { 38, 1 }, - { 31, 2 }, - { 31, 2 }, - { 31, 2 }, - { 39, 2 }, - { 39, 0 }, - { 31, 4 }, - { 31, 5 }, - { 31, 4 }, - { 31, 5 }, + { 33, 2 }, + { 39, 1 }, { 40, 2 }, - { 40, 0 }, - { 31, 3 }, + { 40, 1 }, + { 33, 2 }, + { 33, 2 }, + { 33, 2 }, + { 41, 2 }, + { 41, 0 }, + { 33, 4 }, + { 33, 5 }, + { 33, 4 }, + { 33, 5 }, + { 42, 2 }, + { 42, 0 }, + { 33, 3 }, }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -672,7 +694,7 @@ static void yy_reduce( { yygotominor.yy0.assignString( (char*)yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.assignString( 0 ); yymsp[0].minor.yy0.release_this(); } -#line 677 "bitbakeparser.c" +#line 699 "bitbakeparser.c" break; case 4: #line 64 "bitbakeparser.y" @@ -680,7 +702,7 @@ static void yy_reduce( yygotominor.yy0.assignString( (char*)yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.assignString( 0 ); yymsp[0].minor.yy0.release_this(); } -#line 685 "bitbakeparser.c" +#line 707 "bitbakeparser.c" break; case 5: #line 70 "bitbakeparser.y" @@ -689,191 +711,223 @@ static void yy_reduce( yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(3,&yymsp[-3].minor); yy_destructor(4,&yymsp[-1].minor); } -#line 694 "bitbakeparser.c" +#line 716 "bitbakeparser.c" break; case 6: #line 74 "bitbakeparser.y" -{ e_immediate ( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); +{ e_precat( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); e_export( lex, yymsp[-2].minor.yy0.string() ); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(3,&yymsp[-3].minor); yy_destructor(6,&yymsp[-1].minor); } -#line 703 "bitbakeparser.c" +#line 725 "bitbakeparser.c" break; case 7: #line 78 "bitbakeparser.y" -{ e_cond( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); +{ e_postcat( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + e_export( lex, yymsp[-2].minor.yy0.string() ); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(3,&yymsp[-3].minor); yy_destructor(7,&yymsp[-1].minor); } -#line 711 "bitbakeparser.c" +#line 734 "bitbakeparser.c" break; case 8: #line 82 "bitbakeparser.y" -{ e_assign( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); - yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(4,&yymsp[-1].minor); +{ e_immediate ( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + e_export( lex, yymsp[-2].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(3,&yymsp[-3].minor); + yy_destructor(8,&yymsp[-1].minor); } -#line 718 "bitbakeparser.c" +#line 743 "bitbakeparser.c" break; case 9: -#line 85 "bitbakeparser.y" -{ e_prepend( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); - yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(8,&yymsp[-1].minor); +#line 86 "bitbakeparser.y" +{ e_cond( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(3,&yymsp[-3].minor); + yy_destructor(9,&yymsp[-1].minor); } -#line 725 "bitbakeparser.c" +#line 751 "bitbakeparser.c" break; case 10: -#line 88 "bitbakeparser.y" -{ e_append( lex, yymsp[-2].minor.yy0.string() , yymsp[0].minor.yy0.string() ); - yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(9,&yymsp[-1].minor); +#line 90 "bitbakeparser.y" +{ e_assign( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(4,&yymsp[-1].minor); } -#line 732 "bitbakeparser.c" +#line 758 "bitbakeparser.c" break; case 11: -#line 91 "bitbakeparser.y" -{ e_immediate( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); +#line 93 "bitbakeparser.y" +{ e_precat( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(6,&yymsp[-1].minor); } -#line 739 "bitbakeparser.c" +#line 765 "bitbakeparser.c" break; case 12: -#line 94 "bitbakeparser.y" -{ e_cond( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); +#line 96 "bitbakeparser.y" +{ e_postcat( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(7,&yymsp[-1].minor); } -#line 746 "bitbakeparser.c" +#line 772 "bitbakeparser.c" break; case 13: -#line 98 "bitbakeparser.y" -{ e_addtask( lex, yymsp[-4].minor.yy0.string(), yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); - yymsp[-4].minor.yy0.release_this(); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(11,&yymsp[-3].minor); - yy_destructor(12,&yymsp[-1].minor); +#line 99 "bitbakeparser.y" +{ e_prepend( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(10,&yymsp[-1].minor); } -#line 754 "bitbakeparser.c" +#line 779 "bitbakeparser.c" break; case 14: -#line 101 "bitbakeparser.y" -{ e_addtask( lex, yymsp[-4].minor.yy0.string(), yymsp[0].minor.yy0.string(), yymsp[-2].minor.yy0.string()); - yymsp[-4].minor.yy0.release_this(); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(12,&yymsp[-3].minor); - yy_destructor(11,&yymsp[-1].minor); +#line 102 "bitbakeparser.y" +{ e_append( lex, yymsp[-2].minor.yy0.string() , yymsp[0].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(11,&yymsp[-1].minor); } -#line 762 "bitbakeparser.c" +#line 786 "bitbakeparser.c" break; case 15: -#line 104 "bitbakeparser.y" +#line 105 "bitbakeparser.y" +{ e_immediate( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(8,&yymsp[-1].minor); +} +#line 793 "bitbakeparser.c" + break; + case 16: +#line 108 "bitbakeparser.y" +{ e_cond( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(9,&yymsp[-1].minor); +} +#line 800 "bitbakeparser.c" + break; + case 17: +#line 112 "bitbakeparser.y" +{ e_addtask( lex, yymsp[-4].minor.yy0.string(), yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string() ); + yymsp[-4].minor.yy0.release_this(); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(13,&yymsp[-3].minor); + yy_destructor(14,&yymsp[-1].minor); +} +#line 808 "bitbakeparser.c" + break; + case 18: +#line 115 "bitbakeparser.y" +{ e_addtask( lex, yymsp[-4].minor.yy0.string(), yymsp[0].minor.yy0.string(), yymsp[-2].minor.yy0.string()); + yymsp[-4].minor.yy0.release_this(); yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(14,&yymsp[-3].minor); + yy_destructor(13,&yymsp[-1].minor); +} +#line 816 "bitbakeparser.c" + break; + case 19: +#line 118 "bitbakeparser.y" { e_addtask( lex, yymsp[0].minor.yy0.string(), NULL, NULL); yymsp[0].minor.yy0.release_this();} -#line 768 "bitbakeparser.c" +#line 822 "bitbakeparser.c" break; - case 16: -#line 107 "bitbakeparser.y" + case 20: +#line 121 "bitbakeparser.y" { e_addtask( lex, yymsp[-2].minor.yy0.string(), yymsp[0].minor.yy0.string(), NULL); - yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(11,&yymsp[-1].minor); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(13,&yymsp[-1].minor); } -#line 775 "bitbakeparser.c" +#line 829 "bitbakeparser.c" break; - case 17: -#line 110 "bitbakeparser.y" + case 21: +#line 124 "bitbakeparser.y" { e_addtask( lex, yymsp[-2].minor.yy0.string(), NULL, yymsp[0].minor.yy0.string()); - yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(12,&yymsp[-1].minor); + yymsp[-2].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); yy_destructor(14,&yymsp[-1].minor); } -#line 782 "bitbakeparser.c" +#line 836 "bitbakeparser.c" break; - case 21: -#line 117 "bitbakeparser.y" -{ e_addhandler( lex, yymsp[0].minor.yy0.string()); yymsp[0].minor.yy0.release_this (); yy_destructor(14,&yymsp[-1].minor); + case 25: +#line 131 "bitbakeparser.y" +{ e_addhandler( lex, yymsp[0].minor.yy0.string()); yymsp[0].minor.yy0.release_this (); yy_destructor(16,&yymsp[-1].minor); } -#line 788 "bitbakeparser.c" +#line 842 "bitbakeparser.c" break; - case 22: -#line 119 "bitbakeparser.y" + case 26: +#line 133 "bitbakeparser.y" { e_export_func( lex, yymsp[0].minor.yy0.string()); yymsp[0].minor.yy0.release_this(); } -#line 793 "bitbakeparser.c" +#line 847 "bitbakeparser.c" break; - case 26: -#line 124 "bitbakeparser.y" + case 30: +#line 138 "bitbakeparser.y" { e_inherit( lex, yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.release_this (); } -#line 798 "bitbakeparser.c" +#line 852 "bitbakeparser.c" break; - case 30: -#line 130 "bitbakeparser.y" -{ e_include( lex, yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.release_this(); yy_destructor(19,&yymsp[-1].minor); + case 34: +#line 144 "bitbakeparser.y" +{ e_include( lex, yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.release_this(); yy_destructor(21,&yymsp[-1].minor); } -#line 804 "bitbakeparser.c" +#line 858 "bitbakeparser.c" break; - case 31: -#line 133 "bitbakeparser.y" -{ e_require( lex, yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.release_this(); yy_destructor(20,&yymsp[-1].minor); + case 35: +#line 147 "bitbakeparser.y" +{ e_require( lex, yymsp[0].minor.yy0.string() ); yymsp[0].minor.yy0.release_this(); yy_destructor(22,&yymsp[-1].minor); } -#line 810 "bitbakeparser.c" +#line 864 "bitbakeparser.c" break; - case 32: -#line 136 "bitbakeparser.y" + case 36: +#line 150 "bitbakeparser.y" { /* concatenate body lines */ yygotominor.yy0.assignString( token_t::concatString(yymsp[-1].minor.yy0.string(), yymsp[0].minor.yy0.string()) ); yymsp[-1].minor.yy0.release_this (); yymsp[0].minor.yy0.release_this (); } -#line 819 "bitbakeparser.c" +#line 873 "bitbakeparser.c" break; - case 33: -#line 141 "bitbakeparser.y" + case 37: +#line 155 "bitbakeparser.y" { yygotominor.yy0.assignString(0); } -#line 824 "bitbakeparser.c" +#line 878 "bitbakeparser.c" break; - case 34: -#line 143 "bitbakeparser.y" + case 38: +#line 157 "bitbakeparser.y" { e_proc( lex, yymsp[-3].minor.yy0.string(), yymsp[-1].minor.yy0.string() ); - yymsp[-3].minor.yy0.release_this(); yymsp[-1].minor.yy0.release_this(); yy_destructor(22,&yymsp[-2].minor); - yy_destructor(23,&yymsp[0].minor); + yymsp[-3].minor.yy0.release_this(); yymsp[-1].minor.yy0.release_this(); yy_destructor(24,&yymsp[-2].minor); + yy_destructor(25,&yymsp[0].minor); } -#line 832 "bitbakeparser.c" +#line 886 "bitbakeparser.c" break; - case 35: -#line 146 "bitbakeparser.y" + case 39: +#line 160 "bitbakeparser.y" { e_proc_python ( lex, yymsp[-3].minor.yy0.string(), yymsp[-1].minor.yy0.string() ); - yymsp[-3].minor.yy0.release_this(); yymsp[-1].minor.yy0.release_this(); yy_destructor(24,&yymsp[-4].minor); - yy_destructor(22,&yymsp[-2].minor); - yy_destructor(23,&yymsp[0].minor); + yymsp[-3].minor.yy0.release_this(); yymsp[-1].minor.yy0.release_this(); yy_destructor(26,&yymsp[-4].minor); + yy_destructor(24,&yymsp[-2].minor); + yy_destructor(25,&yymsp[0].minor); } -#line 841 "bitbakeparser.c" +#line 895 "bitbakeparser.c" break; - case 36: -#line 149 "bitbakeparser.y" + case 40: +#line 163 "bitbakeparser.y" { e_proc_python( lex, NULL, yymsp[-1].minor.yy0.string()); - yymsp[-1].minor.yy0.release_this (); yy_destructor(24,&yymsp[-3].minor); - yy_destructor(22,&yymsp[-2].minor); - yy_destructor(23,&yymsp[0].minor); + yymsp[-1].minor.yy0.release_this (); yy_destructor(26,&yymsp[-3].minor); + yy_destructor(24,&yymsp[-2].minor); + yy_destructor(25,&yymsp[0].minor); } -#line 850 "bitbakeparser.c" +#line 904 "bitbakeparser.c" break; - case 37: -#line 153 "bitbakeparser.y" + case 41: +#line 167 "bitbakeparser.y" { e_proc_fakeroot( lex, yymsp[-3].minor.yy0.string(), yymsp[-1].minor.yy0.string() ); - yymsp[-3].minor.yy0.release_this (); yymsp[-1].minor.yy0.release_this (); yy_destructor(25,&yymsp[-4].minor); - yy_destructor(22,&yymsp[-2].minor); - yy_destructor(23,&yymsp[0].minor); + yymsp[-3].minor.yy0.release_this (); yymsp[-1].minor.yy0.release_this (); yy_destructor(27,&yymsp[-4].minor); + yy_destructor(24,&yymsp[-2].minor); + yy_destructor(25,&yymsp[0].minor); } -#line 859 "bitbakeparser.c" +#line 913 "bitbakeparser.c" break; - case 38: -#line 157 "bitbakeparser.y" + case 42: +#line 171 "bitbakeparser.y" { /* concatenate body lines */ yygotominor.yy0.assignString( token_t::concatString(yymsp[-1].minor.yy0.string(), yymsp[0].minor.yy0.string()) ); yymsp[-1].minor.yy0.release_this (); yymsp[0].minor.yy0.release_this (); } -#line 867 "bitbakeparser.c" +#line 921 "bitbakeparser.c" break; - case 39: -#line 161 "bitbakeparser.y" + case 43: +#line 175 "bitbakeparser.y" { yygotominor.yy0.assignString( 0 ); } -#line 872 "bitbakeparser.c" +#line 926 "bitbakeparser.c" break; - case 40: -#line 163 "bitbakeparser.y" + case 44: +#line 177 "bitbakeparser.y" { e_def( lex, yymsp[-2].minor.yy0.string(), yymsp[-1].minor.yy0.string(), yymsp[0].minor.yy0.string()); yymsp[-2].minor.yy0.release_this(); yymsp[-1].minor.yy0.release_this(); yymsp[0].minor.yy0.release_this(); } -#line 878 "bitbakeparser.c" +#line 932 "bitbakeparser.c" break; }; yygoto = yyRuleInfo[yyruleno].lhs; @@ -932,7 +986,7 @@ static void yy_syntax_error( #define TOKEN (yyminor.yy0) #line 52 "bitbakeparser.y" e_parse_error( lex ); -#line 938 "bitbakeparser.c" +#line 992 "bitbakeparser.c" bbparseARG_STORE; /* Suppress warning about unused %extra_argument variable */ } diff --git a/bitbake/lib/bb/parse/parse_c/bitbakeparser.h b/bitbake/lib/bb/parse/parse_c/bitbakeparser.h index 2e51702be..a2c9aa367 100644 --- a/bitbake/lib/bb/parse/parse_c/bitbakeparser.h +++ b/bitbake/lib/bb/parse/parse_c/bitbakeparser.h @@ -3,25 +3,27 @@ #define T_EXPORT 3 #define T_OP_ASSIGN 4 #define T_STRING 5 -#define T_OP_IMMEDIATE 6 -#define T_OP_COND 7 -#define T_OP_PREPEND 8 -#define T_OP_APPEND 9 -#define T_TSYMBOL 10 -#define T_BEFORE 11 -#define T_AFTER 12 -#define T_ADDTASK 13 -#define T_ADDHANDLER 14 -#define T_FSYMBOL 15 -#define T_EXPORT_FUNC 16 -#define T_ISYMBOL 17 -#define T_INHERIT 18 -#define T_INCLUDE 19 -#define T_REQUIRE 20 -#define T_PROC_BODY 21 -#define T_PROC_OPEN 22 -#define T_PROC_CLOSE 23 -#define T_PYTHON 24 -#define T_FAKEROOT 25 -#define T_DEF_BODY 26 -#define T_DEF_ARGS 27 +#define T_OP_PREDOT 6 +#define T_OP_POSTDOT 7 +#define T_OP_IMMEDIATE 8 +#define T_OP_COND 9 +#define T_OP_PREPEND 10 +#define T_OP_APPEND 11 +#define T_TSYMBOL 12 +#define T_BEFORE 13 +#define T_AFTER 14 +#define T_ADDTASK 15 +#define T_ADDHANDLER 16 +#define T_FSYMBOL 17 +#define T_EXPORT_FUNC 18 +#define T_ISYMBOL 19 +#define T_INHERIT 20 +#define T_INCLUDE 21 +#define T_REQUIRE 22 +#define T_PROC_BODY 23 +#define T_PROC_OPEN 24 +#define T_PROC_CLOSE 25 +#define T_PYTHON 26 +#define T_FAKEROOT 27 +#define T_DEF_BODY 28 +#define T_DEF_ARGS 29 diff --git a/bitbake/lib/bb/parse/parse_c/bitbakeparser.y b/bitbake/lib/bb/parse/parse_c/bitbakeparser.y index 252d87792..c18e53543 100644 --- a/bitbake/lib/bb/parse/parse_c/bitbakeparser.y +++ b/bitbake/lib/bb/parse/parse_c/bitbakeparser.y @@ -70,6 +70,14 @@ statement ::= EXPORT variable(s) OP_ASSIGN STRING(v). { e_assign( lex, s.string(), v.string() ); e_export( lex, s.string() ); s.release_this(); v.release_this(); } +statement ::= EXPORT variable(s) OP_PREDOT STRING(v). + { e_precat( lex, s.string(), v.string() ); + e_export( lex, s.string() ); + s.release_this(); v.release_this(); } +statement ::= EXPORT variable(s) OP_POSTDOT STRING(v). + { e_postcat( lex, s.string(), v.string() ); + e_export( lex, s.string() ); + s.release_this(); v.release_this(); } statement ::= EXPORT variable(s) OP_IMMEDIATE STRING(v). { e_immediate ( lex, s.string(), v.string() ); e_export( lex, s.string() ); @@ -81,6 +89,12 @@ statement ::= EXPORT variable(s) OP_COND STRING(v). statement ::= variable(s) OP_ASSIGN STRING(v). { e_assign( lex, s.string(), v.string() ); s.release_this(); v.release_this(); } +statement ::= variable(s) OP_PREDOT STRING(v). + { e_precat( lex, s.string(), v.string() ); + s.release_this(); v.release_this(); } +statement ::= variable(s) OP_POSTDOT STRING(v). + { e_postcat( lex, s.string(), v.string() ); + s.release_this(); v.release_this(); } statement ::= variable(s) OP_PREPEND STRING(v). { e_prepend( lex, s.string(), v.string() ); s.release_this(); v.release_this(); } diff --git a/bitbake/lib/bb/parse/parse_c/bitbakescanner.cc b/bitbake/lib/bb/parse/parse_c/bitbakescanner.cc index 8e95fd97c..43dad12d3 100644 --- a/bitbake/lib/bb/parse/parse_c/bitbakescanner.cc +++ b/bitbake/lib/bb/parse/parse_c/bitbakescanner.cc @@ -355,8 +355,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 45 -#define YY_END_OF_BUFFER 46 +#define YY_NUM_RULES 47 +#define YY_END_OF_BUFFER 48 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -364,96 +364,98 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[798] = +static yyconst flex_int16_t yy_accept[813] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 24, 0, 0, - 0, 0, 46, 44, 43, 43, 44, 44, 44, 44, - 44, 4, 44, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 26, 26, 26, 26, 26, 26, 44, 43, - 28, 43, 44, 44, 44, 27, 4, 44, 44, 44, - 44, 44, 44, 31, 31, 30, 31, 31, 31, 31, - 31, 4, 31, 31, 31, 31, 31, 31, 41, 36, - 36, 36, 36, 36, 36, 44, 38, 38, 38, 38, - 38, 38, 42, 37, 37, 37, 37, 37, 37, 44, - - 39, 39, 39, 39, 39, 39, 24, 24, 24, 24, - 24, 24, 24, 4, 24, 24, 24, 24, 24, 24, - 23, 9, 43, 10, 9, 44, 9, 44, 9, 9, - 9, 4, 9, 9, 9, 9, 9, 9, 9, 40, - 35, 35, 35, 35, 35, 35, 35, 0, 32, 34, - 0, 0, 1, 3, 2, 5, 0, 33, 0, 33, - 33, 33, 33, 33, 33, 33, 33, 26, 26, 26, - 26, 26, 26, 0, 27, 0, 28, 0, 27, 0, - 0, 1, 2, 5, 0, 0, 0, 0, 0, 0, - 0, 29, 0, 0, 0, 0, 0, 36, 36, 36, - - 36, 36, 36, 0, 0, 38, 38, 38, 38, 38, - 38, 37, 37, 37, 37, 37, 37, 0, 0, 39, - 39, 39, 39, 39, 39, 24, 24, 24, 24, 24, - 24, 1, 3, 2, 5, 24, 24, 24, 24, 24, - 23, 23, 9, 0, 9, 0, 10, 0, 7, 0, - 9, 0, 9, 0, 8, 0, 0, 9, 1, 3, - 2, 5, 9, 6, 9, 9, 9, 9, 35, 35, - 35, 35, 35, 35, 35, 35, 34, 0, 22, 0, - 0, 34, 33, 33, 25, 33, 33, 33, 33, 33, - 33, 26, 26, 25, 26, 26, 26, 0, 22, 0, - - 0, 25, 0, 0, 0, 0, 0, 25, 0, 0, - 0, 36, 36, 25, 36, 36, 36, 0, 0, 38, - 38, 25, 38, 38, 38, 37, 37, 25, 37, 37, - 37, 0, 0, 39, 39, 25, 39, 39, 39, 24, - 22, 24, 24, 24, 24, 24, 24, 32, 0, 9, - 9, 6, 9, 9, 9, 9, 9, 35, 35, 35, - 35, 25, 35, 35, 35, 22, 22, 0, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 26, 26, 26, - 26, 26, 26, 22, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 36, 36, 36, 36, - - 36, 36, 0, 38, 0, 38, 38, 38, 38, 38, - 38, 37, 37, 37, 37, 37, 37, 0, 39, 0, - 39, 39, 39, 39, 39, 39, 22, 22, 24, 24, - 24, 24, 24, 24, 22, 9, 9, 9, 9, 9, - 9, 35, 35, 35, 35, 35, 35, 35, 35, 0, - 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, - 36, 36, 36, 36, 0, 38, 38, 38, 38, 38, - 38, 38, 37, 37, 37, 37, 37, 37, 0, 39, - - 39, 39, 39, 39, 39, 39, 24, 24, 24, 24, - 24, 24, 9, 9, 9, 9, 9, 9, 35, 35, - 35, 18, 35, 35, 35, 35, 33, 33, 33, 19, - 33, 33, 33, 21, 33, 26, 26, 26, 26, 26, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 36, 36, 36, 36, 36, 38, - 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, - 37, 39, 39, 39, 39, 39, 39, 24, 24, 24, - 24, 24, 24, 9, 9, 9, 9, 9, 9, 35, - 35, 35, 17, 35, 35, 35, 33, 33, 14, 33, - - 11, 13, 12, 26, 26, 14, 11, 13, 12, 0, - 0, 14, 11, 13, 12, 0, 0, 14, 11, 13, - 12, 36, 36, 14, 11, 13, 12, 38, 38, 14, - 11, 13, 12, 37, 37, 14, 11, 13, 12, 39, - 39, 14, 11, 13, 12, 24, 24, 14, 11, 13, - 12, 9, 9, 9, 9, 9, 9, 35, 35, 14, - 11, 13, 12, 33, 33, 20, 26, 26, 0, 0, - 0, 0, 36, 36, 38, 38, 37, 37, 39, 39, - 24, 24, 9, 9, 35, 35, 33, 33, 26, 26, - 0, 0, 0, 0, 36, 36, 38, 38, 37, 37, - - 39, 39, 24, 24, 9, 9, 35, 35, 33, 15, - 26, 15, 0, 15, 0, 15, 36, 15, 38, 15, - 37, 15, 39, 15, 24, 15, 9, 9, 35, 15, - 33, 26, 0, 0, 36, 38, 37, 39, 24, 9, - 35, 33, 26, 0, 0, 36, 38, 37, 39, 24, - 9, 35, 33, 26, 0, 0, 36, 38, 37, 39, - 24, 9, 35, 33, 26, 0, 0, 36, 38, 37, - 39, 24, 9, 35, 33, 26, 0, 0, 36, 38, - 37, 39, 24, 9, 35, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 9, 16, 0 + 0, 0, 0, 0, 0, 0, 26, 26, 0, 0, + 0, 0, 48, 46, 45, 45, 46, 46, 46, 46, + 46, 46, 4, 46, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 28, 28, 28, 28, 28, 28, 46, + 45, 30, 45, 46, 46, 46, 46, 29, 4, 46, + 46, 46, 46, 46, 46, 33, 33, 32, 33, 33, + 33, 33, 33, 33, 4, 33, 33, 33, 33, 33, + 33, 43, 38, 38, 38, 38, 38, 38, 46, 40, + 40, 40, 40, 40, 40, 40, 44, 39, 39, 39, + + 39, 39, 39, 46, 41, 41, 41, 41, 41, 41, + 41, 26, 26, 26, 26, 26, 26, 26, 26, 4, + 26, 26, 26, 26, 26, 26, 25, 11, 45, 12, + 11, 46, 11, 46, 11, 11, 11, 11, 4, 11, + 11, 11, 11, 11, 11, 11, 42, 37, 37, 37, + 37, 37, 37, 37, 0, 34, 36, 0, 0, 1, + 5, 3, 2, 6, 7, 0, 35, 0, 35, 35, + 35, 35, 35, 35, 35, 35, 28, 28, 28, 28, + 28, 28, 0, 29, 0, 30, 0, 29, 0, 0, + 1, 5, 2, 6, 7, 0, 0, 0, 0, 0, + + 0, 0, 31, 0, 0, 0, 0, 0, 38, 38, + 38, 38, 38, 38, 0, 0, 40, 40, 40, 40, + 40, 40, 39, 39, 39, 39, 39, 39, 0, 0, + 41, 41, 41, 41, 41, 41, 26, 26, 26, 26, + 26, 26, 1, 5, 3, 2, 6, 7, 26, 26, + 26, 26, 26, 25, 25, 11, 0, 11, 0, 12, + 0, 9, 0, 11, 0, 11, 0, 10, 0, 0, + 11, 1, 5, 3, 2, 6, 7, 11, 8, 11, + 11, 11, 11, 37, 37, 37, 37, 37, 37, 37, + 37, 36, 0, 24, 0, 0, 36, 35, 35, 27, + + 35, 35, 35, 35, 35, 35, 28, 28, 27, 28, + 28, 28, 0, 24, 0, 0, 27, 0, 0, 0, + 0, 0, 27, 0, 0, 0, 38, 38, 27, 38, + 38, 38, 0, 0, 40, 40, 27, 40, 40, 40, + 39, 39, 27, 39, 39, 39, 0, 0, 41, 41, + 27, 41, 41, 41, 26, 24, 26, 26, 26, 26, + 26, 26, 34, 0, 11, 11, 8, 11, 11, 11, + 11, 11, 37, 37, 37, 37, 27, 37, 37, 37, + 24, 24, 0, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 28, 28, 28, 28, 28, 28, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 38, 38, 38, 38, 38, 38, 0, 40, 0, + 40, 40, 40, 40, 40, 40, 39, 39, 39, 39, + 39, 39, 0, 41, 0, 41, 41, 41, 41, 41, + 41, 24, 24, 26, 26, 26, 26, 26, 26, 24, + 11, 11, 11, 11, 11, 11, 37, 37, 37, 37, + 37, 37, 37, 37, 0, 36, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 28, 28, 28, 28, 28, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 38, 38, 38, 38, 38, 38, 0, + + 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, + 39, 39, 39, 0, 41, 41, 41, 41, 41, 41, + 41, 26, 26, 26, 26, 26, 26, 11, 11, 11, + 11, 11, 11, 37, 37, 37, 20, 37, 37, 37, + 37, 35, 35, 35, 21, 35, 35, 35, 23, 35, + 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, + 38, 38, 38, 38, 40, 40, 40, 40, 40, 40, + 39, 39, 39, 39, 39, 39, 41, 41, 41, 41, + 41, 41, 26, 26, 26, 26, 26, 26, 11, 11, + + 11, 11, 11, 11, 37, 37, 37, 19, 37, 37, + 37, 35, 35, 16, 35, 13, 15, 14, 28, 28, + 16, 13, 15, 14, 0, 0, 16, 13, 15, 14, + 0, 0, 16, 13, 15, 14, 38, 38, 16, 13, + 15, 14, 40, 40, 16, 13, 15, 14, 39, 39, + 16, 13, 15, 14, 41, 41, 16, 13, 15, 14, + 26, 26, 16, 13, 15, 14, 11, 11, 11, 11, + 11, 11, 37, 37, 16, 13, 15, 14, 35, 35, + 22, 28, 28, 0, 0, 0, 0, 38, 38, 40, + 40, 39, 39, 41, 41, 26, 26, 11, 11, 37, + + 37, 35, 35, 28, 28, 0, 0, 0, 0, 38, + 38, 40, 40, 39, 39, 41, 41, 26, 26, 11, + 11, 37, 37, 35, 17, 28, 17, 0, 17, 0, + 17, 38, 17, 40, 17, 39, 17, 41, 17, 26, + 17, 11, 11, 37, 17, 35, 28, 0, 0, 38, + 40, 39, 41, 26, 11, 37, 35, 28, 0, 0, + 38, 40, 39, 41, 26, 11, 37, 35, 28, 0, + 0, 38, 40, 39, 41, 26, 11, 37, 35, 28, + 0, 0, 38, 40, 39, 41, 26, 11, 37, 35, + 28, 0, 0, 38, 40, 39, 41, 26, 11, 37, + + 18, 18, 18, 18, 18, 18, 18, 18, 18, 11, + 18, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -491,454 +493,472 @@ static yyconst flex_int32_t yy_ec[256] = static yyconst flex_int32_t yy_meta[59] = { 0, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, - 5, 6, 5, 5, 7, 8, 1, 1, 1, 9, + 5, 6, 5, 5, 7, 8, 1, 7, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 1, 11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 12 } ; -static yyconst flex_int16_t yy_base[832] = +static yyconst flex_int16_t yy_base[847] = { 0, 0, 0, 58, 0, 115, 165, 215, 265, 316, 0, 374, 0, 432, 0, 490, 0, 547, 604, 661, 711, - 762, 0, 2156, 2157, 2157, 2157, 2152, 0, 118, 2136, - 2135, 2141, 2133, 115, 118, 116, 120, 124, 140, 131, - 129, 139, 0, 2118, 2109, 2107, 2100, 2105, 2128, 127, - 2157, 2127, 137, 179, 124, 2125, 128, 173, 126, 146, - 153, 118, 158, 2157, 190, 2157, 2157, 2139, 193, 2123, - 2122, 2128, 2120, 2105, 2096, 2094, 2087, 2092, 2157, 0, - 2100, 2091, 2089, 2082, 2087, 2070, 2119, 181, 190, 194, - 153, 197, 2157, 0, 2093, 2084, 2082, 2075, 2080, 2063, - - 2112, 191, 199, 200, 201, 203, 2115, 2114, 2113, 2112, - 212, 209, 222, 217, 228, 226, 233, 208, 239, 240, - 248, 255, 251, 2111, 270, 251, 552, 254, 565, 575, - 577, 622, 627, 626, 634, 612, 669, 684, 691, 2157, - 0, 2081, 205, 2071, 2070, 2063, 2068, 2105, 2157, 257, - 289, 559, 2157, 2157, 2157, 2157, 2050, 263, 2071, 270, - 273, 555, 545, 556, 642, 585, 569, 0, 2078, 2064, - 2061, 222, 2052, 2084, 2157, 290, 2157, 291, 2097, 674, - 680, 2082, 2081, 2080, 283, 564, 554, 608, 262, 2093, - 312, 2157, 2068, 2054, 2051, 529, 2042, 0, 2064, 2050, - - 2047, 611, 2038, 0, 2030, 2079, 646, 650, 652, 695, - 593, 0, 2058, 2044, 2041, 661, 2032, 0, 2024, 2073, - 680, 681, 699, 701, 702, 2076, 2075, 2074, 2073, 733, - 819, 2072, 2071, 2070, 2069, 720, 600, 708, 820, 821, - 724, 2068, 823, 824, 831, 751, 2067, 822, 830, 835, - 839, 843, 847, 845, 846, 858, 880, 870, 881, 889, - 891, 898, 903, 2067, 905, 914, 916, 926, 0, 2041, - 2027, 2013, 2023, 2022, 703, 2013, 902, 841, 754, 0, - 2027, 2157, 910, 919, 905, 913, 933, 934, 937, 940, - 935, 2035, 258, 0, 2014, 2018, 2004, 947, 979, 732, - - 934, 2040, 912, 843, 707, 2030, 910, 2157, 2009, 2013, - 1999, 2026, 922, 0, 2005, 2009, 1995, 1990, 0, 861, - 926, 2040, 855, 947, 964, 2020, 941, 0, 1999, 2003, - 1989, 1984, 0, 979, 950, 2034, 978, 984, 983, 995, - 757, 989, 992, 2037, 996, 571, 997, 1004, 1005, 1014, - 1006, 2037, 1021, 1025, 1026, 1039, 1041, 2012, 1010, 1996, - 1988, 0, 1989, 1993, 1979, 999, 2029, 1973, 1043, 1049, - 1050, 1051, 1058, 1059, 1060, 1070, 1061, 2002, 1992, 1991, - 1973, 1975, 1981, 1087, 1053, 1061, 1062, 813, 1003, 1044, - 1996, 1986, 1985, 1967, 1969, 1975, 1990, 1980, 1979, 1961, - - 1963, 1969, 1954, 2004, 1952, 867, 1078, 1089, 1062, 1090, - 1093, 1981, 1971, 1970, 1952, 1954, 1960, 1945, 1995, 1943, - 1094, 1099, 1101, 1100, 1105, 1103, 1117, 1997, 1111, 1114, - 1118, 1120, 1121, 1122, 1125, 1141, 1127, 1155, 1160, 1165, - 1174, 1971, 1961, 1960, 1945, 1944, 1940, 1942, 1948, 1933, - 1138, 1151, 1170, 1145, 1173, 1176, 1179, 1178, 1180, 1188, - 1960, 1942, 1936, 1947, 1942, 1934, 1114, 1173, 1136, 1183, - 1181, 1179, 1954, 1936, 1930, 1941, 1936, 1928, 1948, 1930, - 1924, 1935, 1930, 1922, 1914, 1964, 1198, 1184, 1141, 830, - 1194, 1195, 1940, 1922, 1916, 1927, 1922, 1914, 1906, 1956, - - 1203, 1197, 1200, 1208, 1222, 1225, 1231, 1232, 1233, 1234, - 1237, 1238, 1248, 1249, 1257, 1265, 1267, 1282, 1932, 1914, - 1908, 0, 1918, 1918, 1913, 1905, 1235, 1253, 1270, 1273, - 1281, 1285, 1287, 1288, 1290, 1919, 1914, 1908, 1911, 1898, - 1909, 1228, 1285, 1283, 1281, 1290, 1291, 1913, 1908, 1902, - 1905, 1892, 1903, 1907, 1902, 1896, 1899, 1886, 1897, 1303, - 1297, 1305, 1306, 1310, 1312, 1901, 1896, 1890, 1893, 1880, - 1891, 1320, 1317, 1323, 1328, 1327, 1329, 1335, 1338, 1339, - 1341, 1342, 1345, 1347, 1356, 1357, 1371, 1392, 1396, 1895, - 1890, 1884, 0, 1887, 1874, 1885, 1344, 1339, 1359, 1380, - - 1381, 1382, 1386, 1902, 1878, 0, 0, 0, 0, 1117, - 1357, 1906, 1905, 1904, 1903, 1896, 1872, 2157, 2157, 2157, - 2157, 1894, 1870, 0, 0, 0, 0, 1240, 1353, 1908, - 1907, 1906, 1905, 1888, 1864, 0, 0, 0, 0, 1399, - 1400, 1902, 1901, 1900, 1899, 1405, 1372, 1902, 1901, 1900, - 1899, 1415, 1419, 1427, 1434, 1439, 1446, 1878, 1854, 0, - 0, 0, 0, 1424, 1433, 1427, 1867, 1856, 1394, 1426, - 1863, 1849, 1858, 1845, 1445, 1409, 1851, 1840, 1451, 1449, - 1456, 1459, 1467, 1476, 1847, 1833, 1463, 1456, 1848, 1819, - 1125, 1454, 1841, 1814, 1837, 1807, 1470, 1457, 1827, 1795, - - 1472, 1476, 1488, 1482, 1501, 1510, 1809, 1782, 1495, 1486, - 1789, 0, 1503, 1792, 1776, 2157, 1747, 0, 1504, 1756, - 1736, 0, 1515, 1745, 1483, 1712, 1529, 1537, 1690, 0, - 1516, 1675, 1513, 1610, 1609, 1522, 1608, 1525, 1491, 1546, - 1607, 1533, 1612, 1475, 1611, 1609, 1534, 1608, 1540, 1535, - 1560, 1607, 1546, 1604, 1232, 1602, 1601, 1549, 1599, 1560, - 1557, 1580, 1597, 1562, 1596, 1553, 1595, 1593, 1566, 1592, - 1567, 1574, 1588, 1591, 1574, 1581, 1226, 1575, 1572, 1582, - 1485, 1590, 1595, 1600, 1381, 1593, 0, 1392, 2157, 0, - 1347, 0, 1029, 1018, 1607, 0, 2157, 1641, 1653, 1665, - - 1677, 1689, 893, 1698, 1704, 1713, 1725, 1737, 1745, 1751, - 1756, 1762, 1771, 1783, 1795, 1807, 1819, 1831, 1839, 1845, - 1848, 730, 581, 550, 1855, 289, 1863, 286, 1871, 1879, - 1887 + 762, 0, 2308, 2309, 2309, 2309, 2304, 0, 118, 2288, + 2287, 2286, 111, 2285, 116, 124, 120, 129, 131, 128, + 144, 139, 140, 0, 2270, 2261, 2259, 2252, 2257, 2280, + 137, 2309, 2279, 127, 183, 124, 171, 2277, 187, 179, + 126, 163, 158, 131, 173, 2309, 204, 2309, 2309, 2291, + 210, 2275, 2274, 2273, 197, 2272, 2257, 2248, 2246, 2239, + 2244, 2309, 0, 2252, 2243, 2241, 2234, 2239, 2222, 218, + 220, 221, 223, 224, 228, 236, 2309, 0, 2246, 2237, + + 2235, 2228, 2233, 2216, 233, 238, 240, 255, 263, 242, + 273, 2269, 2268, 2267, 2266, 283, 285, 289, 293, 287, + 294, 160, 210, 207, 147, 220, 297, 552, 560, 2265, + 565, 210, 569, 544, 580, 622, 627, 634, 623, 669, + 689, 819, 684, 702, 821, 823, 2309, 0, 2235, 266, + 2225, 2224, 2217, 2222, 2259, 2309, 548, 566, 581, 2309, + 2309, 2309, 2309, 2309, 2309, 2204, 568, 2225, 626, 610, + 640, 651, 699, 823, 678, 702, 0, 2232, 2218, 2215, + 550, 2206, 2238, 2309, 577, 2309, 261, 2251, 594, 830, + 2236, 2235, 2234, 2233, 2232, 575, 580, 634, 710, 599, + + 2245, 735, 2309, 2220, 2206, 2203, 703, 2194, 0, 2216, + 2202, 2199, 711, 2190, 0, 2182, 681, 827, 830, 831, + 826, 828, 0, 2211, 2197, 2194, 717, 2185, 0, 2177, + 740, 832, 834, 833, 853, 854, 2230, 2229, 2228, 2227, + 874, 840, 2226, 2225, 2224, 2223, 2222, 2221, 592, 254, + 651, 855, 833, 737, 2220, 877, 897, 898, 878, 2219, + 881, 883, 886, 905, 916, 920, 700, 859, 906, 925, + 936, 940, 941, 950, 955, 960, 964, 974, 2219, 975, + 983, 994, 995, 0, 2193, 2179, 2165, 2175, 2174, 718, + 2165, 883, 910, 934, 0, 2179, 2309, 979, 971, 940, + + 974, 954, 985, 999, 983, 1003, 2187, 968, 0, 2166, + 2170, 2156, 1017, 1036, 583, 1003, 2192, 996, 685, 917, + 2182, 998, 2309, 2161, 2165, 2151, 2178, 1001, 0, 2157, + 2161, 2147, 2142, 0, 1040, 1041, 946, 1042, 1045, 1043, + 2173, 1012, 0, 2152, 2156, 2142, 2137, 0, 1055, 1057, + 1060, 1061, 1062, 1064, 1074, 1087, 1067, 1069, 2191, 1080, + 1082, 687, 1090, 1094, 1103, 1112, 2191, 1111, 1125, 1127, + 1134, 1142, 2166, 1048, 2150, 2142, 0, 2143, 2147, 2133, + 1138, 2183, 2127, 1127, 1141, 1146, 1136, 1149, 1151, 1155, + 1156, 1158, 2156, 2146, 2145, 2127, 2129, 2135, 1164, 1087, + + 1006, 1135, 1132, 595, 912, 2150, 2140, 2139, 2121, 2123, + 2129, 2144, 2134, 2133, 2115, 2117, 2123, 2108, 1183, 2107, + 1185, 1190, 1191, 1192, 1200, 1204, 2136, 2126, 2125, 2107, + 2109, 2115, 2100, 1205, 2099, 1207, 1208, 1212, 1213, 1214, + 1222, 1168, 2153, 923, 1084, 1213, 1182, 1106, 1190, 1236, + 1250, 1251, 1252, 1266, 1267, 1271, 2127, 2117, 2116, 2101, + 2100, 2096, 2098, 2104, 2089, 1210, 1257, 1230, 1273, 1274, + 1275, 1276, 1284, 1286, 1288, 2116, 2098, 2092, 2103, 2098, + 2090, 1280, 1177, 1244, 1282, 1285, 1275, 2110, 2092, 2086, + 2097, 2092, 2084, 2104, 2086, 2080, 2091, 2086, 2078, 2070, + + 1296, 1306, 1323, 1324, 1325, 1327, 1328, 2097, 2079, 2073, + 2084, 2079, 2071, 2063, 1330, 1331, 1333, 1337, 1345, 1340, + 1346, 1347, 1309, 1259, 1351, 1354, 1356, 1370, 1385, 1394, + 1401, 1403, 1408, 2090, 2072, 2066, 0, 2076, 2076, 2071, + 2063, 1359, 1361, 1379, 1355, 1407, 1410, 1411, 1415, 1416, + 2077, 2072, 2066, 2069, 2056, 2067, 1398, 1343, 1408, 1404, + 643, 1409, 2071, 2066, 2060, 2063, 2050, 2061, 2065, 2060, + 2054, 2057, 2044, 2055, 1420, 1445, 1413, 1447, 1453, 1454, + 2059, 2054, 2047, 2050, 2035, 2043, 1455, 1459, 1460, 1461, + 1462, 1463, 1471, 1436, 1430, 1192, 1433, 1479, 1482, 1492, + + 1506, 1519, 1520, 1528, 2047, 2040, 2031, 0, 2034, 2019, + 2027, 1486, 1496, 1505, 1506, 1510, 1516, 1524, 2044, 2018, + 0, 0, 0, 0, 1281, 1517, 2043, 2042, 2039, 2035, + 2023, 1994, 2309, 2309, 2309, 2309, 2005, 1981, 0, 0, + 0, 0, 1538, 1528, 1530, 1534, 1537, 1540, 1981, 1957, + 0, 0, 0, 0, 1557, 1558, 1559, 1560, 1561, 1563, + 1568, 1547, 1988, 1959, 1954, 1948, 1580, 1581, 1582, 1590, + 1592, 1594, 1923, 1863, 0, 0, 0, 0, 1598, 1599, + 1600, 1874, 1858, 1350, 1584, 1803, 1792, 1801, 1790, 1603, + 1601, 1799, 1788, 1604, 1602, 1610, 1609, 1643, 1644, 1797, + + 1786, 1611, 1630, 1800, 1773, 1010, 1606, 1798, 1771, 1795, + 1768, 1640, 1646, 1793, 1766, 1648, 1649, 1614, 1379, 1667, + 1674, 1791, 1764, 1647, 1653, 1793, 0, 1352, 1796, 1791, + 2309, 1790, 0, 1677, 1652, 1789, 0, 1681, 1676, 1480, + 1805, 1685, 1702, 1786, 0, 1682, 1775, 1679, 1774, 1769, + 1696, 1768, 1698, 1688, 1715, 1765, 1706, 1765, 1472, 1763, + 1757, 1714, 1753, 1717, 1719, 1729, 1703, 1722, 1685, 1645, + 1604, 1546, 1726, 1466, 1733, 1635, 1752, 1403, 1739, 1349, + 1725, 1269, 1222, 1740, 1217, 1749, 1758, 1768, 1155, 1755, + 1148, 1481, 1096, 1001, 1761, 866, 1762, 1763, 1792, 834, + + 1768, 0, 742, 2309, 0, 1764, 0, 1778, 678, 1801, + 0, 2309, 1835, 1847, 1859, 1871, 1883, 550, 1892, 1898, + 1907, 1919, 1931, 1939, 1945, 1950, 1956, 1965, 1977, 1989, + 2001, 2013, 2025, 2033, 2039, 2042, 306, 304, 301, 2049, + 213, 2057, 136, 2065, 2073, 2081 } ; -static yyconst flex_int16_t yy_def[832] = +static yyconst flex_int16_t yy_def[847] = { 0, - 797, 1, 797, 3, 798, 798, 799, 799, 797, 9, - 797, 11, 797, 13, 797, 15, 800, 800, 801, 801, - 797, 21, 797, 797, 797, 797, 802, 803, 797, 797, - 797, 797, 797, 804, 804, 804, 804, 804, 804, 804, - 804, 804, 805, 805, 805, 805, 805, 805, 806, 806, - 797, 806, 807, 806, 806, 797, 806, 806, 806, 806, - 806, 806, 806, 797, 808, 797, 797, 802, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 809, - 809, 809, 809, 809, 809, 797, 810, 810, 810, 810, - 810, 810, 797, 811, 811, 811, 811, 811, 811, 797, - - 812, 812, 812, 812, 812, 812, 813, 813, 813, 814, - 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, - 797, 815, 797, 797, 815, 816, 817, 818, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 815, 815, 797, - 819, 819, 819, 819, 819, 819, 819, 802, 797, 820, - 797, 797, 797, 797, 797, 797, 797, 804, 821, 804, - 804, 804, 804, 804, 804, 804, 804, 805, 805, 805, - 805, 805, 805, 806, 797, 806, 797, 807, 802, 806, - 806, 806, 806, 806, 806, 806, 806, 806, 806, 808, - 808, 797, 797, 797, 797, 797, 797, 809, 809, 809, - - 809, 809, 809, 822, 797, 810, 810, 810, 810, 810, - 810, 811, 811, 811, 811, 811, 811, 823, 797, 812, - 812, 812, 812, 812, 812, 813, 797, 814, 797, 813, - 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, - 797, 797, 815, 815, 815, 797, 797, 816, 816, 816, - 817, 817, 817, 818, 818, 818, 815, 815, 815, 815, - 815, 815, 815, 797, 815, 815, 815, 815, 819, 819, - 819, 819, 819, 819, 819, 819, 820, 797, 797, 824, - 821, 797, 804, 804, 804, 804, 804, 804, 804, 804, - 804, 805, 805, 805, 805, 805, 805, 806, 806, 806, - - 806, 806, 806, 806, 806, 797, 797, 797, 797, 797, - 797, 809, 809, 809, 809, 809, 809, 825, 826, 810, - 810, 810, 810, 810, 810, 811, 811, 811, 811, 811, - 811, 827, 828, 812, 812, 812, 812, 812, 812, 813, - 813, 813, 813, 813, 813, 813, 813, 815, 815, 815, - 815, 797, 815, 815, 815, 815, 815, 819, 819, 819, - 819, 819, 819, 819, 819, 797, 797, 829, 804, 804, - 804, 804, 804, 804, 804, 804, 804, 805, 805, 805, - 805, 805, 805, 806, 806, 806, 806, 806, 806, 806, - 797, 797, 797, 797, 797, 797, 809, 809, 809, 809, - - 809, 809, 825, 810, 830, 810, 810, 810, 810, 810, - 810, 811, 811, 811, 811, 811, 811, 827, 812, 831, - 812, 812, 812, 812, 812, 812, 813, 797, 813, 813, - 813, 813, 813, 813, 815, 815, 815, 815, 815, 815, - 815, 819, 819, 819, 819, 819, 819, 819, 819, 829, - 820, 804, 804, 804, 804, 804, 804, 804, 804, 804, - 805, 805, 805, 805, 805, 805, 806, 806, 806, 806, - 806, 806, 797, 797, 797, 797, 797, 797, 809, 809, - 809, 809, 809, 809, 830, 810, 810, 810, 810, 810, - 810, 810, 811, 811, 811, 811, 811, 811, 831, 812, - - 812, 812, 812, 812, 812, 812, 813, 813, 813, 813, - 813, 813, 815, 815, 815, 815, 815, 815, 819, 819, - 819, 819, 819, 819, 819, 819, 804, 804, 804, 804, - 804, 804, 804, 804, 804, 805, 805, 805, 805, 805, - 805, 806, 806, 806, 806, 806, 806, 797, 797, 797, - 797, 797, 797, 809, 809, 809, 809, 809, 809, 810, - 810, 810, 810, 810, 810, 811, 811, 811, 811, 811, - 811, 812, 812, 812, 812, 812, 812, 813, 813, 813, - 813, 813, 813, 815, 815, 815, 815, 815, 815, 819, - 819, 819, 819, 819, 819, 819, 804, 804, 804, 804, - - 804, 804, 804, 805, 805, 805, 805, 805, 805, 806, - 806, 806, 806, 806, 806, 797, 797, 797, 797, 797, - 797, 809, 809, 809, 809, 809, 809, 810, 810, 810, - 810, 810, 810, 811, 811, 811, 811, 811, 811, 812, - 812, 812, 812, 812, 812, 813, 813, 813, 813, 813, - 813, 815, 815, 815, 815, 815, 815, 819, 819, 819, - 819, 819, 819, 804, 804, 804, 805, 805, 806, 806, - 797, 797, 809, 809, 810, 810, 811, 811, 812, 812, - 813, 813, 815, 815, 819, 819, 804, 804, 805, 805, - 806, 806, 797, 797, 809, 809, 810, 810, 811, 811, - - 812, 812, 813, 813, 815, 815, 819, 819, 804, 804, - 805, 805, 806, 806, 797, 797, 809, 809, 810, 810, - 811, 811, 812, 812, 813, 813, 815, 815, 819, 819, - 804, 805, 806, 797, 809, 810, 811, 812, 813, 815, - 819, 804, 805, 806, 797, 809, 810, 811, 812, 813, - 815, 819, 804, 805, 806, 797, 809, 810, 811, 812, - 813, 815, 819, 804, 805, 806, 797, 809, 810, 811, - 812, 813, 815, 819, 804, 805, 806, 797, 809, 810, - 811, 812, 813, 815, 819, 804, 805, 806, 797, 809, - 810, 811, 812, 813, 815, 819, 0, 797, 797, 797, - - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797 + 812, 1, 812, 3, 813, 813, 814, 814, 812, 9, + 812, 11, 812, 13, 812, 15, 815, 815, 816, 816, + 812, 21, 812, 812, 812, 812, 817, 818, 812, 812, + 812, 812, 812, 812, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 820, 820, 820, 820, 820, 820, 821, + 821, 812, 821, 822, 821, 821, 821, 812, 821, 821, + 821, 821, 821, 821, 821, 812, 823, 812, 812, 817, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 824, 824, 824, 824, 824, 824, 812, 825, + 825, 825, 825, 825, 825, 825, 812, 826, 826, 826, + + 826, 826, 826, 812, 827, 827, 827, 827, 827, 827, + 827, 828, 828, 828, 829, 828, 828, 828, 828, 828, + 828, 828, 828, 828, 828, 828, 812, 830, 812, 812, + 830, 831, 832, 833, 830, 830, 830, 830, 830, 830, + 830, 830, 830, 830, 830, 830, 812, 834, 834, 834, + 834, 834, 834, 834, 817, 812, 835, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 819, 836, 819, 819, + 819, 819, 819, 819, 819, 819, 820, 820, 820, 820, + 820, 820, 821, 812, 821, 812, 822, 817, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + + 823, 823, 812, 812, 812, 812, 812, 812, 824, 824, + 824, 824, 824, 824, 837, 812, 825, 825, 825, 825, + 825, 825, 826, 826, 826, 826, 826, 826, 838, 812, + 827, 827, 827, 827, 827, 827, 828, 812, 829, 812, + 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, + 828, 828, 828, 812, 812, 830, 830, 830, 812, 812, + 831, 831, 831, 832, 832, 832, 833, 833, 833, 830, + 830, 830, 830, 830, 830, 830, 830, 830, 812, 830, + 830, 830, 830, 834, 834, 834, 834, 834, 834, 834, + 834, 835, 812, 812, 839, 836, 812, 819, 819, 819, + + 819, 819, 819, 819, 819, 819, 820, 820, 820, 820, + 820, 820, 821, 821, 821, 821, 821, 821, 821, 821, + 812, 812, 812, 812, 812, 812, 824, 824, 824, 824, + 824, 824, 840, 841, 825, 825, 825, 825, 825, 825, + 826, 826, 826, 826, 826, 826, 842, 843, 827, 827, + 827, 827, 827, 827, 828, 828, 828, 828, 828, 828, + 828, 828, 830, 830, 830, 830, 812, 830, 830, 830, + 830, 830, 834, 834, 834, 834, 834, 834, 834, 834, + 812, 812, 844, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 820, 820, 820, 820, 820, 820, 821, 821, + + 821, 821, 821, 821, 821, 812, 812, 812, 812, 812, + 812, 824, 824, 824, 824, 824, 824, 840, 825, 845, + 825, 825, 825, 825, 825, 825, 826, 826, 826, 826, + 826, 826, 842, 827, 846, 827, 827, 827, 827, 827, + 827, 828, 812, 828, 828, 828, 828, 828, 828, 830, + 830, 830, 830, 830, 830, 830, 834, 834, 834, 834, + 834, 834, 834, 834, 844, 835, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 820, 820, 820, 820, 820, + 820, 821, 821, 821, 821, 821, 821, 812, 812, 812, + 812, 812, 812, 824, 824, 824, 824, 824, 824, 845, + + 825, 825, 825, 825, 825, 825, 825, 826, 826, 826, + 826, 826, 826, 846, 827, 827, 827, 827, 827, 827, + 827, 828, 828, 828, 828, 828, 828, 830, 830, 830, + 830, 830, 830, 834, 834, 834, 834, 834, 834, 834, + 834, 819, 819, 819, 819, 819, 819, 819, 819, 819, + 820, 820, 820, 820, 820, 820, 821, 821, 821, 821, + 821, 821, 812, 812, 812, 812, 812, 812, 824, 824, + 824, 824, 824, 824, 825, 825, 825, 825, 825, 825, + 826, 826, 826, 826, 826, 826, 827, 827, 827, 827, + 827, 827, 828, 828, 828, 828, 828, 828, 830, 830, + + 830, 830, 830, 830, 834, 834, 834, 834, 834, 834, + 834, 819, 819, 819, 819, 819, 819, 819, 820, 820, + 820, 820, 820, 820, 821, 821, 821, 821, 821, 821, + 812, 812, 812, 812, 812, 812, 824, 824, 824, 824, + 824, 824, 825, 825, 825, 825, 825, 825, 826, 826, + 826, 826, 826, 826, 827, 827, 827, 827, 827, 827, + 828, 828, 828, 828, 828, 828, 830, 830, 830, 830, + 830, 830, 834, 834, 834, 834, 834, 834, 819, 819, + 819, 820, 820, 821, 821, 812, 812, 824, 824, 825, + 825, 826, 826, 827, 827, 828, 828, 830, 830, 834, + + 834, 819, 819, 820, 820, 821, 821, 812, 812, 824, + 824, 825, 825, 826, 826, 827, 827, 828, 828, 830, + 830, 834, 834, 819, 819, 820, 820, 821, 821, 812, + 812, 824, 824, 825, 825, 826, 826, 827, 827, 828, + 828, 830, 830, 834, 834, 819, 820, 821, 812, 824, + 825, 826, 827, 828, 830, 834, 819, 820, 821, 812, + 824, 825, 826, 827, 828, 830, 834, 819, 820, 821, + 812, 824, 825, 826, 827, 828, 830, 834, 819, 820, + 821, 812, 824, 825, 826, 827, 828, 830, 834, 819, + 820, 821, 812, 824, 825, 826, 827, 828, 830, 834, + + 819, 820, 821, 812, 824, 825, 826, 827, 828, 830, + 834, 0, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812 } ; -static yyconst flex_int16_t yy_nxt[2216] = +static yyconst flex_int16_t yy_nxt[2368] = { 0, 24, 25, 26, 25, 24, 27, 28, 24, 29, 24, - 30, 24, 24, 24, 24, 24, 31, 32, 33, 34, - 34, 35, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 24, 24, 24, 34, 36, 34, 34, 37, - 38, 39, 34, 40, 34, 34, 34, 34, 41, 34, - 42, 34, 34, 34, 34, 34, 24, 24, 24, 25, + 30, 24, 24, 31, 24, 24, 32, 33, 34, 35, + 35, 36, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 24, 24, 24, 35, 37, 35, 35, 38, + 39, 40, 35, 41, 35, 35, 35, 35, 42, 35, + 43, 35, 35, 35, 35, 35, 24, 24, 24, 25, 26, 25, 24, 27, 24, 24, 29, 24, 30, 24, - 24, 24, 24, 24, 31, 32, 33, 43, 43, 44, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 24, 24, 24, 43, 45, 43, 43, 46, 43, 43, - - 43, 47, 43, 43, 43, 43, 43, 43, 48, 43, - 43, 43, 43, 43, 24, 24, 50, 51, 52, 151, - 53, 157, 157, 54, 157, 55, 157, 152, 176, 177, - 157, 56, 57, 58, 175, 157, 59, 157, 183, 149, - 175, 182, 175, 175, 175, 157, 157, 159, 159, 160, - 159, 60, 159, 179, 61, 161, 159, 185, 62, 205, - 162, 159, 175, 159, 188, 63, 50, 51, 52, 175, - 53, 159, 159, 54, 175, 55, 164, 165, 163, 167, - 180, 56, 57, 58, 166, 186, 59, 205, 181, 175, - 184, 191, 192, 187, 151, 175, 205, 219, 189, 210, - - 205, 60, 152, 205, 61, 219, 219, 219, 62, 219, - 227, 227, 207, 230, 227, 63, 65, 66, 67, 227, - 68, 231, 221, 69, 227, 70, 232, 234, 227, 208, - 227, 71, 72, 73, 209, 227, 74, 211, 222, 233, - 223, 227, 227, 225, 271, 235, 272, 224, 238, 241, - 242, 75, 246, 247, 76, 249, 244, 236, 77, 244, - 295, 255, 244, 157, 296, 78, 65, 66, 67, 157, - 68, 244, 237, 69, 244, 70, 157, 244, 175, 157, - 240, 71, 72, 73, 250, 239, 74, 256, 245, 159, - 151, 176, 177, 149, 420, 159, 283, 405, 152, 175, - - 379, 75, 159, 245, 76, 159, 175, 179, 77, 300, - 380, 305, 284, 191, 192, 78, 24, 25, 79, 25, - 24, 27, 24, 24, 29, 24, 30, 24, 24, 24, - 24, 24, 31, 32, 33, 80, 80, 81, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 24, 24, - 24, 80, 82, 80, 80, 83, 80, 80, 80, 84, - 80, 80, 80, 80, 80, 80, 85, 80, 80, 80, - 80, 80, 24, 24, 24, 25, 26, 25, 24, 27, - 86, 24, 29, 24, 30, 24, 24, 87, 87, 24, - 31, 32, 33, 87, 87, 88, 87, 87, 87, 87, - - 87, 87, 87, 87, 87, 87, 24, 24, 24, 87, - 89, 87, 87, 90, 87, 87, 87, 91, 87, 87, - 87, 87, 87, 87, 92, 87, 87, 87, 87, 87, - 24, 24, 24, 25, 93, 25, 24, 27, 24, 24, - 29, 24, 30, 24, 24, 24, 24, 24, 31, 32, - 33, 94, 94, 95, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 24, 24, 24, 94, 96, 94, - 94, 97, 94, 94, 94, 98, 94, 94, 94, 94, - 94, 94, 99, 94, 94, 94, 94, 94, 24, 24, - 24, 25, 26, 25, 24, 27, 100, 24, 29, 24, - - 30, 24, 24, 101, 101, 24, 31, 32, 33, 101, - 101, 102, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 24, 24, 24, 101, 103, 101, 101, 104, - 101, 101, 101, 105, 101, 101, 101, 101, 101, 101, - 106, 101, 101, 101, 101, 101, 24, 24, 108, 109, - 108, 157, 110, 252, 149, 111, 252, 112, 368, 252, - 278, 157, 157, 113, 114, 115, 257, 309, 116, 244, - 175, 310, 244, 227, 258, 157, 244, 159, 244, 244, - 175, 244, 244, 117, 244, 253, 118, 159, 159, 332, - 119, 157, 259, 286, 260, 302, 285, 120, 245, 205, - - 287, 159, 227, 301, 121, 108, 109, 108, 245, 110, - 245, 433, 111, 244, 112, 279, 244, 159, 291, 244, - 113, 114, 115, 244, 175, 116, 244, 244, 244, 244, - 244, 244, 261, 244, 244, 244, 264, 290, 244, 343, - 117, 244, 325, 118, 262, 245, 303, 119, 157, 315, - 304, 265, 205, 316, 120, 245, 205, 263, 205, 245, - 245, 121, 123, 124, 125, 126, 127, 245, 128, 129, - 244, 130, 320, 244, 159, 180, 244, 131, 132, 133, - 288, 298, 134, 181, 289, 244, 219, 219, 244, 321, - 175, 244, 244, 322, 135, 244, 175, 136, 244, 329, - - 137, 205, 245, 330, 138, 219, 334, 219, 219, 266, - 227, 139, 123, 124, 125, 126, 127, 245, 128, 129, - 335, 130, 227, 175, 245, 241, 242, 131, 132, 133, - 267, 268, 134, 323, 230, 227, 299, 324, 318, 337, - 336, 363, 231, 338, 135, 364, 342, 136, 175, 344, - 137, 339, 246, 247, 138, 366, 367, 385, 427, 428, - 390, 139, 24, 25, 140, 25, 24, 27, 24, 24, - 29, 24, 30, 24, 24, 24, 24, 24, 31, 32, - 33, 141, 141, 142, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 24, 24, 24, 141, 143, 144, - - 141, 145, 141, 141, 141, 146, 141, 141, 141, 141, - 141, 141, 147, 141, 141, 141, 141, 141, 24, 24, - 340, 227, 227, 227, 244, 244, 249, 244, 244, 175, - 244, 244, 244, 244, 249, 244, 205, 248, 244, 249, - 252, 149, 278, 252, 252, 149, 252, 252, 252, 348, - 252, 252, 255, 255, 252, 250, 245, 245, 345, 175, - 254, 205, 346, 250, 245, 255, 470, 205, 250, 563, - 347, 349, 253, 205, 244, 341, 253, 244, 256, 256, - 253, 257, 244, 389, 244, 244, 406, 244, 244, 258, - 244, 256, 244, 244, 487, 244, 244, 279, 244, 244, - - 409, 150, 244, 245, 244, 244, 244, 244, 157, 244, - 244, 157, 244, 245, 245, 244, 157, 244, 244, 157, - 244, 244, 245, 244, 245, 157, 350, 244, 175, 351, - 244, 245, 205, 244, 159, 369, 245, 159, 245, 157, - 157, 157, 159, 157, 353, 159, 157, 245, 298, 245, - 175, 159, 392, 205, 355, 354, 219, 388, 356, 245, - 372, 370, 393, 175, 398, 159, 159, 159, 407, 159, - 205, 371, 159, 373, 399, 357, 386, 375, 408, 374, - 384, 367, 376, 413, 219, 219, 387, 410, 377, 219, - 219, 227, 422, 414, 227, 175, 340, 227, 227, 227, - - 366, 367, 423, 299, 421, 244, 349, 244, 244, 244, - 244, 244, 244, 244, 429, 435, 367, 411, 244, 175, - 227, 244, 244, 424, 425, 244, 244, 244, 244, 244, - 244, 436, 244, 244, 430, 219, 426, 245, 245, 245, - 244, 432, 244, 244, 431, 244, 244, 245, 244, 157, - 434, 341, 443, 471, 245, 157, 157, 157, 245, 245, - 175, 350, 444, 437, 157, 157, 157, 157, 205, 175, - 452, 439, 245, 438, 245, 159, 157, 175, 175, 440, - 467, 159, 159, 159, 205, 453, 454, 472, 384, 367, - 159, 159, 159, 159, 441, 205, 205, 468, 469, 205, - - 219, 455, 159, 175, 460, 219, 219, 219, 456, 219, - 458, 219, 457, 227, 488, 490, 227, 459, 427, 428, - 227, 501, 227, 227, 227, 489, 435, 367, 244, 244, - 175, 244, 244, 175, 244, 502, 492, 503, 507, 669, - 491, 175, 244, 542, 157, 244, 506, 205, 244, 713, - 508, 157, 175, 504, 509, 505, 244, 157, 245, 244, - 245, 244, 244, 514, 244, 512, 244, 244, 513, 244, - 159, 511, 244, 510, 245, 244, 157, 159, 244, 157, - 527, 244, 157, 159, 157, 157, 157, 544, 245, 175, - 205, 515, 562, 245, 157, 175, 529, 175, 245, 175, - - 205, 205, 159, 219, 205, 159, 219, 245, 159, 219, - 159, 159, 159, 516, 219, 517, 528, 518, 532, 543, - 159, 533, 545, 531, 546, 530, 534, 560, 219, 547, - 561, 219, 572, 227, 227, 227, 227, 564, 535, 227, - 227, 157, 175, 573, 175, 565, 205, 575, 175, 244, - 244, 574, 244, 244, 788, 244, 244, 766, 244, 157, - 578, 244, 675, 610, 244, 576, 244, 159, 244, 244, - 597, 244, 244, 581, 244, 577, 157, 584, 579, 157, - 582, 245, 245, 244, 580, 159, 244, 157, 583, 244, - 245, 157, 598, 157, 157, 585, 157, 175, 245, 175, - - 245, 175, 159, 205, 587, 159, 175, 175, 586, 205, - 588, 205, 205, 159, 599, 245, 205, 159, 205, 159, - 159, 613, 159, 219, 611, 601, 219, 612, 600, 219, - 603, 615, 589, 219, 219, 219, 629, 227, 628, 602, - 227, 227, 614, 227, 227, 157, 631, 227, 244, 630, - 157, 244, 633, 205, 244, 640, 641, 244, 244, 205, - 244, 244, 632, 244, 244, 157, 664, 642, 643, 645, - 646, 159, 244, 175, 227, 244, 159, 647, 244, 644, - 245, 649, 652, 648, 665, 651, 157, 157, 157, 245, - 245, 159, 157, 244, 650, 653, 244, 244, 676, 244, - - 244, 654, 670, 244, 245, 219, 219, 227, 175, 796, - 175, 655, 159, 159, 159, 205, 244, 682, 159, 244, - 244, 679, 244, 244, 691, 245, 244, 681, 244, 245, - 157, 244, 666, 157, 244, 244, 657, 683, 244, 157, - 244, 244, 175, 244, 656, 680, 244, 244, 245, 698, - 244, 205, 245, 244, 687, 219, 159, 219, 227, 159, - 245, 227, 157, 205, 684, 159, 692, 245, 244, 157, - 175, 244, 245, 688, 244, 697, 205, 244, 219, 245, - 244, 701, 219, 244, 227, 227, 703, 709, 159, 702, - 227, 175, 157, 227, 719, 159, 723, 705, 755, 704, - - 245, 157, 244, 739, 714, 244, 710, 720, 244, 245, - 205, 244, 725, 792, 244, 731, 706, 244, 159, 175, - 750, 219, 157, 733, 736, 727, 724, 159, 205, 175, - 244, 219, 726, 244, 245, 738, 244, 227, 244, 157, - 205, 244, 744, 245, 244, 742, 219, 244, 159, 740, - 244, 747, 157, 244, 749, 205, 753, 758, 761, 227, - 728, 244, 245, 760, 244, 159, 219, 244, 157, 175, - 245, 764, 205, 219, 769, 751, 227, 777, 159, 245, - 157, 244, 772, 762, 244, 771, 775, 244, 205, 244, - 780, 782, 244, 245, 159, 244, 219, 227, 783, 157, - - 790, 244, 786, 789, 244, 773, 159, 244, 244, 787, - 791, 244, 784, 245, 244, 785, 781, 779, 793, 778, - 776, 245, 774, 794, 770, 159, 768, 767, 795, 765, - 763, 759, 757, 245, 756, 754, 752, 748, 746, 745, - 245, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - - 148, 158, 158, 158, 743, 158, 158, 158, 168, 168, - 741, 168, 168, 174, 227, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 190, 190, 190, - 190, 190, 190, 190, 190, 190, 190, 190, 190, 198, - 198, 219, 198, 198, 206, 206, 737, 206, 206, 206, - 212, 212, 205, 212, 212, 220, 220, 735, 220, 220, - 220, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 226, 226, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 243, 734, 243, 243, 243, - - 243, 243, 243, 243, 243, 243, 243, 248, 175, 732, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, - 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, - 251, 254, 730, 729, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 269, 269, 722, 269, 269, 277, 277, - 277, 721, 277, 277, 277, 281, 281, 718, 281, 403, - 403, 717, 403, 403, 716, 715, 403, 418, 418, 712, - 418, 418, 711, 708, 418, 450, 450, 707, 450, 450, - 700, 699, 450, 485, 485, 696, 485, 485, 695, 694, - 485, 499, 499, 693, 499, 499, 690, 689, 499, 686, - - 685, 227, 227, 227, 227, 219, 219, 219, 219, 678, - 677, 205, 205, 205, 205, 674, 673, 672, 671, 175, - 175, 175, 175, 668, 667, 663, 662, 661, 660, 659, - 658, 639, 638, 637, 636, 635, 634, 627, 626, 625, - 624, 623, 622, 621, 620, 619, 618, 617, 616, 609, - 608, 607, 606, 605, 604, 596, 595, 594, 593, 592, - 591, 590, 219, 500, 571, 570, 569, 568, 567, 566, - 205, 486, 559, 558, 557, 556, 555, 554, 553, 552, - 551, 550, 549, 548, 541, 540, 539, 538, 537, 536, - 451, 526, 525, 524, 523, 522, 521, 520, 519, 428, - - 500, 219, 419, 498, 497, 496, 495, 494, 493, 486, - 205, 404, 484, 483, 482, 481, 480, 479, 478, 477, - 476, 475, 474, 473, 466, 465, 464, 463, 462, 461, - 451, 367, 449, 448, 447, 446, 445, 442, 352, 227, - 219, 419, 417, 416, 415, 412, 205, 404, 402, 401, - 400, 397, 396, 395, 394, 391, 175, 383, 382, 381, - 378, 282, 365, 362, 361, 360, 359, 358, 352, 247, - 242, 227, 227, 227, 227, 227, 229, 227, 227, 219, - 333, 331, 328, 327, 326, 205, 319, 317, 314, 313, - 312, 311, 308, 307, 306, 192, 175, 175, 175, 149, - - 175, 297, 294, 293, 292, 282, 280, 149, 276, 275, - 274, 273, 270, 247, 229, 227, 227, 227, 219, 218, - 217, 216, 215, 214, 213, 205, 204, 203, 202, 201, - 200, 199, 197, 196, 195, 194, 193, 156, 155, 154, - 153, 149, 154, 175, 175, 173, 172, 171, 170, 169, - 156, 155, 154, 153, 149, 797, 23, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797 + 24, 31, 24, 24, 32, 33, 34, 44, 44, 45, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 24, 24, 24, 44, 46, 44, 44, 47, 44, 44, + + 44, 48, 44, 44, 44, 44, 44, 44, 49, 44, + 44, 44, 44, 44, 24, 24, 51, 52, 53, 158, + 54, 163, 166, 55, 164, 56, 166, 159, 57, 156, + 166, 58, 59, 60, 166, 166, 61, 166, 185, 186, + 184, 191, 184, 188, 435, 166, 166, 184, 168, 238, + 166, 62, 168, 184, 63, 169, 168, 196, 64, 170, + 168, 168, 238, 168, 173, 65, 51, 52, 53, 171, + 54, 168, 168, 55, 184, 56, 168, 199, 57, 184, + 176, 58, 59, 60, 189, 172, 61, 184, 192, 184, + 174, 249, 190, 252, 175, 184, 195, 193, 198, 184, + + 194, 62, 197, 184, 63, 202, 203, 163, 64, 238, + 164, 158, 238, 200, 262, 65, 67, 68, 69, 159, + 70, 420, 238, 71, 216, 72, 216, 216, 73, 216, + 216, 74, 75, 76, 216, 161, 77, 812, 812, 230, + 812, 812, 216, 263, 230, 812, 230, 251, 230, 250, + 161, 78, 218, 812, 79, 812, 238, 812, 80, 812, + 253, 230, 219, 156, 220, 81, 67, 68, 69, 230, + 70, 232, 812, 71, 221, 72, 222, 188, 73, 230, + 812, 74, 75, 76, 241, 238, 77, 238, 235, 238, + 812, 238, 242, 358, 233, 238, 238, 246, 254, 255, + + 247, 78, 243, 234, 79, 286, 244, 287, 80, 383, + 245, 248, 347, 236, 333, 81, 24, 25, 82, 25, + 24, 27, 24, 24, 29, 24, 30, 24, 24, 31, + 24, 24, 32, 33, 34, 83, 83, 84, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 24, 24, + 24, 83, 85, 83, 83, 86, 83, 83, 83, 87, + 83, 83, 83, 83, 83, 83, 88, 83, 83, 83, + 83, 83, 24, 24, 24, 25, 26, 25, 24, 27, + 89, 24, 29, 24, 30, 24, 24, 90, 91, 24, + 32, 33, 34, 91, 91, 92, 91, 91, 91, 91, + + 91, 91, 91, 91, 91, 91, 24, 24, 24, 91, + 93, 91, 91, 94, 91, 91, 91, 95, 91, 91, + 91, 91, 91, 91, 96, 91, 91, 91, 91, 91, + 24, 24, 24, 25, 97, 25, 24, 27, 24, 24, + 29, 24, 30, 24, 24, 31, 24, 24, 32, 33, + 34, 98, 98, 99, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 24, 24, 24, 98, 100, 98, + 98, 101, 98, 98, 98, 102, 98, 98, 98, 98, + 98, 98, 103, 98, 98, 98, 98, 98, 24, 24, + 24, 25, 26, 25, 24, 27, 104, 24, 29, 24, + + 30, 24, 24, 105, 106, 24, 32, 33, 34, 106, + 106, 107, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 24, 24, 24, 106, 108, 106, 106, 109, + 106, 106, 106, 110, 106, 106, 106, 106, 106, 106, + 111, 106, 106, 106, 106, 106, 24, 24, 113, 114, + 113, 268, 115, 257, 166, 116, 257, 117, 157, 257, + 118, 259, 260, 119, 120, 121, 257, 158, 122, 257, + 265, 156, 257, 265, 166, 159, 265, 269, 185, 186, + 168, 270, 293, 123, 257, 258, 124, 257, 310, 271, + 125, 184, 311, 184, 238, 189, 184, 126, 258, 184, + + 168, 315, 266, 190, 127, 113, 114, 113, 400, 115, + 184, 184, 116, 258, 117, 184, 166, 118, 357, 316, + 119, 120, 121, 257, 257, 122, 257, 257, 257, 257, + 257, 257, 166, 275, 257, 257, 276, 294, 257, 272, + 123, 257, 168, 124, 273, 486, 166, 125, 320, 299, + 184, 274, 298, 238, 126, 258, 258, 166, 168, 184, + 258, 127, 129, 130, 131, 132, 133, 258, 134, 135, + 257, 136, 168, 257, 137, 317, 257, 138, 139, 140, + 238, 300, 141, 168, 166, 257, 277, 216, 257, 238, + 257, 257, 359, 257, 142, 629, 257, 143, 812, 301, + + 144, 184, 258, 257, 145, 166, 257, 268, 166, 257, + 168, 146, 129, 130, 131, 132, 133, 258, 134, 135, + 278, 136, 258, 280, 137, 404, 184, 138, 139, 140, + 305, 168, 141, 269, 168, 258, 202, 203, 254, 255, + 449, 324, 281, 302, 142, 325, 230, 143, 318, 330, + 144, 306, 319, 331, 145, 344, 378, 812, 184, 345, + 379, 146, 24, 25, 147, 25, 24, 27, 24, 24, + 29, 24, 30, 24, 24, 31, 24, 24, 32, 33, + 34, 148, 148, 149, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 24, 24, 24, 148, 150, 151, + + 148, 152, 148, 148, 148, 153, 148, 148, 148, 148, + 148, 148, 154, 148, 148, 148, 148, 148, 24, 24, + 257, 279, 257, 257, 257, 257, 257, 257, 257, 166, + 257, 313, 216, 216, 216, 238, 216, 216, 230, 230, + 230, 355, 238, 812, 812, 812, 184, 812, 812, 812, + 812, 812, 258, 335, 258, 168, 258, 238, 349, 230, + 230, 303, 811, 283, 338, 304, 268, 282, 339, 336, + 812, 812, 337, 350, 351, 241, 238, 340, 257, 259, + 260, 257, 362, 242, 257, 262, 314, 262, 261, 166, + 262, 352, 269, 360, 807, 353, 356, 361, 257, 257, + + 257, 257, 257, 354, 257, 257, 265, 156, 267, 265, + 258, 293, 265, 268, 263, 168, 263, 265, 156, 263, + 265, 265, 363, 265, 265, 238, 270, 265, 184, 257, + 258, 258, 257, 184, 271, 381, 382, 364, 266, 269, + 257, 257, 257, 257, 257, 257, 166, 257, 257, 266, + 522, 257, 216, 266, 257, 487, 257, 257, 258, 257, + 166, 257, 257, 812, 257, 257, 294, 257, 257, 258, + 405, 257, 168, 258, 258, 257, 257, 166, 257, 257, + 166, 257, 257, 258, 257, 166, 168, 257, 258, 166, + 257, 166, 365, 258, 388, 257, 257, 258, 257, 257, + + 366, 257, 257, 168, 384, 166, 168, 258, 258, 166, + 394, 168, 184, 385, 368, 168, 258, 168, 313, 184, + 395, 387, 184, 386, 369, 391, 184, 258, 258, 805, + 389, 168, 370, 184, 728, 168, 371, 399, 382, 390, + 407, 403, 483, 413, 372, 401, 216, 216, 216, 216, + 408, 216, 184, 414, 428, 402, 392, 812, 812, 812, + 812, 230, 812, 230, 429, 421, 230, 230, 230, 238, + 230, 238, 812, 314, 812, 355, 238, 812, 812, 812, + 436, 812, 238, 422, 238, 425, 238, 424, 442, 443, + 458, 257, 444, 423, 257, 364, 426, 257, 257, 437, + + 459, 257, 440, 184, 450, 382, 439, 257, 238, 438, + 257, 445, 257, 257, 482, 257, 257, 441, 257, 257, + 523, 446, 448, 258, 804, 447, 257, 258, 257, 257, + 356, 257, 257, 166, 257, 257, 258, 451, 257, 381, + 382, 257, 166, 257, 258, 258, 257, 166, 184, 257, + 365, 184, 166, 452, 467, 166, 526, 166, 258, 168, + 258, 166, 166, 453, 166, 399, 382, 258, 168, 442, + 443, 484, 454, 168, 455, 258, 802, 468, 168, 800, + 184, 168, 469, 168, 238, 485, 470, 168, 168, 216, + 168, 216, 238, 184, 238, 456, 216, 216, 216, 471, + + 812, 475, 812, 474, 472, 473, 216, 812, 812, 812, + 216, 230, 502, 230, 230, 238, 166, 812, 230, 230, + 230, 812, 812, 558, 812, 812, 503, 504, 230, 812, + 812, 812, 664, 527, 516, 525, 166, 450, 382, 812, + 257, 796, 168, 257, 517, 505, 794, 507, 518, 524, + 506, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 184, 238, 168, 166, 520, 521, 519, 257, 257, 258, + 257, 257, 257, 257, 257, 257, 543, 528, 257, 166, + 166, 166, 166, 258, 258, 258, 542, 529, 530, 168, + 166, 184, 166, 793, 166, 559, 184, 184, 184, 258, + + 258, 184, 216, 684, 258, 168, 168, 168, 168, 557, + 595, 238, 216, 812, 533, 547, 168, 532, 168, 531, + 168, 560, 546, 812, 544, 562, 545, 548, 561, 216, + 216, 216, 549, 216, 216, 575, 230, 230, 550, 230, + 812, 812, 812, 230, 812, 812, 230, 812, 812, 238, + 812, 230, 230, 238, 812, 594, 238, 812, 238, 184, + 587, 166, 812, 812, 578, 166, 184, 166, 184, 576, + 579, 257, 748, 791, 257, 577, 593, 257, 580, 588, + 706, 238, 626, 591, 590, 166, 257, 168, 589, 257, + 596, 168, 257, 168, 612, 257, 592, 597, 257, 599, + + 613, 257, 257, 258, 257, 257, 598, 257, 257, 257, + 257, 168, 257, 166, 184, 257, 166, 166, 258, 216, + 184, 166, 166, 614, 184, 184, 216, 258, 789, 741, + 812, 600, 238, 625, 258, 238, 258, 812, 238, 168, + 602, 258, 168, 168, 628, 601, 603, 168, 168, 630, + 616, 216, 627, 216, 615, 643, 618, 645, 604, 216, + 216, 230, 812, 617, 812, 230, 230, 230, 230, 230, + 812, 812, 812, 238, 663, 662, 812, 812, 812, 812, + 812, 238, 238, 257, 644, 665, 257, 646, 184, 257, + 655, 785, 166, 257, 648, 770, 257, 184, 656, 257, + + 754, 658, 166, 660, 657, 647, 661, 257, 679, 803, + 257, 166, 166, 257, 659, 258, 166, 667, 168, 666, + 257, 257, 166, 257, 257, 258, 257, 257, 168, 257, + 166, 668, 257, 184, 216, 257, 216, 168, 168, 258, + 216, 680, 168, 216, 216, 812, 216, 812, 168, 238, + 669, 812, 258, 258, 812, 812, 168, 812, 681, 670, + 690, 258, 685, 230, 230, 230, 230, 230, 672, 230, + 238, 783, 671, 691, 812, 812, 812, 812, 812, 694, + 812, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 696, 257, 697, 257, 257, 257, 257, 257, 257, 257, + + 184, 257, 698, 695, 166, 166, 166, 216, 230, 216, + 230, 238, 238, 258, 258, 258, 238, 166, 812, 812, + 812, 812, 184, 258, 707, 258, 699, 258, 702, 782, + 168, 168, 168, 712, 716, 724, 166, 238, 740, 703, + 718, 713, 717, 168, 257, 257, 216, 257, 257, 719, + 257, 257, 216, 166, 230, 230, 729, 812, 216, 166, + 787, 184, 168, 812, 734, 812, 812, 746, 257, 812, + 781, 257, 738, 720, 257, 257, 258, 258, 257, 168, + 725, 257, 230, 216, 721, 168, 257, 230, 166, 257, + 238, 742, 257, 812, 812, 184, 735, 751, 812, 739, + + 258, 753, 216, 257, 230, 755, 257, 258, 759, 257, + 780, 757, 166, 812, 168, 812, 257, 765, 258, 257, + 216, 238, 257, 230, 743, 762, 778, 764, 166, 768, + 257, 812, 216, 257, 812, 258, 257, 773, 168, 230, + 775, 184, 776, 812, 766, 166, 216, 779, 258, 792, + 812, 784, 777, 257, 168, 230, 257, 812, 786, 257, + 238, 166, 258, 790, 795, 238, 812, 216, 230, 257, + 216, 168, 257, 797, 166, 257, 774, 788, 812, 812, + 772, 812, 798, 801, 230, 258, 771, 168, 769, 806, + 808, 809, 799, 257, 767, 812, 257, 763, 761, 257, + + 168, 258, 257, 760, 758, 257, 756, 238, 257, 752, + 750, 749, 184, 747, 745, 744, 737, 736, 733, 732, + 810, 731, 730, 727, 726, 258, 723, 722, 715, 714, + 711, 710, 709, 708, 258, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 155, 155, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 167, 167, 167, 705, 167, + + 167, 167, 177, 177, 704, 177, 177, 183, 701, 183, + 183, 183, 183, 183, 183, 183, 183, 183, 183, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 201, 201, 209, 209, 700, 209, 209, 217, 217, + 238, 217, 217, 217, 223, 223, 238, 223, 223, 231, + 231, 238, 231, 231, 231, 237, 237, 237, 237, 237, + 237, 237, 237, 237, 237, 237, 237, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 256, + 238, 256, 256, 256, 256, 256, 256, 256, 256, 256, + + 256, 261, 693, 692, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 264, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 267, 689, 688, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 284, 284, 687, + 284, 284, 292, 292, 292, 686, 292, 292, 292, 296, + 296, 184, 296, 418, 418, 184, 418, 418, 184, 184, + 418, 433, 433, 683, 433, 433, 682, 678, 433, 465, + 465, 677, 465, 465, 676, 675, 465, 500, 500, 674, + 500, 500, 673, 654, 500, 514, 514, 653, 514, 514, + 652, 651, 514, 650, 649, 642, 641, 640, 639, 638, + + 637, 636, 635, 634, 633, 632, 631, 624, 623, 622, + 621, 620, 619, 611, 610, 609, 608, 607, 606, 605, + 515, 586, 585, 584, 583, 582, 581, 501, 574, 573, + 572, 571, 570, 569, 568, 567, 566, 565, 564, 563, + 556, 555, 554, 553, 552, 551, 466, 541, 540, 539, + 538, 537, 536, 535, 534, 443, 515, 434, 513, 512, + 511, 510, 509, 508, 501, 419, 499, 498, 497, 496, + 495, 494, 493, 492, 491, 490, 489, 488, 481, 480, + 479, 478, 477, 476, 466, 382, 464, 463, 462, 461, + 460, 457, 367, 238, 434, 432, 431, 430, 427, 419, + + 417, 416, 415, 412, 411, 410, 409, 406, 184, 398, + 397, 396, 393, 297, 380, 377, 376, 375, 374, 373, + 367, 260, 255, 238, 238, 238, 238, 238, 238, 238, + 240, 238, 238, 348, 346, 343, 342, 341, 334, 332, + 329, 328, 327, 326, 323, 322, 321, 203, 184, 184, + 184, 184, 184, 156, 184, 312, 309, 308, 307, 297, + 295, 156, 291, 290, 289, 288, 285, 260, 240, 238, + 238, 238, 229, 228, 227, 226, 225, 224, 215, 214, + 213, 212, 211, 210, 208, 207, 206, 205, 204, 165, + 162, 161, 160, 156, 162, 184, 184, 182, 181, 180, + + 179, 178, 165, 162, 161, 160, 156, 812, 23, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812 } ; -static yyconst flex_int16_t yy_chk[2216] = +static yyconst flex_int16_t yy_chk[2368] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -953,28 +973,28 @@ static yyconst flex_int16_t yy_chk[2216] = 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 29, - 5, 34, 36, 5, 35, 5, 37, 29, 50, 50, - 38, 5, 5, 5, 62, 41, 5, 40, 57, 53, - 55, 55, 59, 50, 57, 42, 39, 34, 36, 35, - 35, 5, 37, 53, 5, 36, 38, 59, 5, 91, - 37, 41, 60, 40, 62, 5, 6, 6, 6, 61, - 6, 42, 39, 6, 63, 6, 39, 40, 38, 42, - 54, 6, 6, 6, 41, 60, 6, 88, 54, 58, - 58, 65, 65, 61, 69, 54, 89, 102, 63, 91, - - 90, 6, 69, 92, 6, 103, 104, 105, 6, 106, - 118, 112, 88, 111, 111, 6, 7, 7, 7, 114, - 7, 111, 102, 7, 113, 7, 112, 114, 116, 89, - 115, 7, 7, 7, 90, 117, 7, 92, 103, 113, - 104, 119, 120, 106, 143, 115, 143, 105, 118, 121, - 121, 7, 123, 123, 7, 126, 122, 116, 7, 122, - 172, 128, 122, 150, 172, 7, 8, 8, 8, 158, - 8, 125, 117, 8, 125, 8, 160, 125, 189, 161, - 120, 8, 8, 8, 126, 119, 8, 128, 122, 150, - 151, 176, 176, 178, 828, 158, 160, 826, 151, 185, - - 293, 8, 160, 125, 8, 161, 176, 178, 8, 185, - 293, 189, 161, 191, 191, 8, 9, 9, 9, 9, + 5, 33, 35, 5, 33, 5, 37, 29, 5, 54, + 36, 5, 5, 5, 40, 38, 5, 39, 51, 51, + 56, 56, 61, 54, 843, 42, 43, 64, 35, 125, + 41, 5, 37, 51, 5, 36, 36, 61, 5, 37, + 40, 38, 122, 39, 40, 5, 6, 6, 6, 38, + 6, 42, 43, 6, 63, 6, 41, 64, 6, 62, + 43, 6, 6, 6, 55, 39, 6, 57, 57, 65, + 41, 122, 55, 125, 42, 60, 60, 59, 63, 55, + + 59, 6, 62, 59, 6, 67, 67, 75, 6, 124, + 75, 71, 123, 65, 132, 6, 7, 7, 7, 71, + 7, 841, 126, 7, 90, 7, 91, 92, 7, 93, + 94, 7, 7, 7, 95, 90, 7, 91, 92, 105, + 93, 94, 96, 132, 106, 95, 107, 124, 110, 123, + 105, 7, 92, 96, 7, 106, 250, 107, 7, 110, + 126, 108, 93, 187, 94, 7, 8, 8, 8, 109, + 8, 107, 108, 8, 95, 8, 96, 187, 8, 111, + 109, 8, 8, 8, 116, 116, 8, 117, 110, 120, + 111, 118, 116, 250, 108, 119, 121, 120, 127, 127, + + 120, 8, 117, 109, 8, 150, 118, 150, 8, 839, + 119, 121, 838, 111, 837, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -1000,198 +1020,214 @@ static yyconst flex_int16_t yy_chk[2216] = 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 17, - 17, 163, 17, 127, 127, 17, 127, 17, 824, 127, - 152, 162, 164, 17, 17, 17, 129, 196, 17, 129, - 187, 196, 129, 346, 129, 167, 130, 163, 131, 130, - 186, 131, 130, 17, 131, 127, 17, 162, 164, 823, - 17, 166, 130, 163, 131, 187, 162, 17, 129, 211, - - 164, 167, 237, 186, 17, 18, 18, 18, 130, 18, - 131, 346, 18, 136, 18, 152, 136, 166, 167, 136, - 18, 18, 18, 132, 188, 18, 132, 134, 133, 132, - 134, 133, 132, 134, 133, 135, 135, 166, 135, 237, - 18, 135, 211, 18, 133, 136, 188, 18, 165, 202, - 188, 136, 207, 202, 18, 132, 208, 134, 209, 134, - 133, 18, 19, 19, 19, 19, 19, 135, 19, 19, - 137, 19, 207, 137, 165, 180, 137, 19, 19, 19, - 165, 181, 19, 180, 165, 138, 221, 222, 138, 208, - 180, 138, 139, 209, 19, 139, 181, 19, 139, 216, - - 19, 210, 137, 216, 19, 223, 221, 224, 225, 137, - 238, 19, 20, 20, 20, 20, 20, 138, 20, 20, - 222, 20, 236, 305, 139, 241, 241, 20, 20, 20, - 138, 139, 20, 210, 230, 230, 181, 210, 822, 224, - 223, 275, 230, 224, 20, 275, 236, 20, 300, 238, - 20, 225, 246, 246, 20, 279, 279, 300, 341, 341, - 305, 20, 21, 21, 21, 21, 21, 21, 21, 21, + 17, 134, 17, 128, 157, 17, 128, 17, 818, 128, + 17, 129, 129, 17, 17, 17, 131, 158, 17, 131, + 133, 133, 131, 133, 167, 158, 133, 134, 185, 185, + 157, 135, 159, 17, 135, 128, 17, 135, 181, 135, + 17, 196, 181, 185, 249, 189, 197, 17, 131, 315, + + 167, 196, 133, 189, 17, 18, 18, 18, 315, 18, + 189, 404, 18, 135, 18, 200, 170, 18, 249, 197, + 18, 18, 18, 136, 139, 18, 136, 139, 137, 136, + 139, 137, 169, 139, 137, 138, 139, 159, 138, 136, + 18, 138, 170, 18, 137, 404, 171, 18, 200, 170, + 198, 138, 169, 251, 18, 136, 139, 172, 169, 561, + 137, 18, 19, 19, 19, 19, 19, 138, 19, 19, + 140, 19, 171, 140, 19, 198, 140, 19, 19, 19, + 809, 171, 19, 172, 175, 143, 140, 217, 143, 362, + 141, 143, 251, 141, 19, 561, 141, 19, 217, 172, + + 19, 319, 140, 144, 19, 173, 144, 267, 176, 144, + 175, 19, 20, 20, 20, 20, 20, 143, 20, 20, + 141, 20, 141, 143, 20, 319, 199, 20, 20, 20, + 175, 173, 20, 267, 176, 144, 202, 202, 254, 254, + 362, 207, 144, 173, 20, 207, 231, 20, 199, 213, + 20, 176, 199, 213, 20, 227, 290, 231, 803, 227, + 290, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 231, 231, 239, 240, 243, 244, 248, 243, 244, 388, - 243, 244, 245, 245, 249, 245, 490, 250, 245, 250, - 251, 251, 278, 251, 252, 252, 251, 252, 253, 253, - 252, 253, 254, 255, 253, 248, 243, 244, 239, 304, - 256, 323, 239, 249, 245, 256, 388, 320, 250, 490, - 240, 258, 251, 406, 258, 231, 252, 258, 254, 255, - 253, 257, 259, 304, 257, 259, 320, 257, 259, 257, - 260, 256, 261, 260, 406, 261, 260, 278, 261, 262, - - 323, 803, 262, 258, 263, 262, 265, 263, 277, 265, - 263, 285, 265, 257, 259, 266, 283, 267, 266, 286, - 267, 266, 260, 267, 261, 284, 258, 268, 303, 263, - 268, 262, 321, 268, 277, 283, 263, 285, 265, 287, - 288, 291, 283, 289, 265, 286, 290, 266, 298, 267, - 301, 284, 307, 324, 267, 266, 335, 303, 267, 268, - 286, 284, 307, 298, 313, 287, 288, 291, 321, 289, - 325, 284, 290, 287, 313, 268, 301, 289, 321, 288, - 299, 299, 290, 327, 337, 334, 301, 324, 291, 339, - 338, 342, 335, 327, 343, 299, 340, 340, 345, 347, - - 366, 366, 335, 298, 334, 348, 349, 351, 348, 349, - 351, 348, 349, 351, 342, 350, 350, 325, 350, 389, - 794, 350, 353, 337, 338, 353, 354, 355, 353, 354, - 355, 351, 354, 355, 343, 793, 339, 348, 349, 351, - 356, 345, 357, 356, 343, 357, 356, 350, 357, 369, - 347, 340, 359, 389, 353, 370, 371, 372, 354, 355, - 390, 349, 359, 353, 373, 374, 375, 377, 409, 385, - 369, 355, 356, 353, 357, 369, 376, 386, 387, 356, - 385, 370, 371, 372, 407, 370, 371, 390, 384, 384, - 373, 374, 375, 377, 357, 408, 410, 386, 387, 411, - - 421, 372, 376, 384, 377, 422, 424, 423, 373, 426, - 375, 425, 374, 429, 407, 409, 430, 376, 427, 427, - 431, 421, 432, 433, 434, 408, 435, 435, 437, 435, - 467, 437, 435, 610, 437, 422, 411, 423, 429, 610, - 410, 691, 436, 467, 451, 436, 426, 489, 436, 691, - 430, 454, 469, 424, 431, 425, 438, 452, 435, 438, - 437, 439, 438, 437, 439, 434, 440, 439, 436, 440, - 451, 433, 440, 432, 436, 441, 453, 454, 441, 455, - 452, 441, 456, 452, 458, 457, 459, 469, 438, 468, - 488, 438, 489, 439, 460, 472, 454, 471, 440, 470, - - 491, 492, 453, 502, 487, 455, 503, 441, 456, 501, - 458, 457, 459, 439, 504, 440, 453, 441, 457, 468, - 460, 458, 470, 456, 471, 455, 459, 487, 505, 472, - 488, 506, 501, 507, 508, 509, 510, 491, 460, 511, - 512, 527, 777, 502, 542, 492, 628, 504, 755, 513, - 514, 503, 513, 514, 777, 513, 514, 755, 515, 528, - 507, 515, 628, 542, 515, 505, 516, 527, 517, 516, - 527, 517, 516, 510, 517, 506, 529, 513, 508, 530, - 511, 513, 514, 518, 509, 528, 518, 531, 512, 518, - 515, 532, 528, 533, 534, 514, 535, 545, 516, 544, - - 517, 543, 529, 561, 516, 530, 546, 547, 515, 560, - 517, 562, 563, 531, 529, 518, 564, 532, 565, 533, - 534, 545, 535, 573, 543, 532, 572, 544, 531, 574, - 535, 547, 518, 576, 575, 577, 561, 578, 560, 533, - 579, 580, 546, 581, 582, 598, 563, 583, 584, 562, - 597, 584, 565, 791, 584, 572, 573, 585, 586, 629, - 585, 586, 564, 585, 586, 599, 597, 574, 575, 577, - 578, 598, 587, 611, 647, 587, 597, 579, 587, 576, - 584, 581, 584, 580, 598, 583, 600, 601, 602, 585, - 586, 599, 603, 588, 582, 585, 588, 589, 629, 588, - - 589, 586, 611, 589, 587, 640, 641, 646, 788, 785, - 669, 587, 600, 601, 602, 676, 652, 647, 603, 652, - 653, 640, 652, 653, 669, 588, 653, 646, 654, 589, - 664, 654, 600, 666, 654, 655, 589, 652, 655, 665, - 656, 655, 670, 656, 588, 641, 656, 657, 652, 676, - 657, 675, 653, 657, 664, 680, 664, 679, 681, 666, - 654, 682, 688, 698, 653, 665, 670, 655, 683, 687, - 692, 683, 656, 665, 683, 675, 697, 684, 701, 657, - 684, 679, 702, 684, 704, 725, 681, 687, 688, 680, - 703, 744, 710, 739, 697, 687, 701, 683, 744, 682, - - 683, 709, 705, 725, 692, 705, 688, 698, 705, 684, - 719, 706, 703, 781, 706, 709, 684, 706, 710, 713, - 739, 723, 731, 713, 719, 705, 702, 709, 736, 733, - 727, 738, 704, 727, 705, 723, 727, 750, 728, 742, - 747, 728, 733, 706, 728, 731, 749, 740, 731, 727, - 740, 736, 753, 740, 738, 758, 742, 747, 750, 761, - 706, 751, 727, 749, 751, 742, 760, 751, 764, 766, - 728, 753, 769, 771, 758, 740, 772, 766, 753, 740, - 775, 762, 761, 751, 762, 760, 764, 762, 780, 773, - 769, 771, 773, 751, 764, 773, 782, 783, 772, 786, - - 779, 784, 775, 778, 784, 762, 775, 784, 795, 776, - 780, 795, 773, 762, 795, 774, 770, 768, 782, 767, - 765, 773, 763, 783, 759, 786, 757, 756, 784, 754, - 752, 748, 746, 784, 745, 743, 741, 737, 735, 734, - 795, 798, 798, 798, 798, 798, 798, 798, 798, 798, - 798, 798, 798, 799, 799, 799, 799, 799, 799, 799, - 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 801, 801, 801, - 801, 801, 801, 801, 801, 801, 801, 801, 801, 802, - 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, - - 802, 804, 804, 804, 732, 804, 804, 804, 805, 805, - 729, 805, 805, 806, 726, 806, 806, 806, 806, 806, - 806, 806, 806, 806, 806, 807, 807, 807, 807, 807, - 807, 807, 807, 807, 807, 807, 807, 808, 808, 808, - 808, 808, 808, 808, 808, 808, 808, 808, 808, 809, - 809, 724, 809, 809, 810, 810, 721, 810, 810, 810, - 811, 811, 720, 811, 811, 812, 812, 717, 812, 812, - 812, 813, 813, 813, 813, 813, 813, 813, 813, 813, - 813, 813, 813, 814, 814, 814, 814, 814, 814, 814, - 814, 814, 814, 814, 814, 815, 715, 815, 815, 815, - - 815, 815, 815, 815, 815, 815, 815, 816, 714, 711, - 816, 816, 816, 816, 816, 816, 816, 816, 816, 817, - 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, - 817, 818, 708, 707, 818, 818, 818, 818, 818, 818, - 818, 818, 818, 819, 819, 700, 819, 819, 820, 820, - 820, 699, 820, 820, 820, 821, 821, 696, 821, 825, - 825, 695, 825, 825, 694, 693, 825, 827, 827, 690, - 827, 827, 689, 686, 827, 829, 829, 685, 829, 829, - 678, 677, 829, 830, 830, 674, 830, 830, 673, 672, - 830, 831, 831, 671, 831, 831, 668, 667, 831, 659, - - 658, 651, 650, 649, 648, 645, 644, 643, 642, 635, - 634, 633, 632, 631, 630, 623, 622, 617, 616, 615, - 614, 613, 612, 605, 604, 596, 595, 594, 592, 591, - 590, 571, 570, 569, 568, 567, 566, 559, 558, 557, - 556, 555, 554, 553, 552, 551, 550, 549, 548, 541, - 540, 539, 538, 537, 536, 526, 525, 524, 523, 521, - 520, 519, 500, 499, 498, 497, 496, 495, 494, 493, - 486, 485, 484, 483, 482, 481, 480, 479, 478, 477, - 476, 475, 474, 473, 466, 465, 464, 463, 462, 461, - 450, 449, 448, 447, 446, 445, 444, 443, 442, 428, - - 420, 419, 418, 417, 416, 415, 414, 413, 412, 405, - 404, 403, 402, 401, 400, 399, 398, 397, 396, 395, - 394, 393, 392, 391, 383, 382, 381, 380, 379, 378, - 368, 367, 365, 364, 363, 361, 360, 358, 352, 344, - 336, 332, 331, 330, 329, 326, 322, 318, 317, 316, - 315, 312, 311, 310, 309, 306, 302, 297, 296, 295, - 292, 281, 276, 274, 273, 272, 271, 270, 264, 247, - 242, 235, 234, 233, 232, 229, 228, 227, 226, 220, - 219, 217, 215, 214, 213, 206, 205, 203, 201, 200, - 199, 197, 195, 194, 193, 190, 184, 183, 182, 179, - - 174, 173, 171, 170, 169, 159, 157, 148, 147, 146, - 145, 144, 142, 124, 110, 109, 108, 107, 101, 100, - 99, 98, 97, 96, 95, 87, 86, 85, 84, 83, - 82, 81, 78, 77, 76, 75, 74, 73, 72, 71, - 70, 68, 56, 52, 49, 48, 47, 46, 45, 44, - 33, 32, 31, 30, 27, 23, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - - 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, - 797, 797, 797, 797, 797 + 142, 142, 145, 142, 146, 145, 142, 146, 145, 174, + 146, 190, 221, 218, 222, 253, 219, 220, 232, 234, + 233, 242, 242, 221, 218, 222, 190, 219, 220, 232, + 234, 233, 142, 218, 145, 174, 146, 252, 232, 235, + 236, 174, 800, 146, 221, 174, 268, 145, 221, 219, + 235, 236, 220, 233, 234, 241, 241, 222, 256, 259, + 259, 256, 253, 241, 256, 261, 190, 262, 263, 292, + 263, 235, 268, 252, 796, 235, 242, 252, 257, 258, + + 258, 257, 258, 236, 257, 258, 264, 264, 269, 264, + 256, 293, 264, 269, 261, 292, 262, 265, 265, 263, + 265, 266, 266, 265, 266, 444, 270, 266, 405, 270, + 257, 258, 270, 320, 270, 294, 294, 271, 264, 269, + 271, 272, 273, 271, 272, 273, 300, 272, 273, 265, + 444, 274, 337, 266, 274, 405, 275, 274, 270, 275, + 302, 276, 275, 337, 276, 277, 293, 276, 277, 271, + 320, 277, 300, 272, 273, 278, 280, 299, 278, 280, + 301, 278, 280, 274, 281, 298, 302, 281, 275, 305, + 281, 303, 271, 276, 302, 282, 283, 277, 282, 283, + + 278, 282, 283, 299, 298, 304, 301, 278, 280, 306, + 308, 298, 318, 299, 280, 305, 281, 303, 313, 316, + 308, 301, 401, 299, 281, 305, 706, 282, 283, 794, + 303, 304, 282, 313, 706, 306, 282, 314, 314, 304, + 322, 318, 401, 328, 283, 316, 335, 336, 338, 340, + 322, 339, 314, 328, 342, 316, 306, 335, 336, 338, + 340, 349, 339, 350, 342, 335, 351, 352, 353, 357, + 354, 358, 349, 313, 350, 355, 355, 351, 352, 353, + 349, 354, 360, 336, 361, 339, 445, 338, 356, 356, + 374, 363, 357, 336, 363, 364, 340, 363, 364, 350, + + 374, 364, 353, 400, 365, 365, 352, 365, 448, 350, + 365, 358, 368, 366, 400, 368, 366, 354, 368, 366, + 445, 358, 361, 363, 793, 360, 369, 364, 370, 369, + 355, 370, 369, 384, 370, 371, 365, 366, 371, 381, + 381, 371, 387, 372, 368, 366, 372, 385, 403, 372, + 364, 402, 386, 368, 384, 388, 448, 389, 369, 384, + 370, 390, 391, 368, 392, 399, 399, 371, 387, 442, + 442, 402, 370, 385, 371, 372, 791, 385, 386, 789, + 399, 388, 386, 389, 447, 403, 387, 390, 391, 419, + 392, 421, 449, 483, 596, 372, 422, 423, 424, 388, + + 419, 392, 421, 391, 389, 390, 425, 422, 423, 424, + 426, 434, 421, 436, 437, 446, 466, 425, 438, 439, + 440, 426, 434, 483, 436, 437, 422, 423, 441, 438, + 439, 440, 596, 449, 436, 447, 468, 450, 450, 441, + 450, 785, 466, 450, 437, 424, 783, 426, 438, 446, + 425, 451, 452, 453, 451, 452, 453, 451, 452, 453, + 484, 524, 468, 467, 440, 441, 439, 454, 455, 450, + 454, 455, 456, 454, 455, 456, 468, 451, 456, 469, + 470, 471, 472, 451, 452, 453, 467, 452, 453, 467, + 473, 487, 474, 782, 475, 484, 482, 625, 485, 454, + + 455, 486, 501, 625, 456, 469, 470, 471, 472, 482, + 524, 523, 502, 501, 456, 472, 473, 455, 474, 454, + 475, 485, 471, 502, 469, 487, 470, 473, 486, 503, + 504, 505, 474, 506, 507, 502, 515, 516, 475, 517, + 503, 504, 505, 518, 506, 507, 520, 515, 516, 522, + 517, 519, 521, 525, 518, 523, 526, 520, 527, 558, + 516, 545, 519, 521, 505, 542, 684, 543, 728, 503, + 506, 528, 728, 780, 528, 504, 522, 528, 507, 517, + 684, 719, 558, 520, 519, 544, 529, 545, 518, 529, + 525, 542, 529, 543, 542, 530, 521, 526, 530, 528, + + 543, 530, 531, 528, 532, 531, 527, 532, 531, 533, + 532, 544, 533, 546, 557, 533, 547, 548, 529, 577, + 560, 549, 550, 544, 559, 562, 575, 530, 778, 719, + 577, 529, 595, 557, 531, 597, 532, 575, 594, 546, + 531, 533, 547, 548, 560, 530, 532, 549, 550, 562, + 547, 576, 559, 578, 546, 575, 550, 577, 533, 579, + 580, 587, 576, 548, 578, 588, 589, 590, 591, 592, + 579, 580, 587, 593, 595, 594, 588, 589, 590, 591, + 592, 598, 740, 599, 576, 597, 599, 578, 759, 599, + 587, 774, 612, 600, 580, 759, 600, 792, 588, 600, + + 740, 590, 613, 592, 589, 579, 593, 601, 612, 792, + 601, 614, 615, 601, 591, 599, 616, 599, 612, 598, + 602, 603, 617, 602, 603, 600, 602, 603, 613, 604, + 618, 600, 604, 626, 644, 604, 645, 614, 615, 601, + 646, 613, 616, 647, 643, 644, 648, 645, 617, 662, + 601, 646, 602, 603, 647, 643, 618, 648, 615, 602, + 643, 604, 626, 655, 656, 657, 658, 659, 604, 660, + 661, 772, 603, 644, 655, 656, 657, 658, 659, 655, + 660, 667, 668, 669, 667, 668, 669, 667, 668, 669, + 661, 670, 662, 671, 670, 672, 671, 670, 672, 671, + + 685, 672, 667, 656, 679, 680, 681, 691, 695, 690, + 694, 697, 696, 667, 668, 669, 718, 702, 691, 695, + 690, 694, 707, 670, 685, 671, 668, 672, 679, 771, + 679, 680, 681, 690, 694, 702, 703, 776, 718, 680, + 696, 691, 695, 702, 698, 699, 712, 698, 699, 697, + 698, 699, 713, 724, 716, 717, 707, 712, 735, 725, + 776, 770, 703, 713, 712, 716, 717, 724, 720, 735, + 770, 720, 716, 698, 720, 721, 698, 699, 721, 724, + 703, 721, 739, 734, 699, 725, 742, 738, 746, 742, + 754, 720, 742, 739, 734, 748, 713, 734, 738, 717, + + 720, 738, 751, 743, 753, 742, 743, 721, 748, 743, + 769, 746, 757, 751, 746, 753, 755, 754, 742, 755, + 762, 765, 755, 764, 721, 751, 767, 753, 768, 757, + 766, 762, 773, 766, 764, 743, 766, 762, 757, 775, + 764, 781, 765, 773, 755, 779, 784, 768, 755, 781, + 775, 773, 766, 777, 768, 786, 777, 784, 775, 777, + 787, 790, 766, 779, 784, 798, 786, 795, 797, 788, + 806, 779, 788, 786, 801, 788, 763, 777, 795, 797, + 761, 806, 787, 790, 808, 777, 760, 790, 758, 795, + 797, 798, 788, 799, 756, 808, 799, 752, 750, 799, + + 801, 788, 810, 749, 747, 810, 744, 741, 810, 736, + 732, 730, 729, 726, 723, 722, 715, 714, 711, 710, + 799, 709, 708, 705, 704, 799, 701, 700, 693, 692, + 689, 688, 687, 686, 810, 813, 813, 813, 813, 813, + 813, 813, 813, 813, 813, 813, 813, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 815, + 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, + 815, 816, 816, 816, 816, 816, 816, 816, 816, 816, + 816, 816, 816, 817, 817, 817, 817, 817, 817, 817, + 817, 817, 817, 817, 817, 819, 819, 819, 683, 819, + + 819, 819, 820, 820, 682, 820, 820, 821, 674, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 822, + 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, + 822, 823, 823, 823, 823, 823, 823, 823, 823, 823, + 823, 823, 823, 824, 824, 673, 824, 824, 825, 825, + 666, 825, 825, 825, 826, 826, 665, 826, 826, 827, + 827, 664, 827, 827, 827, 828, 828, 828, 828, 828, + 828, 828, 828, 828, 828, 828, 828, 829, 829, 829, + 829, 829, 829, 829, 829, 829, 829, 829, 829, 830, + 663, 830, 830, 830, 830, 830, 830, 830, 830, 830, + + 830, 831, 650, 649, 831, 831, 831, 831, 831, 831, + 831, 831, 831, 832, 832, 832, 832, 832, 832, 832, + 832, 832, 832, 832, 832, 833, 638, 637, 833, 833, + 833, 833, 833, 833, 833, 833, 833, 834, 834, 632, + 834, 834, 835, 835, 835, 631, 835, 835, 835, 836, + 836, 630, 836, 840, 840, 629, 840, 840, 628, 627, + 840, 842, 842, 620, 842, 842, 619, 611, 842, 844, + 844, 610, 844, 844, 609, 607, 844, 845, 845, 606, + 845, 845, 605, 586, 845, 846, 846, 585, 846, 846, + 584, 583, 846, 582, 581, 574, 573, 572, 571, 570, + + 569, 568, 567, 566, 565, 564, 563, 556, 555, 554, + 553, 552, 551, 541, 540, 539, 538, 536, 535, 534, + 514, 513, 512, 511, 510, 509, 508, 500, 499, 498, + 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, + 481, 480, 479, 478, 477, 476, 465, 464, 463, 462, + 461, 460, 459, 458, 457, 443, 435, 433, 432, 431, + 430, 429, 428, 427, 420, 418, 417, 416, 415, 414, + 413, 412, 411, 410, 409, 408, 407, 406, 398, 397, + 396, 395, 394, 393, 383, 382, 380, 379, 378, 376, + 375, 373, 367, 359, 347, 346, 345, 344, 341, 333, + + 332, 331, 330, 327, 326, 325, 324, 321, 317, 312, + 311, 310, 307, 296, 291, 289, 288, 287, 286, 285, + 279, 260, 255, 248, 247, 246, 245, 244, 243, 240, + 239, 238, 237, 230, 228, 226, 225, 224, 216, 214, + 212, 211, 210, 208, 206, 205, 204, 201, 195, 194, + 193, 192, 191, 188, 183, 182, 180, 179, 178, 168, + 166, 155, 154, 153, 152, 151, 149, 130, 115, 114, + 113, 112, 104, 103, 102, 101, 100, 99, 89, 88, + 87, 86, 85, 84, 81, 80, 79, 78, 77, 76, + 74, 73, 72, 70, 58, 53, 50, 49, 48, 47, + + 46, 45, 34, 32, 31, 30, 27, 23, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, + 812, 812, 812, 812, 812, 812, 812 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[46] = +static yyconst flex_int32_t yy_rule_can_match_eol[48] = { 0, -0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, }; +0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -1279,6 +1315,7 @@ extern void bbparseTrace(FILE *TraceFILE, char *zTracePrompt); //static const char* rgbInput; //static size_t cbInput; +extern "C" { int lineError; int errorParse; @@ -1289,6 +1326,8 @@ enum { errorUnsupportedFeature, }; +} + #define YY_EXTRA_TYPE lex_t* /* Read from buffer */ @@ -1312,7 +1351,7 @@ static const char* fixup_escapes (const char* sz); -#line 1316 "<stdout>" +#line 1355 "<stdout>" #define INITIAL 0 #define S_DEF 1 @@ -1326,11 +1365,13 @@ static const char* fixup_escapes (const char* sz); #define S_RVALUE 9 #define S_TASK 10 +#ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include <unistd.h> +#endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * @@ -1370,6 +1411,8 @@ struct yyguts_t }; /* end struct yyguts_t */ +static int yy_init_globals (yyscan_t yyscanner ); + /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ @@ -1541,10 +1584,10 @@ YY_DECL register int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; -#line 159 "bitbakescanner.l" +#line 164 "bitbakescanner.l" -#line 1548 "<stdout>" +#line 1591 "<stdout>" if ( yyg->yy_init ) { @@ -1597,13 +1640,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 798 ) + if ( yy_current_state >= 813 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_current_state != 797 ); + while ( yy_current_state != 812 ); yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; @@ -1637,44 +1680,56 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 161 "bitbakescanner.l" +#line 166 "bitbakescanner.l" { BEGIN S_RVALUE; yyextra->accept (T_OP_APPEND); } YY_BREAK case 2: YY_RULE_SETUP -#line 163 "bitbakescanner.l" +#line 168 "bitbakescanner.l" { BEGIN S_RVALUE; yyextra->accept (T_OP_PREPEND); } YY_BREAK case 3: YY_RULE_SETUP -#line 165 "bitbakescanner.l" +#line 170 "bitbakescanner.l" { BEGIN S_RVALUE; yyextra->accept (T_OP_IMMEDIATE); } YY_BREAK case 4: YY_RULE_SETUP -#line 167 "bitbakescanner.l" +#line 172 "bitbakescanner.l" { BEGIN S_RVALUE; yyextra->accept (T_OP_ASSIGN); } YY_BREAK case 5: YY_RULE_SETUP -#line 169 "bitbakescanner.l" +#line 174 "bitbakescanner.l" { BEGIN S_RVALUE; - yyextra->accept (T_OP_COND); } + yyextra->accept (T_OP_PREDOT); } YY_BREAK case 6: -/* rule 6 can match eol */ YY_RULE_SETUP -#line 172 "bitbakescanner.l" -{ } +#line 176 "bitbakescanner.l" +{ BEGIN S_RVALUE; + yyextra->accept (T_OP_POSTDOT); } YY_BREAK case 7: -/* rule 7 can match eol */ YY_RULE_SETUP -#line 173 "bitbakescanner.l" +#line 178 "bitbakescanner.l" +{ BEGIN S_RVALUE; + yyextra->accept (T_OP_COND); } + YY_BREAK +case 8: +/* rule 8 can match eol */ +YY_RULE_SETUP +#line 181 "bitbakescanner.l" +{ } + YY_BREAK +case 9: +/* rule 9 can match eol */ +YY_RULE_SETUP +#line 182 "bitbakescanner.l" { BEGIN INITIAL; size_t cb = yyleng; while (cb && isspace (yytext[cb - 1])) @@ -1682,10 +1737,10 @@ YY_RULE_SETUP yytext[cb - 1] = 0; yyextra->accept (T_STRING, yytext + 1); } YY_BREAK -case 8: -/* rule 8 can match eol */ +case 10: +/* rule 10 can match eol */ YY_RULE_SETUP -#line 179 "bitbakescanner.l" +#line 188 "bitbakescanner.l" { BEGIN INITIAL; size_t cb = yyleng; while (cb && isspace (yytext[cb - 1])) @@ -1693,208 +1748,208 @@ YY_RULE_SETUP yytext[cb - 1] = 0; yyextra->accept (T_STRING, yytext + 1); } YY_BREAK -case 9: -/* rule 9 can match eol */ +case 11: +/* rule 11 can match eol */ YY_RULE_SETUP -#line 186 "bitbakescanner.l" +#line 195 "bitbakescanner.l" { ERROR (errorUnexpectedInput); } YY_BREAK -case 10: -/* rule 10 can match eol */ +case 12: +/* rule 12 can match eol */ YY_RULE_SETUP -#line 187 "bitbakescanner.l" +#line 196 "bitbakescanner.l" { BEGIN INITIAL; yyextra->accept (T_STRING, NULL); } YY_BREAK -case 11: +case 13: YY_RULE_SETUP -#line 190 "bitbakescanner.l" +#line 199 "bitbakescanner.l" { BEGIN S_INCLUDE; yyextra->accept (T_INCLUDE); } YY_BREAK -case 12: +case 14: YY_RULE_SETUP -#line 192 "bitbakescanner.l" +#line 201 "bitbakescanner.l" { BEGIN S_REQUIRE; yyextra->accept (T_REQUIRE); } YY_BREAK -case 13: +case 15: YY_RULE_SETUP -#line 194 "bitbakescanner.l" +#line 203 "bitbakescanner.l" { BEGIN S_INHERIT; yyextra->accept (T_INHERIT); } YY_BREAK -case 14: +case 16: YY_RULE_SETUP -#line 196 "bitbakescanner.l" +#line 205 "bitbakescanner.l" { BEGIN S_TASK; yyextra->accept (T_ADDTASK); } YY_BREAK -case 15: +case 17: YY_RULE_SETUP -#line 198 "bitbakescanner.l" +#line 207 "bitbakescanner.l" { yyextra->accept (T_ADDHANDLER); } YY_BREAK -case 16: +case 18: YY_RULE_SETUP -#line 199 "bitbakescanner.l" +#line 208 "bitbakescanner.l" { BEGIN S_FUNC; yyextra->accept (T_EXPORT_FUNC); } YY_BREAK -case 17: +case 19: YY_RULE_SETUP -#line 201 "bitbakescanner.l" +#line 210 "bitbakescanner.l" { yyextra->accept (T_BEFORE); } YY_BREAK -case 18: +case 20: YY_RULE_SETUP -#line 202 "bitbakescanner.l" +#line 211 "bitbakescanner.l" { yyextra->accept (T_AFTER); } YY_BREAK -case 19: +case 21: YY_RULE_SETUP -#line 203 "bitbakescanner.l" +#line 212 "bitbakescanner.l" { yyextra->accept (T_EXPORT); } YY_BREAK -case 20: +case 22: YY_RULE_SETUP -#line 205 "bitbakescanner.l" +#line 214 "bitbakescanner.l" { yyextra->accept (T_FAKEROOT); } YY_BREAK -case 21: +case 23: YY_RULE_SETUP -#line 206 "bitbakescanner.l" +#line 215 "bitbakescanner.l" { yyextra->accept (T_PYTHON); } YY_BREAK -case 22: -/* rule 22 can match eol */ +case 24: +/* rule 24 can match eol */ YY_RULE_SETUP -#line 207 "bitbakescanner.l" +#line 216 "bitbakescanner.l" { BEGIN S_PROC; yyextra->accept (T_PROC_OPEN); } YY_BREAK -case 23: -/* rule 23 can match eol */ +case 25: +/* rule 25 can match eol */ YY_RULE_SETUP -#line 209 "bitbakescanner.l" +#line 218 "bitbakescanner.l" { BEGIN INITIAL; yyextra->accept (T_PROC_CLOSE); } YY_BREAK -case 24: -/* rule 24 can match eol */ +case 26: +/* rule 26 can match eol */ YY_RULE_SETUP -#line 211 "bitbakescanner.l" +#line 220 "bitbakescanner.l" { yyextra->accept (T_PROC_BODY, yytext); } YY_BREAK -case 25: +case 27: YY_RULE_SETUP -#line 213 "bitbakescanner.l" +#line 222 "bitbakescanner.l" { BEGIN S_DEF; } YY_BREAK -case 26: +case 28: YY_RULE_SETUP -#line 214 "bitbakescanner.l" +#line 223 "bitbakescanner.l" { BEGIN S_DEF_ARGS; yyextra->accept (T_SYMBOL, yytext); } YY_BREAK -case 27: +case 29: YY_RULE_SETUP -#line 216 "bitbakescanner.l" +#line 225 "bitbakescanner.l" { yyextra->accept (T_DEF_ARGS, yytext); } YY_BREAK -case 28: -/* rule 28 can match eol */ +case 30: +/* rule 30 can match eol */ YY_RULE_SETUP -#line 217 "bitbakescanner.l" +#line 226 "bitbakescanner.l" { BEGIN S_DEF_BODY; } YY_BREAK -case 29: -/* rule 29 can match eol */ +case 31: +/* rule 31 can match eol */ YY_RULE_SETUP -#line 218 "bitbakescanner.l" +#line 227 "bitbakescanner.l" { yyextra->accept (T_DEF_BODY, yytext); } YY_BREAK -case 30: -/* rule 30 can match eol */ +case 32: +/* rule 32 can match eol */ YY_RULE_SETUP -#line 219 "bitbakescanner.l" +#line 228 "bitbakescanner.l" { yyextra->accept (T_DEF_BODY, yytext); } YY_BREAK -case 31: +case 33: YY_RULE_SETUP -#line 220 "bitbakescanner.l" +#line 229 "bitbakescanner.l" { BEGIN INITIAL; unput (yytext[0]); } YY_BREAK -case 32: -/* rule 32 can match eol */ +case 34: +/* rule 34 can match eol */ YY_RULE_SETUP -#line 222 "bitbakescanner.l" +#line 231 "bitbakescanner.l" { } YY_BREAK -case 33: +case 35: YY_RULE_SETUP -#line 224 "bitbakescanner.l" +#line 233 "bitbakescanner.l" { yyextra->accept (T_SYMBOL, yytext); } YY_BREAK -case 34: +case 36: YY_RULE_SETUP -#line 225 "bitbakescanner.l" +#line 234 "bitbakescanner.l" { yyextra->accept (T_VARIABLE, yytext); } YY_BREAK -case 35: +case 37: YY_RULE_SETUP -#line 227 "bitbakescanner.l" +#line 236 "bitbakescanner.l" { yyextra->accept (T_TSYMBOL, yytext); } YY_BREAK -case 36: +case 38: YY_RULE_SETUP -#line 228 "bitbakescanner.l" +#line 237 "bitbakescanner.l" { yyextra->accept (T_FSYMBOL, yytext); } YY_BREAK -case 37: +case 39: YY_RULE_SETUP -#line 229 "bitbakescanner.l" +#line 238 "bitbakescanner.l" { yyextra->accept (T_ISYMBOL, yytext); } YY_BREAK -case 38: +case 40: YY_RULE_SETUP -#line 230 "bitbakescanner.l" +#line 239 "bitbakescanner.l" { BEGIN INITIAL; yyextra->accept (T_ISYMBOL, yytext); } YY_BREAK -case 39: +case 41: YY_RULE_SETUP -#line 232 "bitbakescanner.l" +#line 241 "bitbakescanner.l" { BEGIN INITIAL; yyextra->accept (T_ISYMBOL, yytext); } YY_BREAK -case 40: -/* rule 40 can match eol */ +case 42: +/* rule 42 can match eol */ YY_RULE_SETUP -#line 234 "bitbakescanner.l" +#line 243 "bitbakescanner.l" { BEGIN INITIAL; } YY_BREAK -case 41: -/* rule 41 can match eol */ +case 43: +/* rule 43 can match eol */ YY_RULE_SETUP -#line 235 "bitbakescanner.l" +#line 244 "bitbakescanner.l" { BEGIN INITIAL; } YY_BREAK -case 42: -/* rule 42 can match eol */ +case 44: +/* rule 44 can match eol */ YY_RULE_SETUP -#line 236 "bitbakescanner.l" +#line 245 "bitbakescanner.l" { BEGIN INITIAL; } YY_BREAK -case 43: -/* rule 43 can match eol */ +case 45: +/* rule 45 can match eol */ YY_RULE_SETUP -#line 238 "bitbakescanner.l" +#line 247 "bitbakescanner.l" /* Insignificant whitespace */ YY_BREAK -case 44: +case 46: YY_RULE_SETUP -#line 240 "bitbakescanner.l" +#line 249 "bitbakescanner.l" { ERROR (errorUnexpectedInput); } YY_BREAK /* Check for premature termination */ @@ -1909,15 +1964,15 @@ case YY_STATE_EOF(S_REQUIRE): case YY_STATE_EOF(S_PROC): case YY_STATE_EOF(S_RVALUE): case YY_STATE_EOF(S_TASK): -#line 243 "bitbakescanner.l" +#line 252 "bitbakescanner.l" { return T_EOF; } YY_BREAK -case 45: +case 47: YY_RULE_SETUP -#line 245 "bitbakescanner.l" +#line 254 "bitbakescanner.l" ECHO; YY_BREAK -#line 1921 "<stdout>" +#line 1976 "<stdout>" case YY_END_OF_BUFFER: { @@ -2103,7 +2158,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) else { - size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) @@ -2202,7 +2257,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 798 ) + if ( yy_current_state >= 813 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -2231,11 +2286,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 798 ) + if ( yy_current_state >= 813 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 797); + yy_is_jam = (yy_current_state == 812); return yy_is_jam ? 0 : yy_current_state; } @@ -2675,10 +2730,10 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (yyconst char * str , yyscan_t yyscanner) +YY_BUFFER_STATE yy_scan_string (yyconst char * yy_str , yyscan_t yyscanner) { - return yy_scan_bytes(str,strlen(str) ,yyscanner); + return yy_scan_bytes(yy_str,strlen(yy_str) ,yyscanner); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will @@ -3077,7 +3132,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) #undef YY_DECL_IS_OURS #undef YY_DECL #endif -#line 245 "bitbakescanner.l" +#line 254 "bitbakescanner.l" @@ -3091,36 +3146,56 @@ void lex_t::accept (int token, const char* sz) parse (parser, token, t, this); } -int lex_t::line ()const +void lex_t::input (char *buf, int *result, int max_size) { - return yyget_lineno (scanner); + printf("lex_t::input %p %d\n", buf, max_size); + *result = fread(buf, 1, max_size, file); + printf("lex_t::input result %d\n", *result); } -void parse (FILE* file, PyObject* data) +int lex_t::line ()const { - void* parser = bbparseAlloc (malloc); - yyscan_t scanner; - lex_t lex; - - yylex_init (&scanner); - - lex.parser = parser; - lex.scanner = scanner; - lex.file = file; - lex.data = data; - lex.parse = bbparse; - yyset_extra (&lex, scanner); - + printf("lex_t::line\n"); + return yyget_lineno (scanner); +} - int result = yylex (scanner); - lex.accept (0); - bbparseTrace (NULL, NULL); +extern "C" { - if (result != T_EOF) - printf ("premature end of file\n"); + void parse (FILE* file, PyObject* data) + { + printf("parse bbparseAlloc\n"); + void* parser = bbparseAlloc (malloc); + yyscan_t scanner; + lex_t lex; + + printf("parse yylex_init\n"); + yylex_init (&scanner); + + lex.parser = parser; + lex.scanner = scanner; + lex.file = file; + lex.data = data; + lex.parse = bbparse; + printf("parse yyset_extra\n"); + yyset_extra (&lex, scanner); + + printf("parse yylex\n"); + int result = yylex (scanner); + + printf("parse result %d\n", result); + + lex.accept (0); + printf("parse lex.accept\n"); + bbparseTrace (NULL, NULL); + printf("parse bbparseTrace\n"); + + if (result != T_EOF) + printf ("premature end of file\n"); + + yylex_destroy (scanner); + bbparseFree (parser, free); + } - yylex_destroy (scanner); - bbparseFree (parser, free); } diff --git a/bitbake/lib/bb/parse/parse_c/bitbakescanner.l b/bitbake/lib/bb/parse/parse_c/bitbakescanner.l index 782bc57a0..f69a7325c 100644 --- a/bitbake/lib/bb/parse/parse_c/bitbakescanner.l +++ b/bitbake/lib/bb/parse/parse_c/bitbakescanner.l @@ -83,6 +83,7 @@ extern void bbparseTrace(FILE *TraceFILE, char *zTracePrompt); //static const char* rgbInput; //static size_t cbInput; +extern "C" { int lineError; int errorParse; @@ -93,6 +94,8 @@ enum { errorUnsupportedFeature, }; +} + #define YY_EXTRA_TYPE lex_t* /* Read from buffer */ @@ -112,6 +115,8 @@ static const char* fixup_escapes (const char* sz); C_SP [ \t] COMMENT #.*\n OP_ASSIGN "=" +OP_PREDOT ".=" +OP_POSTDOT "=." OP_IMMEDIATE ":=" OP_PREPEND "=+" OP_APPEND "+=" @@ -166,6 +171,10 @@ PROC \({C_SP}*\) yyextra->accept (T_OP_IMMEDIATE); } {OP_ASSIGN} { BEGIN S_RVALUE; yyextra->accept (T_OP_ASSIGN); } +{OP_PREDOT} { BEGIN S_RVALUE; + yyextra->accept (T_OP_PREDOT); } +{OP_POSTDOT} { BEGIN S_RVALUE; + yyextra->accept (T_OP_POSTDOT); } {OP_COND} { BEGIN S_RVALUE; yyextra->accept (T_OP_COND); } @@ -254,35 +263,55 @@ void lex_t::accept (int token, const char* sz) parse (parser, token, t, this); } +void lex_t::input (char *buf, int *result, int max_size) +{ + printf("lex_t::input %p %d\n", buf, max_size); + *result = fread(buf, 1, max_size, file); + printf("lex_t::input result %d\n", *result); +} + int lex_t::line ()const { + printf("lex_t::line\n"); return yyget_lineno (scanner); } -void parse (FILE* file, PyObject* data) -{ - void* parser = bbparseAlloc (malloc); - yyscan_t scanner; - lex_t lex; - yylex_init (&scanner); +extern "C" { + + void parse (FILE* file, PyObject* data) + { + printf("parse bbparseAlloc\n"); + void* parser = bbparseAlloc (malloc); + yyscan_t scanner; + lex_t lex; + + printf("parse yylex_init\n"); + yylex_init (&scanner); - lex.parser = parser; - lex.scanner = scanner; - lex.file = file; - lex.data = data; - lex.parse = bbparse; - yyset_extra (&lex, scanner); + lex.parser = parser; + lex.scanner = scanner; + lex.file = file; + lex.data = data; + lex.parse = bbparse; + printf("parse yyset_extra\n"); + yyset_extra (&lex, scanner); + printf("parse yylex\n"); + int result = yylex (scanner); + + printf("parse result %d\n", result); - int result = yylex (scanner); + lex.accept (0); + printf("parse lex.accept\n"); + bbparseTrace (NULL, NULL); + printf("parse bbparseTrace\n"); - lex.accept (0); - bbparseTrace (NULL, NULL); + if (result != T_EOF) + printf ("premature end of file\n"); - if (result != T_EOF) - printf ("premature end of file\n"); + yylex_destroy (scanner); + bbparseFree (parser, free); + } - yylex_destroy (scanner); - bbparseFree (parser, free); } diff --git a/bitbake/lib/bb/parse/parse_c/lexer.h b/bitbake/lib/bb/parse/parse_c/lexer.h index 0a985edf2..651f3a861 100644 --- a/bitbake/lib/bb/parse/parse_c/lexer.h +++ b/bitbake/lib/bb/parse/parse_c/lexer.h @@ -24,30 +24,23 @@ THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef LEXER_H #define LEXER_H -/* - * The PyObject Token. Likely to be - * a bb.data implementation - */ -struct PyObject; - - -/** - * This is used by the Parser and Scanner - * of BitBake. - * The implementation and creation is done - * in the scanner. - */ +#include "Python.h" + +extern "C" { + struct lex_t { - void *parser; - void *scanner; - FILE *file; + void* parser; + void* scanner; + FILE* file; PyObject *data; + void* (*parse)(void*, int, token_t, lex_t*); - void accept(int token, const char* string = 0); + void accept(int token, const char* sz = NULL); void input(char *buf, int *result, int max_size); int line()const; }; +} #endif diff --git a/bitbake/lib/bb/parse/parse_c/lexerc.h b/bitbake/lib/bb/parse/parse_c/lexerc.h new file mode 100644 index 000000000..0163a7d63 --- /dev/null +++ b/bitbake/lib/bb/parse/parse_c/lexerc.h @@ -0,0 +1,17 @@ + +#ifndef LEXERC_H +#define LEXERC_H + +#include <stdio.h> + +extern int lineError; +extern int errorParse; + +typedef struct { + void *parser; + void *scanner; + FILE *file; + PyObject *data; +} lex_t; + +#endif diff --git a/bitbake/lib/bb/parse/parse_c/python_output.h b/bitbake/lib/bb/parse/parse_c/python_output.h index de7544cc9..bf34527c0 100644 --- a/bitbake/lib/bb/parse/parse_c/python_output.h +++ b/bitbake/lib/bb/parse/parse_c/python_output.h @@ -27,15 +27,19 @@ This is the glue: */ +extern "C" { + struct lex_t; extern void e_assign(lex_t*, const char*, const char*); extern void e_export(lex_t*, const char*); extern void e_immediate(lex_t*, const char*, const char*); extern void e_cond(lex_t*, const char*, const char*); -extern void e_assign(lex_t*, const char*, const char*); extern void e_prepend(lex_t*, const char*, const char*); extern void e_append(lex_t*, const char*, const char*); +extern void e_precat(lex_t*, const char*, const char*); +extern void e_postcat(lex_t*, const char*, const char*); + extern void e_addtask(lex_t*, const char*, const char*, const char*); extern void e_addhandler(lex_t*,const char*); extern void e_export_func(lex_t*, const char*); @@ -48,4 +52,5 @@ extern void e_proc_fakeroot(lex_t*, const char*, const char*); extern void e_def(lex_t*, const char*, const char*, const char*); extern void e_parse_error(lex_t*); +} #endif // PYTHON_OUTPUT_H diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py index 422ce6f9e..c82090fec 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py @@ -21,9 +21,9 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.""" -import re, bb, os, sys +import re, bb, os, sys, time import bb.fetch, bb.build, bb.utils -from bb import debug, data, fetch, fatal +from bb import debug, data, fetch, fatal, methodpool from ConfHandler import include, localpath, obtain, init from bb.parse import ParseError @@ -44,6 +44,8 @@ __bbpath_found__ = 0 __classname__ = "" classes = [ None, ] +__parsed_methods__ = methodpool.get_parsed_dict() + def supports(fn, d): localfn = localpath(fn, d) return localfn[-3:] == ".bb" or localfn[-8:] == ".bbclass" or localfn[-4:] == ".inc" @@ -78,6 +80,7 @@ def handle(fn, d, include = 0): debug(2, "BB " + fn + ": handle(data, include)") (root, ext) = os.path.splitext(os.path.basename(fn)) + base_name = "%s%s" % (root,ext) init(d) if ext == ".bbclass": @@ -126,10 +129,10 @@ def handle(fn, d, include = 0): s = f.readline() if not s: break s = s.rstrip() - feeder(lineno, s, fn, d) + feeder(lineno, s, fn, base_name, d) if __inpython__: # add a blank line to close out any python definition - feeder(lineno + 1, "", fn, d) + feeder(lineno + 1, "", fn, base_name, d) if ext == ".bbclass": classes.remove(__classname__) else: @@ -156,9 +159,15 @@ def handle(fn, d, include = 0): set_additional_vars(fn, d, include) data.update_data(d) + all_handlers = {} for var in data.keys(d): + # try to add the handler + # if we added it remember the choiche if data.getVarFlag(var, 'handler', d): - bb.event.register(data.getVar(var, d)) + handler = data.getVar(var,d) + if bb.event.register(var,handler) == bb.event.Registered: + all_handlers[var] = handler + continue if not data.getVarFlag(var, 'task', d): @@ -172,12 +181,22 @@ def handle(fn, d, include = 0): pdeps.append(var) data.setVarFlag(p, 'deps', pdeps, d) bb.build.add_task(p, pdeps, d) + + # now add the handlers + if not len(all_handlers) == 0: + data.setVar('__all_handlers__', all_handlers, d) + bbpath.pop(0) if oldfile: bb.data.setVar("FILE", oldfile, d) + + # we have parsed the bb class now + if ext == ".bbclass" or ext == ".inc": + __parsed_methods__[base_name] = 1 + return d -def feeder(lineno, s, fn, d): +def feeder(lineno, s, fn, root, d): global __func_start_regexp__, __inherit_regexp__, __export_func_regexp__, __addtask_regexp__, __addhandler_regexp__, __def_regexp__, __python_func_regexp__, __inpython__,__infunc__, __body__, __bbpath_found__, classes, bb, __residue__ if __infunc__: if s == '}': @@ -205,13 +224,22 @@ def feeder(lineno, s, fn, d): __body__.append(s) return else: - text = '\n'.join(__body__) - comp = bb.utils.better_compile(text, "<bb>", fn ) - bb.utils.better_exec(comp, __builtins__, text, fn) + # Note we will add root to parsedmethods after having parse + # 'this' file. This means we will not parse methods from + # bb classes twice + if not root in __parsed_methods__: + text = '\n'.join(__body__) + methodpool.insert_method( root, text, fn ) + funcs = data.getVar('__functions__', d) or {} + if not funcs.has_key( root ): + funcs[root] = text + else: + funcs[root] = "%s\n%s" % (funcs[root], text) + + data.setVar('__functions__', funcs, d) __body__ = [] __inpython__ = False - funcs = data.getVar('__functions__', d) or "" - data.setVar('__functions__', "%s\n%s" % (funcs, text), d) + # fall through if s == '' or s[0] == '#': return # skip comments and empty lines diff --git a/bitbake/lib/bb/shell.py b/bitbake/lib/bb/shell.py index b86dc9753..93ad00d1e 100644 --- a/bitbake/lib/bb/shell.py +++ b/bitbake/lib/bb/shell.py @@ -3,7 +3,8 @@ # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- ########################################################################## # -# Copyright (C) 2005 Michael 'Mickey' Lauer <mickey@Vanille.de>, Vanille Media +# Copyright (C) 2005-2006 Michael 'Mickey' Lauer <mickey@Vanille.de> +# Copyright (C) 2005-2006 Vanille Media # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software @@ -59,7 +60,7 @@ import sys, os, imp, readline, socket, httplib, urllib, commands, popen2, copy, imp.load_source( "bitbake", os.path.dirname( sys.argv[0] )+"/bitbake" ) from bb import data, parse, build, fatal -__version__ = "0.5.3" +__version__ = "0.5.3.1" __credits__ = """BitBake Shell Version %s (C) 2005 Michael 'Mickey' Lauer <mickey@Vanille.de> Type 'help' for more information, press CTRL-D to exit.""" % __version__ @@ -263,9 +264,10 @@ class BitBakeShellCommands: bbfile = params[0] print "SHELL: Parsing '%s'" % bbfile parse.update_mtime( bbfile ) - bb_data, fromCache = cooker.load_bbfile( bbfile ) - cooker.pkgdata[bbfile] = bb_data - if fromCache: + cooker.bb_cache.cacheValidUpdate(bbfile) + fromCache = cooker.bb_cache.loadData(bbfile, cooker) + cooker.bb_cache.sync() + if False: #from Cache print "SHELL: File has not been updated, not reparsing" else: print "SHELL: Parsed" @@ -307,7 +309,7 @@ class BitBakeShellCommands: what, globexpr = params if what == "files": self._checkParsed() - for key in globfilter( cooker.pkgdata.keys(), globexpr ): print key + for key in globfilter( cooker.status.pkg_fn.keys(), globexpr ): print key elif what == "providers": self._checkParsed() for key in globfilter( cooker.status.pkg_pn.keys(), globexpr ): print key @@ -374,7 +376,7 @@ SRC_URI = "" pasteBin.usage = "<index>" def pasteLog( self, params ): - """Send the last event exception error log (if there is one) to http://pastebin.com""" + """Send the last event exception error log (if there is one) to http://oe.pastebin.com""" if last_exception is None: print "SHELL: No Errors yet (Phew)..." else: @@ -432,7 +434,8 @@ SRC_URI = "" name, var = params bbfile = self._findProvider( name ) if bbfile is not None: - value = cooker.pkgdata[bbfile].getVar( var, 1 ) + the_data = cooker.bb_cache.loadDataFull(bbfile, cooker) + value = the_data.getVar( var, 1 ) print value else: print "ERROR: Nothing provides '%s'" % name @@ -442,13 +445,14 @@ SRC_URI = "" """Set contents of variable defined in providee's metadata""" name, var, value = params bbfile = self._findProvider( name ) - d = cooker.pkgdata[bbfile] if bbfile is not None: - data.setVar( var, value, d ) + print "ERROR: Sorry, this functionality is currently broken" + #d = cooker.pkgdata[bbfile] + #data.setVar( var, value, d ) # mark the change semi persistant - cooker.pkgdata.setDirty(bbfile, d) - print "OK" + #cooker.pkgdata.setDirty(bbfile, d) + #print "OK" else: print "ERROR: Nothing provides '%s'" % name poke.usage = "<providee> <variable> <value>" @@ -458,7 +462,7 @@ SRC_URI = "" what = params[0] if what == "files": self._checkParsed() - for key in cooker.pkgdata.keys(): print key + for key in cooker.status.pkg_fn.keys(): print key elif what == "providers": self._checkParsed() for key in cooker.status.providers.keys(): print key @@ -555,14 +559,14 @@ SRC_URI = "" def completeFilePath( bbfile ): """Get the complete bbfile path""" - if not cooker.pkgdata: return bbfile - for key in cooker.pkgdata.keys(): + if not cooker.status.pkg_fn: return bbfile + for key in cooker.status.pkg_fn.keys(): if key.endswith( bbfile ): return key return bbfile def sendToPastebin( content ): - """Send content to http://www.pastebin.com""" + """Send content to http://oe.pastebin.com""" mydata = {} mydata["parent_pid"] = "" mydata["format"] = "bash" @@ -572,7 +576,7 @@ def sendToPastebin( content ): params = urllib.urlencode( mydata ) headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"} - conn = httplib.HTTPConnection( "pastebin.com:80" ) + conn = httplib.HTTPConnection( "oe.pastebin.com:80" ) conn.request("POST", "/", params, headers ) response = conn.getresponse() @@ -594,10 +598,10 @@ def completer( text, state ): if u == "<variable>": allmatches = cooker.configuration.data.keys() elif u == "<bbfile>": - if cooker.pkgdata is None: allmatches = [ "(No Matches Available. Parsed yet?)" ] - else: allmatches = [ x.split("/")[-1] for x in cooker.pkgdata.keys() ] + if cooker.status.pkg_fn is None: allmatches = [ "(No Matches Available. Parsed yet?)" ] + else: allmatches = [ x.split("/")[-1] for x in cooker.status.pkg_fn.keys() ] elif u == "<providee>": - if cooker.pkgdata is None: allmatches = [ "(No Matches Available. Parsed yet?)" ] + if cooker.status.pkg_fn is None: allmatches = [ "(No Matches Available. Parsed yet?)" ] else: allmatches = cooker.status.providers.iterkeys() else: allmatches = [ "(No tab completion available for this command)" ] else: allmatches = [ "(No tab completion available for this command)" ] |