Update ANGLE in WebKit https://bugs.webkit.org/show_bug.cgi?id=81717
authordino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2012 19:19:18 +0000 (19:19 +0000)
committerdino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2012 19:19:18 +0000 (19:19 +0000)
Reviewed by Kenneth Russell.

Update angleproject to r1009. Synced the source directory
between the angle repository and WebKit. Ran the OS X Lion
version of Bison over the glslang.l input which generates
a slightly different output than angle provided.

Converted tabs to spaces in preprocessor/new files.

* include/EGL/eglext.h:
* include/GLES2/gl2ext.h:
* include/GLSLANG/ShaderLang.h:
* src/common/RefCountObject.cpp: Renamed from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.cpp.
(RefCountObject::RefCountObject):
(RefCountObject::~RefCountObject):
(RefCountObject::addRef):
(RefCountObject::release):
(RefCountObjectBindingPointer::set):
* src/common/RefCountObject.h: Renamed from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.h.
(RefCountObject):
(RefCountObject::id):
(RefCountObjectBindingPointer):
(RefCountObjectBindingPointer::RefCountObjectBindingPointer):
(RefCountObjectBindingPointer::~RefCountObjectBindingPointer):
(RefCountObjectBindingPointer::get):
(RefCountObjectBindingPointer::id):
(RefCountObjectBindingPointer::operator ! ):
(BindingPointer):
(BindingPointer::set):
(BindingPointer::get):
(BindingPointer::operator -> ):
* src/common/debug.cpp:
(gl::output):
* src/common/version.h:
* src/compiler/BaseTypes.h:
* src/compiler/Compiler.cpp:
(TCompiler::TCompiler):
(TCompiler::~TCompiler):
(TCompiler::mapLongVariableNames):
* src/compiler/ConstantUnion.h:
(ConstantUnion::ConstantUnion):
(ConstantUnion::operator==):
(ConstantUnion::operator>):
(ConstantUnion::operator<):
* src/compiler/Intermediate.cpp:
(TIntermConstantUnion::fold):
* src/compiler/MapLongVariableNames.cpp:
(LongNameMap::LongNameMap):
(LongNameMap::~LongNameMap):
(LongNameMap::GetInstance):
(LongNameMap::Release):
(LongNameMap::Find):
(LongNameMap::Insert):
(LongNameMap::Size):
(MapLongVariableNames::MapLongVariableNames):
(MapLongVariableNames::visitSymbol):
(MapLongVariableNames::mapGlobalLongName):
* src/compiler/MapLongVariableNames.h:
(LongNameMap):
(MapLongVariableNames):
* src/compiler/OutputHLSL.cpp:
(sh::OutputHLSL::OutputHLSL):
(sh::OutputHLSL::header):
(sh::OutputHLSL::visitSymbol):
(sh::OutputHLSL::visitUnary):
(sh::OutputHLSL::visitAggregate):
(sh::OutputHLSL::visitLoop):
(sh::OutputHLSL::handleExcessiveLoop):
(sh::OutputHLSL::typeString):
(sh::OutputHLSL::addConstructor):
(sh::OutputHLSL::decorateUniform):
* src/compiler/OutputHLSL.h:
(OutputHLSL):
* src/compiler/PoolAlloc.cpp:
(TAllocation::checkGuardBlock):
* src/compiler/ShHandle.h:
(TCompiler):
* src/compiler/SymbolTable.cpp:
* src/compiler/SymbolTable.h:
(TSymbolTable):
(TSymbolTable::getOuterLevel):
* src/compiler/VariableInfo.cpp:
(getVariableDataType):
* src/compiler/glslang.l:
* src/compiler/glslang.y:
* src/compiler/glslang_lex.cpp:
(yy_buffer_state):
(yyguts_t):
(input):
(yyensure_buffer_stack):
(yy_scan_bytes):
(yyget_leng):
* src/compiler/glslang_tab.cpp:
* src/compiler/osinclude.h:
* src/compiler/preprocessor/cpp.c:
* src/compiler/preprocessor/memory.c:
* src/compiler/preprocessor/new/Context.cpp: Added.
(isMacroNameReserved):
(pp):
(pp::Context::Context):
(pp::Context::~Context):
(pp::Context::init):
(pp::Context::process):
(pp::Context::defineMacro):
(pp::Context::undefineMacro):
(pp::Context::isMacroDefined):
(pp::Context::reset):
(pp::Context::defineBuiltInMacro):
* src/compiler/preprocessor/new/Context.h: Added.
(pp):
(Context):
(pp::Context::lexer):
(pp::Context::output):
* src/compiler/preprocessor/new/Input.cpp: Added.
(pp):
(pp::Input::Input):
(pp::Input::eof):
(pp::Input::read):
(pp::Input::getChar):
(pp::Input::peekChar):
(pp::Input::switchToNextString):
(pp::Input::isStringEmpty):
(pp::Input::stringLength):
* src/compiler/preprocessor/new/Input.h: Added.
(pp):
(Input):
(pp::Input::error):
(pp::Input::stringIndex):
* src/compiler/preprocessor/new/Macro.cpp: Added.
(pp):
(pp::Macro::Macro):
(pp::Macro::~Macro):
* src/compiler/preprocessor/new/Macro.h: Added.
(pp):
(Macro):
(pp::Macro::type):
(pp::Macro::identifier):
(pp::Macro::parameters):
(pp::Macro::replacements):
* src/compiler/preprocessor/new/Preprocessor.cpp: Added.
(pp):
(pp::Preprocessor::Preprocessor):
(pp::Preprocessor::~Preprocessor):
(pp::Preprocessor::init):
(pp::Preprocessor::process):
(pp::Preprocessor::reset):
* src/compiler/preprocessor/new/Preprocessor.h: Added.
(pp):
(Preprocessor):
(pp::Preprocessor::begin):
(pp::Preprocessor::end):
* src/compiler/preprocessor/new/Token.cpp: Added.
(pp):
(pp::Token::encodeLocation):
(pp::Token::decodeLocation):
(pp::Token::Token):
(pp::Token::~Token):
(pp::operator<<):
* src/compiler/preprocessor/new/Token.h: Added.
(pp):
(Token):
(pp::Token::location):
(pp::Token::type):
(pp::Token::value):
* src/compiler/preprocessor/new/generate_parser.sh: Added.
* src/compiler/preprocessor/new/pp.l: Added.
* src/compiler/preprocessor/new/pp.y: Added.
* src/compiler/preprocessor/new/pp_lex.cpp: Added.
(yy_buffer_state):
(yy_trans_info):
(yyguts_t):
(yy_get_previous_state):
(yy_try_NUL_trans):
(input):
(pprestart):
(pp_switch_to_buffer):
(pp_load_buffer_state):
(pp_create_buffer):
(pp_delete_buffer):
(pp_init_buffer):
(pp_flush_buffer):
(pppush_buffer_state):
(pppop_buffer_state):
(ppensure_buffer_stack):
(pp_scan_buffer):
(pp_scan_string):
(pp_scan_bytes):
(yy_push_state):
(yy_pop_state):
(yy_top_state):
(yy_fatal_error):
(ppget_extra):
(ppget_lineno):
(ppget_column):
(ppget_in):
(ppget_out):
(ppget_leng):
(ppget_text):
(ppset_extra):
(ppset_lineno):
(ppset_column):
(ppset_in):
(ppset_out):
(ppget_debug):
(ppset_debug):
(ppget_lval):
(ppset_lval):
(ppget_lloc):
(ppset_lloc):
(pplex_init):
(pplex_init_extra):
(yy_init_globals):
(pplex_destroy):
(yy_flex_strncpy):
(yy_flex_strlen):
(ppalloc):
(pprealloc):
(ppfree):
(extractMacroName):
(pp):
(pp::Context::readInput):
(pp::Context::initLexer):
(pp::Context::destroyLexer):
* src/compiler/preprocessor/new/pp_tab.cpp: Added.
(YYLTYPE):
(yysyntax_error):
(yyerror):
(pushConditionalBlock):
(popConditionalBlock):
(pp::Context::parse):
* src/compiler/preprocessor/new/pp_tab.h: Added.
(YYLTYPE):
* src/compiler/preprocessor/new/stl_utils.h: Added.
(pp):
(Delete):
(pp::Delete::operator()):
(DeleteSecond):
(pp::DeleteSecond::operator()):
* src/compiler/preprocessor/new/token_type.h: Added.
* src/compiler/preprocessor/scanner.c:
(yylex_CPP):
* src/compiler/preprocessor/symbols.c:
* src/compiler/preprocessor/tokens.c:
* src/libEGL/Config.cpp:
(egl::ConfigSet::getConfigs):
* src/libEGL/Display.cpp:
(egl::Display::initialize):
(egl::Display::terminate):
(egl::Display::restoreLostDevice):
(egl::Display::sync):
(egl):
(egl::Display::allocateEventQuery):
(egl::Display::freeEventQuery):
(egl::Display::getFloat32TextureSupport):
(egl::Display::getFloat16TextureSupport):
(egl::Display::getEventQuerySupport):
(egl::Display::initExtensionString):
(egl::Display::shareHandleSupported):
(egl::Display::getOcclusionQuerySupport):
(egl::Display::getInstancingSupport):
* src/libEGL/Display.h:
(Display):
(egl::Display::isD3d9ExDevice):
* src/libEGL/Surface.cpp:
(egl::Surface::resetSwapChain):
* src/libEGL/libEGL.cpp:
* src/libEGL/libEGL.vcproj:
* src/libGLESv2/Blit.cpp:
(gl::Blit::setCommonBlitState):
* src/libGLESv2/Buffer.h:
(Buffer):
* src/libGLESv2/Context.cpp:
(gl::Context::Context):
(gl::Context::~Context):
(gl::Context::makeCurrent):
(gl::Context::getActiveQuery):
(gl):
(gl::Context::createFence):
(gl::Context::createQuery):
(gl::Context::deleteQuery):
(gl::Context::beginQuery):
(gl::Context::endQuery):
(gl::Context::getQuery):
(gl::Context::applyVertexBuffer):
(gl::Context::applyIndexBuffer):
(gl::Context::readPixels):
(gl::Context::clear):
(gl::Context::drawArrays):
(gl::Context::drawElements):
(gl::Context::sync):
(gl::Context::drawLineLoop):
(gl::Context::supportsOcclusionQueries):
(gl::Context::supportsInstancing):
(gl::Context::setVertexAttribDivisor):
(gl::Context::initExtensionString):
(gl::VertexDeclarationCache::applyDeclaration):
(gl::VertexDeclarationCache::markStateDirty):
* src/libGLESv2/Context.h:
(gl):
(gl::VertexAttribute::VertexAttribute):
(State):
(VertexDeclarationCache):
(Context):
* src/libGLESv2/Fence.cpp:
(gl::Fence::Fence):
(gl::Fence::~Fence):
(gl::Fence::setFence):
* src/libGLESv2/Fence.h:
(egl):
(Fence):
* src/libGLESv2/Framebuffer.cpp:
(gl::Framebuffer::lookupRenderbuffer):
(gl::Framebuffer::detachTexture):
(gl::Framebuffer::completeness):
* src/libGLESv2/Framebuffer.h:
* src/libGLESv2/IndexDataManager.cpp:
(gl::IndexDataManager::IndexDataManager):
(gl::IndexDataManager::~IndexDataManager):
(gl::computeRange):
(gl::IndexDataManager::prepareIndexData):
(gl::IndexDataManager::getCountingIndices):
(gl):
* src/libGLESv2/IndexDataManager.h:
(IndexDataManager):
* src/libGLESv2/Program.cpp:
(gl::Program::getUniformLocation):
(gl::Program::setUniform1fv):
(gl::Program::setUniform2fv):
(gl::Program::setUniform3fv):
(gl::Program::setUniform4fv):
(gl::Program::setUniform1iv):
(gl::Program::setUniform2iv):
(gl::Program::setUniform3iv):
(gl::Program::setUniform4iv):
(gl::Program::packVaryings):
(gl::Program::linkVaryings):
(gl::Program::defineUniform):
(gl::Program::createUniform):
(gl::Program::applyUniformnbv):
(gl::Program::applyUniform1iv):
(gl::Program::applyUniform2iv):
(gl::Program::applyUniform3iv):
(gl::Program::applyUniform4iv):
(gl::Program::getInfoLog):
* src/libGLESv2/Program.h:
(Program):
* src/libGLESv2/Query.cpp: Added.
(gl):
(gl::Query::Query):
(gl::Query::~Query):
(gl::Query::begin):
(gl::Query::end):
(gl::Query::getResult):
(gl::Query::isResultAvailable):
(gl::Query::getType):
(gl::Query::testQuery):
* src/libGLESv2/Query.h: Added.
(gl):
(Query):
* src/libGLESv2/Renderbuffer.cpp:
(gl):
(gl::RenderbufferInterface::addProxyRef):
(gl::RenderbufferInterface::releaseProxy):
(gl::RenderbufferTexture::RenderbufferTexture):
(gl::RenderbufferTexture::~RenderbufferTexture):
(gl::RenderbufferTexture::addProxyRef):
(gl::RenderbufferTexture::releaseProxy):
(gl::Renderbuffer::addRef):
(gl::Renderbuffer::release):
* src/libGLESv2/Renderbuffer.h:
(gl):
(RenderbufferInterface):
(RenderbufferTexture):
(Renderbuffer):
* src/libGLESv2/Shader.cpp:
(gl::Shader::Shader):
(gl::Shader::getInfoLog):
(gl::Shader::getSourceImpl):
(gl):
(gl::Shader::initializeCompiler):
(gl::Shader::parseVaryings):
(gl::Shader::uncompile):
(gl::Shader::compileToHLSL):
(gl::VertexShader::uncompile):
(gl::VertexShader::compile):
(gl::VertexShader::parseAttributes):
(gl::FragmentShader::compile):
* src/libGLESv2/Shader.h:
(Shader):
(VertexShader):
* src/libGLESv2/Texture.cpp:
(gl::Texture2D::Texture2D):
(gl::Texture2D::~Texture2D):
(gl):
(gl::Texture2D::addProxyRef):
(gl::Texture2D::releaseProxy):
(gl::Texture2D::getRenderbuffer):
(gl::TextureCubeMap::TextureCubeMap):
(gl::TextureCubeMap::~TextureCubeMap):
(gl::TextureCubeMap::addProxyRef):
(gl::TextureCubeMap::releaseProxy):
(gl::TextureCubeMap::isSamplerComplete):
(gl::TextureCubeMap::convertToRenderTarget):
(gl::TextureCubeMap::getRenderbuffer):
* src/libGLESv2/Texture.h:
(Texture):
(Texture2D):
(TextureCubeMap):
* src/libGLESv2/VertexDataManager.cpp:
(gl::VertexDataManager::writeAttributeData):
(gl::VertexDataManager::prepareVertexData):
(gl::VertexDataManager::spaceRequired):
(gl):
* src/libGLESv2/VertexDataManager.h:
(TranslatedAttribute):
(VertexDataManager):
* src/libGLESv2/libGLESv2.cpp:
* src/libGLESv2/libGLESv2.def:
* src/libGLESv2/libGLESv2.vcproj:
* src/libGLESv2/utilities.cpp:
(gl::IsInternalTextureTarget):
* src/libGLESv2/utilities.h:
(gl):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@112300 268f45cc-cd09-0410-ab3c-d52691b4dbfc

82 files changed:
Source/ThirdParty/ANGLE/ChangeLog
Source/ThirdParty/ANGLE/include/EGL/eglext.h
Source/ThirdParty/ANGLE/include/GLES2/gl2ext.h
Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h
Source/ThirdParty/ANGLE/src/common/RefCountObject.cpp [moved from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.cpp with 98% similarity]
Source/ThirdParty/ANGLE/src/common/RefCountObject.h [moved from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.h with 93% similarity]
Source/ThirdParty/ANGLE/src/common/debug.cpp
Source/ThirdParty/ANGLE/src/common/version.h
Source/ThirdParty/ANGLE/src/compiler/BaseTypes.h
Source/ThirdParty/ANGLE/src/compiler/Compiler.cpp
Source/ThirdParty/ANGLE/src/compiler/ConstantUnion.h
Source/ThirdParty/ANGLE/src/compiler/Intermediate.cpp
Source/ThirdParty/ANGLE/src/compiler/MapLongVariableNames.cpp
Source/ThirdParty/ANGLE/src/compiler/MapLongVariableNames.h
Source/ThirdParty/ANGLE/src/compiler/OutputHLSL.cpp
Source/ThirdParty/ANGLE/src/compiler/OutputHLSL.h
Source/ThirdParty/ANGLE/src/compiler/PoolAlloc.cpp
Source/ThirdParty/ANGLE/src/compiler/ShHandle.h
Source/ThirdParty/ANGLE/src/compiler/SymbolTable.cpp
Source/ThirdParty/ANGLE/src/compiler/SymbolTable.h
Source/ThirdParty/ANGLE/src/compiler/VariableInfo.cpp
Source/ThirdParty/ANGLE/src/compiler/glslang.l
Source/ThirdParty/ANGLE/src/compiler/glslang.y
Source/ThirdParty/ANGLE/src/compiler/glslang_lex.cpp
Source/ThirdParty/ANGLE/src/compiler/glslang_tab.cpp
Source/ThirdParty/ANGLE/src/compiler/osinclude.h
Source/ThirdParty/ANGLE/src/compiler/preprocessor/cpp.c
Source/ThirdParty/ANGLE/src/compiler/preprocessor/memory.c
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Context.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Context.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/generate_parser.sh [new file with mode: 0755]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.y [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_lex.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_tab.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_tab.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/stl_utils.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/token_type.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/compiler/preprocessor/scanner.c
Source/ThirdParty/ANGLE/src/compiler/preprocessor/symbols.c
Source/ThirdParty/ANGLE/src/compiler/preprocessor/tokens.c
Source/ThirdParty/ANGLE/src/libEGL/Config.cpp
Source/ThirdParty/ANGLE/src/libEGL/Display.cpp
Source/ThirdParty/ANGLE/src/libEGL/Display.h
Source/ThirdParty/ANGLE/src/libEGL/Surface.cpp
Source/ThirdParty/ANGLE/src/libEGL/libEGL.cpp
Source/ThirdParty/ANGLE/src/libEGL/libEGL.vcproj
Source/ThirdParty/ANGLE/src/libGLESv2/Blit.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.h
Source/ThirdParty/ANGLE/src/libGLESv2/Context.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Context.h
Source/ThirdParty/ANGLE/src/libGLESv2/Fence.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Fence.h
Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.h
Source/ThirdParty/ANGLE/src/libGLESv2/IndexDataManager.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/IndexDataManager.h
Source/ThirdParty/ANGLE/src/libGLESv2/Program.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Program.h
Source/ThirdParty/ANGLE/src/libGLESv2/Query.cpp [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/libGLESv2/Query.h [new file with mode: 0644]
Source/ThirdParty/ANGLE/src/libGLESv2/Renderbuffer.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Renderbuffer.h
Source/ThirdParty/ANGLE/src/libGLESv2/Shader.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Shader.h
Source/ThirdParty/ANGLE/src/libGLESv2/Texture.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/Texture.h
Source/ThirdParty/ANGLE/src/libGLESv2/VertexDataManager.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/VertexDataManager.h
Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.def
Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2.vcproj
Source/ThirdParty/ANGLE/src/libGLESv2/utilities.cpp
Source/ThirdParty/ANGLE/src/libGLESv2/utilities.h

index c8948179fd65198de1c0cdfcfb3b1d2bdb86a046..5029207499eaadd4ed69c35842f98ad036de5dd0 100644 (file)
@@ -1,3 +1,430 @@
+2012-03-26  Dean Jackson  <dino@apple.com>
+
+        Update ANGLE in WebKit
+        https://bugs.webkit.org/show_bug.cgi?id=81717
+
+        Reviewed by Kenneth Russell.
+
+        Update angleproject to r1009. Synced the source directory
+        between the angle repository and WebKit. Ran the OS X Lion
+        version of Bison over the glslang.l input which generates
+        a slightly different output than angle provided.
+
+        * include/EGL/eglext.h:
+        * include/GLES2/gl2ext.h:
+        * include/GLSLANG/ShaderLang.h:
+        * src/common/RefCountObject.cpp: Renamed from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.cpp.
+        (RefCountObject::RefCountObject):
+        (RefCountObject::~RefCountObject):
+        (RefCountObject::addRef):
+        (RefCountObject::release):
+        (RefCountObjectBindingPointer::set):
+        * src/common/RefCountObject.h: Renamed from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.h.
+        (RefCountObject):
+        (RefCountObject::id):
+        (RefCountObjectBindingPointer):
+        (RefCountObjectBindingPointer::RefCountObjectBindingPointer):
+        (RefCountObjectBindingPointer::~RefCountObjectBindingPointer):
+        (RefCountObjectBindingPointer::get):
+        (RefCountObjectBindingPointer::id):
+        (RefCountObjectBindingPointer::operator ! ):
+        (BindingPointer):
+        (BindingPointer::set):
+        (BindingPointer::get):
+        (BindingPointer::operator -> ):
+        * src/common/debug.cpp:
+        (gl::output):
+        * src/common/version.h:
+        * src/compiler/BaseTypes.h:
+        * src/compiler/Compiler.cpp:
+        (TCompiler::TCompiler):
+        (TCompiler::~TCompiler):
+        (TCompiler::mapLongVariableNames):
+        * src/compiler/ConstantUnion.h:
+        (ConstantUnion::ConstantUnion):
+        (ConstantUnion::operator==):
+        (ConstantUnion::operator>):
+        (ConstantUnion::operator<):
+        * src/compiler/Intermediate.cpp:
+        (TIntermConstantUnion::fold):
+        * src/compiler/MapLongVariableNames.cpp:
+        (LongNameMap::LongNameMap):
+        (LongNameMap::~LongNameMap):
+        (LongNameMap::GetInstance):
+        (LongNameMap::Release):
+        (LongNameMap::Find):
+        (LongNameMap::Insert):
+        (LongNameMap::Size):
+        (MapLongVariableNames::MapLongVariableNames):
+        (MapLongVariableNames::visitSymbol):
+        (MapLongVariableNames::mapGlobalLongName):
+        * src/compiler/MapLongVariableNames.h:
+        (LongNameMap):
+        (MapLongVariableNames):
+        * src/compiler/OutputHLSL.cpp:
+        (sh::OutputHLSL::OutputHLSL):
+        (sh::OutputHLSL::header):
+        (sh::OutputHLSL::visitSymbol):
+        (sh::OutputHLSL::visitUnary):
+        (sh::OutputHLSL::visitAggregate):
+        (sh::OutputHLSL::visitLoop):
+        (sh::OutputHLSL::handleExcessiveLoop):
+        (sh::OutputHLSL::typeString):
+        (sh::OutputHLSL::addConstructor):
+        (sh::OutputHLSL::decorateUniform):
+        * src/compiler/OutputHLSL.h:
+        (OutputHLSL):
+        * src/compiler/PoolAlloc.cpp:
+        (TAllocation::checkGuardBlock):
+        * src/compiler/ShHandle.h:
+        (TCompiler):
+        * src/compiler/SymbolTable.cpp:
+        * src/compiler/SymbolTable.h:
+        (TSymbolTable):
+        (TSymbolTable::getOuterLevel):
+        * src/compiler/VariableInfo.cpp:
+        (getVariableDataType):
+        * src/compiler/glslang.l:
+        * src/compiler/glslang.y:
+        * src/compiler/glslang_lex.cpp:
+        (yy_buffer_state):
+        (yyguts_t):
+        (input):
+        (yyensure_buffer_stack):
+        (yy_scan_bytes):
+        (yyget_leng):
+        * src/compiler/glslang_tab.cpp:
+        * src/compiler/osinclude.h:
+        * src/compiler/preprocessor/cpp.c:
+        * src/compiler/preprocessor/memory.c:
+        * src/compiler/preprocessor/new/Context.cpp: Added.
+        (isMacroNameReserved):
+        (pp):
+        (pp::Context::Context):
+        (pp::Context::~Context):
+        (pp::Context::init):
+        (pp::Context::process):
+        (pp::Context::defineMacro):
+        (pp::Context::undefineMacro):
+        (pp::Context::isMacroDefined):
+        (pp::Context::reset):
+        (pp::Context::defineBuiltInMacro):
+        * src/compiler/preprocessor/new/Context.h: Added.
+        (pp):
+        (Context):
+        (pp::Context::lexer):
+        (pp::Context::output):
+        * src/compiler/preprocessor/new/Input.cpp: Added.
+        (pp):
+        (pp::Input::Input):
+        (pp::Input::eof):
+        (pp::Input::read):
+        (pp::Input::getChar):
+        (pp::Input::peekChar):
+        (pp::Input::switchToNextString):
+        (pp::Input::isStringEmpty):
+        (pp::Input::stringLength):
+        * src/compiler/preprocessor/new/Input.h: Added.
+        (pp):
+        (Input):
+        (pp::Input::error):
+        (pp::Input::stringIndex):
+        * src/compiler/preprocessor/new/Macro.cpp: Added.
+        (pp):
+        (pp::Macro::Macro):
+        (pp::Macro::~Macro):
+        * src/compiler/preprocessor/new/Macro.h: Added.
+        (pp):
+        (Macro):
+        (pp::Macro::type):
+        (pp::Macro::identifier):
+        (pp::Macro::parameters):
+        (pp::Macro::replacements):
+        * src/compiler/preprocessor/new/Preprocessor.cpp: Added.
+        (pp):
+        (pp::Preprocessor::Preprocessor):
+        (pp::Preprocessor::~Preprocessor):
+        (pp::Preprocessor::init):
+        (pp::Preprocessor::process):
+        (pp::Preprocessor::reset):
+        * src/compiler/preprocessor/new/Preprocessor.h: Added.
+        (pp):
+        (Preprocessor):
+        (pp::Preprocessor::begin):
+        (pp::Preprocessor::end):
+        * src/compiler/preprocessor/new/Token.cpp: Added.
+        (pp):
+        (pp::Token::encodeLocation):
+        (pp::Token::decodeLocation):
+        (pp::Token::Token):
+        (pp::Token::~Token):
+        (pp::operator<<):
+        * src/compiler/preprocessor/new/Token.h: Added.
+        (pp):
+        (Token):
+        (pp::Token::location):
+        (pp::Token::type):
+        (pp::Token::value):
+        * src/compiler/preprocessor/new/generate_parser.sh: Added.
+        * src/compiler/preprocessor/new/pp.l: Added.
+        * src/compiler/preprocessor/new/pp.y: Added.
+        * src/compiler/preprocessor/new/pp_lex.cpp: Added.
+        (yy_buffer_state):
+        (yy_trans_info):
+        (yyguts_t):
+        (yy_get_previous_state):
+        (yy_try_NUL_trans):
+        (input):
+        (pprestart):
+        (pp_switch_to_buffer):
+        (pp_load_buffer_state):
+        (pp_create_buffer):
+        (pp_delete_buffer):
+        (pp_init_buffer):
+        (pp_flush_buffer):
+        (pppush_buffer_state):
+        (pppop_buffer_state):
+        (ppensure_buffer_stack):
+        (pp_scan_buffer):
+        (pp_scan_string):
+        (pp_scan_bytes):
+        (yy_push_state):
+        (yy_pop_state):
+        (yy_top_state):
+        (yy_fatal_error):
+        (ppget_extra):
+        (ppget_lineno):
+        (ppget_column):
+        (ppget_in):
+        (ppget_out):
+        (ppget_leng):
+        (ppget_text):
+        (ppset_extra):
+        (ppset_lineno):
+        (ppset_column):
+        (ppset_in):
+        (ppset_out):
+        (ppget_debug):
+        (ppset_debug):
+        (ppget_lval):
+        (ppset_lval):
+        (ppget_lloc):
+        (ppset_lloc):
+        (pplex_init):
+        (pplex_init_extra):
+        (yy_init_globals):
+        (pplex_destroy):
+        (yy_flex_strncpy):
+        (yy_flex_strlen):
+        (ppalloc):
+        (pprealloc):
+        (ppfree):
+        (extractMacroName):
+        (pp):
+        (pp::Context::readInput):
+        (pp::Context::initLexer):
+        (pp::Context::destroyLexer):
+        * src/compiler/preprocessor/new/pp_tab.cpp: Added.
+        (YYLTYPE):
+        (yysyntax_error):
+        (yyerror):
+        (pushConditionalBlock):
+        (popConditionalBlock):
+        (pp::Context::parse):
+        * src/compiler/preprocessor/new/pp_tab.h: Added.
+        (YYLTYPE):
+        * src/compiler/preprocessor/new/stl_utils.h: Added.
+        (pp):
+        (Delete):
+        (pp::Delete::operator()):
+        (DeleteSecond):
+        (pp::DeleteSecond::operator()):
+        * src/compiler/preprocessor/new/token_type.h: Added.
+        * src/compiler/preprocessor/scanner.c:
+        (yylex_CPP):
+        * src/compiler/preprocessor/symbols.c:
+        * src/compiler/preprocessor/tokens.c:
+        * src/libEGL/Config.cpp:
+        (egl::ConfigSet::getConfigs):
+        * src/libEGL/Display.cpp:
+        (egl::Display::initialize):
+        (egl::Display::terminate):
+        (egl::Display::restoreLostDevice):
+        (egl::Display::sync):
+        (egl):
+        (egl::Display::allocateEventQuery):
+        (egl::Display::freeEventQuery):
+        (egl::Display::getFloat32TextureSupport):
+        (egl::Display::getFloat16TextureSupport):
+        (egl::Display::getEventQuerySupport):
+        (egl::Display::initExtensionString):
+        (egl::Display::shareHandleSupported):
+        (egl::Display::getOcclusionQuerySupport):
+        (egl::Display::getInstancingSupport):
+        * src/libEGL/Display.h:
+        (Display):
+        (egl::Display::isD3d9ExDevice):
+        * src/libEGL/Surface.cpp:
+        (egl::Surface::resetSwapChain):
+        * src/libEGL/libEGL.cpp:
+        * src/libEGL/libEGL.vcproj:
+        * src/libGLESv2/Blit.cpp:
+        (gl::Blit::setCommonBlitState):
+        * src/libGLESv2/Buffer.h:
+        (Buffer):
+        * src/libGLESv2/Context.cpp:
+        (gl::Context::Context):
+        (gl::Context::~Context):
+        (gl::Context::makeCurrent):
+        (gl::Context::getActiveQuery):
+        (gl):
+        (gl::Context::createFence):
+        (gl::Context::createQuery):
+        (gl::Context::deleteQuery):
+        (gl::Context::beginQuery):
+        (gl::Context::endQuery):
+        (gl::Context::getQuery):
+        (gl::Context::applyVertexBuffer):
+        (gl::Context::applyIndexBuffer):
+        (gl::Context::readPixels):
+        (gl::Context::clear):
+        (gl::Context::drawArrays):
+        (gl::Context::drawElements):
+        (gl::Context::sync):
+        (gl::Context::drawLineLoop):
+        (gl::Context::supportsOcclusionQueries):
+        (gl::Context::supportsInstancing):
+        (gl::Context::setVertexAttribDivisor):
+        (gl::Context::initExtensionString):
+        (gl::VertexDeclarationCache::applyDeclaration):
+        (gl::VertexDeclarationCache::markStateDirty):
+        * src/libGLESv2/Context.h:
+        (gl):
+        (gl::VertexAttribute::VertexAttribute):
+        (State):
+        (VertexDeclarationCache):
+        (Context):
+        * src/libGLESv2/Fence.cpp:
+        (gl::Fence::Fence):
+        (gl::Fence::~Fence):
+        (gl::Fence::setFence):
+        * src/libGLESv2/Fence.h:
+        (egl):
+        (Fence):
+        * src/libGLESv2/Framebuffer.cpp:
+        (gl::Framebuffer::lookupRenderbuffer):
+        (gl::Framebuffer::detachTexture):
+        (gl::Framebuffer::completeness):
+        * src/libGLESv2/Framebuffer.h:
+        * src/libGLESv2/IndexDataManager.cpp:
+        (gl::IndexDataManager::IndexDataManager):
+        (gl::IndexDataManager::~IndexDataManager):
+        (gl::computeRange):
+        (gl::IndexDataManager::prepareIndexData):
+        (gl::IndexDataManager::getCountingIndices):
+        (gl):
+        * src/libGLESv2/IndexDataManager.h:
+        (IndexDataManager):
+        * src/libGLESv2/Program.cpp:
+        (gl::Program::getUniformLocation):
+        (gl::Program::setUniform1fv):
+        (gl::Program::setUniform2fv):
+        (gl::Program::setUniform3fv):
+        (gl::Program::setUniform4fv):
+        (gl::Program::setUniform1iv):
+        (gl::Program::setUniform2iv):
+        (gl::Program::setUniform3iv):
+        (gl::Program::setUniform4iv):
+        (gl::Program::packVaryings):
+        (gl::Program::linkVaryings):
+        (gl::Program::defineUniform):
+        (gl::Program::createUniform):
+        (gl::Program::applyUniformnbv):
+        (gl::Program::applyUniform1iv):
+        (gl::Program::applyUniform2iv):
+        (gl::Program::applyUniform3iv):
+        (gl::Program::applyUniform4iv):
+        (gl::Program::getInfoLog):
+        * src/libGLESv2/Program.h:
+        (Program):
+        * src/libGLESv2/Query.cpp: Added.
+        (gl):
+        (gl::Query::Query):
+        (gl::Query::~Query):
+        (gl::Query::begin):
+        (gl::Query::end):
+        (gl::Query::getResult):
+        (gl::Query::isResultAvailable):
+        (gl::Query::getType):
+        (gl::Query::testQuery):
+        * src/libGLESv2/Query.h: Added.
+        (gl):
+        (Query):
+        * src/libGLESv2/Renderbuffer.cpp:
+        (gl):
+        (gl::RenderbufferInterface::addProxyRef):
+        (gl::RenderbufferInterface::releaseProxy):
+        (gl::RenderbufferTexture::RenderbufferTexture):
+        (gl::RenderbufferTexture::~RenderbufferTexture):
+        (gl::RenderbufferTexture::addProxyRef):
+        (gl::RenderbufferTexture::releaseProxy):
+        (gl::Renderbuffer::addRef):
+        (gl::Renderbuffer::release):
+        * src/libGLESv2/Renderbuffer.h:
+        (gl):
+        (RenderbufferInterface):
+        (RenderbufferTexture):
+        (Renderbuffer):
+        * src/libGLESv2/Shader.cpp:
+        (gl::Shader::Shader):
+        (gl::Shader::getInfoLog):
+        (gl::Shader::getSourceImpl):
+        (gl):
+        (gl::Shader::initializeCompiler):
+        (gl::Shader::parseVaryings):
+        (gl::Shader::uncompile):
+        (gl::Shader::compileToHLSL):
+        (gl::VertexShader::uncompile):
+        (gl::VertexShader::compile):
+        (gl::VertexShader::parseAttributes):
+        (gl::FragmentShader::compile):
+        * src/libGLESv2/Shader.h:
+        (Shader):
+        (VertexShader):
+        * src/libGLESv2/Texture.cpp:
+        (gl::Texture2D::Texture2D):
+        (gl::Texture2D::~Texture2D):
+        (gl):
+        (gl::Texture2D::addProxyRef):
+        (gl::Texture2D::releaseProxy):
+        (gl::Texture2D::getRenderbuffer):
+        (gl::TextureCubeMap::TextureCubeMap):
+        (gl::TextureCubeMap::~TextureCubeMap):
+        (gl::TextureCubeMap::addProxyRef):
+        (gl::TextureCubeMap::releaseProxy):
+        (gl::TextureCubeMap::isSamplerComplete):
+        (gl::TextureCubeMap::convertToRenderTarget):
+        (gl::TextureCubeMap::getRenderbuffer):
+        * src/libGLESv2/Texture.h:
+        (Texture):
+        (Texture2D):
+        (TextureCubeMap):
+        * src/libGLESv2/VertexDataManager.cpp:
+        (gl::VertexDataManager::writeAttributeData):
+        (gl::VertexDataManager::prepareVertexData):
+        (gl::VertexDataManager::spaceRequired):
+        (gl):
+        * src/libGLESv2/VertexDataManager.h:
+        (TranslatedAttribute):
+        (VertexDataManager):
+        * src/libGLESv2/libGLESv2.cpp:
+        * src/libGLESv2/libGLESv2.def:
+        * src/libGLESv2/libGLESv2.vcproj:
+        * src/libGLESv2/utilities.cpp:
+        (gl::IsInternalTextureTarget):
+        * src/libGLESv2/utilities.h:
+        (gl):
+
 2012-03-09  Ashod Nakashian  <ashodnakashian@yahoo.com>
 
         Bash scripts should support LF endings only
index 2d4ab2235046b43f35d64cc75aa5e57ac81d5512..b670840d12e4ab1d7134e490cb7fbc223afe2345 100644 (file)
@@ -6,7 +6,7 @@ extern "C" {
 #endif
 
 /*
-** Copyright (c) 2007-2010 The Khronos Group Inc.
+** Copyright (c) 2007-2012 The Khronos Group Inc.
 **
 ** Permission is hereby granted, free of charge, to any person obtaining a
 ** copy of this software and/or associated documentation files (the
@@ -34,8 +34,8 @@ extern "C" {
 
 /* Header file version number */
 /* Current version at http://www.khronos.org/registry/egl/ */
-/* $Revision: 15052 $ on $Date: 2011-07-06 17:43:46 -0700 (Wed, 06 Jul 2011) $ */
-#define EGL_EGLEXT_VERSION 10
+/* $Revision: 16473 $ on $Date: 2012-01-04 02:20:48 -0800 (Wed, 04 Jan 2012) $ */
+#define EGL_EGLEXT_VERSION 11
 
 #ifndef EGL_KHR_config_attribs
 #define EGL_KHR_config_attribs 1
@@ -178,15 +178,15 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EG
 
 #ifndef EGL_NV_coverage_sample
 #define EGL_NV_coverage_sample 1
-#define EGL_COVERAGE_BUFFERS_NV 0x30E0
-#define EGL_COVERAGE_SAMPLES_NV 0x30E1
+#define EGL_COVERAGE_BUFFERS_NV                        0x30E0
+#define EGL_COVERAGE_SAMPLES_NV                        0x30E1
 #endif
 
 #ifndef EGL_NV_depth_nonlinear
 #define EGL_NV_depth_nonlinear 1
-#define EGL_DEPTH_ENCODING_NV 0x30E2
+#define EGL_DEPTH_ENCODING_NV                  0x30E2
 #define EGL_DEPTH_ENCODING_NONE_NV 0
-#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3
+#define EGL_DEPTH_ENCODING_NONLINEAR_NV                0x30E3
 #endif
 
 #if KHRONOS_SUPPORT_INT64   /* EGLTimeNV requires 64-bit uint support */
@@ -301,16 +301,16 @@ EGLAPI EGLBoolean eglQuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface
 typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
 #endif
 
-#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle
-#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
-#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE  0x3200
-#endif
-
 #ifndef EGL_ANGLE_software_display
 #define EGL_ANGLE_software_display 1
 #define EGL_SOFTWARE_DISPLAY_ANGLE ((EGLNativeDisplayType)-1)
 #endif
 
+#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle
+#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
+#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE  0x3200
+#endif
+
 #ifndef EGL_NV_coverage_sample_resolve
 #define EGL_NV_coverage_sample_resolve 1
 #define EGL_COVERAGE_SAMPLE_RESOLVE_NV         0x3131
@@ -318,14 +318,6 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay
 #define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV    0x3133
 #endif
 
-#ifndef EGL_EXT_create_context_robustness
-#define EGL_EXT_create_context_robustness 1
-#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT                0x30BF
-#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT  0x3138
-#define EGL_NO_RESET_NOTIFICATION_EXT                       0x31BE
-#define EGL_LOSE_CONTEXT_ON_RESET_EXT                       0x31BF
-#endif
-
 #if KHRONOS_SUPPORT_INT64   /* EGLTimeKHR requires 64-bit uint support */
 #ifndef EGL_NV_system_time
 #define EGL_NV_system_time 1
@@ -341,6 +333,14 @@ typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void);
 #endif
 #endif
 
+#ifndef EGL_EXT_create_context_robustness
+#define EGL_EXT_create_context_robustness 1
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT   0x30BF
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138
+#define EGL_NO_RESET_NOTIFICATION_EXT          0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_EXT          0x31BF
+#endif
+
 #ifdef __cplusplus
 }
 #endif
index 5233f4a16d3cc588fe74aa3ade6722ff22046b98..a124014172a2790b032840ed3cfb0648def43944 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __gl2ext_h_
 #define __gl2ext_h_
 
-/* $Revision: 15049 $ on $Date:: 2011-07-06 17:28:16 -0700 #$ */
+/* $Revision: 16482 $ on $Date:: 2012-01-04 13:44:55 -0500 #$ */
 
 #ifdef __cplusplus
 extern "C" {
@@ -233,6 +233,11 @@ typedef void* GLeglImageOES;
 #define GL_FRAMEBUFFER_ATTACHMENT_ANGLE                         0x93A3
 #endif
 
+/* GL_ANGLE_instanced_arrays */
+#ifndef GL_ANGLE_instanced_arrays
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE                    0x88FE
+#endif
+
 /*------------------------------------------------------------------------*
  * APPLE extension tokens
  *------------------------------------------------------------------------*/
@@ -287,6 +292,29 @@ typedef void* GLeglImageOES;
 #define GL_MAX_EXT                                              0x8008
 #endif
 
+/* GL_EXT_color_buffer_half_float */
+#ifndef GL_EXT_color_buffer_half_float
+#define GL_RGBA16F_EXT                                          0x881A
+#define GL_RGB16F_EXT                                           0x881B
+#define GL_RG16F_EXT                                            0x822F
+#define GL_R16F_EXT                                             0x822D
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT            0x8211
+#define GL_UNSIGNED_NORMALIZED_EXT                              0x8C17
+#endif
+
+/* GL_EXT_debug_label */
+#ifndef GL_EXT_debug_label
+#define GL_PROGRAM_PIPELINE_OBJECT_EXT                          0x8A4F
+#define GL_PROGRAM_OBJECT_EXT                                   0x8B40
+#define GL_SHADER_OBJECT_EXT                                    0x8B48
+#define GL_BUFFER_OBJECT_EXT                                    0x9151
+#define GL_QUERY_OBJECT_EXT                                     0x9153
+#define GL_VERTEX_ARRAY_OBJECT_EXT                              0x9154
+#endif
+
+/* GL_EXT_debug_marker */
+/* No new tokens introduced by this extension. */
+
 /* GL_EXT_discard_framebuffer */
 #ifndef GL_EXT_discard_framebuffer
 #define GL_COLOR_EXT                                            0x1800
@@ -294,9 +322,26 @@ typedef void* GLeglImageOES;
 #define GL_STENCIL_EXT                                          0x1802
 #endif
 
+/* GL_EXT_multisampled_render_to_texture */
+#ifndef GL_EXT_multisampled_render_to_texture
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT           0x8D6C
+#define GL_RENDERBUFFER_SAMPLES_EXT                             0x9133
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT               0x9134
+#define GL_MAX_SAMPLES_EXT                                      0x9135
+#endif
+
 /* GL_EXT_multi_draw_arrays */
 /* No new tokens introduced by this extension. */
 
+/* GL_EXT_occlusion_query_boolean */
+#ifndef GL_EXT_occlusion_query_boolean
+#define GL_ANY_SAMPLES_PASSED_EXT                               0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT                  0x8D6A
+#define GL_CURRENT_QUERY_EXT                                    0x8865
+#define GL_QUERY_RESULT_EXT                                     0x8866
+#define GL_QUERY_RESULT_AVAILABLE_EXT                           0x8867
+#endif
+
 /* GL_EXT_read_format_bgra */
 #ifndef GL_EXT_read_format_bgra
 #define GL_BGRA_EXT                                             0x80E1
@@ -304,23 +349,44 @@ typedef void* GLeglImageOES;
 #define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT                       0x8366
 #endif
 
+/* GL_EXT_robustness */
+#ifndef GL_EXT_robustness
+/* reuse GL_NO_ERROR */
+#define GL_GUILTY_CONTEXT_RESET_EXT                             0x8253
+#define GL_INNOCENT_CONTEXT_RESET_EXT                           0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_EXT                            0x8255
+#define GL_CONTEXT_ROBUST_ACCESS_EXT                            0x90F3
+#define GL_RESET_NOTIFICATION_STRATEGY_EXT                      0x8256
+#define GL_LOSE_CONTEXT_ON_RESET_EXT                            0x8252
+#define GL_NO_RESET_NOTIFICATION_EXT                            0x8261
+#endif
+
+/* GL_EXT_separate_shader_objects */
+#ifndef GL_EXT_separate_shader_objects
+#define GL_VERTEX_SHADER_BIT_EXT                                0x00000001
+#define GL_FRAGMENT_SHADER_BIT_EXT                              0x00000002
+#define GL_ALL_SHADER_BITS_EXT                                  0xFFFFFFFF
+#define GL_PROGRAM_SEPARABLE_EXT                                0x8258
+#define GL_ACTIVE_PROGRAM_EXT                                   0x8259
+#define GL_PROGRAM_PIPELINE_BINDING_EXT                         0x825A
+#endif
+
 /* GL_EXT_shader_texture_lod */
 /* No new tokens introduced by this extension. */
 
-/* GL_EXT_texture_filter_anisotropic */
-#ifndef GL_EXT_texture_filter_anisotropic
-#define GL_TEXTURE_MAX_ANISOTROPY_EXT                           0x84FE
-#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                       0x84FF
+/* GL_EXT_shadow_samplers */
+#ifndef GL_EXT_shadow_samplers
+#define GL_TEXTURE_COMPARE_MODE_EXT                             0x884C
+#define GL_TEXTURE_COMPARE_FUNC_EXT                             0x884D
+#define GL_COMPARE_REF_TO_TEXTURE_EXT                           0x884E
 #endif
 
-/* GL_EXT_texture_format_BGRA8888 */
-#ifndef GL_EXT_texture_format_BGRA8888
-#define GL_BGRA_EXT                                             0x80E1
-#endif
-
-/* GL_EXT_texture_type_2_10_10_10_REV */
-#ifndef GL_EXT_texture_type_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT                      0x8368
+/* GL_EXT_sRGB */
+#ifndef GL_EXT_sRGB
+#define GL_SRGB_EXT                                             0x8C40
+#define GL_SRGB_ALPHA_EXT                                       0x8C42
+#define GL_SRGB8_ALPHA8_EXT                                     0x8C43
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT            0x8210
 #endif
 
 /* GL_EXT_texture_compression_dxt1 */
@@ -329,49 +395,58 @@ typedef void* GLeglImageOES;
 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT                        0x83F1
 #endif
 
-/* GL_EXT_unpack_subimage */
-#ifndef GL_EXT_unpack_subimage
-#define GL_UNPACK_ROW_LENGTH                                    0x0CF2
-#define GL_UNPACK_SKIP_ROWS                                     0x0CF3
-#define GL_UNPACK_SKIP_PIXELS                                   0x0CF4
+/* GL_EXT_texture_filter_anisotropic */
+#ifndef GL_EXT_texture_filter_anisotropic
+#define GL_TEXTURE_MAX_ANISOTROPY_EXT                           0x84FE
+#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT                       0x84FF
 #endif
 
-/* GL_EXT_robustness */
-#ifndef GL_EXT_robustness
-#define GL_GUILTY_CONTEXT_RESET_EXT                             0x8253
-#define GL_INNOCENT_CONTEXT_RESET_EXT                           0x8254
-#define GL_UNKNOWN_CONTEXT_RESET_EXT                            0x8255
-#define GL_CONTEXT_ROBUST_ACCESS_EXT                            0x90F3
-#define GL_RESET_NOTIFICATION_STRATEGY_EXT                      0x8256
-#define GL_LOSE_CONTEXT_ON_RESET_EXT                            0x8252
-#define GL_NO_RESET_NOTIFICATION_EXT                            0x8261
+/* GL_EXT_texture_format_BGRA8888 */
+#ifndef GL_EXT_texture_format_BGRA8888
+#define GL_BGRA_EXT                                             0x80E1
+#endif
+
+/* GL_EXT_texture_rg */
+#ifndef GL_EXT_texture_rg
+#define GL_RED_EXT                                              0x1903
+#define GL_RG_EXT                                               0x8227
+#define GL_R8_EXT                                               0x8229
+#define GL_RG8_EXT                                              0x822B
 #endif
 
 /* GL_EXT_texture_storage */
 #ifndef GL_EXT_texture_storage
 #define GL_TEXTURE_IMMUTABLE_FORMAT_EXT                         0x912F
-#define GL_ALPHA8_EXT                                           0x803C
+#define GL_ALPHA8_EXT                                           0x803C  
 #define GL_LUMINANCE8_EXT                                       0x8040
 #define GL_LUMINANCE8_ALPHA8_EXT                                0x8045
-/* OES_texture_float dependent internal formats */
-#define GL_RGBA32F_EXT                                          0x8814  /* reuse tokens from ARB_texture_float */
+#define GL_RGBA32F_EXT                                          0x8814  
 #define GL_RGB32F_EXT                                           0x8815
 #define GL_ALPHA32F_EXT                                         0x8816
 #define GL_LUMINANCE32F_EXT                                     0x8818
 #define GL_LUMINANCE_ALPHA32F_EXT                               0x8819
-/* OES_texture_half_float dependent internal formats */
-#define GL_RGBA16F_EXT                                          0x881A /* reuse tokens from ARB_texture_float */
+/* reuse GL_RGBA16F_EXT */
 #define GL_RGB16F_EXT                                           0x881B
 #define GL_ALPHA16F_EXT                                         0x881C
 #define GL_LUMINANCE16F_EXT                                     0x881E
 #define GL_LUMINANCE_ALPHA16F_EXT                               0x881F
-/* EXT_texture_type_2_10_10_10_REV dependent internal formats */
-#define GL_RGB10_A2_EXT                                         0x8059  /* reuse tokens from EXT_texture */
+#define GL_RGB10_A2_EXT                                         0x8059  
 #define GL_RGB10_EXT                                            0x8052
-/* EXT_texture_format_BGRA8888 dependent internal formats */
 #define GL_BGRA8_EXT                                            0x93A1
 #endif
 
+/* GL_EXT_texture_type_2_10_10_10_REV */
+#ifndef GL_EXT_texture_type_2_10_10_10_REV
+#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT                      0x8368
+#endif
+
+/* GL_EXT_unpack_subimage */
+#ifndef GL_EXT_unpack_subimage
+#define GL_UNPACK_ROW_LENGTH                                    0x0CF2
+#define GL_UNPACK_SKIP_ROWS                                     0x0CF3
+#define GL_UNPACK_SKIP_PIXELS                                   0x0CF4
+#endif
+
 /*------------------------------------------------------------------------*
  * DMP extension tokens
  *------------------------------------------------------------------------*/
@@ -881,6 +956,19 @@ typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shad
 #define GL_ANGLE_texture_usage 1
 #endif
 
+/* GL_ANGLE_instanced_arrays */
+#ifndef GL_ANGLE_instanced_arrays
+#define GL_ANGLE_instanced_arrays 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE(GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
+#endif
+typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);
+#endif
+
 /*------------------------------------------------------------------------*
  * APPLE extension functions
  *------------------------------------------------------------------------*/
@@ -934,6 +1022,35 @@ typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void);
 #define GL_EXT_blend_minmax 1
 #endif
 
+/* GL_EXT_color_buffer_half_float */
+#ifndef GL_EXT_color_buffer_half_float
+#define GL_EXT_color_buffer_half_float 1
+#endif
+
+/* GL_EXT_debug_label */
+#ifndef GL_EXT_debug_label
+#define GL_EXT_debug_label 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif
+typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label);
+typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label);
+#endif
+
+/* GL_EXT_debug_marker */
+#ifndef GL_EXT_debug_marker
+#define GL_EXT_debug_marker 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker);
+GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker);
+GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void);
+#endif
+typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker);
+typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void);
+#endif
+
 /* GL_EXT_discard_framebuffer */
 #ifndef GL_EXT_discard_framebuffer
 #define GL_EXT_discard_framebuffer 1
@@ -943,6 +1060,17 @@ GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numA
 typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
 #endif
 
+/* GL_EXT_multisampled_render_to_texture */
+#ifndef GL_EXT_multisampled_render_to_texture
+#define GL_EXT_multisampled_render_to_texture 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum, GLsizei, GLenum, GLsizei, GLsizei);
+GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);
+#endif
+typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
+#endif
+
 #ifndef GL_EXT_multi_draw_arrays
 #define GL_EXT_multi_draw_arrays 1
 #ifdef GL_GLEXT_PROTOTYPES
@@ -953,16 +1081,134 @@ typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *fir
 typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);
 #endif
 
+/* GL_EXT_occlusion_query_boolean */
+#ifndef GL_EXT_occlusion_query_boolean
+#define GL_EXT_occlusion_query_boolean 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids);
+GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id);
+GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id);
+GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target);
+GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params);
+#endif
+typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids);
+typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id);
+typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id);
+typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target);
+typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params);
+#endif
+
 /* GL_EXT_read_format_bgra */
 #ifndef GL_EXT_read_format_bgra
 #define GL_EXT_read_format_bgra 1
 #endif
 
+/* GL_EXT_robustness */
+#ifndef GL_EXT_robustness
+#define GL_EXT_robustness 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);
+GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, float *params);
+GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+#endif
+typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
+typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, float *params);
+typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
+#endif
+
+/* GL_EXT_separate_shader_objects */
+#ifndef GL_EXT_separate_shader_objects
+#define GL_EXT_separate_shader_objects 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program);
+GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program);
+GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings);
+GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines);
+GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines);
+GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params);
+GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint x);
+GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint x, GLint y);
+GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z);
+GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
+GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat x);
+GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat x, GLfloat y);
+GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
+GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value);
+GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline);
+GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+#endif
+typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program);
+typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings);
+typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines);
+typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines);
+typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint x);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint x, GLint y);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat x);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline);
+typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
+#endif
+
 /* GL_EXT_shader_texture_lod */
 #ifndef GL_EXT_shader_texture_lod
 #define GL_EXT_shader_texture_lod 1
 #endif
 
+/* GL_EXT_shadow_samplers */
+#ifndef GL_EXT_shadow_samplers
+#define GL_EXT_shadow_samplers 1
+#endif
+
+/* GL_EXT_sRGB */
+#ifndef GL_EXT_sRGB
+#define GL_EXT_sRGB 1
+#endif
+
+/* GL_EXT_texture_compression_dxt1 */
+#ifndef GL_EXT_texture_compression_dxt1
+#define GL_EXT_texture_compression_dxt1 1
+#endif
+
 /* GL_EXT_texture_filter_anisotropic */
 #ifndef GL_EXT_texture_filter_anisotropic
 #define GL_EXT_texture_filter_anisotropic 1
@@ -973,45 +1219,40 @@ typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GL
 #define GL_EXT_texture_format_BGRA8888 1
 #endif
 
+/* GL_EXT_texture_rg */
+#ifndef GL_EXT_texture_rg
+#define GL_EXT_texture_rg 1
+#endif
+
+/* GL_EXT_texture_storage */
+#ifndef GL_EXT_texture_storage
+#define GL_EXT_texture_storage 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+#endif
+
 /* GL_EXT_texture_type_2_10_10_10_REV */
 #ifndef GL_EXT_texture_type_2_10_10_10_REV
 #define GL_EXT_texture_type_2_10_10_10_REV 1
 #endif
 
-/* GL_EXT_texture_compression_dxt1 */
-#ifndef GL_EXT_texture_compression_dxt1
-#define GL_EXT_texture_compression_dxt1 1
-#endif
-
 /* GL_EXT_unpack_subimage */
 #ifndef GL_EXT_unpack_subimage
 #define GL_EXT_unpack_subimage 1
 #endif
 
-/* GL_EXT_robustness */
-#ifndef GL_EXT_robustness
-#define GL_EXT_robustness 1
-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void);
-GL_APICALL void   GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
-GL_APICALL void   GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
-GL_APICALL void   GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params);
-#endif /* GL_GLEXT_PROTOTYPES */
-typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void);
-typedef void   (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
-typedef void   (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
-typedef void   (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params);
-#endif
-
-/* GL_EXT_texture_storage */
-#ifndef GL_EXT_texture_storage
-#define GL_EXT_texture_storage 1
-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY TexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-#endif /* GL_GLEXT_PROTOTYPES */
-typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXT) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-#endif
-
 /*------------------------------------------------------------------------*
  * DMP extension functions
  *------------------------------------------------------------------------*/
index 33dd6a578e66c5703f379f41d35368a77dfe8861..a3fc935138c02add08b488b158c929756732b0c9 100644 (file)
@@ -77,7 +77,8 @@ typedef enum {
   SH_FLOAT_MAT4     = 0x8B5C,
   SH_SAMPLER_2D     = 0x8B5E,
   SH_SAMPLER_CUBE   = 0x8B60,
-  SH_SAMPLER_2D_RECT_ARB = 0x8B63
+  SH_SAMPLER_2D_RECT_ARB = 0x8B63,
+  SH_SAMPLER_EXTERNAL_OES = 0x8D66
 } ShDataType;
 
 typedef enum {
similarity index 98%
rename from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.cpp
rename to Source/ThirdParty/ANGLE/src/common/RefCountObject.cpp
index 2de1e718db6346ec9a867b6037799e1ecb8d4a46..c1ef90cdccc26095ffe51830316a182df126fe76 100644 (file)
@@ -11,9 +11,6 @@
 
 #include "RefCountObject.h"
 
-namespace gl
-{
-
 RefCountObject::RefCountObject(GLuint id)
 {
     mId = id;
@@ -48,5 +45,3 @@ void RefCountObjectBindingPointer::set(RefCountObject *newObject)
 
     mObject = newObject;
 }
-
-}
similarity index 93%
rename from Source/ThirdParty/ANGLE/src/libGLESv2/RefCountObject.h
rename to Source/ThirdParty/ANGLE/src/common/RefCountObject.h
index a1493505f728ffa1eca1a486c18573d6656c08f0..727c71c3624fb849e5dcf52c0e2a3e398dbbee50 100644 (file)
@@ -9,8 +9,8 @@
 // that need to be reference counted for correct cross-context deletion.
 // (Concretely, textures, buffers and renderbuffers.)
 
-#ifndef LIBGLESV2_REFCOUNTOBJECT_H_
-#define LIBGLESV2_REFCOUNTOBJECT_H_
+#ifndef COMMON_REFCOUNTOBJECT_H_
+#define COMMON_REFCOUNTOBJECT_H_
 
 #include <cstddef>
 
@@ -19,9 +19,6 @@
 
 #include "common/debug.h"
 
-namespace gl
-{
-
 class RefCountObject
 {
   public:
@@ -65,6 +62,4 @@ class BindingPointer : public RefCountObjectBindingPointer
     ObjectType *operator -> () const { return get(); }
 };
 
-}
-
-#endif   // LIBGLESV2_REFCOUNTOBJECT_H_
+#endif   // COMMON_REFCOUNTOBJECT_H_
index 81a183e8f2136f5103e8ed60024751f8b807c3f3..845d25896246d01ec0fb397070dcf820a0a3243f 100644 (file)
@@ -23,7 +23,7 @@ static void output(bool traceFileDebugOnly, PerfOutputFunction perfFunc, const c
 #if !defined(ANGLE_DISABLE_PERF)\r
     if (perfActive())\r
     {\r
-        char message[4096];\r
+        char message[32768];\r
         int len = vsprintf_s(message, format, vararg);\r
         if (len < 0)\r
         {\r
@@ -31,7 +31,7 @@ static void output(bool traceFileDebugOnly, PerfOutputFunction perfFunc, const c
         }\r
 \r
         // There are no ASCII variants of these D3DPERF functions.\r
-        wchar_t wideMessage[4096];\r
+        wchar_t wideMessage[32768];\r
         for (int i = 0; i < len; ++i)\r
         {\r
             wideMessage[i] = message[i];\r
index 0f92c2c2c93840d3e2929841ae63539b0436a77d..203c421773794b0b913ba88bad82f177015244b6 100644 (file)
@@ -1,7 +1,7 @@
 #define MAJOR_VERSION 1
 #define MINOR_VERSION 0
 #define BUILD_VERSION 0
-#define BUILD_REVISION 939
+#define BUILD_REVISION 1009
 
 #define STRINGIFY(x) #x
 #define MACRO_STRINGIFY(x) STRINGIFY(x)
index 55b1f9a15ded6da065321a0fc7d36bdcbd4999b2..5f83185304a9b0e7315081c7cb7780452ce981a1 100644 (file)
@@ -47,6 +47,7 @@ enum TBasicType
     EbtGuardSamplerEnd,    // non type:  see implementation of IsSampler()
     EbtStruct,
     EbtAddress,            // should be deprecated??
+    EbtInvariant,          // used as a type when qualifying a previously declared variable as being invariant
 };
 
 inline const char* getBasicString(TBasicType t)
index 22764bdcfba5662ab350fd9926e7fecbc570ec28..f27cb75d515e77af2d19283bdfc20d6e45e33ba9 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -8,10 +8,10 @@
 #include "compiler/DetectRecursion.h"
 #include "compiler/ForLoopUnroll.h"
 #include "compiler/Initialize.h"
+#include "compiler/MapLongVariableNames.h"
 #include "compiler/ParseHelper.h"
 #include "compiler/ShHandle.h"
 #include "compiler/ValidateLimitations.h"
-#include "compiler/MapLongVariableNames.h"
 
 namespace {
 bool InitializeSymbolTable(
@@ -91,10 +91,13 @@ TCompiler::TCompiler(ShShaderType type, ShShaderSpec spec)
       shaderSpec(spec),
       builtInFunctionEmulator(type)
 {
+    longNameMap = LongNameMap::GetInstance();
 }
 
 TCompiler::~TCompiler()
 {
+    ASSERT(longNameMap);
+    longNameMap->Release();
 }
 
 bool TCompiler::Init(const ShBuiltInResources& resources)
@@ -246,7 +249,8 @@ void TCompiler::collectAttribsUniforms(TIntermNode* root)
 
 void TCompiler::mapLongVariableNames(TIntermNode* root)
 {
-    MapLongVariableNames map(varyingLongNameMap);
+    ASSERT(longNameMap);
+    MapLongVariableNames map(longNameMap);
     root->traverse(&map);
 }
 
index d28a11b8b8f617b93e2a437925777a9cddff0a64..fd9d94dc5a8bea5ed5d05be5f6bb66938e715dfc 100644 (file)
 
 class ConstantUnion {
 public:
+    ConstantUnion()
+    {
+        iConst = 0;
+    }
 
     POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)        
     void setIConst(int i) {iConst = i; type = EbtInt; }
@@ -54,8 +58,6 @@ public:
         default:
             return false;
         }
-
-        return false;
     }
 
     bool operator!=(const int i) const
@@ -89,8 +91,6 @@ public:
         default:
             return false;   // Invalid operation, handled at semantic analysis
         }
-
-        return false;
     }
 
     bool operator<(const ConstantUnion& constant) const
@@ -104,8 +104,6 @@ public:
         default:
             return false;   // Invalid operation, handled at semantic analysis
         }
-
-        return false;
     }
 
     ConstantUnion operator+(const ConstantUnion& constant) const
index e1e8da25aa738629f81142b0f3ac825c4a176201..ca6d8f7460832e1fa668231ca9198d4abe8306e9 100644 (file)
@@ -1371,8 +1371,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
         newNode->setLine(getLine());
         return newNode;
     }
-
-    return this;
 }
 
 TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermConstantUnion* node)
index 3c5d356da043a303aef0f71751ca7ab415d9913b..0c7e1a9cb809b2cd39ea86dc9d6fa3148da28b89 100644 (file)
@@ -8,24 +8,75 @@
 
 namespace {
 
-TString mapLongName(int id, const TString& name, bool isVarying)
+TString mapLongName(int id, const TString& name, bool isGlobal)
 {
     ASSERT(name.size() > MAX_SHORTENED_IDENTIFIER_SIZE);
     TStringStream stream;
     stream << "webgl_";
-    if (isVarying)
-        stream << "v";
+    if (isGlobal)
+        stream << "g";
     stream << id << "_";
     stream << name.substr(0, MAX_SHORTENED_IDENTIFIER_SIZE - stream.str().size());
     return stream.str();
 }
 
+LongNameMap* gLongNameMapInstance = NULL;
+
 }  // anonymous namespace
 
-MapLongVariableNames::MapLongVariableNames(
-    std::map<std::string, std::string>& varyingLongNameMap)
-    : mVaryingLongNameMap(varyingLongNameMap)
+LongNameMap::LongNameMap()
+    : refCount(0)
+{
+}
+
+LongNameMap::~LongNameMap()
+{
+}
+
+// static
+LongNameMap* LongNameMap::GetInstance()
+{
+    if (gLongNameMapInstance == NULL)
+        gLongNameMapInstance = new LongNameMap;
+    gLongNameMapInstance->refCount++;
+    return gLongNameMapInstance;
+}
+
+void LongNameMap::Release()
+{
+    ASSERT(gLongNameMapInstance == this);
+    ASSERT(refCount > 0);
+    refCount--;
+    if (refCount == 0) {
+        delete gLongNameMapInstance;
+        gLongNameMapInstance = NULL;
+    }
+}
+
+const char* LongNameMap::Find(const char* originalName) const
 {
+    std::map<std::string, std::string>::const_iterator it = mLongNameMap.find(
+        originalName);
+    if (it != mLongNameMap.end())
+        return (*it).second.c_str();
+    return NULL;
+}
+
+void LongNameMap::Insert(const char* originalName, const char* mappedName)
+{
+    mLongNameMap.insert(std::map<std::string, std::string>::value_type(
+        originalName, mappedName));
+}
+
+int LongNameMap::Size() const
+{
+    return mLongNameMap.size();
+}
+
+MapLongVariableNames::MapLongVariableNames(LongNameMap* globalMap)
+{
+    ASSERT(globalMap);
+    mGlobalMap = globalMap;
 }
 
 void MapLongVariableNames::visitSymbol(TIntermSymbol* symbol)
@@ -39,7 +90,7 @@ void MapLongVariableNames::visitSymbol(TIntermSymbol* symbol)
           case EvqInvariantVaryingOut:
           case EvqUniform:
             symbol->setSymbol(
-                mapVaryingLongName(symbol->getSymbol()));
+                mapGlobalLongName(symbol->getSymbol()));
             break;
           default:
             symbol->setSymbol(
@@ -56,15 +107,14 @@ bool MapLongVariableNames::visitLoop(Visit, TIntermLoop* node)
     return true;
 }
 
-TString MapLongVariableNames::mapVaryingLongName(const TString& name)
+TString MapLongVariableNames::mapGlobalLongName(const TString& name)
 {
-    std::map<std::string, std::string>::const_iterator it = mVaryingLongNameMap.find(name.c_str());
-    if (it != mVaryingLongNameMap.end())
-        return (*it).second.c_str();
-
-    int id = mVaryingLongNameMap.size();
-    TString mappedName = mapLongName(id, name, true);
-    mVaryingLongNameMap.insert(
-        std::map<std::string, std::string>::value_type(name.c_str(), mappedName.c_str()));
-    return mappedName;
+    ASSERT(mGlobalMap);
+    const char* mappedName = mGlobalMap->Find(name.c_str());
+    if (mappedName != NULL)
+        return mappedName;
+    int id = mGlobalMap->Size();
+    TString rt = mapLongName(id, name, true);
+    mGlobalMap->Insert(name.c_str(), rt.c_str());
+    return rt;
 }
index 086f2b9e8b0f43072e50307ea771bea97f2f4ce1..fb2c7e81cb8e8d339478cb2023e1f0e435adc31a 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 // This size does not include '\0' in the end.
 #define MAX_SHORTENED_IDENTIFIER_SIZE 32
 
+// This is a ref-counted singleton. GetInstance() returns a pointer to the
+// singleton, and after use, call Release(). GetInstance() and Release() should
+// be paired.
+class LongNameMap {
+public:
+    static LongNameMap* GetInstance();
+    void Release();
+
+    // Return the mapped name if <originalName, mappedName> is in the map;
+    // otherwise, return NULL.
+    const char* Find(const char* originalName) const;
+
+    // Insert a pair into the map.
+    void Insert(const char* originalName, const char* mappedName);
+
+    // Return the number of entries in the map.
+    int Size() const;
+
+private:
+    LongNameMap();
+    ~LongNameMap();
+
+    size_t refCount;
+    std::map<std::string, std::string> mLongNameMap;
+};
+
 // Traverses intermediate tree to map attributes and uniforms names that are
 // longer than MAX_SHORTENED_IDENTIFIER_SIZE to MAX_SHORTENED_IDENTIFIER_SIZE.
 class MapLongVariableNames : public TIntermTraverser {
 public:
-    MapLongVariableNames(std::map<std::string, std::string>& varyingLongNameMap);
+    MapLongVariableNames(LongNameMap* globalMap);
 
     virtual void visitSymbol(TIntermSymbol*);
     virtual bool visitLoop(Visit, TIntermLoop*);
 
 private:
-    TString mapVaryingLongName(const TString& name);
+    TString mapGlobalLongName(const TString& name);
 
-    std::map<std::string, std::string>& mVaryingLongNameMap;
+    LongNameMap* mGlobalMap;
 };
 
 #endif  // COMPILER_MAP_LONG_VARIABLE_NAMES_H_
index b3a00d30dc443de7a14c8e5a9f90e8bff7268983..69b8c26b866dd37a1a568c1d33dbed538600719e 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -67,7 +67,10 @@ OutputHLSL::OutputHLSL(TParseContext &context) : TIntermTraverser(true, true, tr
     mUsesEqualBVec2 = false;
     mUsesEqualBVec3 = false;
     mUsesEqualBVec4 = false;
-    mUsesAtan2 = false;
+    mUsesAtan2_1 = false;
+    mUsesAtan2_2 = false;
+    mUsesAtan2_3 = false;
+    mUsesAtan2_4 = false;
 
     mScopeDepth = 0;
 
@@ -139,7 +142,7 @@ void OutputHLSL::header()
                 {
                     if (mReferencedUniforms.find(name.c_str()) != mReferencedUniforms.end())
                     {
-                        uniforms += "uniform " + typeString(type) + " " + decorateUniform(name, type.isArray()) + arrayString(type) + ";\n";
+                        uniforms += "uniform " + typeString(type) + " " + decorateUniform(name, type) + arrayString(type) + ";\n";
                     }
                 }
                 else if (qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn)
@@ -303,7 +306,7 @@ void OutputHLSL::header()
                 {
                     if (mReferencedUniforms.find(name.c_str()) != mReferencedUniforms.end())
                     {
-                        uniforms += "uniform " + typeString(type) + " " + decorateUniform(name, type.isArray()) + arrayString(type) + ";\n";
+                        uniforms += "uniform " + typeString(type) + " " + decorateUniform(name, type) + arrayString(type) + ";\n";
                     }
                 }
                 else if (qualifier == EvqAttribute)
@@ -703,7 +706,7 @@ void OutputHLSL::header()
                "}\n";
     }
 
-    if (mUsesAtan2)
+    if (mUsesAtan2_1)
     {
         out << "float atanyx(float y, float x)\n"
                "{\n"
@@ -711,6 +714,39 @@ void OutputHLSL::header()
                "    return atan2(y, x);\n"
                "}\n";
     }
+
+    if (mUsesAtan2_2)
+    {
+        out << "float2 atanyx(float2 y, float2 x)\n"
+               "{\n"
+               "    if(x[0] == 0 && y[0] == 0) x[0] = 1;\n"
+               "    if(x[1] == 0 && y[1] == 0) x[1] = 1;\n"
+               "    return float2(atan2(y[0], x[0]), atan2(y[1], x[1]));\n"
+               "}\n";
+    }
+
+    if (mUsesAtan2_3)
+    {
+        out << "float3 atanyx(float3 y, float3 x)\n"
+               "{\n"
+               "    if(x[0] == 0 && y[0] == 0) x[0] = 1;\n"
+               "    if(x[1] == 0 && y[1] == 0) x[1] = 1;\n"
+               "    if(x[2] == 0 && y[2] == 0) x[2] = 1;\n"
+               "    return float3(atan2(y[0], x[0]), atan2(y[1], x[1]), atan2(y[2], x[2]));\n"
+               "}\n";
+    }
+
+    if (mUsesAtan2_4)
+    {
+        out << "float4 atanyx(float4 y, float4 x)\n"
+               "{\n"
+               "    if(x[0] == 0 && y[0] == 0) x[0] = 1;\n"
+               "    if(x[1] == 0 && y[1] == 0) x[1] = 1;\n"
+               "    if(x[2] == 0 && y[2] == 0) x[2] = 1;\n"
+               "    if(x[3] == 0 && y[3] == 0) x[3] = 1;\n"
+               "    return float4(atan2(y[0], x[0]), atan2(y[1], x[1]), atan2(y[2], x[2]), atan2(y[3], x[3]));\n"
+               "}\n";
+    }
 }
 
 void OutputHLSL::visitSymbol(TIntermSymbol *node)
@@ -759,7 +795,7 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
         if (qualifier == EvqUniform)
         {
             mReferencedUniforms.insert(name.c_str());
-            out << decorateUniform(name, node->isArray());
+            out << decorateUniform(name, node->getType());
         }
         else if (qualifier == EvqAttribute)
         {
@@ -1032,8 +1068,6 @@ bool OutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
 
 bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
 {
-    TInfoSinkBase &out = mBody;
-
     switch (node->getOp())
     {
       case EOpNegative:         outputTriplet(visit, "(-", "", ")");  break;
@@ -1110,7 +1144,6 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
 
 bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
 {
-    ShShaderType shaderType = mContext.shaderType;
     TInfoSinkBase &out = mBody;
 
     switch (node->getOp())
@@ -1252,7 +1285,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
             return false;
         }
         break;
-      case EOpComma:            outputTriplet(visit, "", ", ", "");                break;
+      case EOpComma:            outputTriplet(visit, "(", ", ", ")");                break;
       case EOpFunction:
         {
             TString name = TFunction::unmangleName(node->getName());
@@ -1279,6 +1312,11 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
 
                     if (symbol)
                     {
+                        if (symbol->getType().getStruct())
+                        {
+                            addConstructor(symbol->getType(), scopedStruct(symbol->getType().getTypeName()), NULL);
+                        }
+
                         out << argumentString(symbol);
 
                         if (i < arguments.size() - 1)
@@ -1497,7 +1535,14 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
       case EOpPow:              outputTriplet(visit, "pow(", ", ", ")");               break;
       case EOpAtan:
         ASSERT(node->getSequence().size() == 2);   // atan(x) is a unary operator
-        mUsesAtan2 = true;
+        switch (node->getSequence()[0]->getAsTyped()->getNominalSize())
+        {
+          case 1: mUsesAtan2_1 = true; break;
+          case 2: mUsesAtan2_2 = true; break;
+          case 3: mUsesAtan2_3 = true; break;
+          case 4: mUsesAtan2_4 = true; break;
+          default: UNREACHABLE();
+        }
         outputTriplet(visit, "atanyx(", ", ", ")");
         break;
       case EOpMin:           outputTriplet(visit, "min(", ", ", ")");           break;
@@ -1595,14 +1640,14 @@ bool OutputHLSL::visitLoop(Visit visit, TIntermLoop *node)
 
     if (node->getType() == ELoopDoWhile)
     {
-        out << "do\n";
+        out << "{do\n";
 
         outputLineDirective(node->getLine());
         out << "{\n";
     }
     else
     {
-        out << "for(";
+        out << "{for(";
         
         if (node->getInit())
         {
@@ -1644,10 +1689,10 @@ bool OutputHLSL::visitLoop(Visit visit, TIntermLoop *node)
 
         node->getCondition()->traverse(this);
 
-        out << ")";
+        out << ");";
     }
 
-    out << ";\n";
+    out << "}\n";
 
     return false;
 }
@@ -1839,7 +1884,6 @@ bool OutputHLSL::handleExcessiveLoop(TIntermLoop *node)
 
             while (iterations > 0)
             {
-                int remainder = (limit - initial) % increment;
                 int clampedLimit = initial + increment * std::min(255, iterations);
 
                 // for(int index = initial; index < clampedLimit; index += increment)
@@ -2019,6 +2063,8 @@ TString OutputHLSL::typeString(const TType &type)
             return "sampler2D";
           case EbtSamplerCube:
             return "samplerCUBE";
+          case EbtSamplerExternalOES:
+            return "sampler2D";
         }
     }
 
@@ -2060,6 +2106,11 @@ void OutputHLSL::addConstructor(const TType &type, const TString &name, const TI
         return;   // Nameless structures don't have constructors
     }
 
+    if (type.getStruct() && mStructNames.find(decorate(name)) != mStructNames.end())
+    {
+        return;   // Already added
+    }
+
     TType ctorType = type;
     ctorType.clearArrayness();
     ctorType.setPrecision(EbpHigh);
@@ -2370,12 +2421,16 @@ TString OutputHLSL::decorate(const TString &string)
     return string;
 }
 
-TString OutputHLSL::decorateUniform(const TString &string, bool array)
+TString OutputHLSL::decorateUniform(const TString &string, const TType &type)
 {
-    if (array)
+    if (type.isArray())
     {
         return "ar_" + string;   // Allows identifying arrays of size 1
     }
+    else if (type.getBasicType() == EbtSamplerExternalOES)
+    {
+        return "ex_" + string;
+    }
     
     return decorate(string);
 }
index 06ad84986fdd76da6b19bd7fa126396cb2093d43..824bc071b7419dda903747d8616a34682fe7dca7 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -32,7 +32,7 @@ class OutputHLSL : public TIntermTraverser
     static TString arrayString(const TType &type);
     static TString initializer(const TType &type);
     static TString decorate(const TString &string);                      // Prepends an underscore to avoid naming clashes
-    static TString decorateUniform(const TString &string, bool array);
+    static TString decorateUniform(const TString &string, const TType &type);
 
   protected:
     void header();
@@ -113,7 +113,10 @@ class OutputHLSL : public TIntermTraverser
     bool mUsesEqualBVec2;
     bool mUsesEqualBVec3;
     bool mUsesEqualBVec4;
-    bool mUsesAtan2;
+    bool mUsesAtan2_1;
+    bool mUsesAtan2_2;
+    bool mUsesAtan2_3;
+    bool mUsesAtan2_4;
 
     typedef std::set<TString> Constructors;
     Constructors mConstructors;
index e286c7d206dd02c3e8f86f43b861e201922f1767..a600c02cba683687bcca6c690232bacea15e49c1 100644 (file)
@@ -157,8 +157,13 @@ void TAllocation::checkGuardBlock(unsigned char* blockMem, unsigned char val, co
             char assertMsg[80];
 
             // We don't print the assert message.  It's here just to be helpful.
-            sprintf(assertMsg, "PoolAlloc: Damage %s %lu byte allocation at 0x%p\n",
+#if defined(_MSC_VER)
+            sprintf(assertMsg, "PoolAlloc: Damage %s %Iu byte allocation at 0x%p\n",
                     locText, size, data());
+#else
+            sprintf(assertMsg, "PoolAlloc: Damage %s %zu byte allocation at 0x%p\n",
+                    locText, size, data());
+#endif
             assert(0 && "PoolAlloc: Damage in guard block");
         }
     }
index 8ddf0f1527a85b13d71e2ce9b7f2efc4bdd7f96e..91c47e7776451e8b230d70ddfd37e8e838d216b1 100644 (file)
@@ -1,5 +1,5 @@
 //
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
@@ -22,6 +22,7 @@
 #include "compiler/SymbolTable.h"
 #include "compiler/VariableInfo.h"
 
+class LongNameMap;
 class TCompiler;
 
 //
@@ -100,8 +101,8 @@ private:
     TVariableInfoList attribs;  // Active attributes in the compiled shader.
     TVariableInfoList uniforms;  // Active uniforms in the compiled shader.
 
-    // Pair of long varying varibale name <originalName, mappedName>.
-    std::map<std::string, std::string> varyingLongNameMap;
+    // Cached copy of the ref-counted singleton.
+    LongNameMap* longNameMap;
 };
 
 //
index e6695d6b904f5df21107659fd339b5ff25b28edd..edbea99b9a5bab3f21c815b9c1150ea489b5677b 100644 (file)
@@ -9,6 +9,10 @@
 // are documented in the header file.
 //
 
+#if defined(_MSC_VER)
+#pragma warning(disable: 4718)
+#endif
+
 #include "compiler/SymbolTable.h"
 
 #include <stdio.h>
index 38bc6575936166a64813a46f990961a30cbe8d90..33616dc6cdf492ad711e9740068edf25fbaa1596 100644 (file)
@@ -302,6 +302,12 @@ public:
         assert(table.size() >= 2);
         return table[1];
     }
+
+    TSymbolTableLevel* getOuterLevel() {
+        assert(table.size() >= 2);
+        return table[currentLevel() - 1];
+    }
+
     void relateToOperator(const char* name, TOperator op) {
         table[0]->relateToOperator(name, op);
     }
index 843f1877c980a33edfcc505896838795203787f2..1e9486f8d339de0862437c0a6561c5bd3690e2ae 100644 (file)
@@ -63,6 +63,7 @@ static ShDataType getVariableDataType(const TType& type)
           }
       case EbtSampler2D: return SH_SAMPLER_2D;
       case EbtSamplerCube: return SH_SAMPLER_CUBE;
+      case EbtSamplerExternalOES: return SH_SAMPLER_EXTERNAL_OES;
       case EbtSampler2DRect: return SH_SAMPLER_2D_RECT_ARB;
       default: UNREACHABLE();
     }
index 4cee2f2f5c6887365c30f968784c7892514e676a..9a0394bc57fca6b66fa65ee2d53fe8370db3c1d5 100644 (file)
@@ -21,6 +21,18 @@ WHICH GENERATES THE GLSL ES LEXER (glslang_lex.cpp).
 //
 
 // This file is auto-generated by generate_parser.sh. DO NOT EDIT!
+
+// Ignore errors in auto-generated code.
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+#elif defined(_MSC_VER)
+#pragma warning(disable: 4065)
+#pragma warning(disable: 4189)
+#pragma warning(disable: 4505)
+#pragma warning(disable: 4701)
+#endif
 }
 
 %{
@@ -483,7 +495,7 @@ void updateExtensionBehavior(const char* extName, const char* behavior)
                 context->infoSink.info.message(EPrefixWarning, msg.c_str(), yylineno); 
                 break;
             default:
-                ;
+                break;
             }
             return;
         } else
index ec1a85cd500e3ec853567fe325cf1aba22fe0eb9..d6c8869f32952063b64e3a5f0c5aaab645db1363 100644 (file)
@@ -22,6 +22,18 @@ WHICH GENERATES THE GLSL ES PARSER (glslang_tab.cpp AND glslang_tab.h).
 
 // This file is auto-generated by generate_parser.sh. DO NOT EDIT!
 
+// Ignore errors in auto-generated code.
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+#elif defined(_MSC_VER)
+#pragma warning(disable: 4065)
+#pragma warning(disable: 4189)
+#pragma warning(disable: 4505)
+#pragma warning(disable: 4701)
+#endif
+
 #include "compiler/SymbolTable.h"
 #include "compiler/ParseHelper.h"
 #include "GLSLANG/ShaderLang.h"
@@ -129,7 +141,7 @@ extern void yyerror(TParseContext* context, const char* reason);
 %type <interm.intermNode> declaration external_declaration
 %type <interm.intermNode> for_init_statement compound_statement_no_new_scope
 %type <interm.nodePair> selection_rest_statement for_rest_statement
-%type <interm.intermNode> iteration_statement jump_statement statement_no_new_scope
+%type <interm.intermNode> iteration_statement jump_statement statement_no_new_scope statement_with_scope
 %type <interm> single_declaration init_declarator_list
 
 %type <interm> parameter_declaration parameter_declarator parameter_type_specifier
@@ -968,6 +980,8 @@ declaration
         
         prototype->setOp(EOpPrototype);
         $$ = prototype;
+
+        context->symbolTable.pop();
     }
     | init_declarator_list SEMICOLON {
         if ($1.intermAggregate)
@@ -1012,7 +1026,9 @@ function_prototype
         $$.function = $1;
         $$.line = $2.line;
 
-        context->symbolTable.insert(*$$.function);
+        // We're at the inner scope level of the function's arguments and body statement.
+        // Add the function prototype to the surrounding scope instead.
+        context->symbolTable.getOuterLevel()->insert(*$$.function);
     }
     ;
 
@@ -1070,6 +1086,8 @@ function_header
         TType type($1);
         function = new TFunction($2.string, type);
         $$ = function;
+        
+        context->symbolTable.push();
     }
     ;
 
@@ -1171,6 +1189,12 @@ init_declarator_list
         $$ = $1;
     }
     | init_declarator_list COMMA IDENTIFIER {
+        if ($1.type.type == EbtInvariant && !$3.symbol)
+        {
+            context->error($3.line, "undeclared identifier declared as invariant", $3.string->c_str(), "");
+            context->recover();
+        }
+
         TIntermSymbol* symbol = context->intermediate.addSymbol(0, *$3.string, TType($1.type), $3.line);
         $$.intermAggregate = context->intermediate.growAggregate($1.intermNode, symbol, $3.line);
         
@@ -1335,8 +1359,21 @@ single_declaration
     }
     | INVARIANT IDENTIFIER {
         VERTEX_ONLY("invariant declaration", $1.line);
-        $$.qualifier = EvqInvariantVaryingOut;
-        $$.intermAggregate = 0;
+        if (context->globalErrorCheck($1.line, context->symbolTable.atGlobalLevel(), "invariant varying"))
+            context->recover();
+        $$.type.setBasic(EbtInvariant, EvqInvariantVaryingOut, $2.line);
+        if (!$2.symbol)
+        {
+            context->error($2.line, "undeclared identifier declared as invariant", $2.string->c_str(), "");
+            context->recover();
+            
+            $$.intermAggregate = 0;
+        }
+        else
+        {
+            TIntermSymbol *symbol = context->intermediate.addSymbol(0, *$2.string, TType($$.type), $2.line);
+            $$.intermAggregate = context->intermediate.makeAggregate(symbol, $2.line);
+        }
     }
 
 //
@@ -1800,6 +1837,11 @@ statement_no_new_scope
     | simple_statement                { $$ = $1; }
     ;
 
+statement_with_scope
+    : { context->symbolTable.push(); } compound_statement_no_new_scope { context->symbolTable.pop(); $$ = $2; }
+    | { context->symbolTable.push(); } simple_statement                { context->symbolTable.pop(); $$ = $2; }
+    ;
+
 compound_statement_no_new_scope
     // Statement that doesn't create a new scope, for selection_statement, iteration_statement
     : LEFT_BRACE RIGHT_BRACE {
@@ -1837,11 +1879,11 @@ selection_statement
     ;
 
 selection_rest_statement
-    : statement ELSE statement {
+    : statement_with_scope ELSE statement_with_scope {
         $$.node1 = $1;
         $$.node2 = $3;
     }
-    | statement {
+    | statement_with_scope {
         $$.node1 = $1;
         $$.node2 = 0;
     }
@@ -1878,7 +1920,7 @@ iteration_statement
         $$ = context->intermediate.addLoop(ELoopWhile, 0, $4, 0, $6, $1.line);
         --context->loopNestingLevel;
     }
-    | DO { ++context->loopNestingLevel; } statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON {
+    | DO { ++context->loopNestingLevel; } statement_with_scope WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON {
         if (context->boolErrorCheck($8.line, $6))
             context->recover();
 
@@ -2014,11 +2056,6 @@ function_definition
             }
         }
 
-        //
-        // New symbol table scope for body of function plus its arguments
-        //
-        context->symbolTable.push();
-
         //
         // Remember the return type for later checking for RETURN statements.
         //
@@ -2071,7 +2108,7 @@ function_definition
             context->error($1.line, "function does not return a value:", "", $1.function->getName().c_str());
             context->recover();
         }
-        context->symbolTable.pop();
+        
         $$ = context->intermediate.growAggregate($1.intermAggregate, $3, 0);
         context->intermediate.setAggregateOperator($$, EOpFunction, $1.line);
         $$->getAsAggregate()->setName($1.function->getMangledName().c_str());
@@ -2085,6 +2122,8 @@ function_definition
 
         if ($3 && $3->getAsAggregate())
             $$->getAsAggregate()->setEndLine($3->getAsAggregate()->getEndLine());
+
+        context->symbolTable.pop();
     }
     ;
 
index 9e0bbb17bd6f2c16a1290e7232f2468ad4267b44..59b7299137477a89e26da3a42f30d3cb92c0f192 100644 (file)
@@ -1,4 +1,4 @@
-#line 17 "./compiler/glslang.l"
+#line 17 "./glslang.l"
 //
 // Copyright (c) 2010 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
@@ -7,9 +7,21 @@
 
 // This file is auto-generated by generate_parser.sh. DO NOT EDIT!
 
+// Ignore errors in auto-generated code.
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+#elif defined(_MSC_VER)
+#pragma warning(disable: 4065)
+#pragma warning(disable: 4189)
+#pragma warning(disable: 4505)
+#pragma warning(disable: 4701)
+#endif
+
 
 
-#line 13 "./compiler/glslang_lex.cpp"
+#line 25 "./glslang_lex.cpp"
 
 #define  YY_INT_ALIGNED short int
 
@@ -179,11 +191,6 @@ typedef void* yyscan_t;
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
 #endif
 
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
 #define EOB_ACT_CONTINUE_SCAN 0
 #define EOB_ACT_END_OF_FILE 1
 #define EOB_ACT_LAST_MATCH 2
@@ -197,7 +204,7 @@ typedef size_t yy_size_t;
      */
     #define  YY_LESS_LINENO(n) \
             do { \
-                yy_size_t yyl;\
+                int yyl;\
                 for ( yyl = n; yyl < yyleng; ++yyl )\
                     if ( yytext[yyl] == '\n' )\
                         --yylineno;\
@@ -219,6 +226,11 @@ typedef size_t yy_size_t;
 
 #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
 
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
 #ifndef YY_STRUCT_YY_BUFFER_STATE
 #define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
@@ -236,7 +248,7 @@ struct yy_buffer_state
        /* Number of characters read into yy_ch_buf, not including EOB
         * characters.
         */
-       yy_size_t yy_n_chars;
+       int yy_n_chars;
 
        /* Whether we "own" the buffer - i.e., we know we created it,
         * and can realloc() it to grow it, and should free() it to
@@ -315,7 +327,7 @@ static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
 
 YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
 YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
 
 void *yyalloc (yy_size_t ,yyscan_t yyscanner );
 void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
@@ -809,8 +821,8 @@ struct yyguts_t
     size_t yy_buffer_stack_max; /**< capacity of stack. */
     YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
     char yy_hold_char;
-    yy_size_t yy_n_chars;
-    yy_size_t yyleng_r;
+    int yy_n_chars;
+    int yyleng_r;
     char *yy_c_buf_p;
     int yy_init;
     int yy_start;
@@ -863,7 +875,7 @@ FILE *yyget_out (yyscan_t yyscanner );
 
 void yyset_out  (FILE * out_str ,yyscan_t yyscanner );
 
-yy_size_t yyget_leng (yyscan_t yyscanner );
+int yyget_leng (yyscan_t yyscanner );
 
 char *yyget_text (yyscan_t yyscanner );
 
@@ -1897,7 +1909,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 
        else
                {
-                       yy_size_t num_to_read =
+                       int num_to_read =
                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
                while ( num_to_read <= 0 )
@@ -1911,7 +1923,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 
                        if ( b->yy_is_our_buffer )
                                {
-                               yy_size_t new_size = b->yy_buf_size * 2;
+                               int new_size = b->yy_buf_size * 2;
 
                                if ( new_size <= 0 )
                                        b->yy_buf_size += b->yy_buf_size / 8;
@@ -1942,7 +1954,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 
                /* Read in more data. */
                YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-                       yyg->yy_n_chars, num_to_read );
+                       yyg->yy_n_chars, (size_t) num_to_read );
 
                YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
                }
@@ -2067,7 +2079,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
 
                else
                        { /* need more input */
-                       yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
+                       int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
                        ++yyg->yy_c_buf_p;
 
                        switch ( yy_get_next_buffer( yyscanner ) )
@@ -2091,7 +2103,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
                                case EOB_ACT_END_OF_FILE:
                                        {
                                        if ( yywrap(yyscanner ) )
-                                               return 0;
+                                               return EOF;
 
                                        if ( ! yyg->yy_did_buffer_switch_on_eof )
                                                YY_NEW_FILE;
@@ -2354,7 +2366,7 @@ void yypop_buffer_state (yyscan_t yyscanner)
  */
 static void yyensure_buffer_stack (yyscan_t yyscanner)
 {
-       yy_size_t num_to_alloc;
+       int num_to_alloc;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
        if (!yyg->yy_buffer_stack) {
@@ -2452,11 +2464,12 @@ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
  * @param yyscanner The scanner object.
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
 {
        YY_BUFFER_STATE b;
        char *buf;
-       yy_size_t n, i;
+       yy_size_t n;
+       int i;
     
        /* Get memory for full buffer, including space for trailing EOB's. */
        n = _yybytes_len + 2;
@@ -2606,7 +2619,7 @@ FILE *yyget_out  (yyscan_t yyscanner)
 /** Get the length of the current token.
  * @param yyscanner The scanner object.
  */
-yy_size_t yyget_leng  (yyscan_t yyscanner)
+int yyget_leng  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yyleng;
@@ -3116,7 +3129,7 @@ void updateExtensionBehavior(const char* extName, const char* behavior)
                 context->infoSink.info.message(EPrefixWarning, msg.c_str(), yylineno); 
                 break;
             default:
-                ;
+                break;
             }
             return;
         } else
index f696272d51130dd25f852e69ed84bbb29e1d7fe5..37a0f05228886704a9a3ec6f3bfaf0e9fe153fbd 100644 (file)
 
 
 //
-// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
+// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 
 // This file is auto-generated by generate_parser.sh. DO NOT EDIT!
 
+// Ignore errors in auto-generated code.
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wunused-function"
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+#elif defined(_MSC_VER)
+#pragma warning(disable: 4065)
+#pragma warning(disable: 4189)
+#pragma warning(disable: 4505)
+#pragma warning(disable: 4701)
+#endif
+
 #include "compiler/SymbolTable.h"
 #include "compiler/ParseHelper.h"
 #include "GLSLANG/ShaderLang.h"
@@ -584,16 +596,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  71
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1370
+#define YYLAST   1416
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  96
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  80
+#define YYNNTS  83
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  197
+#define YYNRULES  201
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  300
+#define YYNSTATES  304
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -664,16 +676,17 @@ static const yytype_uint16 yyprhs[] =
      368,   370,   372,   374,   376,   378,   380,   382,   384,   385,
      392,   393,   399,   401,   404,   408,   410,   414,   416,   421,
      423,   425,   427,   429,   431,   433,   435,   437,   439,   442,
-     443,   444,   450,   452,   454,   457,   461,   463,   466,   468,
-     471,   477,   481,   483,   485,   490,   491,   498,   499,   508,
-     509,   517,   519,   521,   523,   524,   527,   531,   534,   537,
-     540,   544,   547,   549,   552,   554,   556,   557
+     443,   444,   450,   452,   454,   455,   458,   459,   462,   465,
+     469,   471,   474,   476,   479,   485,   489,   491,   493,   498,
+     499,   506,   507,   516,   517,   525,   527,   529,   531,   532,
+     535,   539,   542,   545,   548,   552,   555,   557,   560,   562,
+     564,   565
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-     172,     0,    -1,    45,    -1,    97,    -1,    48,    -1,    47,
+     175,     0,    -1,    45,    -1,    97,    -1,    48,    -1,    47,
       -1,    49,    -1,    72,   124,    73,    -1,    98,    -1,    99,
       74,   100,    75,    -1,   101,    -1,    99,    78,    50,    -1,
       99,    53,    -1,    99,    54,    -1,   124,    -1,   102,    -1,
@@ -716,45 +729,46 @@ static const yytype_int16 yyrhs[] =
       -1,   146,   147,    -1,   139,   148,    82,    -1,   149,    -1,
      148,    79,   149,    -1,    45,    -1,    45,    74,   125,    75,
       -1,   122,    -1,   126,    -1,   154,    -1,   153,    -1,   151,
-      -1,   160,    -1,   161,    -1,   164,    -1,   171,    -1,    76,
-      77,    -1,    -1,    -1,    76,   155,   159,   156,    77,    -1,
-     158,    -1,   153,    -1,    76,    77,    -1,    76,   159,    77,
-      -1,   152,    -1,   159,   152,    -1,    82,    -1,   124,    82,
-      -1,    18,    72,   124,    73,   162,    -1,   152,    16,   152,
-      -1,   152,    -1,   124,    -1,   137,    45,    81,   150,    -1,
-      -1,    40,    72,   165,   163,    73,   157,    -1,    -1,    15,
-     166,   152,    40,    72,   124,    73,    82,    -1,    -1,    17,
-      72,   167,   168,   170,    73,   157,    -1,   160,    -1,   151,
-      -1,   163,    -1,    -1,   169,    82,    -1,   169,    82,   124,
-      -1,    14,    82,    -1,    13,    82,    -1,    20,    82,    -1,
-      20,   124,    82,    -1,    19,    82,    -1,   173,    -1,   172,
-     173,    -1,   174,    -1,   126,    -1,    -1,   127,   175,   158,
-      -1
+      -1,   163,    -1,   164,    -1,   167,    -1,   174,    -1,    76,
+      77,    -1,    -1,    -1,    76,   155,   162,   156,    77,    -1,
+     161,    -1,   153,    -1,    -1,   159,   161,    -1,    -1,   160,
+     153,    -1,    76,    77,    -1,    76,   162,    77,    -1,   152,
+      -1,   162,   152,    -1,    82,    -1,   124,    82,    -1,    18,
+      72,   124,    73,   165,    -1,   158,    16,   158,    -1,   158,
+      -1,   124,    -1,   137,    45,    81,   150,    -1,    -1,    40,
+      72,   168,   166,    73,   157,    -1,    -1,    15,   169,   158,
+      40,    72,   124,    73,    82,    -1,    -1,    17,    72,   170,
+     171,   173,    73,   157,    -1,   163,    -1,   151,    -1,   166,
+      -1,    -1,   172,    82,    -1,   172,    82,   124,    -1,    14,
+      82,    -1,    13,    82,    -1,    20,    82,    -1,    20,   124,
+      82,    -1,    19,    82,    -1,   176,    -1,   175,   176,    -1,
+     177,    -1,   126,    -1,    -1,   127,   178,   161,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   153,   153,   188,   191,   204,   209,   214,   220,   223,
-     296,   299,   408,   418,   431,   439,   538,   541,   549,   553,
-     560,   564,   571,   577,   586,   594,   649,   656,   666,   669,
-     679,   689,   710,   711,   712,   717,   718,   727,   739,   740,
-     748,   759,   763,   764,   774,   784,   794,   807,   808,   818,
-     831,   835,   839,   843,   844,   857,   858,   871,   872,   885,
-     886,   903,   904,   917,   918,   919,   920,   921,   925,   928,
-     939,   947,   972,   977,   984,  1020,  1023,  1030,  1038,  1059,
-    1078,  1089,  1118,  1123,  1133,  1138,  1148,  1151,  1154,  1157,
-    1163,  1170,  1173,  1189,  1207,  1231,  1254,  1258,  1276,  1284,
-    1316,  1336,  1412,  1421,  1444,  1447,  1453,  1461,  1469,  1477,
-    1487,  1494,  1497,  1500,  1506,  1509,  1524,  1528,  1532,  1536,
-    1545,  1550,  1555,  1560,  1565,  1570,  1575,  1580,  1585,  1590,
-    1596,  1602,  1608,  1613,  1618,  1627,  1636,  1641,  1654,  1654,
-    1668,  1668,  1677,  1680,  1695,  1731,  1735,  1741,  1749,  1765,
-    1769,  1773,  1774,  1780,  1781,  1782,  1783,  1784,  1788,  1789,
-    1789,  1789,  1799,  1800,  1805,  1808,  1818,  1821,  1827,  1828,
-    1832,  1840,  1844,  1854,  1859,  1876,  1876,  1881,  1881,  1888,
-    1888,  1896,  1899,  1905,  1908,  1914,  1918,  1925,  1932,  1939,
-    1946,  1957,  1966,  1970,  1977,  1980,  1986,  1986
+       0,   165,   165,   200,   203,   216,   221,   226,   232,   235,
+     308,   311,   420,   430,   443,   451,   550,   553,   561,   565,
+     572,   576,   583,   589,   598,   606,   661,   668,   678,   681,
+     691,   701,   722,   723,   724,   729,   730,   739,   751,   752,
+     760,   771,   775,   776,   786,   796,   806,   819,   820,   830,
+     843,   847,   851,   855,   856,   869,   870,   883,   884,   897,
+     898,   915,   916,   929,   930,   931,   932,   933,   937,   940,
+     951,   959,   986,   991,   998,  1036,  1039,  1046,  1054,  1075,
+    1096,  1107,  1136,  1141,  1151,  1156,  1166,  1169,  1172,  1175,
+    1181,  1188,  1191,  1213,  1231,  1255,  1278,  1282,  1300,  1308,
+    1340,  1360,  1449,  1458,  1481,  1484,  1490,  1498,  1506,  1514,
+    1524,  1531,  1534,  1537,  1543,  1546,  1561,  1565,  1569,  1573,
+    1582,  1587,  1592,  1597,  1602,  1607,  1612,  1617,  1622,  1627,
+    1633,  1639,  1645,  1650,  1655,  1664,  1673,  1678,  1691,  1691,
+    1705,  1705,  1714,  1717,  1732,  1768,  1772,  1778,  1786,  1802,
+    1806,  1810,  1811,  1817,  1818,  1819,  1820,  1821,  1825,  1826,
+    1826,  1826,  1836,  1837,  1841,  1841,  1842,  1842,  1847,  1850,
+    1860,  1863,  1869,  1870,  1874,  1882,  1886,  1896,  1901,  1918,
+    1918,  1923,  1923,  1930,  1930,  1938,  1941,  1947,  1950,  1956,
+    1960,  1967,  1974,  1981,  1988,  1999,  2008,  2012,  2019,  2022,
+    2028,  2028
 };
 #endif
 
@@ -802,12 +816,12 @@ static const char *const yytname[] =
   "struct_declarator_list", "struct_declarator", "initializer",
   "declaration_statement", "statement", "simple_statement",
   "compound_statement", "@3", "@4", "statement_no_new_scope",
-  "compound_statement_no_new_scope", "statement_list",
-  "expression_statement", "selection_statement",
-  "selection_rest_statement", "condition", "iteration_statement", "@5",
-  "@6", "@7", "for_init_statement", "conditionopt", "for_rest_statement",
+  "statement_with_scope", "@5", "@6", "compound_statement_no_new_scope",
+  "statement_list", "expression_statement", "selection_statement",
+  "selection_rest_statement", "condition", "iteration_statement", "@7",
+  "@8", "@9", "for_init_statement", "conditionopt", "for_rest_statement",
   "jump_statement", "translation_unit", "external_declaration",
-  "function_definition", "@8", 0
+  "function_definition", "@10", 0
 };
 #endif
 
@@ -848,10 +862,11 @@ static const yytype_uint8 yyr1[] =
      142,   142,   142,   142,   142,   142,   142,   142,   144,   143,
      145,   143,   146,   146,   147,   148,   148,   149,   149,   150,
      151,   152,   152,   153,   153,   153,   153,   153,   154,   155,
-     156,   154,   157,   157,   158,   158,   159,   159,   160,   160,
-     161,   162,   162,   163,   163,   165,   164,   166,   164,   167,
-     164,   168,   168,   169,   169,   170,   170,   171,   171,   171,
-     171,   171,   172,   172,   173,   173,   175,   174
+     156,   154,   157,   157,   159,   158,   160,   158,   161,   161,
+     162,   162,   163,   163,   164,   165,   165,   166,   166,   168,
+     167,   169,   167,   170,   167,   171,   171,   172,   172,   173,
+     173,   174,   174,   174,   174,   174,   175,   175,   176,   176,
+     178,   177
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -873,10 +888,11 @@ static const yytype_uint8 yyr2[] =
        1,     1,     1,     1,     1,     1,     1,     1,     0,     6,
        0,     5,     1,     2,     3,     1,     3,     1,     4,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     2,     0,
-       0,     5,     1,     1,     2,     3,     1,     2,     1,     2,
-       5,     3,     1,     1,     4,     0,     6,     0,     8,     0,
-       7,     1,     1,     1,     0,     2,     3,     2,     2,     2,
-       3,     2,     1,     2,     1,     1,     0,     3
+       0,     5,     1,     1,     0,     2,     0,     2,     2,     3,
+       1,     2,     1,     2,     5,     3,     1,     1,     4,     0,
+       6,     0,     8,     0,     7,     1,     1,     1,     0,     2,
+       3,     2,     2,     2,     3,     2,     1,     2,     1,     1,
+       0,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -887,33 +903,34 @@ static const yytype_uint8 yydefact[] =
        0,     0,   111,   112,   113,     0,   105,   104,   119,   117,
      118,   123,   124,   125,   126,   127,   128,   120,   121,   122,
      129,   130,   131,   108,   106,     0,   116,   132,   133,   134,
-     135,   137,   195,   196,     0,    76,    86,     0,    91,    96,
-       0,   102,     0,   109,   114,   136,     0,   192,   194,   107,
+     135,   137,   199,   200,     0,    76,    86,     0,    91,    96,
+       0,   102,     0,   109,   114,   136,     0,   196,   198,   107,
      101,     0,     0,   140,    71,     0,    74,    86,     0,    87,
       88,    89,    77,     0,    86,     0,    72,    97,   103,   110,
-       0,     1,   193,     0,   138,     0,     0,   197,    78,    83,
+       0,     1,   197,     0,   138,     0,     0,   201,    78,    83,
       85,    90,     0,    92,    79,     0,     0,     2,     5,     4,
        6,    27,     0,     0,     0,    34,    33,    32,     3,     8,
       28,    10,    15,    16,     0,     0,    21,     0,    35,     0,
       38,    41,    42,    47,    50,    51,    52,    53,    55,    57,
       59,    70,     0,    25,    73,     0,     0,     0,   142,     0,
-       0,   177,     0,     0,     0,     0,     0,   159,   164,   168,
-      35,    61,    68,     0,   150,     0,   114,   153,   166,   152,
+       0,   181,     0,     0,     0,     0,     0,   159,   168,   172,
+      35,    61,    68,     0,   150,     0,   114,   153,   170,   152,
      151,     0,   154,   155,   156,   157,    80,    82,    84,     0,
        0,    98,     0,   149,   100,    29,    30,     0,    12,    13,
        0,     0,    19,    18,     0,    20,    22,    24,    31,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,   115,     0,   147,     0,   145,   141,   143,
-     188,   187,     0,   179,     0,   191,   189,     0,   175,   158,
-       0,    64,    65,    66,    67,    63,     0,     0,   169,   165,
-     167,     0,    93,     0,    95,    99,     7,     0,    14,    26,
+     192,   191,   166,   183,     0,   195,   193,     0,   179,   158,
+       0,    64,    65,    66,    67,    63,     0,     0,   173,   169,
+     171,     0,    93,     0,    95,    99,     7,     0,    14,    26,
       11,    17,    23,    36,    37,    40,    39,    45,    46,    43,
       44,    48,    49,    54,    56,    58,     0,   139,     0,     0,
-     144,     0,     0,     0,   190,     0,   160,    62,    69,     0,
-      94,     9,     0,     0,   146,     0,   182,   181,   184,     0,
-     173,     0,     0,     0,    81,    60,   148,     0,   183,     0,
-       0,   172,   170,     0,     0,   161,     0,   185,     0,     0,
-       0,   163,   176,   162,     0,   186,   180,   171,   174,   178
+     144,     0,     0,     0,     0,     0,   194,     0,   160,    62,
+      69,     0,    94,     9,     0,     0,   146,     0,   165,   167,
+     186,   185,   188,   166,   177,     0,     0,     0,    81,    60,
+     148,     0,   187,     0,     0,   176,   174,     0,     0,   161,
+       0,   189,     0,   166,     0,   163,   180,   162,     0,   190,
+     184,   175,   178,   182
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
@@ -925,347 +942,358 @@ static const yytype_int16 yydefgoto[] =
      144,   145,    34,    35,    36,    79,    62,    63,    80,    37,
       38,    39,    40,    41,    42,    43,   123,    45,   125,    75,
      127,   128,   196,   197,   164,   147,   148,   149,   150,   210,
-     273,   292,   293,   151,   152,   153,   282,   272,   154,   255,
-     202,   252,   268,   279,   280,   155,    46,    47,    48,    55
+     277,   296,   251,   252,   253,   297,   151,   152,   153,   286,
+     276,   154,   257,   202,   254,   272,   283,   284,   155,    46,
+      47,    48,    55
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -251
+#define YYPACT_NINF -266
 static const yytype_int16 yypact[] =
 {
-    1250,   -17,  -251,  -251,  -251,   113,  -251,  -251,  -251,  -251,
-    -251,  -251,  -251,  -251,  -251,  -251,  -251,  -251,  -251,  -251,
-    -251,  -251,  -251,  -251,  -251,   -39,  -251,  -251,  -251,  -251,
-    -251,  -251,  -251,   -65,   -34,   -10,    21,   -32,  -251,    28,
-     207,  -251,  1324,  -251,    56,  -251,  1206,  -251,  -251,  -251,
-    -251,  1324,    74,  -251,  -251,    86,  -251,    71,    95,  -251,
-    -251,  -251,  -251,   207,   119,   120,  -251,   -56,  -251,  -251,
-     971,  -251,  -251,    84,  -251,   207,   287,  -251,  -251,  -251,
-    -251,   124,   207,   -59,  -251,   773,   971,    98,  -251,  -251,
-    -251,  -251,   971,   971,   971,  -251,  -251,  -251,  -251,  -251,
-      35,  -251,  -251,  -251,   100,    -9,  1037,   102,  -251,   971,
-     -27,    -1,  -251,   -24,    99,  -251,  -251,  -251,   112,   111,
-     -51,  -251,   103,  -251,  -251,   207,   135,  1106,  -251,   101,
-     104,  -251,   109,   115,   106,   839,   117,   107,  -251,  -251,
-      39,  -251,  -251,   -11,  -251,   -65,    54,  -251,  -251,  -251,
-    -251,   371,  -251,  -251,  -251,  -251,   116,  -251,  -251,   905,
-     971,  -251,   118,  -251,  -251,  -251,  -251,     8,  -251,  -251,
-     971,  1287,  -251,  -251,   971,   125,  -251,  -251,  -251,   971,
-     971,   971,   971,   971,   971,   971,   971,   971,   971,   971,
-     971,   971,   971,  -251,  1149,   122,    17,  -251,  -251,  -251,
-    -251,  -251,   455,  -251,   971,  -251,  -251,    32,  -251,  -251,
-     455,  -251,  -251,  -251,  -251,  -251,   971,   971,  -251,  -251,
-    -251,   971,  -251,   123,  -251,  -251,  -251,   126,   121,  -251,
-     127,  -251,  -251,  -251,  -251,   -27,   -27,  -251,  -251,  -251,
-    -251,   -24,   -24,  -251,   112,   111,    79,  -251,   971,   135,
-    -251,   151,   623,    11,  -251,   707,   455,  -251,  -251,   128,
-    -251,  -251,   971,   130,  -251,   134,  -251,  -251,   707,   455,
-     121,   147,   136,   131,  -251,  -251,  -251,   971,  -251,   132,
-     142,   200,  -251,   139,   539,  -251,    19,   971,   539,   455,
-     971,  -251,  -251,  -251,   140,   121,  -251,  -251,  -251,  -251
+    1253,   -20,  -266,  -266,  -266,   148,  -266,  -266,  -266,  -266,
+    -266,  -266,  -266,  -266,  -266,  -266,  -266,  -266,  -266,  -266,
+    -266,  -266,  -266,  -266,  -266,   -39,  -266,  -266,  -266,  -266,
+    -266,  -266,  -266,   -18,    -2,     6,    21,   -61,  -266,    51,
+    1296,  -266,  1370,  -266,    25,  -266,  1209,  -266,  -266,  -266,
+    -266,  1370,    42,  -266,  -266,    50,  -266,    71,    95,  -266,
+    -266,  -266,  -266,  1296,   123,   105,  -266,     9,  -266,  -266,
+     974,  -266,  -266,    81,  -266,  1296,   290,  -266,  -266,  -266,
+    -266,   125,  1296,   -13,  -266,   776,   974,    99,  -266,  -266,
+    -266,  -266,   974,   974,   974,  -266,  -266,  -266,  -266,  -266,
+      35,  -266,  -266,  -266,   100,    -6,  1040,   104,  -266,   974,
+      36,   -64,  -266,   -21,   102,  -266,  -266,  -266,   113,   117,
+     -51,  -266,   108,  -266,  -266,  1296,   129,  1109,  -266,    97,
+     103,  -266,   112,   114,   106,   842,   115,   116,  -266,  -266,
+      39,  -266,  -266,   -43,  -266,   -18,    47,  -266,  -266,  -266,
+    -266,   374,  -266,  -266,  -266,  -266,   118,  -266,  -266,   908,
+     974,  -266,   120,  -266,  -266,  -266,  -266,    19,  -266,  -266,
+     974,  1333,  -266,  -266,   974,   119,  -266,  -266,  -266,   974,
+     974,   974,   974,   974,   974,   974,   974,   974,   974,   974,
+     974,   974,   974,  -266,  1152,   122,   -29,  -266,  -266,  -266,
+    -266,  -266,   121,  -266,   974,  -266,  -266,     5,  -266,  -266,
+     458,  -266,  -266,  -266,  -266,  -266,   974,   974,  -266,  -266,
+    -266,   974,  -266,   137,  -266,  -266,  -266,   138,   111,  -266,
+     142,  -266,  -266,  -266,  -266,    36,    36,  -266,  -266,  -266,
+    -266,   -21,   -21,  -266,   113,   117,    82,  -266,   974,   129,
+    -266,   175,    50,   626,   710,    38,  -266,   197,   458,  -266,
+    -266,   141,  -266,  -266,   974,   155,  -266,   145,  -266,  -266,
+    -266,  -266,   197,   121,   111,   186,   159,   160,  -266,  -266,
+    -266,   974,  -266,   166,   176,   236,  -266,   174,   542,  -266,
+      43,   974,   542,   121,   974,  -266,  -266,  -266,   177,   111,
+    -266,  -266,  -266,  -266
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -251,  -251,  -251,  -251,  -251,  -251,  -251,    50,  -251,  -251,
-    -251,  -251,   -44,  -251,   -21,  -251,   -62,   -20,  -251,  -251,
-    -251,    34,    36,    33,  -251,   -66,   -83,  -251,   -92,   -73,
-       7,    13,  -251,  -251,  -251,   143,   170,   176,   159,  -251,
-    -251,  -247,   -22,   -30,   237,   -15,     0,  -251,  -251,  -251,
-     129,  -122,  -251,    -6,  -159,    -8,  -140,  -250,  -251,  -251,
-    -251,   -41,   202,    48,     9,  -251,  -251,    -5,  -251,  -251,
-    -251,  -251,  -251,  -251,  -251,  -251,  -251,   213,  -251,  -251
+    -266,  -266,  -266,  -266,  -266,  -266,  -266,    85,  -266,  -266,
+    -266,  -266,   -44,  -266,   -15,  -266,   -55,   -19,  -266,  -266,
+    -266,    72,    70,    73,  -266,   -66,   -83,  -266,   -92,   -73,
+      13,    14,  -266,  -266,  -266,   180,   206,   201,   184,  -266,
+    -266,  -241,   -25,   -30,   262,    -4,     0,  -266,  -266,  -266,
+     143,  -122,  -266,    22,  -145,    16,  -144,  -226,  -266,  -266,
+    -266,   -17,  -265,  -266,  -266,   -54,    63,    20,  -266,  -266,
+       4,  -266,  -266,  -266,  -266,  -266,  -266,  -266,  -266,  -266,
+     231,  -266,  -266
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -117
+#define YYTABLE_NINF -165
 static const yytype_int16 yytable[] =
 {
-      44,   224,   167,   163,   121,   199,    52,    32,   271,   191,
-      68,   220,   162,    33,    64,   159,    84,    54,    85,   121,
-      49,   271,   160,   176,    58,    86,   108,    69,    50,     6,
-       7,   183,   184,    81,   291,    64,    73,    53,   291,    56,
-      44,   108,    44,   207,   192,   126,    44,    65,   165,   166,
-      66,    44,    81,    32,    59,    60,    61,    23,    24,    33,
-     179,   180,   251,    44,   173,   178,   185,   186,   217,    57,
-     174,   218,   199,    67,    58,    44,   146,   163,   228,     6,
-       7,   226,    44,   181,   269,   182,   223,   217,   168,   169,
-     217,   232,   294,   121,   -75,   126,   249,   126,   217,   250,
+      44,    77,   167,   163,   121,   199,    52,   220,   285,   191,
+      68,    64,   162,    32,    33,   224,   275,    49,    65,   121,
+     181,    66,   182,   176,    58,    50,   108,   269,   301,     6,
+       7,   275,    64,    81,   183,   184,   217,    53,    69,   218,
+      44,   108,    44,   207,   192,   126,    44,    73,   165,   166,
+     249,    44,    81,   250,    59,    60,    61,    23,    24,    32,
+      33,   159,   295,    44,    54,   178,   295,   173,   160,   185,
+     186,    56,   199,   174,    58,    44,   146,   163,   228,     6,
+       7,    84,    44,    85,   217,    57,   223,   256,   168,   169,
+      86,   232,   226,   121,   -75,   126,    67,   126,   217,    70,
      246,   211,   212,   213,    59,    60,    61,    23,    24,   170,
-     214,   217,   253,   171,   254,   108,   220,     2,     3,     4,
-     215,   237,   238,   239,   240,    44,   -25,    44,    70,   281,
-      70,   298,    49,   257,   258,   233,   234,   108,   108,   108,
-     108,   108,   108,   108,   108,   108,   108,   108,   259,   297,
-      74,   146,    59,    60,    61,   121,   187,   188,   217,   262,
-     235,   236,    76,   270,   126,    83,   124,   241,   242,   156,
-     -26,   189,   190,   172,   177,   263,   270,   108,   193,   275,
-     195,   203,   121,   200,   209,   286,   201,   204,   205,   208,
-     221,   265,   283,   225,    44,   295,   248,  -116,   260,   -27,
-     217,   261,   146,   274,   108,   276,   277,   163,   285,   284,
-     146,     2,     3,     4,   287,   288,   289,     8,     9,    10,
-     290,   231,   299,   243,   245,   157,   244,    78,    11,    12,
+     214,   273,   255,   171,   220,   108,   298,   217,    74,   -25,
+     215,    70,   217,   179,   180,    44,    76,    44,   237,   238,
+     239,   240,    49,   259,   260,   233,   234,   108,   108,   108,
+     108,   108,   108,   108,   108,   108,   108,   108,   261,   302,
+      83,   146,     2,     3,     4,   121,    59,    60,    61,   187,
+     188,   217,   264,   124,   126,   274,   235,   236,   241,   242,
+     156,   -26,   189,   172,   195,   265,   177,   108,   190,   200,
+     274,   279,   121,   193,   203,   201,   204,   208,   205,   290,
+     217,  -116,   221,   209,    44,   225,   248,  -164,   268,   299,
+      58,     2,     3,     4,   108,     6,     7,     8,     9,    10,
+     146,   163,   262,   263,   -27,   267,   278,   281,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      82,   158,    51,   264,   266,    25,    26,   296,    27,    28,
-      29,    30,   146,    31,   194,   146,   146,    77,   256,    72,
-       0,   267,     0,   278,     0,     0,     0,     0,   146,   146,
+     280,   287,   288,    23,    24,    25,    26,   289,    27,    28,
+      29,    30,    87,    31,    88,    89,    90,    91,   291,   292,
+      92,    93,   293,   146,   146,   294,   231,   146,   146,   303,
+     244,   243,   157,    78,   245,    82,   158,    51,   194,    94,
+     270,   266,   146,   258,   271,   300,   282,    72,     0,     0,
+      95,    96,     0,    97,     0,     0,     0,     0,   146,     0,
+       0,     0,   146,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,   129,   130,   131,     0,   132,   133,   134,
+     135,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,     0,     0,     0,    23,    24,    25,    26,
+     136,    27,    28,    29,    30,    87,    31,    88,    89,    90,
+      91,     0,     0,    92,    93,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   146,     0,     0,     0,   146,   146,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
-     129,   130,   131,     0,   132,   133,   134,   135,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-       0,     0,     0,    23,    24,    25,    26,   136,    27,    28,
-      29,    30,    87,    31,    88,    89,    90,    91,     0,     0,
-      92,    93,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    94,
-       0,     0,     0,   137,   138,     0,     0,     0,     0,   139,
-      95,    96,     0,    97,     1,     2,     3,     4,     5,     6,
-       7,     8,     9,    10,   129,   130,   131,     0,   132,   133,
-     134,   135,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,     0,     0,     0,    23,    24,    25,
-      26,   136,    27,    28,    29,    30,    87,    31,    88,    89,
-      90,    91,     0,     0,    92,    93,     0,     0,     0,     0,
+       0,     0,    94,     0,     0,     0,   137,   138,     0,     0,
+       0,     0,   139,    95,    96,     0,    97,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,   129,   130,   131,
+       0,   132,   133,   134,   135,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,     0,     0,     0,
+      23,    24,    25,    26,   136,    27,    28,    29,    30,    87,
+      31,    88,    89,    90,    91,     0,     0,    92,    93,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    94,     0,     0,     0,   137,   219,     0,
-       0,     0,     0,   139,    95,    96,     0,    97,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,   129,   130,
-     131,     0,   132,   133,   134,   135,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,     0,     0,
-       0,    23,    24,    25,    26,   136,    27,    28,    29,    30,
-      87,    31,    88,    89,    90,    91,     0,     0,    92,    93,
+       0,     0,     0,     0,     0,     0,    94,     0,     0,     0,
+     137,   219,     0,     0,     0,     0,   139,    95,    96,     0,
+      97,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,   129,   130,   131,     0,   132,   133,   134,   135,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,     0,     0,     0,    23,    24,    25,    26,   136,    27,
+      28,    29,    30,    87,    31,    88,    89,    90,    91,     0,
+       0,    92,    93,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    94,     0,     0,
-       0,   137,     0,     0,     0,     0,     0,   139,    95,    96,
-       0,    97,     1,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,   129,   130,   131,     0,   132,   133,   134,   135,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,     0,     0,     0,    23,    24,    25,    26,   136,
-      27,    28,    29,    30,    87,    31,    88,    89,    90,    91,
-       0,     0,    92,    93,     0,     0,     0,     0,     0,     0,
+      94,     0,     0,     0,   137,     0,     0,     0,     0,     0,
+     139,    95,    96,     0,    97,     1,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,   129,   130,   131,     0,   132,
+     133,   134,   135,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,     0,     0,     0,    23,    24,
+      25,    26,   136,    27,    28,    29,    30,    87,    31,    88,
+      89,    90,    91,     0,     0,    92,    93,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    94,     0,     0,     0,    76,     0,     0,     0,     0,
-       0,   139,    95,    96,     0,    97,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,     0,     0,     0,     0,
-       0,     0,     0,     0,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,     0,     0,     0,    23,
-      24,    25,    26,     0,    27,    28,    29,    30,    87,    31,
-      88,    89,    90,    91,     0,     0,    92,    93,     0,     0,
+       0,     0,     0,     0,    94,     0,     0,     0,    76,     0,
+       0,     0,     0,     0,   139,    95,    96,     0,    97,     1,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,   129,
+     130,   131,     0,   132,   133,   134,   135,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
+       0,     0,    23,    24,    25,    26,   136,    27,    28,    29,
+      30,    87,    31,    88,    89,    90,    91,     0,     0,    92,
+      93,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    94,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   139,    95,
+      96,     0,    97,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,     0,     0,     0,     0,     0,     0,     0,
+       0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,     0,     0,     0,    23,    24,    25,    26,
+       0,    27,    28,    29,    30,    87,    31,    88,    89,    90,
+      91,     0,     0,    92,    93,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    94,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   139,    95,    96,     0,    97,
-      58,     2,     3,     4,     0,     6,     7,     8,     9,    10,
-       0,     0,     0,     0,     0,     0,     0,     0,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-       0,     0,     0,    23,    24,    25,    26,     0,    27,    28,
-      29,    30,    87,    31,    88,    89,    90,    91,     0,     0,
-      92,    93,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    94,
-       0,     0,     0,     8,     9,    10,     0,     0,     0,     0,
-      95,    96,     0,    97,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,     0,     0,     0,     0,
-       0,    25,    26,     0,    27,    28,    29,    30,    87,    31,
-      88,    89,    90,    91,     0,     0,    92,    93,     0,     0,
+       0,     0,    94,     0,     0,     0,     8,     9,    10,     0,
+       0,     0,   139,    95,    96,     0,    97,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
+       0,     0,     0,     0,    25,    26,     0,    27,    28,    29,
+      30,    87,    31,    88,    89,    90,    91,     0,     0,    92,
+      93,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    94,     0,
+       0,   161,     8,     9,    10,     0,     0,     0,     0,    95,
+      96,     0,    97,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,     0,     0,     0,     0,     0,
+      25,    26,     0,    27,    28,    29,    30,    87,    31,    88,
+      89,    90,    91,     0,     0,    92,    93,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    94,     0,     0,   161,     8,
-       9,    10,     0,     0,     0,     0,    95,    96,     0,    97,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,     0,     0,     0,     0,     0,    25,    26,     0,
-      27,    28,    29,    30,    87,    31,    88,    89,    90,    91,
-       0,     0,    92,    93,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    94,     0,     0,     0,     8,     9,
+      10,     0,     0,     0,   206,    95,    96,     0,    97,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,     0,     0,     0,     0,     0,    25,    26,     0,    27,
+      28,    29,    30,    87,    31,    88,    89,    90,    91,     0,
+       0,    92,    93,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    94,     0,     0,     0,     8,     9,    10,     0,     0,
-       0,   206,    95,    96,     0,    97,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,     0,     0,
-       0,     0,     0,    25,    26,     0,    27,    28,    29,    30,
-      87,    31,    88,    89,    90,    91,     0,     0,    92,    93,
+      94,     0,     0,   222,     8,     9,    10,     0,     0,     0,
+       0,    95,    96,     0,    97,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,     0,     0,     0,
+       0,     0,    25,    26,     0,    27,    28,    29,    30,    87,
+      31,    88,    89,    90,    91,     0,     0,    92,    93,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    94,     0,     0,
-     222,     8,     9,    10,     0,     0,     0,     0,    95,    96,
-       0,    97,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,     0,     0,     0,     0,     0,    25,
-      26,     0,    27,    28,    29,    30,    87,    31,    88,    89,
-      90,    91,     0,     0,    92,    93,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    94,     0,     0,     0,
+       8,     9,    10,     0,     0,     0,     0,    95,    96,     0,
+      97,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,     0,     0,     0,     0,     0,    25,   175,
+       0,    27,    28,    29,    30,    87,    31,    88,    89,    90,
+      91,     0,     0,    92,    93,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    94,     0,     0,     0,     8,     9,    10,
-       0,     0,     0,     0,    95,    96,     0,    97,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-       0,     0,     0,     0,     0,    25,   175,     0,    27,    28,
-      29,    30,    87,    31,    88,    89,    90,    91,     0,     0,
-      92,    93,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    94,
+       0,     0,    94,     2,     3,     4,     0,     0,     0,     8,
+       9,    10,     0,    95,    96,     0,    97,     0,     0,     0,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,     0,     0,     0,     0,     0,    25,    26,     0,
+      27,    28,    29,    30,     0,    31,     2,     3,     4,     0,
+       0,     0,     8,     9,    10,     0,     0,     0,     0,     0,
+       0,     0,     0,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,     0,   198,     0,     0,     0,
+      25,    26,     0,    27,    28,    29,    30,     0,    31,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    71,
+       0,     0,     1,     2,     3,     4,     5,     6,     7,     8,
+       9,    10,     0,     0,     0,     0,     0,     0,     0,   247,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,     0,     0,     0,    23,    24,    25,    26,     0,
+      27,    28,    29,    30,     0,    31,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,     0,     0,     0,     0,
+       0,     0,     0,     0,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,     0,     0,     0,    23,
+      24,    25,    26,     0,    27,    28,    29,    30,     0,    31,
        2,     3,     4,     0,     0,     0,     8,     9,    10,     0,
-      95,    96,     0,    97,     0,     0,     0,    11,    12,    13,
+       0,     0,     0,     0,     0,     0,     0,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
        0,     0,     0,     0,    25,    26,     0,    27,    28,    29,
-      30,     0,    31,     2,     3,     4,     0,     0,     0,     8,
-       9,    10,     0,     0,     0,     0,     0,     0,     0,     0,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,     0,   198,     0,     0,     0,    25,    26,     0,
-      27,    28,    29,    30,     0,    31,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    71,     0,     0,     1,
-       2,     3,     4,     5,     6,     7,     8,     9,    10,     0,
-       0,     0,     0,     0,     0,     0,   247,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
-       0,     0,    23,    24,    25,    26,     0,    27,    28,    29,
-      30,     0,    31,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,     0,     0,     0,     0,     0,     0,     0,
+      30,     0,    31,     8,     9,    10,     0,     0,     0,     0,
+       0,     0,     0,     0,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,     0,     0,     0,     0,
+       0,    25,    26,     0,    27,    28,    29,    30,   229,    31,
+       8,     9,    10,   230,     0,     0,     0,     0,     0,     0,
        0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,     0,     0,     0,    23,    24,    25,    26,
-       0,    27,    28,    29,    30,     0,    31,     8,     9,    10,
-       0,     0,     0,     0,     0,     0,     0,     0,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-       0,     0,     0,     0,     0,    25,    26,     0,    27,    28,
-      29,    30,   229,    31,     8,     9,    10,   230,     0,     0,
-       0,     0,     0,     0,     0,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,     0,     0,     0,
-       0,     0,    25,    26,     0,    27,    28,    29,    30,     0,
-      31
+      20,    21,    22,     0,     0,     0,     0,     0,    25,    26,
+       0,    27,    28,    29,    30,     0,    31
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,   160,    94,    86,    70,   127,    45,     0,   255,    60,
-      40,   151,    85,     0,    36,    74,    72,    82,    74,    85,
-      37,   268,    81,   106,     3,    81,    70,    42,    45,     8,
-       9,    55,    56,    63,   284,    57,    51,    76,   288,    73,
-      40,    85,    42,   135,    95,    75,    46,    79,    92,    93,
-      82,    51,    82,    46,    33,    34,    35,    36,    37,    46,
-      87,    88,   202,    63,    73,   109,    90,    91,    79,    79,
-      79,    82,   194,    45,     3,    75,    76,   160,   170,     8,
-       9,    73,    82,    84,    73,    86,   159,    79,    53,    54,
-      79,   174,    73,   159,    73,   125,    79,   127,    79,    82,
+       0,    55,    94,    86,    70,   127,    45,   151,   273,    60,
+      40,    36,    85,     0,     0,   160,   257,    37,    79,    85,
+      84,    82,    86,   106,     3,    45,    70,   253,   293,     8,
+       9,   272,    57,    63,    55,    56,    79,    76,    42,    82,
+      40,    85,    42,   135,    95,    75,    46,    51,    92,    93,
+      79,    51,    82,    82,    33,    34,    35,    36,    37,    46,
+      46,    74,   288,    63,    82,   109,   292,    73,    81,    90,
+      91,    73,   194,    79,     3,    75,    76,   160,   170,     8,
+       9,    72,    82,    74,    79,    79,   159,    82,    53,    54,
+      81,   174,    73,   159,    73,   125,    45,   127,    79,    74,
      192,    62,    63,    64,    33,    34,    35,    36,    37,    74,
-      71,    79,   204,    78,    82,   159,   256,     4,     5,     6,
-      81,   183,   184,   185,   186,   125,    72,   127,    74,   269,
-      74,   290,    37,   216,   217,   179,   180,   181,   182,   183,
-     184,   185,   186,   187,   188,   189,   190,   191,   221,   289,
-      76,   151,    33,    34,    35,   221,    57,    58,    79,    80,
-     181,   182,    76,   255,   194,    45,    82,   187,   188,    45,
-      72,    59,    61,    73,    72,   248,   268,   221,    75,   262,
-      45,    72,   248,    82,    77,   277,    82,    72,    82,    72,
-      74,    40,    45,    75,   194,   287,    74,    72,    75,    72,
-      79,    75,   202,    75,   248,    75,    72,   290,    77,    73,
-     210,     4,     5,     6,    82,    73,    16,    10,    11,    12,
-      81,   171,    82,   189,   191,    82,   190,    57,    21,    22,
+      71,    73,   204,    78,   258,   159,    73,    79,    76,    72,
+      81,    74,    79,    87,    88,   125,    76,   127,   183,   184,
+     185,   186,    37,   216,   217,   179,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,   190,   191,   221,   294,
+      45,   151,     4,     5,     6,   221,    33,    34,    35,    57,
+      58,    79,    80,    82,   194,   257,   181,   182,   187,   188,
+      45,    72,    59,    73,    45,   248,    72,   221,    61,    82,
+     272,   264,   248,    75,    72,    82,    72,    72,    82,   281,
+      79,    72,    74,    77,   194,    75,    74,    76,   252,   291,
+       3,     4,     5,     6,   248,     8,     9,    10,    11,    12,
+     210,   294,    75,    75,    72,    40,    75,    72,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      64,    82,     5,   249,   252,    38,    39,   288,    41,    42,
-      43,    44,   252,    46,   125,   255,   256,    55,   210,    46,
-      -1,   252,    -1,   268,    -1,    -1,    -1,    -1,   268,   269,
+      75,    45,    73,    36,    37,    38,    39,    77,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    82,    73,
+      53,    54,    16,   253,   254,    81,   171,   257,   258,    82,
+     190,   189,    82,    57,   191,    64,    82,     5,   125,    72,
+     254,   249,   272,   210,   254,   292,   272,    46,    -1,    -1,
+      83,    84,    -1,    86,    -1,    -1,    -1,    -1,   288,    -1,
+      -1,    -1,   292,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    -1,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    -1,    -1,    -1,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   284,    -1,    -1,    -1,   288,   289,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    -1,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      -1,    -1,    -1,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      53,    54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,
-      -1,    -1,    -1,    76,    77,    -1,    -1,    -1,    -1,    82,
-      83,    84,    -1,    86,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    -1,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    -1,    -1,    -1,    36,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,
+      -1,    -1,    72,    -1,    -1,    -1,    76,    77,    -1,    -1,
+      -1,    -1,    82,    83,    84,    -1,    86,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      -1,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    -1,    -1,    -1,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    -1,    -1,    53,    54,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    77,    -1,
-      -1,    -1,    -1,    82,    83,    84,    -1,    86,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    -1,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    -1,    -1,
-      -1,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    -1,    -1,    53,    54,
+      -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,
+      76,    77,    -1,    -1,    -1,    -1,    82,    83,    84,    -1,
+      86,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    -1,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    -1,    -1,    -1,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    -1,
+      -1,    53,    54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
-      -1,    76,    -1,    -1,    -1,    -1,    -1,    82,    83,    84,
-      -1,    86,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    -1,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    -1,    -1,    -1,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,    -1,
+      72,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      82,    83,    84,    -1,    86,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    -1,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    -1,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    -1,    -1,    53,    54,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,
-      -1,    82,    83,    84,    -1,    86,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    36,
-      37,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    53,    54,    -1,    -1,
+      -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,
+      -1,    -1,    -1,    -1,    82,    83,    84,    -1,    86,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    -1,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
+      -1,    -1,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    -1,    -1,    53,
+      54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    82,    83,
+      84,    -1,    86,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    -1,    -1,    -1,    36,    37,    38,    39,
+      -1,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    82,    83,    84,    -1,    86,
-       3,     4,     5,     6,    -1,     8,     9,    10,    11,    12,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      -1,    -1,    -1,    36,    37,    38,    39,    -1,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      53,    54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,
-      -1,    -1,    -1,    10,    11,    12,    -1,    -1,    -1,    -1,
-      83,    84,    -1,    86,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
-      47,    48,    49,    50,    -1,    -1,    53,    54,    -1,    -1,
+      -1,    -1,    72,    -1,    -1,    -1,    10,    11,    12,    -1,
+      -1,    -1,    82,    83,    84,    -1,    86,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
+      -1,    -1,    -1,    -1,    38,    39,    -1,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    -1,    -1,    53,
+      54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,
+      -1,    75,    10,    11,    12,    -1,    -1,    -1,    -1,    83,
+      84,    -1,    86,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
+      38,    39,    -1,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    -1,    -1,    53,    54,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    75,    10,
-      11,    12,    -1,    -1,    -1,    -1,    83,    84,    -1,    86,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    10,    11,
+      12,    -1,    -1,    -1,    82,    83,    84,    -1,    86,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    -1,
+      -1,    53,    54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    72,    -1,    -1,    -1,    10,    11,    12,    -1,    -1,
-      -1,    82,    83,    84,    -1,    86,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    -1,    -1,
-      -1,    -1,    -1,    38,    39,    -1,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    -1,    -1,    53,    54,
+      72,    -1,    -1,    75,    10,    11,    12,    -1,    -1,    -1,
+      -1,    83,    84,    -1,    86,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    -1,    -1,    -1,
+      -1,    -1,    38,    39,    -1,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    -1,    -1,    53,    54,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
-      75,    10,    11,    12,    -1,    -1,    -1,    -1,    83,    84,
-      -1,    86,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,
-      39,    -1,    41,    42,    43,    44,    45,    46,    47,    48,
-      49,    50,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,
+      10,    11,    12,    -1,    -1,    -1,    -1,    83,    84,    -1,
+      86,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,
+      -1,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    72,    -1,    -1,    -1,    10,    11,    12,
-      -1,    -1,    -1,    -1,    83,    84,    -1,    86,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    -1,    -1,
-      53,    54,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,
+      -1,    -1,    72,     4,     5,     6,    -1,    -1,    -1,    10,
+      11,    12,    -1,    83,    84,    -1,    86,    -1,    -1,    -1,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,
+      41,    42,    43,    44,    -1,    46,     4,     5,     6,    -1,
+      -1,    -1,    10,    11,    12,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    -1,    77,    -1,    -1,    -1,
+      38,    39,    -1,    41,    42,    43,    44,    -1,    46,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,
+      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    77,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    -1,    -1,    -1,    36,    37,    38,    39,    -1,
+      41,    42,    43,    44,    -1,    46,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    36,
+      37,    38,    39,    -1,    41,    42,    43,    44,    -1,    46,
        4,     5,     6,    -1,    -1,    -1,    10,    11,    12,    -1,
-      83,    84,    -1,    86,    -1,    -1,    -1,    21,    22,    23,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,    22,    23,
       24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
       -1,    -1,    -1,    -1,    38,    39,    -1,    41,    42,    43,
-      44,    -1,    46,     4,     5,     6,    -1,    -1,    -1,    10,
-      11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    -1,    77,    -1,    -1,    -1,    38,    39,    -1,
-      41,    42,    43,    44,    -1,    46,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,     3,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    77,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
-      -1,    -1,    36,    37,    38,    39,    -1,    41,    42,    43,
-      44,    -1,    46,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      44,    -1,    46,    10,    11,    12,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
+      10,    11,    12,    50,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    -1,    -1,    -1,    36,    37,    38,    39,
-      -1,    41,    42,    43,    44,    -1,    46,    10,    11,    12,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    41,    42,
-      43,    44,    45,    46,    10,    11,    12,    50,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    38,    39,    -1,    41,    42,    43,    44,    -1,
-      46
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,
+      -1,    41,    42,    43,    44,    -1,    46
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1276,10 +1304,10 @@ static const yytype_uint8 yystos[] =
       12,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    36,    37,    38,    39,    41,    42,    43,
       44,    46,   126,   127,   128,   129,   130,   135,   136,   137,
-     138,   139,   140,   141,   142,   143,   172,   173,   174,    37,
-      45,   140,    45,    76,    82,   175,    73,    79,     3,    33,
+     138,   139,   140,   141,   142,   143,   175,   176,   177,    37,
+      45,   140,    45,    76,    82,   178,    73,    79,     3,    33,
       34,    35,   132,   133,   138,    79,    82,    45,   139,   141,
-      74,     0,   173,   141,    76,   145,    76,   158,   132,   131,
+      74,     0,   176,   141,    76,   145,    76,   161,   132,   131,
      134,   139,   133,    45,    72,    74,    81,    45,    47,    48,
       49,    50,    53,    54,    72,    83,    84,    86,    97,    98,
       99,   101,   102,   103,   104,   105,   106,   107,   108,   109,
@@ -1287,21 +1315,22 @@ static const yytype_uint8 yystos[] =
      120,   121,   125,   142,    82,   144,   139,   146,   147,    13,
       14,    15,    17,    18,    19,    20,    40,    76,    77,    82,
      108,   121,   122,   124,   126,   127,   142,   151,   152,   153,
-     154,   159,   160,   161,   164,   171,    45,   131,   134,    74,
+     154,   162,   163,   164,   167,   174,    45,   131,   134,    74,
       81,    75,   125,   122,   150,   108,   108,   124,    53,    54,
       74,    78,    73,    73,    79,    39,   122,    72,   108,    87,
       88,    84,    86,    55,    56,    90,    91,    57,    58,    59,
       61,    60,    95,    75,   146,    45,   148,   149,    77,   147,
-      82,    82,   166,    72,    72,    82,    82,   124,    72,    77,
+      82,    82,   169,    72,    72,    82,    82,   124,    72,    77,
      155,    62,    63,    64,    71,    81,   123,    79,    82,    77,
      152,    74,    75,   125,   150,    75,    73,   100,   124,    45,
       50,   103,   122,   108,   108,   110,   110,   112,   112,   112,
      112,   113,   113,   117,   118,   119,   124,    77,    74,    79,
-      82,   152,   167,   124,    82,   165,   159,   122,   122,   125,
-      75,    75,    80,   125,   149,    40,   151,   160,   168,    73,
-     124,   137,   163,   156,    75,   122,    75,    72,   163,   169,
-     170,   152,   162,    45,    73,    77,   124,    82,    73,    16,
-      81,   153,   157,   158,    73,   124,   157,   152,   150,    82
+      82,   158,   159,   160,   170,   124,    82,   168,   162,   122,
+     122,   125,    75,    75,    80,   125,   149,    40,   161,   153,
+     151,   163,   171,    73,   124,   137,   166,   156,    75,   122,
+      75,    72,   166,   172,   173,   158,   165,    45,    73,    77,
+     124,    82,    73,    16,    81,   153,   157,   161,    73,   124,
+     157,   158,   150,    82
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -3126,6 +3155,8 @@ yyreduce:
         
         prototype->setOp(EOpPrototype);
         (yyval.interm.intermNode) = prototype;
+
+        context->symbolTable.pop();
     ;}
     break;
 
@@ -3179,7 +3210,9 @@ yyreduce:
         (yyval.interm).function = (yyvsp[(1) - (2)].interm.function);
         (yyval.interm).line = (yyvsp[(2) - (2)].lex).line;
 
-        context->symbolTable.insert(*(yyval.interm).function);
+        // We're at the inner scope level of the function's arguments and body statement.
+        // Add the function prototype to the surrounding scope instead.
+        context->symbolTable.getOuterLevel()->insert(*(yyval.interm).function);
     ;}
     break;
 
@@ -3247,6 +3280,8 @@ yyreduce:
         TType type((yyvsp[(1) - (3)].interm.type));
         function = new TFunction((yyvsp[(2) - (3)].lex).string, type);
         (yyval.interm.function) = function;
+        
+        context->symbolTable.push();
     ;}
     break;
 
@@ -3373,6 +3408,12 @@ yyreduce:
   case 92:
 
     {
+        if ((yyvsp[(1) - (3)].interm).type.type == EbtInvariant && !(yyvsp[(3) - (3)].lex).symbol)
+        {
+            context->error((yyvsp[(3) - (3)].lex).line, "undeclared identifier declared as invariant", (yyvsp[(3) - (3)].lex).string->c_str(), "");
+            context->recover();
+        }
+
         TIntermSymbol* symbol = context->intermediate.addSymbol(0, *(yyvsp[(3) - (3)].lex).string, TType((yyvsp[(1) - (3)].interm).type), (yyvsp[(3) - (3)].lex).line);
         (yyval.interm).intermAggregate = context->intermediate.growAggregate((yyvsp[(1) - (3)].interm).intermNode, symbol, (yyvsp[(3) - (3)].lex).line);
         
@@ -3570,8 +3611,21 @@ yyreduce:
 
     {
         VERTEX_ONLY("invariant declaration", (yyvsp[(1) - (2)].lex).line);
-        (yyval.interm).qualifier = EvqInvariantVaryingOut;
-        (yyval.interm).intermAggregate = 0;
+        if (context->globalErrorCheck((yyvsp[(1) - (2)].lex).line, context->symbolTable.atGlobalLevel(), "invariant varying"))
+            context->recover();
+        (yyval.interm).type.setBasic(EbtInvariant, EvqInvariantVaryingOut, (yyvsp[(2) - (2)].lex).line);
+        if (!(yyvsp[(2) - (2)].lex).symbol)
+        {
+            context->error((yyvsp[(2) - (2)].lex).line, "undeclared identifier declared as invariant", (yyvsp[(2) - (2)].lex).string->c_str(), "");
+            context->recover();
+            
+            (yyval.interm).intermAggregate = 0;
+        }
+        else
+        {
+            TIntermSymbol *symbol = context->intermediate.addSymbol(0, *(yyvsp[(2) - (2)].lex).string, TType((yyval.interm).type), (yyvsp[(2) - (2)].lex).line);
+            (yyval.interm).intermAggregate = context->intermediate.makeAggregate(symbol, (yyvsp[(2) - (2)].lex).line);
+        }
     ;}
     break;
 
@@ -4163,12 +4217,32 @@ yyreduce:
 
   case 164:
 
+    { context->symbolTable.push(); ;}
+    break;
+
+  case 165:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[(2) - (2)].interm.intermNode); ;}
+    break;
+
+  case 166:
+
+    { context->symbolTable.push(); ;}
+    break;
+
+  case 167:
+
+    { context->symbolTable.pop(); (yyval.interm.intermNode) = (yyvsp[(2) - (2)].interm.intermNode); ;}
+    break;
+
+  case 168:
+
     {
         (yyval.interm.intermNode) = 0;
     ;}
     break;
 
-  case 165:
+  case 169:
 
     {
         if ((yyvsp[(2) - (3)].interm.intermAggregate)) {
@@ -4179,31 +4253,31 @@ yyreduce:
     ;}
     break;
 
-  case 166:
+  case 170:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.makeAggregate((yyvsp[(1) - (1)].interm.intermNode), 0);
     ;}
     break;
 
-  case 167:
+  case 171:
 
     {
         (yyval.interm.intermAggregate) = context->intermediate.growAggregate((yyvsp[(1) - (2)].interm.intermAggregate), (yyvsp[(2) - (2)].interm.intermNode), 0);
     ;}
     break;
 
-  case 168:
+  case 172:
 
     { (yyval.interm.intermNode) = 0; ;}
     break;
 
-  case 169:
+  case 173:
 
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[(1) - (2)].interm.intermTypedNode)); ;}
     break;
 
-  case 170:
+  case 174:
 
     {
         if (context->boolErrorCheck((yyvsp[(1) - (5)].lex).line, (yyvsp[(3) - (5)].interm.intermTypedNode)))
@@ -4212,7 +4286,7 @@ yyreduce:
     ;}
     break;
 
-  case 171:
+  case 175:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (3)].interm.intermNode);
@@ -4220,7 +4294,7 @@ yyreduce:
     ;}
     break;
 
-  case 172:
+  case 176:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (1)].interm.intermNode);
@@ -4228,7 +4302,7 @@ yyreduce:
     ;}
     break;
 
-  case 173:
+  case 177:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[(1) - (1)].interm.intermTypedNode);
@@ -4237,7 +4311,7 @@ yyreduce:
     ;}
     break;
 
-  case 174:
+  case 178:
 
     {
         TIntermNode* intermNode;
@@ -4255,12 +4329,12 @@ yyreduce:
     ;}
     break;
 
-  case 175:
+  case 179:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; ;}
     break;
 
-  case 176:
+  case 180:
 
     {
         context->symbolTable.pop();
@@ -4269,12 +4343,12 @@ yyreduce:
     ;}
     break;
 
-  case 177:
+  case 181:
 
     { ++context->loopNestingLevel; ;}
     break;
 
-  case 178:
+  case 182:
 
     {
         if (context->boolErrorCheck((yyvsp[(8) - (8)].lex).line, (yyvsp[(6) - (8)].interm.intermTypedNode)))
@@ -4285,12 +4359,12 @@ yyreduce:
     ;}
     break;
 
-  case 179:
+  case 183:
 
     { context->symbolTable.push(); ++context->loopNestingLevel; ;}
     break;
 
-  case 180:
+  case 184:
 
     {
         context->symbolTable.pop();
@@ -4299,35 +4373,35 @@ yyreduce:
     ;}
     break;
 
-  case 181:
+  case 185:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     ;}
     break;
 
-  case 182:
+  case 186:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     ;}
     break;
 
-  case 183:
+  case 187:
 
     {
         (yyval.interm.intermTypedNode) = (yyvsp[(1) - (1)].interm.intermTypedNode);
     ;}
     break;
 
-  case 184:
+  case 188:
 
     {
         (yyval.interm.intermTypedNode) = 0;
     ;}
     break;
 
-  case 185:
+  case 189:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (2)].interm.intermTypedNode);
@@ -4335,7 +4409,7 @@ yyreduce:
     ;}
     break;
 
-  case 186:
+  case 190:
 
     {
         (yyval.interm.nodePair).node1 = (yyvsp[(1) - (3)].interm.intermTypedNode);
@@ -4343,7 +4417,7 @@ yyreduce:
     ;}
     break;
 
-  case 187:
+  case 191:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4354,7 +4428,7 @@ yyreduce:
     ;}
     break;
 
-  case 188:
+  case 192:
 
     {
         if (context->loopNestingLevel <= 0) {
@@ -4365,7 +4439,7 @@ yyreduce:
     ;}
     break;
 
-  case 189:
+  case 193:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yyvsp[(1) - (2)].lex).line);
@@ -4376,7 +4450,7 @@ yyreduce:
     ;}
     break;
 
-  case 190:
+  case 194:
 
     {
         (yyval.interm.intermNode) = context->intermediate.addBranch(EOpReturn, (yyvsp[(2) - (3)].interm.intermTypedNode), (yyvsp[(1) - (3)].lex).line);
@@ -4391,7 +4465,7 @@ yyreduce:
     ;}
     break;
 
-  case 191:
+  case 195:
 
     {
         FRAG_ONLY("discard", (yyvsp[(1) - (2)].lex).line);
@@ -4399,7 +4473,7 @@ yyreduce:
     ;}
     break;
 
-  case 192:
+  case 196:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
@@ -4407,7 +4481,7 @@ yyreduce:
     ;}
     break;
 
-  case 193:
+  case 197:
 
     {
         (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[(1) - (2)].interm.intermNode), (yyvsp[(2) - (2)].interm.intermNode), 0);
@@ -4415,21 +4489,21 @@ yyreduce:
     ;}
     break;
 
-  case 194:
+  case 198:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     ;}
     break;
 
-  case 195:
+  case 199:
 
     {
         (yyval.interm.intermNode) = (yyvsp[(1) - (1)].interm.intermNode);
     ;}
     break;
 
-  case 196:
+  case 200:
 
     {
         TFunction* function = (yyvsp[(1) - (1)].interm).function;
@@ -4462,11 +4536,6 @@ yyreduce:
             }
         }
 
-        //
-        // New symbol table scope for body of function plus its arguments
-        //
-        context->symbolTable.push();
-
         //
         // Remember the return type for later checking for RETURN statements.
         //
@@ -4514,7 +4583,7 @@ yyreduce:
     ;}
     break;
 
-  case 197:
+  case 201:
 
     {
         //?? Check that all paths return a value if return type != void ?
@@ -4523,7 +4592,7 @@ yyreduce:
             context->error((yyvsp[(1) - (3)].interm).line, "function does not return a value:", "", (yyvsp[(1) - (3)].interm).function->getName().c_str());
             context->recover();
         }
-        context->symbolTable.pop();
+        
         (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[(1) - (3)].interm).intermAggregate, (yyvsp[(3) - (3)].interm.intermNode), 0);
         context->intermediate.setAggregateOperator((yyval.interm.intermNode), EOpFunction, (yyvsp[(1) - (3)].interm).line);
         (yyval.interm.intermNode)->getAsAggregate()->setName((yyvsp[(1) - (3)].interm).function->getMangledName().c_str());
@@ -4537,6 +4606,8 @@ yyreduce:
 
         if ((yyvsp[(3) - (3)].interm.intermNode) && (yyvsp[(3) - (3)].interm.intermNode)->getAsAggregate())
             (yyval.interm.intermNode)->getAsAggregate()->setEndLine((yyvsp[(3) - (3)].interm.intermNode)->getAsAggregate()->getEndLine());
+
+        context->symbolTable.pop();
     ;}
     break;
 
index 6ce4df94da09f7f70b032d5a521a24aadd18dd18..9b3acdf2b5794d4247076d95c0903a8133d13387 100644 (file)
@@ -16,7 +16,8 @@
 #define ANGLE_OS_WIN
 #elif defined(__APPLE__) || defined(__linux__) || \
       defined(__FreeBSD__) || defined(__OpenBSD__) || \
-      defined(__sun) || defined(ANDROID)
+      defined(__sun) || defined(ANDROID) || \
+      defined(__GLIBC__) || defined(__GNU__)
 #define ANGLE_OS_POSIX
 #else
 #error Unsupported platform.
index 03dd4f6741095dc8fcd900a59d74772065570992..13a5df18a9b3eaaa749a36db1452b7c70b37d4b1 100644 (file)
@@ -53,6 +53,12 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "compiler/preprocessor/slglobals.h"
 
+#if defined(_MSC_VER)
+#pragma warning(disable: 4054)
+#pragma warning(disable: 4152)
+#pragma warning(disable: 4706)
+#endif
+
 static int CPPif(yystypepp * yylvalpp);
 
 /* Don't use memory.c's replacements, as we clean up properly here */
index e6fea7aa33eb53664d8c3fac7ce43cf5f8e2a7c5..029521a55928987e8829ba9f81778e32a0008208 100644 (file)
@@ -52,6 +52,10 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "compiler/preprocessor/memory.h"
 
+#if defined(_MSC_VER)
+#pragma warning(disable: 4706)
+#endif
+
 // default alignment and chunksize, if called with 0 arguments
 #define CHUNKSIZE       (64*1024)
 #define ALIGN           8
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Context.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Context.cpp
new file mode 100644 (file)
index 0000000..259cc43
--- /dev/null
@@ -0,0 +1,139 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "Context.h"
+
+#include <algorithm>
+#include <sstream>
+
+#include "compiler/debug.h"
+#include "stl_utils.h"
+#include "token_type.h"
+
+static bool isMacroNameReserved(const std::string* name)
+{
+    ASSERT(name);
+
+    // Names prefixed with "GL_" are reserved.
+    if (name->substr(0, 3) == "GL_")
+        return true;
+
+    // Names containing two consecutive underscores are reserved.
+    if (name->find("__") != std::string::npos)
+        return true;
+
+    return false;
+}
+
+namespace pp
+{
+
+Context::Context()
+    : mLexer(NULL),
+      mInput(NULL),
+      mOutput(NULL)
+{
+}
+
+Context::~Context()
+{
+    destroyLexer();
+}
+
+bool Context::init()
+{
+    return initLexer();
+
+    // TODO(alokp): Define built-in macros here so that we do not need to
+    // define them everytime in process().
+}
+
+bool Context::process(int count,
+                      const char* const string[],
+                      const int length[],
+                      TokenVector* output)
+{
+    ASSERT((count >=0) && (string != NULL) && (output != NULL));
+
+    // Setup.
+    mInput = new Input(count, string, length);
+    mOutput = output;
+    defineBuiltInMacro("GL_ES", 1);
+
+    // Parse.
+    bool success = parse();
+
+    // Cleanup.
+    reset();
+    return success;
+}
+
+bool Context::defineMacro(pp::Token::Location location,
+                          pp::Macro::Type type,
+                          std::string* name,
+                          pp::TokenVector* parameters,
+                          pp::TokenVector* replacements)
+{
+    std::auto_ptr<Macro> macro(new Macro(type, name, parameters, replacements));
+    if (isMacroNameReserved(name))
+    {
+        // TODO(alokp): Report error.
+        return false;
+    }
+    if (isMacroDefined(name))
+    {
+        // TODO(alokp): Report error.
+        return false;
+    }
+
+    mMacros[*name] = macro.release();
+    return true;
+}
+
+bool Context::undefineMacro(const std::string* name)
+{
+    MacroSet::iterator iter = mMacros.find(*name);
+    if (iter == mMacros.end())
+    {
+        // TODO(alokp): Report error.
+        return false;
+    }
+    mMacros.erase(iter);
+    return true;
+}
+
+bool Context::isMacroDefined(const std::string* name)
+{
+    return mMacros.find(*name) != mMacros.end();
+}
+
+// Reset to initialized state.
+void Context::reset()
+{
+    std::for_each(mMacros.begin(), mMacros.end(), DeleteSecond());
+    mMacros.clear();
+
+    delete mInput;
+    mInput = NULL;
+
+    mOutput = NULL;
+}
+
+void Context::defineBuiltInMacro(const std::string& name, int value)
+{
+    std::ostringstream stream;
+    stream << value;
+    Token* token = new Token(0, INT_CONSTANT, new std::string(stream.str()));
+    TokenVector* replacements = new pp::TokenVector(1, token);
+
+    mMacros[name] = new Macro(Macro::kTypeObj,
+                              new std::string(name),
+                              NULL,
+                              replacements);
+}
+
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Context.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Context.h
new file mode 100644 (file)
index 0000000..a812747
--- /dev/null
@@ -0,0 +1,60 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_PREPROCESSOR_CONTEXT_H_
+#define COMPILER_PREPROCESSOR_CONTEXT_H_
+
+#include <map>
+
+#include "common/angleutils.h"
+#include "Input.h"
+#include "Macro.h"
+#include "Token.h"
+
+namespace pp
+{
+
+class Context
+{
+  public:
+    Context();
+    ~Context();
+
+    bool init();
+    bool process(int count, const char* const string[], const int length[],
+                 TokenVector* output);
+
+    void* lexer() { return mLexer; }
+    int readInput(char* buf, int maxSize);
+    TokenVector* output() { return mOutput; }
+
+    bool defineMacro(pp::Token::Location location,
+                     pp::Macro::Type type,
+                     std::string* name,
+                     pp::TokenVector* parameters,
+                     pp::TokenVector* replacements);
+    bool undefineMacro(const std::string* name);
+    bool isMacroDefined(const std::string* name);
+
+  private:
+    DISALLOW_COPY_AND_ASSIGN(Context);
+    typedef std::map<std::string, Macro*> MacroSet;
+
+    void reset();
+    bool initLexer();
+    void destroyLexer();
+    void defineBuiltInMacro(const std::string& name, int value);
+    bool parse();
+
+    void* mLexer;  // Lexer handle.
+    Input* mInput;
+    TokenVector* mOutput;
+    MacroSet mMacros;  // Defined macros.
+};
+
+}  // namespace pp
+#endif  // COMPILER_PREPROCESSOR_CONTEXT_H_
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.cpp
new file mode 100644 (file)
index 0000000..694c3bd
--- /dev/null
@@ -0,0 +1,165 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "Input.h"
+
+#include <cstdio>
+
+#include "compiler/debug.h"
+
+namespace pp
+{
+
+Input::Input(int count, const char* const string[], const int length[])
+    : mCount(count),
+      mString(string),
+      mLength(length),
+      mIndex(-1),
+      mSize(0),
+      mError(kErrorNone),
+      mState(kStateInitial)
+{
+    ASSERT(mCount >= 0);
+    switchToNextString();
+}
+
+bool Input::eof() const
+{
+    ASSERT(mIndex <= mCount);
+    return mIndex == mCount;
+}
+
+int Input::read(char* buf, int bufSize)
+{
+    int nread = 0;
+    int startIndex = mIndex;
+    // Keep reading until the buffer is full or the current string is exhausted.
+    while ((mIndex == startIndex) && (nread < bufSize))
+    {
+        int c = getChar();
+        if (c == EOF)
+        {
+            if (mState == kStateBlockComment)
+                mError = kErrorUnexpectedEOF;
+            break;
+        }
+
+        switch (mState)
+        {
+          case kStateInitial:
+            if (c == '/')
+            {
+                // Potentially a comment.
+                switch (peekChar())
+                {
+                  case '/':
+                    getChar();  // Eat '/'.
+                    mState = kStateLineComment;
+                    break;
+                  case '*':
+                    getChar();  // Eat '*'.
+                    mState = kStateBlockComment;
+                    break;
+                  default:
+                    // Not a comment.
+                    buf[nread++] = c;
+                    break;
+                }
+            } else
+            {
+                buf[nread++] = c;
+            }
+            break;
+
+          case kStateLineComment:
+            if (c == '\n')
+            {
+                buf[nread++] = c;
+                mState = kStateInitial;
+            }
+            break;
+
+          case kStateBlockComment:
+            if (c == '*' && (peekChar() == '/'))
+            {
+                getChar();   // Eat '/'.
+                buf[nread++] = ' ';  // Replace comment with whitespace.
+                mState = kStateInitial;
+            } else if (c == '\n')
+            {
+                // Line breaks are never skipped.
+                buf[nread++] = c;
+            }
+            break;
+
+          default:
+            ASSERT(false);
+            break;
+        }
+    }
+
+    return nread;
+}
+
+int Input::getChar()
+{
+    if (eof()) return EOF;
+
+    const char* str = mString[mIndex];
+    int c = str[mSize++];
+
+    // Switch to next string if the current one is fully read.
+    int length = stringLength(mIndex);
+    // We never read from empty string.
+    ASSERT(length != 0);
+    if (((length < 0) && (str[mSize] == '\0')) ||
+        ((length > 0) && (mSize == length)))
+        switchToNextString();
+
+    return c;
+}
+
+int Input::peekChar()
+{
+    // Save the current read position.
+    int index = mIndex;
+    int size = mSize;
+    int c = getChar();
+
+    // Restore read position.
+    mIndex = index;
+    mSize = size;
+    return c;
+}
+
+void Input::switchToNextString()
+{
+    ASSERT(mIndex < mCount);
+
+    mSize = 0;
+    do
+    {
+        ++mIndex;
+    } while (!eof() && isStringEmpty(mIndex));
+}
+
+bool Input::isStringEmpty(int index)
+{
+    ASSERT(index < mCount);
+
+    const char* str = mString[mIndex];
+    int length = stringLength(mIndex);
+    return (length == 0) || ((length < 0) && (str[0] == '\0'));
+}
+
+int Input::stringLength(int index)
+{
+    ASSERT(index < mCount);
+    return mLength ? mLength[index] : -1;
+}
+
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Input.h
new file mode 100644 (file)
index 0000000..5a1b5d1
--- /dev/null
@@ -0,0 +1,74 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_PREPROCESSOR_INPUT_H_
+#define COMPILER_PREPROCESSOR_INPUT_H_
+
+namespace pp
+{
+
+// Reads the given set of strings into input buffer.
+// Strips comments.
+class Input
+{
+  public:
+    Input(int count, const char* const string[], const int length[]);
+
+    enum Error
+    {
+        kErrorNone,
+        kErrorUnexpectedEOF
+    };
+    Error error() const { return mError; }
+
+    // Returns the index of string currently being scanned.
+    int stringIndex() const { return mIndex; }
+    // Returns true if EOF has reached.
+    bool eof() const;
+
+    // Reads up to bufSize characters into buf.
+    // Returns the number of characters read.
+    // It replaces each comment by a whitespace. It reads only one string
+    // at a time so that the lexer has opportunity to update the string number
+    // for meaningful diagnostic messages.
+    int read(char* buf, int bufSize);
+
+private:
+    enum State
+    {
+        kStateInitial,
+        kStateLineComment,
+        kStateBlockComment
+    };
+
+    int getChar();
+    int peekChar();
+    // Switches input buffer to the next non-empty string.
+    // This is called when the current string is fully read.
+    void switchToNextString();
+    // Returns true if the given string is empty.
+    bool isStringEmpty(int index);
+    // Return the length of the given string.
+    // Returns a negative value for null-terminated strings.
+    int stringLength(int index);
+
+    // Input.
+    int mCount;
+    const char* const* mString;
+    const int* mLength;
+
+    // Current read position.
+    int mIndex;   // Index of string currently being scanned.
+    int mSize;    // Size of string already scanned.
+
+    // Current error and state.
+    Error mError;
+    State mState;
+};
+
+}  // namespace pp
+#endif  // COMPILER_PREPROCESSOR_INPUT_H_
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.cpp
new file mode 100644 (file)
index 0000000..fccca96
--- /dev/null
@@ -0,0 +1,45 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "Macro.h"
+
+#include <algorithm>
+
+#include "stl_utils.h"
+
+namespace pp
+{
+
+Macro::Macro(Type type,
+             std::string* name,
+             TokenVector* parameters,
+             TokenVector* replacements)
+    : mType(type),
+      mName(name),
+      mParameters(parameters),
+      mReplacements(replacements)
+{
+}
+
+Macro::~Macro()
+{
+    delete mName;
+
+    if (mParameters)
+    {
+        std::for_each(mParameters->begin(), mParameters->end(), Delete());
+        delete mParameters;
+    }
+
+    if (mReplacements)
+    {
+        std::for_each(mReplacements->begin(), mReplacements->end(), Delete());
+        delete mReplacements;
+    }
+}
+
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Macro.h
new file mode 100644 (file)
index 0000000..e243306
--- /dev/null
@@ -0,0 +1,51 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_PREPROCESSOR_MACRO_H_
+#define COMPILER_PREPROCESSOR_MACRO_H_
+
+#include <string>
+#include <vector>
+
+#include "common/angleutils.h"
+#include "Token.h"
+
+namespace pp
+{
+
+class Macro
+{
+  public:
+    enum Type
+    {
+        kTypeObj,
+        kTypeFunc
+    };
+
+    // Takes ownership of pointer parameters.
+    Macro(Type type,
+          std::string* name,
+          TokenVector* parameters,
+          TokenVector* replacements);
+    ~Macro();
+
+    Type type() const { return mType; }
+    const std::string* identifier() const { return mName; }
+    const TokenVector* parameters() const { return mParameters; }
+    const TokenVector* replacements() const { return mReplacements; }
+
+  private:
+    DISALLOW_COPY_AND_ASSIGN(Macro);
+
+    Type mType;
+    std::string* mName;
+    TokenVector* mParameters;
+    TokenVector* mReplacements;
+};
+
+}  // namespace pp
+#endif COMPILER_PREPROCESSOR_MACRO_H_
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.cpp
new file mode 100644 (file)
index 0000000..ef49e57
--- /dev/null
@@ -0,0 +1,53 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "Preprocessor.h"
+
+#include <algorithm>
+
+#include "compiler/debug.h"
+#include "Context.h"
+#include "stl_utils.h"
+
+namespace pp
+{
+
+Preprocessor::Preprocessor() : mContext(NULL)
+{
+}
+
+Preprocessor::~Preprocessor()
+{
+    delete mContext;
+}
+
+bool Preprocessor::init()
+{
+    mContext = new Context;
+    return mContext->init();
+}
+
+bool Preprocessor::process(int count,
+                           const char* const string[],
+                           const int length[])
+{
+    ASSERT((count >=0) && (string != NULL));
+    if ((count < 0) || (string == NULL))
+        return false;
+
+    reset();
+
+    return mContext->process(count, string, length, &mTokens);
+}
+
+void Preprocessor::reset()
+{
+    std::for_each(mTokens.begin(), mTokens.end(), Delete());
+    mTokens.clear();
+}
+
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Preprocessor.h
new file mode 100644 (file)
index 0000000..885bb70
--- /dev/null
@@ -0,0 +1,42 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_PREPROCESSOR_PREPROCESSOR_H_
+#define COMPILER_PREPROCESSOR_PREPROCESSOR_H_
+
+#include "common/angleutils.h"
+#include "Token.h"
+
+namespace pp
+{
+
+class Context;
+
+class Preprocessor
+{
+  public:
+    Preprocessor();
+    ~Preprocessor();
+
+    bool init();
+
+    bool process(int count, const char* const string[], const int length[]);
+    TokenIterator begin() const { return mTokens.begin(); }
+    TokenIterator end() const { return mTokens.end(); }
+
+  private:
+    DISALLOW_COPY_AND_ASSIGN(Preprocessor);
+
+    // Reset to initialized state.
+    void reset();
+
+    Context* mContext;
+    TokenVector mTokens;  // Output.
+};
+
+}  // namespace pp
+#endif  // COMPILER_PREPROCESSOR_PREPROCESSOR_H_
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.cpp
new file mode 100644 (file)
index 0000000..a2e759c
--- /dev/null
@@ -0,0 +1,55 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "Token.h"
+
+#include "token_type.h"
+
+static const int kLocationLineSize = 16;  // in bits.
+static const int kLocationLineMask = (1 << kLocationLineSize) - 1;
+
+namespace pp
+{
+
+Token::Location Token::encodeLocation(int line, int file)
+{
+    return (file << kLocationLineSize) | (line & kLocationLineMask);
+}
+
+void Token::decodeLocation(Location loc, int* line, int* file)
+{
+    if (file) *file = loc >> kLocationLineSize;
+    if (line) *line = loc & kLocationLineMask;
+}
+
+Token::Token(Location location, int type, std::string* value)
+    : mLocation(location),
+      mType(type),
+      mValue(value)
+{
+}
+
+Token::~Token() {
+    delete mValue;
+}
+
+std::ostream& operator<<(std::ostream& out, const Token& token)
+{
+    switch (token.type())
+    {
+      case INT_CONSTANT:
+      case FLOAT_CONSTANT:
+      case IDENTIFIER:
+        out << *(token.value());
+        break;
+      default:
+        out << static_cast<char>(token.type());
+        break;
+    }
+    return out;
+}
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.h b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/Token.h
new file mode 100644 (file)
index 0000000..4f5a12b
--- /dev/null
@@ -0,0 +1,48 @@
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef COMPILER_PREPROCESSOR_TOKEN_H_
+#define COMPILER_PREPROCESSOR_TOKEN_H_
+
+#include <string>
+#include <vector>
+
+#include "common/angleutils.h"
+
+namespace pp
+{
+
+class Token
+{
+  public:
+    typedef int Location;
+    static Location encodeLocation(int line, int file);
+    static void decodeLocation(Location loc, int* line, int* file);
+
+    // Takes ownership of string.
+    Token(Location location, int type, std::string* value);
+    ~Token();
+
+    Location location() const { return mLocation; }
+    int type() const { return mType; }
+    const std::string* value() const { return mValue; }
+
+  private:
+    DISALLOW_COPY_AND_ASSIGN(Token);
+
+    Location mLocation;
+    int mType;
+    std::string* mValue;
+};
+
+typedef std::vector<Token*> TokenVector;
+typedef TokenVector::const_iterator TokenIterator;
+
+extern std::ostream& operator<<(std::ostream& out, const Token& token);
+
+}  // namepsace pp
+#endif  // COMPILER_PREPROCESSOR_TOKEN_H_
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/generate_parser.sh b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/generate_parser.sh
new file mode 100755 (executable)
index 0000000..5b32f71
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/bash
+# Copyright (c) 2010 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Generates GLSL ES preprocessor - pp_lex.cpp, pp_tab.h, and pp_tab.cpp
+
+run_flex()
+{
+input_file=$script_dir/$1.l
+output_source=$script_dir/$1_lex.cpp
+flex --noline --nounistd --outfile=$output_source $input_file
+}
+
+run_bison()
+{
+input_file=$script_dir/$1.y
+output_header=$script_dir/$1_tab.h
+output_source=$script_dir/$1_tab.cpp
+bison --no-lines --skeleton=yacc.c --defines=$output_header --output=$output_source $input_file
+}
+
+script_dir=$(dirname $0)
+
+# Generate preprocessor
+run_flex pp
+run_bison pp
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l
new file mode 100644 (file)
index 0000000..627ca04
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+//
+// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+This file contains the Lex specification for GLSL ES preprocessor.
+Based on Microsoft Visual Studio 2010 Preprocessor Grammar:
+http://msdn.microsoft.com/en-us/library/2scxys89.aspx
+
+IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
+*/
+
+%top{
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// This file is auto-generated by generate_parser.sh. DO NOT EDIT!
+}
+
+%{
+#include "compiler/debug.h"
+#include "Context.h"
+#include "pp_tab.h"
+
+#define YY_USER_ACTION                        \
+    do {                                      \
+        yylloc->first_line = yylineno;        \
+        yylloc->first_column = yycolumn + 1;  \
+        yycolumn += yyleng;                   \
+    } while(0);
+
+#define YY_INPUT(buf, result, maxSize) \
+    result = yyextra->readInput(buf, maxSize);
+    
+static std::string* extractMacroName(const char* str, int len);
+%}
+
+%option noyywrap nounput never-interactive
+%option yylineno reentrant bison-bridge bison-locations
+%option stack
+%option prefix="pp"
+%option extra-type="pp::Context*"
+
+HSPACE      [ \t]
+HASH        ^{HSPACE}*#{HSPACE}*
+IDENTIFIER  [_a-zA-Z][_a-zA-Z0-9]*
+PUNCTUATOR  [][<>(){}.+-/*%^|&~=!:;,?]
+
+DECIMAL_CONSTANT      [1-9][0-9]*
+OCTAL_CONSTANT        0[0-7]*
+HEXADECIMAL_CONSTANT  0[xX][0-9a-fA-F]+
+
+DIGIT                [0-9]
+EXPONENT_PART        [eE][+-]?{DIGIT}+
+FRACTIONAL_CONSTANT  ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
+
+%%
+
+{HASH} { return HASH; }
+
+{HASH}define{HSPACE}+{IDENTIFIER}/[ \t\n] {
+    yylval->sval = extractMacroName(yytext, yyleng);
+    return HASH_DEFINE_OBJ;
+}
+{HASH}define{HSPACE}+{IDENTIFIER}/"(" {
+    yylval->sval = extractMacroName(yytext, yyleng);
+    return HASH_DEFINE_FUNC;
+}
+{HASH}undef{HSPACE}+ { return HASH_UNDEF; }
+
+{HASH}if { return HASH_IF; }
+{HASH}ifdef { return HASH_IFDEF; }
+{HASH}ifndef { return HASH_IFNDEF; }
+{HASH}else { return HASH_ELSE; }
+{HASH}elif { return HASH_ELIF; }
+{HASH}endif { return HASH_ENDIF; }
+"defined" { return DEFINED; }
+
+{HASH}error { return HASH_ERROR; }
+{HASH}pragma { return HASH_PRAGMA; }
+{HASH}extension { return HASH_EXTENSION; }
+{HASH}version { return HASH_VERSION; }
+{HASH}line { return HASH_LINE; }
+
+{IDENTIFIER} {
+    yylval->sval = new std::string(yytext, yyleng);
+    return IDENTIFIER;
+}
+
+{DECIMAL_CONSTANT}|{OCTAL_CONSTANT}|{HEXADECIMAL_CONSTANT} {
+    yylval->sval = new std::string(yytext, yyleng);
+    return INT_CONSTANT;
+}
+
+({DIGIT}+{EXPONENT_PART})|({FRACTIONAL_CONSTANT}{EXPONENT_PART}?) {
+    yylval->sval = new std::string(yytext, yyleng);
+    return FLOAT_CONSTANT;
+}
+
+{PUNCTUATOR} { return yytext[0]; }
+
+[ \t\v\f]+ { /* Ignore whitespace */ }
+
+\n {
+    ++yylineno; yycolumn = 0;
+    return yytext[0];
+}
+
+<*><<EOF>>     { yyterminate(); }
+
+%%
+
+std::string* extractMacroName(const char* str, int len)
+{
+    // The input string is of the form {HASH}define{HSPACE}+{IDENTIFIER}
+    // We just need to find the last HSPACE.
+    ASSERT(str && (len > 8));  // strlen("#define ") == 8;
+
+    std::string* name = NULL;
+    for (int i = len - 1; i >= 0; --i)
+    {
+        if ((str[i] == ' ') || (str[i] == '\t'))
+        {
+            name = new std::string(str + i + 1, len - i - 1);
+            break;
+        }
+    }
+    ASSERT(name);
+    return name;
+}
+
+namespace pp {
+
+int Context::readInput(char* buf, int maxSize)
+{
+    int nread = YY_NULL;
+    while (!mInput->eof() &&
+           (mInput->error() == pp::Input::kErrorNone) &&
+           (nread == YY_NULL))
+    {
+        int line = 0, file = 0;
+        pp::Token::decodeLocation(yyget_lineno(mLexer), &line, &file);
+        file = mInput->stringIndex();
+        yyset_lineno(pp::Token::encodeLocation(line, file), mLexer);
+
+        nread = mInput->read(buf, maxSize);
+
+        if (mInput->error() == pp::Input::kErrorUnexpectedEOF)
+        {
+            // TODO(alokp): Report error.
+        }
+    }
+    return nread;
+}
+
+bool Context::initLexer()
+{
+    ASSERT(mLexer == NULL);
+
+    if (yylex_init_extra(this, &mLexer))
+        return false;
+
+    yyrestart(0, mLexer);
+    return true;
+}
+
+void Context::destroyLexer()
+{
+    ASSERT(mLexer);
+
+    yylex_destroy(mLexer);
+    mLexer = NULL;
+}
+
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.y b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.y
new file mode 100644 (file)
index 0000000..55193ab
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+This file contains the Yacc grammar for GLSL ES preprocessor.
+Based on Microsoft Visual Studio 2010 Preprocessor Grammar:
+http://msdn.microsoft.com/en-us/library/2scxys89.aspx
+
+IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_glsl_parser.sh,
+WHICH GENERATES THE GLSL ES PARSER.
+*/
+
+%{
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// This file is auto-generated by generate_glslang_parser.sh. DO NOT EDIT!
+
+#include "Context.h"
+
+#define YYLEX_PARAM context->lexer()
+#define YYDEBUG 1
+%}
+
+%pure-parser
+%name-prefix="pp"
+%locations
+%parse-param {pp::Context* context}
+
+%union {
+    int ival;
+    std::string* sval;
+    pp::Token* tval;
+    pp::TokenVector* tlist;
+}
+
+%{
+extern int yylex(YYSTYPE* lvalp, YYLTYPE* llocp, void* lexer);
+static void yyerror(YYLTYPE* llocp,
+                    pp::Context* context,
+                    const char* reason);
+
+static void pushConditionalBlock(pp::Context* context, bool condition);
+static void popConditionalBlock(pp::Context* context);
+%}
+
+%token HASH HASH_UNDEF
+%token HASH_IF HASH_IFDEF HASH_IFNDEF HASH_ELSE HASH_ELIF HASH_ENDIF DEFINED
+%token HASH_ERROR HASH_PRAGMA HASH_EXTENSION HASH_VERSION HASH_LINE
+%token <sval> HASH_DEFINE_OBJ HASH_DEFINE_FUNC
+%token <sval> INT_CONSTANT FLOAT_CONSTANT IDENTIFIER
+%type <ival> operator
+%type <tval> conditional_token token
+%type <tlist> parameter_list replacement_list conditional_list token_list
+%%
+
+input
+    : /* empty */
+    | input line
+;
+
+line
+    : text_line
+    | control_line
+;
+
+text_line
+    : '\n'
+    | token_list '\n' {
+        // TODO(alokp): Expand macros.
+        pp::TokenVector* out = context->output();
+        out->insert(out->end(), $1->begin(), $1->end());
+        delete $1;
+    }
+;
+
+control_line
+    : HASH '\n'
+    | HASH_DEFINE_OBJ replacement_list '\n' {
+        context->defineMacro(@1.first_line, pp::Macro::kTypeObj, $1, NULL, $2);
+    }
+    | HASH_DEFINE_FUNC '(' parameter_list ')' replacement_list '\n' {
+        context->defineMacro(@1.first_line, pp::Macro::kTypeFunc, $1, $3, $5);
+    }
+    | HASH_UNDEF IDENTIFIER '\n' {
+        context->undefineMacro($2);
+    }
+    | HASH_IF conditional_list '\n' {
+        pushConditionalBlock(context, $2 ? true : false);
+    }
+    | HASH_IFDEF IDENTIFIER '\n' {
+        pushConditionalBlock(context, context->isMacroDefined($2));
+    }
+    | HASH_IFNDEF IDENTIFIER '\n' {
+        pushConditionalBlock(context, !context->isMacroDefined($2));
+    }
+    | HASH_ELIF conditional_list '\n' {
+    }
+    | HASH_ELSE '\n' {
+    }
+    | HASH_ENDIF '\n' {
+        popConditionalBlock(context);
+    }
+    | HASH_ERROR '\n'
+    | HASH_PRAGMA '\n'
+    | HASH_EXTENSION '\n'
+    | HASH_VERSION '\n'
+    | HASH_LINE '\n'
+;
+
+replacement_list
+    : /* empty */ { $$ = NULL; }
+    | token_list
+
+parameter_list
+    : /* empty */ { $$ = NULL; }
+    | IDENTIFIER {
+        $$ = new pp::TokenVector;
+        $$->push_back(new pp::Token(@1.first_line, IDENTIFIER, $1));
+    }
+    | parameter_list ',' IDENTIFIER {
+        $$ = $1;
+        $$->push_back(new pp::Token(@3.first_line, IDENTIFIER, $3));
+    }
+
+conditional_list
+    : conditional_token {
+        $$ = new pp::TokenVector;
+        $$->push_back($1);
+    }
+    | conditional_list conditional_token {
+        $$ = $1;
+        $$->push_back($2);
+    }
+;
+
+token_list
+    : token {
+        $$ = new pp::TokenVector;
+        $$->push_back($1);
+    }
+    | token_list token {
+        $$ = $1;
+        $$->push_back($2);
+    }
+;
+
+conditional_token
+    : DEFINED IDENTIFIER {
+    }
+    | DEFINED '(' IDENTIFIER ')' {
+    }
+    | token
+;
+
+token
+    : operator {
+        $$ = new pp::Token(@1.first_line, $1, NULL);
+    }
+    | INT_CONSTANT {
+        $$ = new pp::Token(@1.first_line, INT_CONSTANT, $1);
+    }
+    | FLOAT_CONSTANT {
+        $$ = new pp::Token(@1.first_line, FLOAT_CONSTANT, $1);
+    }
+    | IDENTIFIER {
+        $$ = new pp::Token(@1.first_line, IDENTIFIER, $1);
+    }
+;
+
+operator
+    : '[' { $$ = '['; }
+    | ']' { $$ = ']'; }
+    | '<' { $$ = '<'; }
+    | '>' { $$ = '>'; }
+    | '(' { $$ = '('; }
+    | ')' { $$ = ')'; }
+    | '{' { $$ = '{'; }
+    | '}' { $$ = '}'; }
+    | '.' { $$ = '.'; }
+    | '+' { $$ = '+'; }
+    | '-' { $$ = '-'; }
+    | '/' { $$ = '/'; }
+    | '*' { $$ = '*'; }
+    | '%' { $$ = '%'; }
+    | '^' { $$ = '^'; }
+    | '|' { $$ = '|'; }
+    | '&' { $$ = '&'; }
+    | '~' { $$ = '~'; }
+    | '=' { $$ = '='; }
+    | '!' { $$ = '!'; }
+    | ':' { $$ = ':'; }
+    | ';' { $$ = ';'; }
+    | ',' { $$ = ','; }
+    | '?' { $$ = '?'; }
+;
+
+%%
+
+void yyerror(YYLTYPE* llocp, pp::Context* context, const char* reason)
+{
+}
+
+void pushConditionalBlock(pp::Context* context, bool condition)
+{
+}
+
+void popConditionalBlock(pp::Context* context)
+{
+}
+
+namespace pp {
+bool Context::parse()
+{
+    yydebug = 1;
+    return yyparse(this) == 0 ? true : false;
+}
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_lex.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_lex.cpp
new file mode 100644 (file)
index 0000000..717e7cc
--- /dev/null
@@ -0,0 +1,2268 @@
+#line 16 "compiler/preprocessor/new/pp.l"
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// This file is auto-generated by generate_parser.sh. DO NOT EDIT!
+
+
+
+#line 13 "compiler/preprocessor/new/pp_lex.cpp"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else   /* ! __cplusplus */
+
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
+
+#define YY_USE_CONST
+
+#endif  /* defined (__STDC__) */
+#endif  /* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+   are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE pprestart(yyin ,yyscanner )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
+     *       access to the local variable yy_act. Since yyless() is a macro, it would break
+     *       existing scanners that call yyless() from OUTSIDE pplex. 
+     *       One obvious solution it to make yy_act a global. I tried that, and saw
+     *       a 5% performance hit in a non-yylineno scanner, because yy_act is
+     *       normally declared as a register variable-- so it is not worth it.
+     */
+    #define  YY_LESS_LINENO(n) \
+            do { \
+                int yyl;\
+                for ( yyl = n; yyl < yyleng; ++yyl )\
+                    if ( yytext[yyl] == '\n' )\
+                        --yylineno;\
+            }while(0)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+    do \
+        { \
+        /* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+        *yy_cp = yyg->yy_hold_char; \
+        YY_RESTORE_YY_MORE_OFFSET \
+        yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+        YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+        } \
+    while ( 0 )
+
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+    {
+    FILE *yy_input_file;
+
+    char *yy_ch_buf;        /* input buffer */
+    char *yy_buf_pos;       /* current position in input buffer */
+
+    /* Size of input buffer in bytes, not including room for EOB
+     * characters.
+     */
+    yy_size_t yy_buf_size;
+
+    /* Number of characters read into yy_ch_buf, not including EOB
+     * characters.
+     */
+    int yy_n_chars;
+
+    /* Whether we "own" the buffer - i.e., we know we created it,
+     * and can realloc() it to grow it, and should free() it to
+     * delete it.
+     */
+    int yy_is_our_buffer;
+
+    /* Whether this is an "interactive" input source; if so, and
+     * if we're using stdio for input, then we want to use getc()
+     * instead of fread(), to make sure we stop fetching input after
+     * each newline.
+     */
+    int yy_is_interactive;
+
+    /* Whether we're considered to be at the beginning of a line.
+     * If so, '^' rules will be active on the next match, otherwise
+     * not.
+     */
+    int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
+    /* Whether to try to fill the input buffer when we reach the
+     * end of it.
+     */
+    int yy_fill_buffer;
+
+    int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+    /* When an EOF's been seen but there's still some text to process
+     * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+     * shouldn't try reading from the input source any more.  We might
+     * still have a bunch of tokens to match, though, because of
+     * possible backing-up.
+     *
+     * When we actually see the EOF, we change the status to "new"
+     * (via pprestart()), so that the user can continue scanning by
+     * just pointing yyin at a new input file.
+     */
+#define YY_BUFFER_EOF_PENDING 2
+
+    };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+void pprestart (FILE *input_file ,yyscan_t yyscanner );
+void pp_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+YY_BUFFER_STATE pp_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
+void pp_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void pp_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
+void pppush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
+void pppop_buffer_state (yyscan_t yyscanner );
+
+static void ppensure_buffer_stack (yyscan_t yyscanner );
+static void pp_load_buffer_state (yyscan_t yyscanner );
+static void pp_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
+
+#define YY_FLUSH_BUFFER pp_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
+
+YY_BUFFER_STATE pp_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
+YY_BUFFER_STATE pp_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
+YY_BUFFER_STATE pp_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
+
+void *ppalloc (yy_size_t ,yyscan_t yyscanner );
+void *pprealloc (void *,yy_size_t ,yyscan_t yyscanner );
+void ppfree (void * ,yyscan_t yyscanner );
+
+#define yy_new_buffer pp_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+    { \
+    if ( ! YY_CURRENT_BUFFER ){ \
+        ppensure_buffer_stack (yyscanner); \
+        YY_CURRENT_BUFFER_LVALUE =    \
+            pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+    } \
+    YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+    }
+
+#define yy_set_bol(at_bol) \
+    { \
+    if ( ! YY_CURRENT_BUFFER ){\
+        ppensure_buffer_stack (yyscanner); \
+        YY_CURRENT_BUFFER_LVALUE =    \
+            pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+    } \
+    YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+    }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define ppwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
+static int yy_get_next_buffer (yyscan_t yyscanner );
+static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+    yyg->yytext_ptr = yy_bp; \
+    yyleng = (size_t) (yy_cp - yy_bp); \
+    yyg->yy_hold_char = *yy_cp; \
+    *yy_cp = '\0'; \
+    yyg->yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 23
+#define YY_END_OF_BUFFER 24
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+    {
+    flex_int32_t yy_verify;
+    flex_int32_t yy_nxt;
+    };
+static yyconst flex_int16_t yy_accept[105] =
+    {   0,
+        0,    0,   24,   23,   21,   22,   20,   20,   18,   18,
+       17,   17,   21,    1,   21,   19,   19,   18,    0,    0,
+        0,   18,   17,   17,   21,    1,    1,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   19,   18,   17,    0,
+        0,    0,    0,    0,    5,    0,    0,    0,    0,    0,
+       19,   17,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   17,    0,    9,    8,    0,    0,
+        0,    0,    0,   16,    0,    0,    0,   17,    0,   10,
+       12,    0,    6,    0,    0,    0,    0,   11,    0,    0,
+        7,   13,    4,    0,    0,    0,   15,    0,    0,    2,
+
+        3,    0,   14,    0
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        4,    4,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    5,    1,    6,    1,    5,    5,    1,    7,
+        5,    5,    8,    5,    8,    9,    5,   10,   11,   11,
+       11,   11,   11,   11,   11,   12,   12,    5,    5,    5,
+        5,    5,    5,    1,   13,   13,   13,   13,   14,   13,
+       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
+       15,   15,   15,   15,   15,   15,   15,   16,   15,   15,
+        5,    1,    5,    5,   15,    1,   17,   13,   13,   18,
+
+       19,   20,   21,   15,   22,   15,   15,   23,   24,   25,
+       26,   27,   15,   28,   29,   30,   31,   32,   15,   33,
+       15,   15,    5,    5,    5,    5,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst flex_int32_t yy_meta[34] =
+    {   0,
+        1,    2,    3,    1,    1,    1,    3,    1,    1,    4,
+        4,    4,    5,    6,    7,    7,    5,    5,    6,    5,
+        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
+        7,    7,    7
+    } ;
+
+static yyconst flex_int16_t yy_base[111] =
+    {   0,
+        0,   18,  184,  185,   11,  185,  185,   21,   28,   53,
+        0,  164,   39,   71,   12,   32,   34,    1,   39,   44,
+        0,    0,    0,  162,   64,    0,    0,  162,   46,  160,
+      157,  150,  152,  157,   70,   47,   65,    0,  153,  154,
+       62,  155,  144,  141,   67,  145,  152,  150,  139,   76,
+       85,  141,  143,  144,  144,  140,  135,  141,  140,  140,
+      138,  135,  136,  125,  134,  127,  185,  185,  131,  122,
+      124,  128,  128,  185,  122,  125,  122,  125,  123,  185,
+      185,  112,  185,  120,  113,  127,   97,    0,  107,   86,
+      185,  185,  105,   76,   81,   34,  185,   97,   10,  185,
+
+      185,  103,  185,  185,  110,  114,  118,  121,  126,  132
+    } ;
+
+static yyconst flex_int16_t yy_def[111] =
+    {   0,
+      105,  105,  104,  104,  104,  104,  104,  104,  104,  104,
+      106,  106,  104,  104,  104,  107,  107,    9,   18,  104,
+      108,   10,  106,  106,  104,   14,   14,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  108,  106,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  106,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  106,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  106,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  106,  104,  104,
+      104,  104,  104,  104,  109,  104,  104,  110,  104,  104,
+
+      104,  110,  104,    0,  104,  104,  104,  104,  104,  104
+    } ;
+
+static yyconst flex_int16_t yy_nxt[219] =
+    {   0,
+        4,    5,    6,    5,    7,    4,    7,    7,    8,    9,
+       10,   10,   15,   15,   15,   15,  104,   12,    4,   13,
+        6,    5,    7,   14,    7,    7,    8,    9,   10,   10,
+       16,   16,   16,  104,  103,   12,   17,   18,   18,   19,
+       25,   20,   15,   21,   26,   35,   20,   35,   19,   19,
+       35,   36,   35,   37,   37,   37,   37,   37,   37,   99,
+       21,   17,   22,   22,   22,   25,   20,   15,   41,   26,
+       42,   20,   27,   43,   37,   37,   37,   50,   44,   51,
+       51,   51,   95,   54,   59,   51,   51,   51,   28,   29,
+       55,   60,   30,   31,   51,   51,   51,   32,  100,  100,
+
+       97,   33,   34,  101,  100,  100,   93,   96,   95,  101,
+       11,   11,   11,   11,   11,   11,   11,   23,   23,   23,
+       23,   16,   94,   16,   38,   38,   38,   98,   93,   92,
+       98,   98,   98,  102,  102,  102,  102,  102,  102,   91,
+       90,   89,   88,   87,   86,   85,   84,   83,   82,   81,
+       80,   79,   78,   77,   76,   75,   74,   73,   72,   71,
+       70,   69,   68,   67,   66,   65,   64,   63,   62,   61,
+       58,   57,   56,   53,   52,   49,   48,   47,   46,   45,
+       40,   39,   24,  104,    3,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104
+    } ;
+
+static yyconst flex_int16_t yy_chk[219] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    5,   15,    5,   15,   18,    1,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        8,    8,    8,   18,   99,    2,    9,    9,    9,    9,
+       13,    9,   13,    9,   13,   16,    9,   17,   19,   19,
+       16,   20,   17,   20,   20,   20,   36,   36,   36,   96,
+        9,   10,   10,   10,   10,   25,   10,   25,   29,   25,
+       29,   10,   14,   29,   37,   37,   37,   35,   29,   35,
+       35,   35,   95,   41,   45,   50,   50,   50,   14,   14,
+       41,   45,   14,   14,   51,   51,   51,   14,   98,   98,
+
+       94,   14,   14,   98,  102,  102,   93,   90,   89,  102,
+      105,  105,  105,  105,  105,  105,  105,  106,  106,  106,
+      106,  107,   87,  107,  108,  108,  108,  109,   86,   85,
+      109,  109,  109,  110,  110,  110,  110,  110,  110,   84,
+       82,   79,   78,   77,   76,   75,   73,   72,   71,   70,
+       69,   66,   65,   64,   63,   62,   61,   60,   59,   58,
+       57,   56,   55,   54,   53,   52,   49,   48,   47,   46,
+       44,   43,   42,   40,   39,   34,   33,   32,   31,   30,
+       28,   24,   12,    3,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  104,  104,  104,  104,  104,  104
+    } ;
+
+/* Table of booleans, true if rule could match eol. */
+static yyconst flex_int32_t yy_rule_can_match_eol[24] =
+    {   0,
+0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 1, 0,     };
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+/*
+//
+// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+This file contains the Lex specification for GLSL ES preprocessor.
+Based on Microsoft Visual Studio 2010 Preprocessor Grammar:
+http://msdn.microsoft.com/en-us/library/2scxys89.aspx
+
+IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
+*/
+
+#include "compiler/debug.h"
+#include "Context.h"
+#include "pp_tab.h"
+
+#define YY_USER_ACTION                        \
+    do {                                      \
+        yylloc->first_line = yylineno;        \
+        yylloc->first_column = yycolumn + 1;  \
+        yycolumn += yyleng;                   \
+    } while(0);
+
+#define YY_INPUT(buf, result, maxSize) \
+    result = yyextra->readInput(buf, maxSize);
+    
+static std::string* extractMacroName(const char* str, int len);
+
+#define INITIAL 0
+
+#define YY_EXTRA_TYPE pp::Context*
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+    {
+
+    /* User-defined. Not touched by flex. */
+    YY_EXTRA_TYPE yyextra_r;
+
+    /* The rest are the same as the globals declared in the non-reentrant scanner. */
+    FILE *yyin_r, *yyout_r;
+    size_t yy_buffer_stack_top; /**< index of top of stack. */
+    size_t yy_buffer_stack_max; /**< capacity of stack. */
+    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+    char yy_hold_char;
+    int yy_n_chars;
+    int yyleng_r;
+    char *yy_c_buf_p;
+    int yy_init;
+    int yy_start;
+    int yy_did_buffer_switch_on_eof;
+    int yy_start_stack_ptr;
+    int yy_start_stack_depth;
+    int *yy_start_stack;
+    yy_state_type yy_last_accepting_state;
+    char* yy_last_accepting_cpos;
+
+    int yylineno_r;
+    int yy_flex_debug_r;
+
+    char *yytext_r;
+    int yy_more_flag;
+    int yy_more_len;
+
+    YYSTYPE * yylval_r;
+
+    YYLTYPE * yylloc_r;
+
+    }; /* end struct yyguts_t */
+
+static int yy_init_globals (yyscan_t yyscanner );
+
+    /* This must go here because YYSTYPE and YYLTYPE are included
+     * from bison output in section 1.*/
+    #    define yylval yyg->yylval_r
+    
+    #    define yylloc yyg->yylloc_r
+    
+int pplex_init (yyscan_t* scanner);
+
+int pplex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int pplex_destroy (yyscan_t yyscanner );
+
+int ppget_debug (yyscan_t yyscanner );
+
+void ppset_debug (int debug_flag ,yyscan_t yyscanner );
+
+YY_EXTRA_TYPE ppget_extra (yyscan_t yyscanner );
+
+void ppset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
+
+FILE *ppget_in (yyscan_t yyscanner );
+
+void ppset_in  (FILE * in_str ,yyscan_t yyscanner );
+
+FILE *ppget_out (yyscan_t yyscanner );
+
+void ppset_out  (FILE * out_str ,yyscan_t yyscanner );
+
+int ppget_leng (yyscan_t yyscanner );
+
+char *ppget_text (yyscan_t yyscanner );
+
+int ppget_lineno (yyscan_t yyscanner );
+
+void ppset_lineno (int line_number ,yyscan_t yyscanner );
+
+YYSTYPE * ppget_lval (yyscan_t yyscanner );
+
+void ppset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
+
+       YYLTYPE *ppget_lloc (yyscan_t yyscanner );
+    
+        void ppset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
+    
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int ppwrap (yyscan_t yyscanner );
+#else
+extern int ppwrap (yyscan_t yyscanner );
+#endif
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (yyscan_t yyscanner );
+#else
+static int input (yyscan_t yyscanner );
+#endif
+
+#endif
+
+    static void yy_push_state (int new_state ,yyscan_t yyscanner);
+    
+    static void yy_pop_state (yyscan_t yyscanner );
+    
+    static int yy_top_state (yyscan_t yyscanner );
+    
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+    if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+        { \
+        int c = '*'; \
+        int n; \
+        for ( n = 0; n < max_size && \
+                 (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+            buf[n] = (char) c; \
+        if ( c == '\n' ) \
+            buf[n++] = (char) c; \
+        if ( c == EOF && ferror( yyin ) ) \
+            YY_FATAL_ERROR( "input in flex scanner failed" ); \
+        result = n; \
+        } \
+    else \
+        { \
+        errno=0; \
+        while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+            { \
+            if( errno != EINTR) \
+                { \
+                YY_FATAL_ERROR( "input in flex scanner failed" ); \
+                break; \
+                } \
+            errno=0; \
+            clearerr(yyin); \
+            } \
+        }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int pplex \
+               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);
+
+#define YY_DECL int pplex \
+               (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+    if ( yyleng > 0 ) \
+        YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+                (yytext[yyleng - 1] == '\n'); \
+    YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+    register yy_state_type yy_current_state;
+    register char *yy_cp, *yy_bp;
+    register int yy_act;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    yylval = yylval_param;
+
+    yylloc = yylloc_param;
+
+    if ( !yyg->yy_init )
+        {
+        yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+        YY_USER_INIT;
+#endif
+
+        if ( ! yyg->yy_start )
+            yyg->yy_start = 1;  /* first start state */
+
+        if ( ! yyin )
+            yyin = stdin;
+
+        if ( ! yyout )
+            yyout = stdout;
+
+        if ( ! YY_CURRENT_BUFFER ) {
+            ppensure_buffer_stack (yyscanner);
+            YY_CURRENT_BUFFER_LVALUE =
+                pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+        }
+
+        pp_load_buffer_state(yyscanner );
+        }
+
+    while ( 1 )     /* loops until end-of-file is reached */
+        {
+        yy_cp = yyg->yy_c_buf_p;
+
+        /* Support of yytext. */
+        *yy_cp = yyg->yy_hold_char;
+
+        /* yy_bp points to the position in yy_ch_buf of the start of
+         * the current run.
+         */
+        yy_bp = yy_cp;
+
+        yy_current_state = yyg->yy_start;
+        yy_current_state += YY_AT_BOL();
+yy_match:
+        do
+            {
+            register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+            if ( yy_accept[yy_current_state] )
+                {
+                yyg->yy_last_accepting_state = yy_current_state;
+                yyg->yy_last_accepting_cpos = yy_cp;
+                }
+            while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                {
+                yy_current_state = (int) yy_def[yy_current_state];
+                if ( yy_current_state >= 105 )
+                    yy_c = yy_meta[(unsigned int) yy_c];
+                }
+            yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+            ++yy_cp;
+            }
+        while ( yy_current_state != 104 );
+        yy_cp = yyg->yy_last_accepting_cpos;
+        yy_current_state = yyg->yy_last_accepting_state;
+
+yy_find_action:
+        yy_act = yy_accept[yy_current_state];
+
+        YY_DO_BEFORE_ACTION;
+
+        if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
+            {
+            int yyl;
+            for ( yyl = 0; yyl < yyleng; ++yyl )
+                if ( yytext[yyl] == '\n' )
+                       
+    do{ yylineno++;
+        yycolumn=0;
+    }while(0)
+;
+            }
+
+do_action:  /* This label is used only to access EOF actions. */
+
+        switch ( yy_act )
+    { /* beginning of action switch */
+            case 0: /* must back up */
+            /* undo the effects of YY_DO_BEFORE_ACTION */
+            *yy_cp = yyg->yy_hold_char;
+            yy_cp = yyg->yy_last_accepting_cpos;
+            yy_current_state = yyg->yy_last_accepting_state;
+            goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+{ return HASH; }
+    YY_BREAK
+case 2:
+/* rule 2 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{
+    yylval->sval = extractMacroName(yytext, yyleng);
+    return HASH_DEFINE_OBJ;
+}
+    YY_BREAK
+case 3:
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+{
+    yylval->sval = extractMacroName(yytext, yyleng);
+    return HASH_DEFINE_FUNC;
+}
+    YY_BREAK
+case 4:
+YY_RULE_SETUP
+{ return HASH_UNDEF; }
+    YY_BREAK
+case 5:
+YY_RULE_SETUP
+{ return HASH_IF; }
+    YY_BREAK
+case 6:
+YY_RULE_SETUP
+{ return HASH_IFDEF; }
+    YY_BREAK
+case 7:
+YY_RULE_SETUP
+{ return HASH_IFNDEF; }
+    YY_BREAK
+case 8:
+YY_RULE_SETUP
+{ return HASH_ELSE; }
+    YY_BREAK
+case 9:
+YY_RULE_SETUP
+{ return HASH_ELIF; }
+    YY_BREAK
+case 10:
+YY_RULE_SETUP
+{ return HASH_ENDIF; }
+    YY_BREAK
+case 11:
+YY_RULE_SETUP
+{ return DEFINED; }
+    YY_BREAK
+case 12:
+YY_RULE_SETUP
+{ return HASH_ERROR; }
+    YY_BREAK
+case 13:
+YY_RULE_SETUP
+{ return HASH_PRAGMA; }
+    YY_BREAK
+case 14:
+YY_RULE_SETUP
+{ return HASH_EXTENSION; }
+    YY_BREAK
+case 15:
+YY_RULE_SETUP
+{ return HASH_VERSION; }
+    YY_BREAK
+case 16:
+YY_RULE_SETUP
+{ return HASH_LINE; }
+    YY_BREAK
+case 17:
+YY_RULE_SETUP
+{
+    yylval->sval = new std::string(yytext, yyleng);
+    return IDENTIFIER;
+}
+    YY_BREAK
+case 18:
+YY_RULE_SETUP
+{
+    yylval->sval = new std::string(yytext, yyleng);
+    return INT_CONSTANT;
+}
+    YY_BREAK
+case 19:
+YY_RULE_SETUP
+{
+    yylval->sval = new std::string(yytext, yyleng);
+    return FLOAT_CONSTANT;
+}
+    YY_BREAK
+case 20:
+YY_RULE_SETUP
+{ return yytext[0]; }
+    YY_BREAK
+case 21:
+YY_RULE_SETUP
+{ /* Ignore whitespace */ }
+    YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+{
+    ++yylineno; yycolumn = 0;
+    return yytext[0];
+}
+    YY_BREAK
+case YY_STATE_EOF(INITIAL):
+{ yyterminate(); }
+    YY_BREAK
+case 23:
+YY_RULE_SETUP
+ECHO;
+    YY_BREAK
+
+    case YY_END_OF_BUFFER:
+        {
+        /* Amount of text matched not including the EOB char. */
+        int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+        /* Undo the effects of YY_DO_BEFORE_ACTION. */
+        *yy_cp = yyg->yy_hold_char;
+        YY_RESTORE_YY_MORE_OFFSET
+
+        if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+            {
+            /* We're scanning a new file or input source.  It's
+             * possible that this happened because the user
+             * just pointed yyin at a new source and called
+             * pplex().  If so, then we have to assure
+             * consistency between YY_CURRENT_BUFFER and our
+             * globals.  Here is the right place to do so, because
+             * this is the first action (other than possibly a
+             * back-up) that will match for the new input source.
+             */
+            yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+            YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+            YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+            }
+
+        /* Note that here we test for yy_c_buf_p "<=" to the position
+         * of the first EOB in the buffer, since yy_c_buf_p will
+         * already have been incremented past the NUL character
+         * (since all states make transitions on EOB to the
+         * end-of-buffer state).  Contrast this with the test
+         * in input().
+         */
+        if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+            { /* This was really a NUL. */
+            yy_state_type yy_next_state;
+
+            yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+            yy_current_state = yy_get_previous_state( yyscanner );
+
+            /* Okay, we're now positioned to make the NUL
+             * transition.  We couldn't have
+             * yy_get_previous_state() go ahead and do it
+             * for us because it doesn't know how to deal
+             * with the possibility of jamming (and we don't
+             * want to build jamming into it because then it
+             * will run more slowly).
+             */
+
+            yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+            yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+            if ( yy_next_state )
+                {
+                /* Consume the NUL. */
+                yy_cp = ++yyg->yy_c_buf_p;
+                yy_current_state = yy_next_state;
+                goto yy_match;
+                }
+
+            else
+                {
+                yy_cp = yyg->yy_last_accepting_cpos;
+                yy_current_state = yyg->yy_last_accepting_state;
+                goto yy_find_action;
+                }
+            }
+
+        else switch ( yy_get_next_buffer( yyscanner ) )
+            {
+            case EOB_ACT_END_OF_FILE:
+                {
+                yyg->yy_did_buffer_switch_on_eof = 0;
+
+                if ( ppwrap(yyscanner ) )
+                    {
+                    /* Note: because we've taken care in
+                     * yy_get_next_buffer() to have set up
+                     * yytext, we can now set up
+                     * yy_c_buf_p so that if some total
+                     * hoser (like flex itself) wants to
+                     * call the scanner after we return the
+                     * YY_NULL, it'll still work - another
+                     * YY_NULL will get returned.
+                     */
+                    yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+                    yy_act = YY_STATE_EOF(YY_START);
+                    goto do_action;
+                    }
+
+                else
+                    {
+                    if ( ! yyg->yy_did_buffer_switch_on_eof )
+                        YY_NEW_FILE;
+                    }
+                break;
+                }
+
+            case EOB_ACT_CONTINUE_SCAN:
+                yyg->yy_c_buf_p =
+                    yyg->yytext_ptr + yy_amount_of_matched_text;
+
+                yy_current_state = yy_get_previous_state( yyscanner );
+
+                yy_cp = yyg->yy_c_buf_p;
+                yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+                goto yy_match;
+
+            case EOB_ACT_LAST_MATCH:
+                yyg->yy_c_buf_p =
+                &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+                yy_current_state = yy_get_previous_state( yyscanner );
+
+                yy_cp = yyg->yy_c_buf_p;
+                yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+                goto yy_find_action;
+            }
+        break;
+        }
+
+    default:
+        YY_FATAL_ERROR(
+            "fatal flex scanner internal error--no action found" );
+    } /* end of action switch */
+        } /* end of scanning one token */
+} /* end of pplex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *  EOB_ACT_LAST_MATCH -
+ *  EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *  EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+    register char *source = yyg->yytext_ptr;
+    register int number_to_move, i;
+    int ret_val;
+
+    if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+        YY_FATAL_ERROR(
+        "fatal flex scanner internal error--end of buffer missed" );
+
+    if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+        { /* Don't try to fill the buffer, so this is an EOF. */
+        if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+            {
+            /* We matched a single character, the EOB, so
+             * treat this as a final EOF.
+             */
+            return EOB_ACT_END_OF_FILE;
+            }
+
+        else
+            {
+            /* We matched some text prior to the EOB, first
+             * process it.
+             */
+            return EOB_ACT_LAST_MATCH;
+            }
+        }
+
+    /* Try to read more data. */
+
+    /* First move last chars to start of buffer. */
+    number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
+
+    for ( i = 0; i < number_to_move; ++i )
+        *(dest++) = *(source++);
+
+    if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+        /* don't do the read, it's not guaranteed to return an EOF,
+         * just force an EOF
+         */
+        YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+    else
+        {
+            int num_to_read =
+            YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+        while ( num_to_read <= 0 )
+            { /* Not enough room in the buffer - grow it. */
+
+            /* just a shorter name for the current buffer */
+            YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+            int yy_c_buf_p_offset =
+                (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+            if ( b->yy_is_our_buffer )
+                {
+                int new_size = b->yy_buf_size * 2;
+
+                if ( new_size <= 0 )
+                    b->yy_buf_size += b->yy_buf_size / 8;
+                else
+                    b->yy_buf_size *= 2;
+
+                b->yy_ch_buf = (char *)
+                    /* Include room in for 2 EOB chars. */
+                    pprealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
+                }
+            else
+                /* Can't grow it, we don't own it. */
+                b->yy_ch_buf = 0;
+
+            if ( ! b->yy_ch_buf )
+                YY_FATAL_ERROR(
+                "fatal error - scanner input buffer overflow" );
+
+            yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+            num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+                        number_to_move - 1;
+
+            }
+
+        if ( num_to_read > YY_READ_BUF_SIZE )
+            num_to_read = YY_READ_BUF_SIZE;
+
+        /* Read in more data. */
+        YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+            yyg->yy_n_chars, (size_t) num_to_read );
+
+        YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+        }
+
+    if ( yyg->yy_n_chars == 0 )
+        {
+        if ( number_to_move == YY_MORE_ADJ )
+            {
+            ret_val = EOB_ACT_END_OF_FILE;
+            pprestart(yyin  ,yyscanner);
+            }
+
+        else
+            {
+            ret_val = EOB_ACT_LAST_MATCH;
+            YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+                YY_BUFFER_EOF_PENDING;
+            }
+        }
+
+    else
+        ret_val = EOB_ACT_CONTINUE_SCAN;
+
+    if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+        /* Extend the array by 50%, plus the number we really need. */
+        yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+        YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) pprealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
+        if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+            YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+    }
+
+    yyg->yy_n_chars += number_to_move;
+    YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+    YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+    yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+    return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+{
+    register yy_state_type yy_current_state;
+    register char *yy_cp;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    yy_current_state = yyg->yy_start;
+    yy_current_state += YY_AT_BOL();
+
+    for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+        {
+        register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+        if ( yy_accept[yy_current_state] )
+            {
+            yyg->yy_last_accepting_state = yy_current_state;
+            yyg->yy_last_accepting_cpos = yy_cp;
+            }
+        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+            {
+            yy_current_state = (int) yy_def[yy_current_state];
+            if ( yy_current_state >= 105 )
+                yy_c = yy_meta[(unsigned int) yy_c];
+            }
+        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+        }
+
+    return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *  next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
+{
+    register int yy_is_jam;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+    register char *yy_cp = yyg->yy_c_buf_p;
+
+    register YY_CHAR yy_c = 1;
+    if ( yy_accept[yy_current_state] )
+        {
+        yyg->yy_last_accepting_state = yy_current_state;
+        yyg->yy_last_accepting_cpos = yy_cp;
+        }
+    while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+        {
+        yy_current_state = (int) yy_def[yy_current_state];
+        if ( yy_current_state >= 105 )
+            yy_c = yy_meta[(unsigned int) yy_c];
+        }
+    yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+    yy_is_jam = (yy_current_state == 104);
+
+    return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (yyscan_t yyscanner)
+#else
+    static int input  (yyscan_t yyscanner)
+#endif
+
+{
+    int c;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+    if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+        {
+        /* yy_c_buf_p now points to the character we want to return.
+         * If this occurs *before* the EOB characters, then it's a
+         * valid NUL; if not, then we've hit the end of the buffer.
+         */
+        if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+            /* This was really a NUL. */
+            *yyg->yy_c_buf_p = '\0';
+
+        else
+            { /* need more input */
+            int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
+            ++yyg->yy_c_buf_p;
+
+            switch ( yy_get_next_buffer( yyscanner ) )
+                {
+                case EOB_ACT_LAST_MATCH:
+                    /* This happens because yy_g_n_b()
+                     * sees that we've accumulated a
+                     * token and flags that we need to
+                     * try matching the token before
+                     * proceeding.  But for input(),
+                     * there's no matching to consider.
+                     * So convert the EOB_ACT_LAST_MATCH
+                     * to EOB_ACT_END_OF_FILE.
+                     */
+
+                    /* Reset buffer status. */
+                    pprestart(yyin ,yyscanner);
+
+                    /*FALLTHROUGH*/
+
+                case EOB_ACT_END_OF_FILE:
+                    {
+                    if ( ppwrap(yyscanner ) )
+                        return EOF;
+
+                    if ( ! yyg->yy_did_buffer_switch_on_eof )
+                        YY_NEW_FILE;
+#ifdef __cplusplus
+                    return yyinput(yyscanner);
+#else
+                    return input(yyscanner);
+#endif
+                    }
+
+                case EOB_ACT_CONTINUE_SCAN:
+                    yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+                    break;
+                }
+            }
+        }
+
+    c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+    *yyg->yy_c_buf_p = '\0';    /* preserve yytext */
+    yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+    YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+    if ( YY_CURRENT_BUFFER_LVALUE->yy_at_bol )
+           
+    do{ yylineno++;
+        yycolumn=0;
+    }while(0)
+;
+
+    return c;
+}
+#endif  /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void pprestart  (FILE * input_file , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    if ( ! YY_CURRENT_BUFFER ){
+        ppensure_buffer_stack (yyscanner);
+        YY_CURRENT_BUFFER_LVALUE =
+            pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+    }
+
+    pp_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
+    pp_load_buffer_state(yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+    void pp_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    /* TODO. We should be able to replace this entire function body
+     * with
+     *      pppop_buffer_state();
+     *      pppush_buffer_state(new_buffer);
+     */
+    ppensure_buffer_stack (yyscanner);
+    if ( YY_CURRENT_BUFFER == new_buffer )
+        return;
+
+    if ( YY_CURRENT_BUFFER )
+        {
+        /* Flush out information for old buffer. */
+        *yyg->yy_c_buf_p = yyg->yy_hold_char;
+        YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+        YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+        }
+
+    YY_CURRENT_BUFFER_LVALUE = new_buffer;
+    pp_load_buffer_state(yyscanner );
+
+    /* We don't actually know whether we did this switch during
+     * EOF (ppwrap()) processing, but the only time this flag
+     * is looked at is after ppwrap() is called, so it's safe
+     * to go ahead and always set it.
+     */
+    yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+static void pp_load_buffer_state  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+    yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+    yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+    yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE pp_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
+{
+    YY_BUFFER_STATE b;
+    
+    b = (YY_BUFFER_STATE) ppalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+    if ( ! b )
+        YY_FATAL_ERROR( "out of dynamic memory in pp_create_buffer()" );
+
+    b->yy_buf_size = size;
+
+    /* yy_ch_buf has to be 2 characters longer than the size given because
+     * we need to put in 2 end-of-buffer characters.
+     */
+    b->yy_ch_buf = (char *) ppalloc(b->yy_buf_size + 2 ,yyscanner );
+    if ( ! b->yy_ch_buf )
+        YY_FATAL_ERROR( "out of dynamic memory in pp_create_buffer()" );
+
+    b->yy_is_our_buffer = 1;
+
+    pp_init_buffer(b,file ,yyscanner);
+
+    return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with pp_create_buffer()
+ * @param yyscanner The scanner object.
+ */
+    void pp_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    if ( ! b )
+        return;
+
+    if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+        YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+    if ( b->yy_is_our_buffer )
+        ppfree((void *) b->yy_ch_buf ,yyscanner );
+
+    ppfree((void *) b ,yyscanner );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a pprestart() or at EOF.
+ */
+    static void pp_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)
+
+{
+    int oerrno = errno;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    pp_flush_buffer(b ,yyscanner);
+
+    b->yy_input_file = file;
+    b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then pp_init_buffer was _probably_
+     * called from pprestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = 0;
+    
+    errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+    void pp_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    if ( ! b )
+        return;
+
+    b->yy_n_chars = 0;
+
+    /* We always need two end-of-buffer characters.  The first causes
+     * a transition to the end-of-buffer state.  The second causes
+     * a jam in that state.
+     */
+    b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+    b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+    b->yy_buf_pos = &b->yy_ch_buf[0];
+
+    b->yy_at_bol = 1;
+    b->yy_buffer_status = YY_BUFFER_NEW;
+
+    if ( b == YY_CURRENT_BUFFER )
+        pp_load_buffer_state(yyscanner );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  @param yyscanner The scanner object.
+ */
+void pppush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    if (new_buffer == NULL)
+        return;
+
+    ppensure_buffer_stack(yyscanner);
+
+    /* This block is copied from pp_switch_to_buffer. */
+    if ( YY_CURRENT_BUFFER )
+        {
+        /* Flush out information for old buffer. */
+        *yyg->yy_c_buf_p = yyg->yy_hold_char;
+        YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+        YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+        }
+
+    /* Only push if top exists. Otherwise, replace top. */
+    if (YY_CURRENT_BUFFER)
+        yyg->yy_buffer_stack_top++;
+    YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+    /* copied from pp_switch_to_buffer. */
+    pp_load_buffer_state(yyscanner );
+    yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  @param yyscanner The scanner object.
+ */
+void pppop_buffer_state (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    if (!YY_CURRENT_BUFFER)
+        return;
+
+    pp_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
+    YY_CURRENT_BUFFER_LVALUE = NULL;
+    if (yyg->yy_buffer_stack_top > 0)
+        --yyg->yy_buffer_stack_top;
+
+    if (YY_CURRENT_BUFFER) {
+        pp_load_buffer_state(yyscanner );
+        yyg->yy_did_buffer_switch_on_eof = 1;
+    }
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void ppensure_buffer_stack (yyscan_t yyscanner)
+{
+    int num_to_alloc;
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    if (!yyg->yy_buffer_stack) {
+
+        /* First allocation is just for 2 elements, since we don't know if this
+         * scanner will even need a stack. We use 2 instead of 1 to avoid an
+         * immediate realloc on the next call.
+         */
+        num_to_alloc = 1;
+        yyg->yy_buffer_stack = (struct yy_buffer_state**)ppalloc
+                                (num_to_alloc * sizeof(struct yy_buffer_state*)
+                                , yyscanner);
+        if ( ! yyg->yy_buffer_stack )
+            YY_FATAL_ERROR( "out of dynamic memory in ppensure_buffer_stack()" );
+                                  
+        memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+                
+        yyg->yy_buffer_stack_max = num_to_alloc;
+        yyg->yy_buffer_stack_top = 0;
+        return;
+    }
+
+    if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+        /* Increase the buffer to prepare for a possible push. */
+        int grow_size = 8 /* arbitrary grow size */;
+
+        num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+        yyg->yy_buffer_stack = (struct yy_buffer_state**)pprealloc
+                                (yyg->yy_buffer_stack,
+                                num_to_alloc * sizeof(struct yy_buffer_state*)
+                                , yyscanner);
+        if ( ! yyg->yy_buffer_stack )
+            YY_FATAL_ERROR( "out of dynamic memory in ppensure_buffer_stack()" );
+
+        /* zero only the new slots.*/
+        memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+        yyg->yy_buffer_stack_max = num_to_alloc;
+    }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE pp_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
+{
+    YY_BUFFER_STATE b;
+    
+    if ( size < 2 ||
+         base[size-2] != YY_END_OF_BUFFER_CHAR ||
+         base[size-1] != YY_END_OF_BUFFER_CHAR )
+        /* They forgot to leave room for the EOB's. */
+        return 0;
+
+    b = (YY_BUFFER_STATE) ppalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+    if ( ! b )
+        YY_FATAL_ERROR( "out of dynamic memory in pp_scan_buffer()" );
+
+    b->yy_buf_size = size - 2;  /* "- 2" to take care of EOB's */
+    b->yy_buf_pos = b->yy_ch_buf = base;
+    b->yy_is_our_buffer = 0;
+    b->yy_input_file = 0;
+    b->yy_n_chars = b->yy_buf_size;
+    b->yy_is_interactive = 0;
+    b->yy_at_bol = 1;
+    b->yy_fill_buffer = 0;
+    b->yy_buffer_status = YY_BUFFER_NEW;
+
+    pp_switch_to_buffer(b ,yyscanner );
+
+    return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to pplex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       pp_scan_bytes() instead.
+ */
+YY_BUFFER_STATE pp_scan_string (yyconst char * yystr , yyscan_t yyscanner)
+{
+    
+    return pp_scan_bytes(yystr,strlen(yystr) ,yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to pplex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE pp_scan_bytes  (yyconst char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
+{
+    YY_BUFFER_STATE b;
+    char *buf;
+    yy_size_t n;
+    int i;
+    
+    /* Get memory for full buffer, including space for trailing EOB's. */
+    n = _yybytes_len + 2;
+    buf = (char *) ppalloc(n ,yyscanner );
+    if ( ! buf )
+        YY_FATAL_ERROR( "out of dynamic memory in pp_scan_bytes()" );
+
+    for ( i = 0; i < _yybytes_len; ++i )
+        buf[i] = yybytes[i];
+
+    buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+    b = pp_scan_buffer(buf,n ,yyscanner);
+    if ( ! b )
+        YY_FATAL_ERROR( "bad buffer in pp_scan_bytes()" );
+
+    /* It's okay to grow etc. this buffer, and we should throw it
+     * away when we're done.
+     */
+    b->yy_is_our_buffer = 1;
+
+    return b;
+}
+
+    static void yy_push_state (int  new_state , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth )
+        {
+        yy_size_t new_size;
+
+        yyg->yy_start_stack_depth += YY_START_STACK_INCR;
+        new_size = yyg->yy_start_stack_depth * sizeof( int );
+
+        if ( ! yyg->yy_start_stack )
+            yyg->yy_start_stack = (int *) ppalloc(new_size ,yyscanner );
+
+        else
+            yyg->yy_start_stack = (int *) pprealloc((void *) yyg->yy_start_stack,new_size ,yyscanner );
+
+        if ( ! yyg->yy_start_stack )
+            YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
+        }
+
+    yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START;
+
+    BEGIN(new_state);
+}
+
+    static void yy_pop_state  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    if ( --yyg->yy_start_stack_ptr < 0 )
+        YY_FATAL_ERROR( "start-condition stack underflow" );
+
+    BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]);
+}
+
+    static int yy_top_state  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1];
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
+{
+        (void) fprintf( stderr, "%s\n", msg );
+    exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+    do \
+        { \
+        /* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+        yytext[yyleng] = yyg->yy_hold_char; \
+        yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+        yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+        *yyg->yy_c_buf_p = '\0'; \
+        yyleng = yyless_macro_arg; \
+        } \
+    while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE ppget_extra  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int ppget_lineno  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    
+        if (! YY_CURRENT_BUFFER)
+            return 0;
+    
+    return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int ppget_column  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    
+        if (! YY_CURRENT_BUFFER)
+            return 0;
+    
+    return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *ppget_in  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *ppget_out  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int ppget_leng  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *ppget_text  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void ppset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void ppset_lineno (int  line_number , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+        /* lineno is only valid if an input buffer exists. */
+        if (! YY_CURRENT_BUFFER )
+           yy_fatal_error( "ppset_lineno called with no buffer" , yyscanner); 
+    
+    yylineno = line_number;
+}
+
+/** Set the current column.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void ppset_column (int  column_no , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+        /* column is only valid if an input buffer exists. */
+        if (! YY_CURRENT_BUFFER )
+           yy_fatal_error( "ppset_column called with no buffer" , yyscanner); 
+    
+    yycolumn = column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see pp_switch_to_buffer
+ */
+void ppset_in (FILE *  in_str , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyin = in_str ;
+}
+
+void ppset_out (FILE *  out_str , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yyout = out_str ;
+}
+
+int ppget_debug  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yy_flex_debug;
+}
+
+void ppset_debug (int  bdebug , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yy_flex_debug = bdebug ;
+}
+
+/* Accessor methods for yylval and yylloc */
+
+YYSTYPE * ppget_lval  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yylval;
+}
+
+void ppset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yylval = yylval_param;
+}
+
+YYLTYPE *ppget_lloc  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    return yylloc;
+}
+    
+void ppset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    yylloc = yylloc_param;
+}
+    
+/* User-visible API */
+
+/* pplex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+
+int pplex_init(yyscan_t* ptr_yy_globals)
+
+{
+    if (ptr_yy_globals == NULL){
+        errno = EINVAL;
+        return 1;
+    }
+
+    *ptr_yy_globals = (yyscan_t) ppalloc ( sizeof( struct yyguts_t ), NULL );
+
+    if (*ptr_yy_globals == NULL){
+        errno = ENOMEM;
+        return 1;
+    }
+
+    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+    return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* pplex_init_extra has the same functionality as pplex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to ppalloc in
+ * the yyextra field.
+ */
+
+int pplex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
+
+{
+    struct yyguts_t dummy_yyguts;
+
+    ppset_extra (yy_user_defined, &dummy_yyguts);
+
+    if (ptr_yy_globals == NULL){
+        errno = EINVAL;
+        return 1;
+    }
+    
+    *ptr_yy_globals = (yyscan_t) ppalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+    
+    if (*ptr_yy_globals == NULL){
+        errno = ENOMEM;
+        return 1;
+    }
+    
+    /* By setting to 0xAA, we expose bugs in
+    yy_init_globals. Leave at 0x00 for releases. */
+    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+    
+    ppset_extra (yy_user_defined, *ptr_yy_globals);
+    
+    return yy_init_globals ( *ptr_yy_globals );
+}
+
+static int yy_init_globals (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+    /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from pplex_destroy(), so don't allocate here.
+     */
+
+    yyg->yy_buffer_stack = 0;
+    yyg->yy_buffer_stack_top = 0;
+    yyg->yy_buffer_stack_max = 0;
+    yyg->yy_c_buf_p = (char *) 0;
+    yyg->yy_init = 0;
+    yyg->yy_start = 0;
+
+    yyg->yy_start_stack_ptr = 0;
+    yyg->yy_start_stack_depth = 0;
+    yyg->yy_start_stack =  NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    yyin = stdin;
+    yyout = stdout;
+#else
+    yyin = (FILE *) 0;
+    yyout = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * pplex_init()
+     */
+    return 0;
+}
+
+/* pplex_destroy is for both reentrant and non-reentrant scanners. */
+int pplex_destroy  (yyscan_t yyscanner)
+{
+    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+    /* Pop the buffer stack, destroying each element. */
+    while(YY_CURRENT_BUFFER){
+        pp_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
+        YY_CURRENT_BUFFER_LVALUE = NULL;
+        pppop_buffer_state(yyscanner);
+    }
+
+    /* Destroy the stack itself. */
+    ppfree(yyg->yy_buffer_stack ,yyscanner);
+    yyg->yy_buffer_stack = NULL;
+
+    /* Destroy the start condition stack. */
+        ppfree(yyg->yy_start_stack ,yyscanner );
+        yyg->yy_start_stack = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * pplex() is called, initialization will occur. */
+    yy_init_globals( yyscanner);
+
+    /* Destroy the main struct (reentrant only). */
+    ppfree ( yyscanner , yyscanner );
+    yyscanner = NULL;
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
+{
+    register int i;
+    for ( i = 0; i < n; ++i )
+        s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
+{
+    register int n;
+    for ( n = 0; s[n]; ++n )
+        ;
+
+    return n;
+}
+#endif
+
+void *ppalloc (yy_size_t  size , yyscan_t yyscanner)
+{
+    return (void *) malloc( size );
+}
+
+void *pprealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
+{
+    /* The cast to (char *) in the following accommodates both
+     * implementations that use char* generic pointers, and those
+     * that use void* generic pointers.  It works with the latter
+     * because both ANSI C and C++ allow castless assignment from
+     * any pointer type to void*, and deal with argument conversions
+     * as though doing an assignment.
+     */
+    return (void *) realloc( (char *) ptr, size );
+}
+
+void ppfree (void * ptr , yyscan_t yyscanner)
+{
+    free( (char *) ptr );   /* see pprealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+std::string* extractMacroName(const char* str, int len)
+{
+    // The input string is of the form {HASH}define{HSPACE}+{IDENTIFIER}
+    // We just need to find the last HSPACE.
+    ASSERT(str && (len > 8));  // strlen("#define ") == 8;
+
+    std::string* name = NULL;
+    for (int i = len - 1; i >= 0; --i)
+    {
+        if ((str[i] == ' ') || (str[i] == '\t'))
+        {
+            name = new std::string(str + i + 1, len - i - 1);
+            break;
+        }
+    }
+    ASSERT(name);
+    return name;
+}
+
+namespace pp {
+
+int Context::readInput(char* buf, int maxSize)
+{
+    int nread = YY_NULL;
+    while (!mInput->eof() &&
+           (mInput->error() == pp::Input::kErrorNone) &&
+           (nread == YY_NULL))
+    {
+        int line = 0, file = 0;
+        pp::Token::decodeLocation(ppget_lineno(mLexer), &line, &file);
+        file = mInput->stringIndex();
+        ppset_lineno(pp::Token::encodeLocation(line, file),mLexer);
+
+        nread = mInput->read(buf, maxSize);
+
+        if (mInput->error() == pp::Input::kErrorUnexpectedEOF)
+        {
+            // TODO(alokp): Report error.
+        }
+    }
+    return nread;
+}
+
+bool Context::initLexer()
+{
+    ASSERT(mLexer == NULL);
+
+    if (pplex_init_extra(this,&mLexer))
+        return false;
+
+    pprestart(0,mLexer);
+    return true;
+}
+
+void Context::destroyLexer()
+{
+    ASSERT(mLexer);
+
+    pplex_destroy(mLexer);
+    mLexer = NULL;
+}
+
+}  // namespace pp
+
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_tab.cpp b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp_tab.cpp
new file mode 100644 (file)
index 0000000..a7b6aa0
--- /dev/null
@@ -0,0 +1,2072 @@
+/* A Bison parser, made by GNU Bison 2.3.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary&n