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