]> code.ossystems Code Review - openembedded-core.git/commitdiff
Update to bitbake 1.4.2 (latest stable branch release). This includes the caching...
authorRichard Purdie <richard@openedhand.com>
Tue, 9 May 2006 15:44:08 +0000 (15:44 +0000)
committerRichard Purdie <richard@openedhand.com>
Tue, 9 May 2006 15:44:08 +0000 (15:44 +0000)
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@371 311d38ba-8fff-0310-9ca6-ca027cbcb966

28 files changed:
bitbake/AUTHORS
bitbake/ChangeLog
bitbake/MANIFEST
bitbake/bin/bitbake
bitbake/bin/bitbakec [deleted file]
bitbake/conf/bitbake.conf
bitbake/lib/bb/__init__.py
bitbake/lib/bb/cache.py [new file with mode: 0644]
bitbake/lib/bb/data.py
bitbake/lib/bb/data_smart.py
bitbake/lib/bb/event.py
bitbake/lib/bb/fetch/__init__.py
bitbake/lib/bb/fetch/git.py
bitbake/lib/bb/methodpool.py [new file with mode: 0644]
bitbake/lib/bb/parse/__init__.py
bitbake/lib/bb/parse/parse_c/BBHandler.py
bitbake/lib/bb/parse/parse_c/Makefile [new file with mode: 0644]
bitbake/lib/bb/parse/parse_c/bitbakec.pyx [new file with mode: 0644]
bitbake/lib/bb/parse/parse_c/bitbakeparser.cc
bitbake/lib/bb/parse/parse_c/bitbakeparser.h
bitbake/lib/bb/parse/parse_c/bitbakeparser.y
bitbake/lib/bb/parse/parse_c/bitbakescanner.cc
bitbake/lib/bb/parse/parse_c/bitbakescanner.l
bitbake/lib/bb/parse/parse_c/lexer.h
bitbake/lib/bb/parse/parse_c/lexerc.h [new file with mode: 0644]
bitbake/lib/bb/parse/parse_c/python_output.h
bitbake/lib/bb/parse/parse_py/BBHandler.py
bitbake/lib/bb/shell.py

index 4129e4c523922afe3b10323fad256cfb1ac09e0e..ef119cce22eadbffc9c5e15e4591a55b4f6c2a8e 100644 (file)
@@ -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>
index 3dfba1ed8169312517f7bbdd005ce22ff7dce89e..93cc45aaf4a596ef489e25b4c9174cce3a0b4030 100644 (file)
@@ -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
index 14a21d7bf4214120f916e043d076f6264214a498..5823cd070720c77d60af44ee266444e6f465463d 100644 (file)
@@ -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
index 457fbb75272c201fd84b7b1b20cb30cca24a6a4b..10cf4bd00a0ef9986202170b7fb8e60c89d10a22 100755 (executable)
 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
deleted file mode 100644 (file)
index db6a160..0000000
Binary files a/bitbake/bin/bitbakec and /dev/null differ
index fd216a32613df6435dac9c0731885ffea5f1f238..d288fee78fa0a1cdabaf953b58944eddf293e339 100644 (file)
@@ -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}"
index c6c0beb792c128ef81a9a2c71745bb745c4cfdf5..c3e7a1665810b96555b222d954ce18edd923c7bb 100644 (file)
@@ -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 (file)
index 0000000..921a9f7
--- /dev/null
@@ -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)
+
index 56ee977f66e95bd78aaf41e43f6d959be1fe0c17..55d1cc90531ff6922c39990c83f0f7631448ed32 100644 (file)
@@ -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 ""
index 52f391dec1b63c7795efe165f737b7feb9646ba5..fbd4167fe4a5594d2bd80fd68c97e3411d5e1a4e 100644 (file)
@@ -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
index cbe6d2a11abe9e47d5e009c0d7752caac0d3091c..b1d12177c4c167e87fabe54cf2d2e5f73726275c 100644 (file)
@@ -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"""
index 0515f2a5e9ec782fc164a429e228df35be3468ac..ac698a0d1c6e379fef9543b676d33c78cefe92f5 100644 (file)
@@ -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:
index f30ae2360aef8ff0a571774e635492722ffcd234..49235c141e1624cb9f464483ec22f46b0f3fbb7e 100644 (file)
@@ -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 (file)
index 0000000..d7434ed
--- /dev/null
@@ -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    
index cb2741606180ecd389798b2e0a89a4771a6b495b..58e17d154ad998139d8682795a2f39fb73f13dee 100644 (file)
@@ -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"""
index 300871d9e32a2587f0ccddc682fd711ffe37d20c..d9f48db17bb43855537af881335d1fbd36854bb7 100644 (file)
@@ -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 (file)
index 0000000..9eb7ce9
--- /dev/null
@@ -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 (file)
index 0000000..362cc20
--- /dev/null
@@ -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.")
+
index 3a3c53dd469198e488d9c56b126fe7fef65d9b21..ee9a901b70e5ad0221570527360154d91a4adeb1 100644 (file)
 **                       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 */
 }
 
index 2e51702be87d5431318ecf6f605209460fca9839..a2c9aa367d190941407650a6808abaf26782be3f 100644 (file)
@@ -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
index 252d87792f67c4f6ff7d3f2419d300689832b2cd..c18e53543b74eb0bf4e3cd4b3eef2b2718db58d0 100644 (file)
@@ -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(); }
index 8e95fd97c8394a27e6808cbc0844e18dd4575b4a..43dad12d39f3ff510bf99d02cd14b1d8146bd6a6 100644 (file)
@@ -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);
 }
 
index 782bc57a0fadc64b2d329ad5b703258e0a4db3c3..f69a7325c3d5f5004207ebdc39e03608bd1c2957 100644 (file)
@@ -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);
 }
index 0a985edf2352547abbe4e727d5090a7a0726c4bc..651f3a86188a872052c03b4a9cc896fe7f3b3ec6 100644 (file)
@@ -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;
+    voidparser;
+    voidscanner;
+    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 (file)
index 0000000..0163a7d
--- /dev/null
@@ -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
index de7544cc9dd36ec7311dc1d2405439b0c3758094..bf34527c0a213ede577e26863b905d3afb73a765 100644 (file)
@@ -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
index 422ce6f9efd2c651a833d96b32d139a271ea765c..c82090fec0e2ea19fbc66453d5f4ea15e3dbb2ba 100644 (file)
@@ -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
index b86dc9753c16772d79a3f94e0e82599a2af774f2..93ad00d1edda0993308d0c984bdca05ff297ac6c 100644 (file)
@@ -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)" ]