From 721332425986dabe66e11188a75537f2c94a21cf Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Mon, 8 Jul 2013 19:39:16 +0000 Subject: [PATCH] Reframe the preprocessor as a C++ class, with instances, removing all C code, removing all global variables. Upgrade bison version to pass a parse context on through to the preprocessor. All the basic things to make something thread safe. git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@22291 e7fa87d3-cd2b-0410-9028-fcbf551c1848 --- OGLCompilersDLL/InitializeDll.cpp | 20 +- glslang.vcxproj | 30 +- glslang.vcxproj.filters | 84 +- glslang/Include/InitializeParseContext.h | 45 - glslang/MachineIndependent/Makefile | 37 +- glslang/MachineIndependent/ParseHelper.cpp | 360 +- glslang/MachineIndependent/ParseHelper.h | 28 +- glslang/MachineIndependent/PoolAlloc.cpp | 2 +- glslang/MachineIndependent/Scan.cpp | 36 +- glslang/MachineIndependent/ScanContext.h | 6 +- glslang/MachineIndependent/ShaderLang.cpp | 28 +- glslang/MachineIndependent/glslang.y | 29 +- .../MachineIndependent/preprocessor/Makefile | 23 +- .../MachineIndependent/preprocessor/Pp.cpp | 1076 ++++++ .../preprocessor/{atom.c => PpAtom.cpp} | 316 +- .../preprocessor/{scanner.h => PpContext.cpp} | 69 +- .../preprocessor/PpContext.h | 389 ++ .../preprocessor/{memory.c => PpMemory.cpp} | 52 +- .../preprocessor/{scanner.c => PpScanner.cpp} | 538 ++- .../preprocessor/{symbols.c => PpSymbols.cpp} | 101 +- .../preprocessor/{tokens.c => PpTokens.cpp} | 220 +- .../preprocessor/{parser.h => PpTokens.h} | 71 +- .../MachineIndependent/preprocessor/atom.h | 96 - glslang/MachineIndependent/preprocessor/cpp.c | 1153 ------ glslang/MachineIndependent/preprocessor/cpp.h | 128 - .../preprocessor/cppstruct.c | 183 - .../MachineIndependent/preprocessor/memory.h | 89 - .../preprocessor/preprocess.h | 158 - .../preprocessor/slglobals.h | 116 - .../MachineIndependent/preprocessor/symbols.h | 143 - .../MachineIndependent/preprocessor/tokens.h | 122 - tools/bison.exe | Bin 196096 -> 513536 bytes tools/bison.hairy | 334 -- tools/bison.simple | 699 ---- tools/data/Makefile.am | 30 + tools/data/Makefile.in | 1639 ++++++++ tools/data/README | 70 + tools/data/bison.m4 | 610 +++ tools/data/c++-skel.m4 | 26 + tools/data/c++.m4 | 205 + tools/data/c-like.m4 | 44 + tools/data/c-skel.m4 | 26 + tools/data/c.m4 | 722 ++++ tools/data/glr.c | 2589 +++++++++++++ tools/data/glr.cc | 346 ++ tools/data/java-skel.m4 | 26 + tools/data/java.m4 | 304 ++ tools/data/lalr1.cc | 1143 ++++++ tools/data/lalr1.java | 927 +++++ tools/data/location.cc | 299 ++ tools/data/m4sugar/foreach.m4 | 362 ++ tools/data/m4sugar/m4sugar.m4 | 3301 +++++++++++++++++ tools/data/stack.hh | 121 + tools/data/xslt/bison.xsl | 105 + tools/data/xslt/xml2dot.xsl | 397 ++ tools/data/xslt/xml2text.xsl | 569 +++ tools/data/xslt/xml2xhtml.xsl | 745 ++++ tools/data/yacc.c | 2065 +++++++++++ tools/flex.exe | Bin 181248 -> 0 bytes 59 files changed, 18949 insertions(+), 4503 deletions(-) delete mode 100644 glslang/Include/InitializeParseContext.h create mode 100644 glslang/MachineIndependent/preprocessor/Pp.cpp rename glslang/MachineIndependent/preprocessor/{atom.c => PpAtom.cpp} (70%) rename glslang/MachineIndependent/preprocessor/{scanner.h => PpContext.cpp} (77%) create mode 100644 glslang/MachineIndependent/preprocessor/PpContext.h rename glslang/MachineIndependent/preprocessor/{memory.c => PpMemory.cpp} (87%) rename glslang/MachineIndependent/preprocessor/{scanner.c => PpScanner.cpp} (56%) rename glslang/MachineIndependent/preprocessor/{symbols.c => PpSymbols.cpp} (82%) rename glslang/MachineIndependent/preprocessor/{tokens.c => PpTokens.cpp} (72%) rename glslang/MachineIndependent/preprocessor/{parser.h => PpTokens.h} (79%) delete mode 100644 glslang/MachineIndependent/preprocessor/atom.h delete mode 100644 glslang/MachineIndependent/preprocessor/cpp.c delete mode 100644 glslang/MachineIndependent/preprocessor/cpp.h delete mode 100644 glslang/MachineIndependent/preprocessor/cppstruct.c delete mode 100644 glslang/MachineIndependent/preprocessor/memory.h delete mode 100644 glslang/MachineIndependent/preprocessor/preprocess.h delete mode 100644 glslang/MachineIndependent/preprocessor/slglobals.h delete mode 100644 glslang/MachineIndependent/preprocessor/symbols.h delete mode 100644 glslang/MachineIndependent/preprocessor/tokens.h delete mode 100644 tools/bison.hairy delete mode 100644 tools/bison.simple create mode 100644 tools/data/Makefile.am create mode 100644 tools/data/Makefile.in create mode 100644 tools/data/README create mode 100644 tools/data/bison.m4 create mode 100644 tools/data/c++-skel.m4 create mode 100644 tools/data/c++.m4 create mode 100644 tools/data/c-like.m4 create mode 100644 tools/data/c-skel.m4 create mode 100644 tools/data/c.m4 create mode 100644 tools/data/glr.c create mode 100644 tools/data/glr.cc create mode 100644 tools/data/java-skel.m4 create mode 100644 tools/data/java.m4 create mode 100644 tools/data/lalr1.cc create mode 100644 tools/data/lalr1.java create mode 100644 tools/data/location.cc create mode 100644 tools/data/m4sugar/foreach.m4 create mode 100644 tools/data/m4sugar/m4sugar.m4 create mode 100644 tools/data/stack.hh create mode 100644 tools/data/xslt/bison.xsl create mode 100644 tools/data/xslt/xml2dot.xsl create mode 100644 tools/data/xslt/xml2text.xsl create mode 100644 tools/data/xslt/xml2xhtml.xsl create mode 100644 tools/data/yacc.c delete mode 100644 tools/flex.exe diff --git a/OGLCompilersDLL/InitializeDll.cpp b/OGLCompilersDLL/InitializeDll.cpp index 7a9955d5..4c42e59e 100644 --- a/OGLCompilersDLL/InitializeDll.cpp +++ b/OGLCompilersDLL/InitializeDll.cpp @@ -36,7 +36,6 @@ #include "InitializeDll.h" #include "Include/InitializeGlobals.h" -#include "Include/InitializeParseContext.h" #include "Public/ShaderLang.h" @@ -58,18 +57,13 @@ bool InitProcess() return false; } - - if (!InitializePoolIndex()) { + if (! InitializePoolIndex()) { assert(0 && "InitProcess(): Failed to initalize global pool"); return false; } - if (!InitializeParseContextIndex()) { - assert(0 && "InitProcess(): Failed to initalize parse context"); - return false; - } - InitThread(); + return true; } @@ -89,10 +83,7 @@ bool InitThread() InitializeGlobalPools(); - if (!InitializeThreadParseContext()) - return false; - - if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) { + if (! OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) { assert(0 && "InitThread(): Unable to set init flag."); return false; } @@ -119,8 +110,6 @@ bool DetachThread() FreeGlobalPools(); - if (!FreeParseContext()) - success = false; } return success; @@ -139,9 +128,6 @@ bool DetachProcess() FreePoolIndex(); - if (!FreeParseContextIndex()) - success = false; - OS_FreeTLSIndex(ThreadInitializeIndex); ThreadInitializeIndex = OS_INVALID_TLS_INDEX; diff --git a/glslang.vcxproj b/glslang.vcxproj index c50b18f0..85a49002 100644 --- a/glslang.vcxproj +++ b/glslang.vcxproj @@ -150,9 +150,18 @@ xcopy /y $(IntDir)$(TargetName)$(TargetExt) Test - + + 4065 + + + + + + + + @@ -166,13 +175,6 @@ xcopy /y $(IntDir)$(TargetName)$(TargetExt) Test - - - - - - - @@ -187,18 +189,11 @@ xcopy /y $(IntDir)$(TargetName)$(TargetExt) Test + + - - - - - - - - - @@ -208,7 +203,6 @@ xcopy /y $(IntDir)$(TargetName)$(TargetExt) Test - diff --git a/glslang.vcxproj.filters b/glslang.vcxproj.filters index 624bcaf8..fa45e1f2 100644 --- a/glslang.vcxproj.filters +++ b/glslang.vcxproj.filters @@ -8,9 +8,6 @@ {564543b5-6302-49ab-9d24-bd6bef91274a} - - {5d320e20-4d64-4db1-9d8c-e7fdc234be36} - {d4faa328-f693-4b77-9fcb-9629ca0d8ee8} @@ -26,6 +23,9 @@ {0c27903f-6ef2-4725-9d9c-70f50aeaa7a1} + + {f25a01e9-79ce-49bf-b79a-d10de89a0fec} + @@ -67,27 +67,6 @@ Machine Independent - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - OSDependent\Windows @@ -109,6 +88,27 @@ Machine Independent + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + @@ -129,33 +129,6 @@ Machine Independent - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - - - Machine Independent\CPP - Header Files @@ -174,9 +147,6 @@ Header Files - - Header Files - Header Files @@ -219,6 +189,12 @@ Machine Independent + + Machine Independent\Preprocessor + + + Machine Independent\Preprocessor + diff --git a/glslang/Include/InitializeParseContext.h b/glslang/Include/InitializeParseContext.h deleted file mode 100644 index 6fe095e7..00000000 --- a/glslang/Include/InitializeParseContext.h +++ /dev/null @@ -1,45 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// - -#ifndef __INITIALIZE_PARSE_CONTEXT_INCLUDED_ -#define __INITIALIZE_PARSE_CONTEXT_INCLUDED_ -#include "osinclude.h" - -bool InitializeParseContextIndex(); -bool InitializeThreadParseContext(); -bool FreeParseContext(); -bool FreeParseContextIndex(); - - -#endif // __INITIALIZE_PARSE_CONTEXT_INCLUDED_ diff --git a/glslang/MachineIndependent/Makefile b/glslang/MachineIndependent/Makefile index 508c29fe..3800f574 100644 --- a/glslang/MachineIndependent/Makefile +++ b/glslang/MachineIndependent/Makefile @@ -13,7 +13,7 @@ OBJECTS= Initialize.o IntermTraverse.o \ RemoveTree.o ShaderLang.o intermOut.o parseConst.o SymbolTable.o \ InfoSink.o Versions.o Constant.o Scan.o -SRCS= gen_glslang.cpp gen_glslang_tab.cpp Initialize.cpp IntermTraverse.cpp \ +SRCS= gen_glslang_tab.cpp Initialize.cpp IntermTraverse.cpp \ Intermediate.cpp ParseHelper.cpp PoolAlloc.cp QualifierAlive.cpp \ RemoveTree.cpp ShaderLang.cpp SymbolTable.cpp intermOut.cpp \ parseConst.cpp InfoSink.cpp Versions.cpp Constant.cpp Scan.cpp @@ -24,21 +24,13 @@ default: all all: $(SHAREDOBJECT) -$(SHAREDOBJECT): gen_glslang.o gen_glslang_tab.o $(OBJECTS) \ +$(SHAREDOBJECT): gen_glslang_tab.o $(OBJECTS) \ $(LIBPREPROCESSOR) $(LIBCODEGEN) $(LIBOSDEPENDENT) $(LIBINITIALISATION) - $(CC) -fPIC -shared -o $@ -rdynamic -Wl,-whole-archive $(OBJECTS) $(LIBPREPROCESSOR) $(LIBCODEGEN) $(LIBOSDEPENDENT) $(LIBINITIALISATION) gen_glslang.o gen_glslang_tab.o -Wl,-no-whole-archive - -gen_glslang.o : gen_glslang.cpp glslang_tab.h - $(CC) -fPIC -c $(INCLUDE) gen_glslang.cpp -o $@ + $(CC) -fPIC -shared -o $@ -rdynamic -Wl,-whole-archive $(OBJECTS) $(LIBPREPROCESSOR) $(LIBCODEGEN) $(LIBOSDEPENDENT) $(LIBINITIALISATION) gen_glslang_tab.o -Wl,-no-whole-archive gen_glslang_tab.o : gen_glslang_tab.cpp $(CC) -fPIC -c $(INCLUDE) gen_glslang_tab.cpp -o $@ -gen_glslang.cpp: glslang.l - @echo Generating gen_glslang.cpp - @dos2unix glslang.l - flex glslang.l - gen_glslang_tab.cpp glslang_tab.h: glslang.y @echo Generating gen_glslang_tab.cpp @dos2unix glslang.y @@ -72,7 +64,7 @@ depend: # .PHONY : clean clean : - $(RM) *.o *.a gen_glslang_tab.cpp glslang_tab.cpp glslang_tab.cpp.h gen_glslang.cpp glslang_tab.h glslang.output + $(RM) *.o *.a gen_glslang_tab.cpp glslang_tab.cpp glslang_tab.cpp.h glslang_tab.h glslang.output $(RM) ./lib/*.so cd $(INCPREPROCESSOR); make clean cd $(INCCODEGEN); make clean @@ -81,19 +73,6 @@ clean : # DO NOT DELETE -gen_glslang.o: ParseHelper.h ../Include/ShHandle.h -gen_glslang.o: ../Public/ShaderLang.h ../Include/InfoSink.h -gen_glslang.o: ../Include/Common.h ../Include/PoolAlloc.h SymbolTable.h -gen_glslang.o: ../Include/Common.h ../Include/intermediate.h -gen_glslang.o: ../Include/Types.h ../Include/BaseTypes.h -gen_glslang.o: ../Include/ConstantUnion.h ../Include/InfoSink.h -gen_glslang.o: localintermediate.h ../Include/intermediate.h -gen_glslang.o: ../Public/ShaderLang.h glslang_tab.h ./unistd.h -gen_glslang.o: ./preprocessor/preprocess.h ./preprocessor/slglobals.h -gen_glslang.o: ./preprocessor/memory.h ./preprocessor/atom.h -gen_glslang.o: ./preprocessor/scanner.h ./preprocessor/parser.h -gen_glslang.o: ./preprocessor/cpp.h ./preprocessor/tokens.h -gen_glslang.o: ./preprocessor/symbols.h ./preprocessor/compile.h gen_glslang_tab.o: SymbolTable.h ../Include/Common.h gen_glslang_tab.o: ../Include/intermediate.h ../Include/Common.h gen_glslang_tab.o: ../Include/PoolAlloc.h ../Include/Types.h @@ -126,10 +105,15 @@ ParseHelper.o: ../Include/Common.h ../Include/intermediate.h ParseHelper.o: ../Include/Types.h ../Include/BaseTypes.h ParseHelper.o: ../Include/ConstantUnion.h ../Include/InfoSink.h ParseHelper.o: localintermediate.h ../Include/intermediate.h -ParseHelper.o: ../Public/ShaderLang.h ../Include/InitializeParseContext.h +ParseHelper.o: ../Public/ShaderLang.h ParseHelper.o: ../OSDependent/Linux/osinclude.h ParseHelper.o: ../Include/InitializeGlobals.h ../Include/PoolAlloc.h QualifierAlive.o: ../Include/intermediate.h +Scan.o: Scan.h +Scan.o: ParseHelper.h SymbolTable.h +Scan.o: glslang_tab.cpp.h +Scan.o: ../Include/Types.h +Scan.o: ScanContext.h preprocessor/PpContext.h preprocessor/PpTokens.h RemoveTree.o: ../Include/intermediate.h RemoveTree.h ShaderLang.o: SymbolTable.h ../Include/Common.h ../Include/intermediate.h ShaderLang.o: ../Include/Common.h ../Include/PoolAlloc.h ../Include/Types.h @@ -161,4 +145,3 @@ parseConst.o: ../Public/ShaderLang.h InfoSink.o: ../Include/InfoSink.h Versions.o: ParseHelper.h Versions.h ../Include/ShHandle.h SymbolTable.h localintermediate.h Constant.o: localintermediate.h ../Include/intermediate.h ../Public/ShaderLang.h SymbolTable.h Versions.h -Scan.o: Scan.h Versions.h diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 9c2efa99..97cf421e 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -35,14 +35,11 @@ // #include "ParseHelper.h" -#include "Include/InitializeParseContext.h" #include "osinclude.h" #include #include -extern "C" { - #include "./preprocessor/preprocess.h" -} +#include "preprocessor/PpContext.h" TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, bool pb, int v, EProfile p, EShLanguage L, TInfoSink& is, bool fc, EShMessages m) : @@ -50,8 +47,11 @@ TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, bool pb, numErrors(0), loopNestingLevel(0), structNestingLevel(0), inTypeParen(false), parsingBuiltins(pb), version(v), profile(p), forwardCompatible(fc), messages(m), - contextPragma(true, false) + contextPragma(true, false), afterEOF(false), tokensBeforeEOF(false) { + currentLoc.line = 1; + currentLoc.string = 0; + // set all precision defaults to EpqNone, which is correct for all desktop types // and for ES types that don't have defaults (thus getting an error on use) for (int type = 0; type < EbtNumTypes; ++type) @@ -104,24 +104,20 @@ const char* TParseContext::getPreamble() return 0; } -TSourceLoc currentLine; // TODO: thread: get this into the scan context, sort out with return from PP -#ifdef _WIN32 - extern int yyparse(TParseContext&); -#else - extern int yyparse(void*); - #define parseContext (*((TParseContext*)(parseContextLocal))) -#endif +extern int yyparse(void*); // -// Parse an array of strings using yyparse. We set up globals used by -// yywrap. +// Parse an array of strings using yyparse, going through the +// preprocessor to tokenize the shader strings, then through +// the GLSL scanner. // -// Returns true for success, false for failure. +// Returns true for successful acceptance of the shader, false if any errors. // -bool TParseContext::parseShaderStrings(char* strings[], int strLen[], int numStrings) +bool TParseContext::parseShaderStrings(TPpContext& ppContext, char* strings[], int lengths[], int numStrings) { - if (! strings || numStrings == 0) - return false; + // empty shaders are okay + if (! strings || numStrings == 0 || lengths[0] == 0) + return true; for (int i = 0; i < numStrings; ++i) { if (! strings[i]) { @@ -134,36 +130,9 @@ bool TParseContext::parseShaderStrings(char* strings[], int strLen[], int numStr } } - // set up all the cpp fields... - // TODO: thread safety: don't move 'this' into the global - cpp->pC = (void*)this; - const char* preamble = getPreamble(); - char *writeablePreamble = 0; - if (preamble) { - // preAmble could be a hard-coded string; make writable copy - // TODO: efficiency PP: make it not need writable strings - int size = strlen(preamble) + 1; - writeablePreamble = new char[size]; - memcpy(writeablePreamble, preamble, size); - ScanFromString(writeablePreamble); - cpp->PaWhichStr = -1; - } else { - ScanFromString(strings[0]); - cpp->PaWhichStr = 0; - } - - afterEOF = false; - cpp->PaArgv = strings; - cpp->PaArgc = numStrings; - int string0len; - if (! strLen) { - string0len = (int) strlen(strings[0]); - cpp->PaStrLen = &string0len; - } else - cpp->PaStrLen = strLen; - cpp->notAVersionToken = 0; - currentLine.string = 0; - currentLine.line = 1; + if (getPreamble()) + ppContext.setPreamble(getPreamble(), strlen(getPreamble())); + ppContext.setShaderStrings(strings, lengths, numStrings); // TODO: desktop PP: a shader containing nothing but white space and comments is valid, even though it has no parse tokens int len = 0; @@ -171,170 +140,73 @@ bool TParseContext::parseShaderStrings(char* strings[], int strLen[], int numStr strings[0][len] == '\t' || strings[0][len] == '\n' || strings[0][len] == '\r') { - if (++len >= strLen[0]) { - delete writeablePreamble; + if (++len >= lengths[0]) return true; - } } - if (*cpp->PaStrLen > 0) { - int ret; - #ifdef _WIN32 - ret = yyparse(*this); - #else - ret = yyparse((void*)this); - #endif - delete writeablePreamble; - if (cpp->CompileError == 1 || numErrors > 0) - return false; - else - return true; - } + yyparse((void*)this); - delete writeablePreamble; - - return true; + return numErrors == 0; } -// TODO: fix this for threads -void yyerror(const char *s) +// This is called from bison when it has a parse (syntax) error +void TParseContext::parserError(const char *s) { - TParseContext& pc = *((TParseContext *)cpp->pC); - - if (pc.afterEOF) { - if (cpp->tokensBeforeEOF == 1) - ThreadLocalParseContext()->error(currentLine, "", "pre-mature EOF", s, ""); + if (afterEOF) { + if (tokensBeforeEOF == 1) + error(currentLoc, "", "pre-mature EOF", s, ""); } else - ThreadLocalParseContext()->error(currentLine, "", "", s, ""); + error(currentLoc, "", "", s, ""); } - -extern "C" { - -// Communications with the preprocess. -// TODO: threads: this all needs redoing for thread safety - -void ShPpDebugLogMsg(const char *msg) +void TParseContext::handlePragma(const char **tokens, int numTokens) { - TParseContext& pc = *((TParseContext *)cpp->pC); - - pc.infoSink.debug.message(EPrefixNone, msg); -} - -void ShPpWarningToInfoLog(const char *msg) -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - - pc.warn(currentLine, msg, "Preprocessor", ""); -} - -void ShPpErrorToInfoLog(const char *msg) -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - - pc.error(currentLine, msg, "Preprocessor", ""); -} - -// return 1 if error -// return 0 if no error -int ShPpMacrosMustBeDefinedError() -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - - if (pc.profile == EEsProfile) { - if (pc.messages & EShMsgRelaxedErrors) - ShPpWarningToInfoLog("undefined macro in expression not allowed in es profile"); - else { - ShPpErrorToInfoLog("undefined macro in expression"); - - return 1; - } - } - - return 0; -} - -// TODO: PP/threads: integrate this with location from token -void SetLineNumber(int line) -{ - currentLine.line = line; -} - -void SetStringNumber(int string) -{ - currentLine.string = string; -} - -int GetStringNumber(void) -{ - return currentLine.string; -} - -int GetLineNumber(void) -{ - return currentLine.line; -} - -void IncLineNumber(void) -{ - ++currentLine.line; -} - -void DecLineNumber(void) -{ - --currentLine.line; -} - -void HandlePragma(const char **tokens, int numTokens) -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - if (!strcmp(tokens[0], "optimize")) { if (numTokens != 4) { - ShPpErrorToInfoLog("optimize pragma syntax is incorrect"); + error(currentLoc, "optimize pragma syntax is incorrect", "#pragma", ""); return; } if (strcmp(tokens[1], "(")) { - ShPpErrorToInfoLog("\"(\" expected after 'optimize' keyword"); + error(currentLoc, "\"(\" expected after 'optimize' keyword", "#pragma", ""); return; } if (!strcmp(tokens[2], "on")) - pc.contextPragma.optimize = true; + contextPragma.optimize = true; else if (!strcmp(tokens[2], "off")) - pc.contextPragma.optimize = false; + contextPragma.optimize = false; else { - ShPpErrorToInfoLog("\"on\" or \"off\" expected after '(' for 'optimize' pragma"); + error(currentLoc, "\"on\" or \"off\" expected after '(' for 'optimize' pragma", "#pragma", ""); return; } if (strcmp(tokens[3], ")")) { - ShPpErrorToInfoLog("\")\" expected to end 'optimize' pragma"); + error(currentLoc, "\")\" expected to end 'optimize' pragma", "#pragma", ""); return; } } else if (!strcmp(tokens[0], "debug")) { if (numTokens != 4) { - ShPpErrorToInfoLog("debug pragma syntax is incorrect"); + error(currentLoc, "debug pragma syntax is incorrect", "#pragma", ""); return; } if (strcmp(tokens[1], "(")) { - ShPpErrorToInfoLog("\"(\" expected after 'debug' keyword"); + error(currentLoc, "\"(\" expected after 'debug' keyword", "#pragma", ""); return; } if (!strcmp(tokens[2], "on")) - pc.contextPragma.debug = true; + contextPragma.debug = true; else if (!strcmp(tokens[2], "off")) - pc.contextPragma.debug = false; + contextPragma.debug = false; else { - ShPpErrorToInfoLog("\"on\" or \"off\" expected after '(' for 'debug' pragma"); + error(currentLoc, "\"on\" or \"off\" expected after '(' for 'debug' pragma", "#pragma", ""); return; } if (strcmp(tokens[3], ")")) { - ShPpErrorToInfoLog("\")\" expected to end 'debug' pragma"); + error(currentLoc, "\")\" expected to end 'debug' pragma", "#pragma", ""); return; } } else { @@ -371,47 +243,7 @@ void HandlePragma(const char **tokens, int numTokens) } } -void StoreStr(const char *string) -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - - TString strSrc; - strSrc = TString(string); - - pc.HashErrMsg = pc.HashErrMsg + " " + strSrc; -} - -const char* GetStrfromTStr(void) -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - - cpp->ErrMsg = pc.HashErrMsg.c_str(); - return cpp->ErrMsg; -} - -void ResetTString(void) -{ - TParseContext& pc = *((TParseContext *)cpp->pC); - - pc.HashErrMsg = ""; -} - -void SetVersion(int version) -{ - // called by the CPP, but this functionality is currently - // taken over by ScanVersion() before parsing starts - - // CPP should still report errors in semantics -} - -int GetShaderVersion(void* cppPc) -{ - TParseContext& pc = *((TParseContext *)cppPc); - - return pc.version; -} - -TBehavior GetBehavior(const char* behavior) +TBehavior TParseContext::getExtensionBehavior(const char* behavior) { if (!strcmp("require", behavior)) return EBhRequire; @@ -422,38 +254,37 @@ TBehavior GetBehavior(const char* behavior) else if (!strcmp("warn", behavior)) return EBhWarn; else { - ShPpErrorToInfoLog((TString("behavior '") + behavior + "' is not supported").c_str()); + error(currentLoc, "behavior not supported", "#extension", behavior); return EBhDisable; } } -void updateExtensionBehavior(const char* extName, const char* behavior) +void TParseContext::updateExtensionBehavior(const char* extName, const char* behavior) { - TParseContext& pc = *((TParseContext *)cpp->pC); - TBehavior behaviorVal = GetBehavior(behavior); + TBehavior behaviorVal = getExtensionBehavior(behavior); TMap:: iterator iter; TString msg; // special cased for all extension if (!strcmp(extName, "all")) { if (behaviorVal == EBhRequire || behaviorVal == EBhEnable) { - ShPpErrorToInfoLog("extension 'all' cannot have 'require' or 'enable' behavior"); + error(currentLoc, "extension 'all' cannot have 'require' or 'enable' behavior", "#extension", ""); return; } else { - for (iter = pc.extensionBehavior.begin(); iter != pc.extensionBehavior.end(); ++iter) + for (iter = extensionBehavior.begin(); iter != extensionBehavior.end(); ++iter) iter->second = behaviorVal; } } else { - iter = pc.extensionBehavior.find(TString(extName)); - if (iter == pc.extensionBehavior.end()) { + iter = extensionBehavior.find(TString(extName)); + if (iter == extensionBehavior.end()) { switch (behaviorVal) { case EBhRequire: - ShPpErrorToInfoLog((TString("extension '") + extName + "' is not supported").c_str()); + error(currentLoc, "extension not supported", "#extension", extName); break; case EBhEnable: case EBhWarn: case EBhDisable: - pc.warn(currentLine, "extension not supported", extName, ""); + warn(currentLoc, "extension not supported", "#extension", extName); break; default: assert(0 && "unexpected behaviorVal"); @@ -465,9 +296,6 @@ void updateExtensionBehavior(const char* extName, const char* behavior) } } -} // extern "C" - - /////////////////////////////////////////////////////////////////////// // // Sub- vector and matrix fields @@ -707,8 +535,8 @@ void TParseContext::variableCheck(TIntermTyped*& nodePtr) symbolTable.insert(*fakeVariable); // substitute a symbol node for this new variable - nodePtr = intermediate.addSymbol(fakeVariable->getUniqueId(), - fakeVariable->getName(), + nodePtr = intermediate.addSymbol(fakeVariable->getUniqueId(), + fakeVariable->getName(), fakeVariable->getType(), symbol->getLoc()); } else { switch (symbol->getQualifier().storage) { @@ -2383,89 +2211,3 @@ void TParseContext::initializeExtensionBehavior() extensionBehavior["GL_ARB_texture_rectangle"] = EBhDisable; extensionBehavior["GL_3DL_array_objects"] = EBhDisable; } - -OS_TLSIndex GlobalParseContextIndex = OS_INVALID_TLS_INDEX; - -bool InitializeParseContextIndex() -{ - if (GlobalParseContextIndex != OS_INVALID_TLS_INDEX) { - assert(0 && "InitializeParseContextIndex(): Parse Context already initialised"); - return false; - } - - // - // Allocate a TLS index. - // - GlobalParseContextIndex = OS_AllocTLSIndex(); - - if (GlobalParseContextIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "InitializeParseContextIndex(): Parse Context already initialised"); - return false; - } - - return true; -} - -bool InitializeThreadParseContext() -{ - if (GlobalParseContextIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "InitializeThreadParseContext(): Parse Context index not initialized"); - return false; - } - - TThreadParseContext *lpParseContext = static_cast(OS_GetTLSValue(GlobalParseContextIndex)); - if (lpParseContext != 0) { - assert(0 && "InitializeParseContextIndex(): Parse Context already initialized"); - return false; - } - - TThreadParseContext *lpThreadData = new TThreadParseContext(); - if (lpThreadData == 0) { - assert(0 && "InitializeThreadParseContext(): Unable to create thread parse context"); - return false; - } - - lpThreadData->lpGlobalParseContext = 0; - OS_SetTLSValue(GlobalParseContextIndex, lpThreadData); - - return true; -} - -TParseContextPointer& ThreadLocalParseContext() -{ - // - // Minimal error checking for speed - // - - TThreadParseContext *lpParseContext = static_cast(OS_GetTLSValue(GlobalParseContextIndex)); - - return lpParseContext->lpGlobalParseContext; -} - -bool FreeParseContext() -{ - if (GlobalParseContextIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "FreeParseContext(): Parse Context index not initialized"); - return false; - } - - TThreadParseContext *lpParseContext = static_cast(OS_GetTLSValue(GlobalParseContextIndex)); - if (lpParseContext) - delete lpParseContext; - - return true; -} - -bool FreeParseContextIndex() -{ - OS_TLSIndex tlsiIndex = GlobalParseContextIndex; - - if (GlobalParseContextIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "FreeParseContextIndex(): Parse Context index not initialized"); - return false; - } - - GlobalParseContextIndex = OS_INVALID_TLS_INDEX; - - return OS_FreeTLSIndex(tlsiIndex); -} diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h index 8f72eacb..102810ed 100644 --- a/glslang/MachineIndependent/ParseHelper.h +++ b/glslang/MachineIndependent/ParseHelper.h @@ -55,6 +55,8 @@ struct TPragma { TPragmaTable pragmaTable; }; +class TPpContext; + namespace glslang { class TScanContext; }; @@ -63,10 +65,13 @@ namespace glslang { // The following are extra variables needed during parsing, grouped together so // they can be passed to the parser without needing a global. // -struct TParseContext { +class TParseContext { +public: TParseContext(TSymbolTable&, TIntermediate&, bool parsingBuiltins, int version, EProfile, EShLanguage, TInfoSink&, bool forwardCompatible = false, EShMessages messages = EShMsgDefault); - glslang::TScanContext *scanContext; + + glslang::TScanContext* scanContext; + TPpContext* ppContext; TIntermediate& intermediate; // to hold and build a parse tree TSymbolTable& symbolTable; // symbol table that goes with the current language, version, and profile TInfoSink& infoSink; @@ -92,8 +97,9 @@ struct TParseContext { TPrecisionQualifier defaultPrecision[EbtNumTypes]; static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2)); // see computeSamplerTypeIndex() TPrecisionQualifier defaultSamplerPrecision[maxSamplerIndex]; - TString HashErrMsg; bool afterEOF; + bool tokensBeforeEOF; + TSourceLoc currentLoc; const TString* blockName; TQualifier globalUniformDefaults; TQualifier globalInputDefaults; @@ -102,7 +108,12 @@ struct TParseContext { void initializeExtensionBehavior(); const char* getPreamble(); - bool parseShaderStrings(char* strings[], int strLen[], int numStrings); + bool parseShaderStrings(TPpContext&, char* strings[], int strLen[], int numStrings); + void parserError(const char *s); + + void handlePragma(const char **tokens, int numTokens); + TBehavior getExtensionBehavior(const char* behavior); + void updateExtensionBehavior(const char* extName, const char* behavior); void C_DECL error(TSourceLoc, const char *szReason, const char *szToken, const char *szExtraInfoFormat, ...); @@ -183,13 +194,4 @@ struct TParseContext { void doubleCheck(TSourceLoc, const char* op); }; -typedef TParseContext* TParseContextPointer; -TParseContextPointer& ThreadLocalParseContext(); - -// TODO: threading: -typedef struct TThreadParseContextRec -{ - TParseContext *lpGlobalParseContext; -} TThreadParseContext; - #endif // _PARSER_HELPER_INCLUDED_ diff --git a/glslang/MachineIndependent/PoolAlloc.cpp b/glslang/MachineIndependent/PoolAlloc.cpp index 53bfe28f..ad5de3b8 100644 --- a/glslang/MachineIndependent/PoolAlloc.cpp +++ b/glslang/MachineIndependent/PoolAlloc.cpp @@ -42,7 +42,7 @@ OS_TLSIndex PoolIndex; void InitializeGlobalPools() { - TThreadGlobalPools* globalPools= static_cast(OS_GetTLSValue(PoolIndex)); + TThreadGlobalPools* globalPools = static_cast(OS_GetTLSValue(PoolIndex)); if (globalPools) return; diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp index ca9af6ac..10174310 100644 --- a/glslang/MachineIndependent/Scan.cpp +++ b/glslang/MachineIndependent/Scan.cpp @@ -48,10 +48,8 @@ #include "ScanContext.h" // preprocessor includes -extern "C" { - #include "preprocessor/parser.h" - #include "preprocessor/preprocess.h" -} +#include "preprocessor/PpContext.h" +#include "preprocessor/PpTokens.h" namespace glslang { @@ -236,12 +234,6 @@ bool ScanVersion(TInputScanner& input, int& version, EProfile& profile) namespace glslang { -// This gets filled in by the preprocessor scanner. -class TPpToken{ -public: - yystypepp lexer; -}; - // Fill this in when doing glslang-level scanning, to hand back to the parser. class TParserToken { public: @@ -257,7 +249,7 @@ int yylex(YYSTYPE* glslangTokenDesc, TParseContext& parseContext) { glslang::TParserToken token(*glslangTokenDesc); - return parseContext.scanContext->tokenize(token); + return parseContext.scanContext->tokenize(parseContext.ppContext, token); } namespace { @@ -487,17 +479,15 @@ void TScanContext::fillInKeywordMap() ReservedSet->insert("using"); } -int TScanContext::tokenize(TParserToken& token) +int TScanContext::tokenize(TPpContext* pp, TParserToken& token) { parserToken = &token; - TPpToken ppTokenStorage; - ppToken = &ppTokenStorage; - tokenText = PpTokenize(&ppToken->lexer); + TPpToken ppToken; + tokenText = pp->tokenize(&ppToken); - loc.string = cpp->tokenLoc->file; - loc.line = cpp->tokenLoc->line; + loc = ppToken.loc; parserToken->sType.lex.loc = loc; - switch (ppToken->lexer.ppToken) { + switch (ppToken.ppToken) { case ';': afterType = false; return SEMICOLON; case ',': afterType = false; return COMMA; case ':': return COLON; @@ -545,10 +535,10 @@ int TScanContext::tokenize(TParserToken& token) case CPP_OR_ASSIGN: return OR_ASSIGN; case CPP_XOR_ASSIGN: return XOR_ASSIGN; - case CPP_INTCONSTANT: parserToken->sType.lex.i = ppToken->lexer.sc_int; return INTCONSTANT; - case CPP_UINTCONSTANT: parserToken->sType.lex.i = ppToken->lexer.sc_int; return UINTCONSTANT; - case CPP_FLOATCONSTANT: parserToken->sType.lex.d = ppToken->lexer.sc_dval; return FLOATCONSTANT; - case CPP_DOUBLECONSTANT: parserToken->sType.lex.d = ppToken->lexer.sc_dval; return DOUBLECONSTANT; + case CPP_INTCONSTANT: parserToken->sType.lex.i = ppToken.ival; return INTCONSTANT; + case CPP_UINTCONSTANT: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT; + case CPP_FLOATCONSTANT: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT; + case CPP_DOUBLECONSTANT: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT; case CPP_IDENTIFIER: return tokenizeIdentifier(); case EOF: return 0; @@ -896,7 +886,7 @@ int TScanContext::identifierOrType() int TScanContext::reservedWord() { - ThreadLocalParseContext()->error(loc, "Reserved word.", tokenText, "", ""); + parseContext.error(loc, "Reserved word.", tokenText, "", ""); return 0; } diff --git a/glslang/MachineIndependent/ScanContext.h b/glslang/MachineIndependent/ScanContext.h index 116a36b2..d99df223 100644 --- a/glslang/MachineIndependent/ScanContext.h +++ b/glslang/MachineIndependent/ScanContext.h @@ -40,10 +40,12 @@ #include "ParseHelper.h" +class TPpContext; +class TPpToken; + namespace glslang { class TParserToken; -class TPpToken; class TScanContext { public: @@ -51,7 +53,7 @@ public: virtual ~TScanContext() { } static void fillInKeywordMap(); - int tokenize(TParserToken&); + int tokenize(TPpContext*, TParserToken&); protected: int tokenizeIdentifier(); diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 0a1a12ab..8bb6c5bd 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -49,9 +49,7 @@ #include "../Include/ShHandle.h" #include "InitializeDll.h" -extern "C" { -#include "preprocessor/preprocess.h" -} +#include "preprocessor/PpContext.h" #define SH_EXPORTING #include "../Public/ShaderLang.h" @@ -87,7 +85,6 @@ const int VersionCount = 12; // Each has a different set of built-ins, and we want to preserve that from // compile to compile. // -// TODO: quality: thread safety: ensure the built-in symbol table levels are read only. TSymbolTable* SharedSymbolTables[VersionCount][EProfileCount][EShLangCount] = {}; TPoolAllocator* PerProcessGPA = 0; @@ -104,9 +101,10 @@ bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, int version, EProfil symbolTable = &symbolTables[language]; TParseContext parseContext(*symbolTable, intermediate, true, version, profile, language, infoSink); - ThreadLocalParseContext() = &parseContext; + TPpContext ppContext(parseContext); glslang::TScanContext scanContext(parseContext); parseContext.scanContext = &scanContext; + parseContext.ppContext = &ppContext; assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel()); @@ -121,14 +119,6 @@ bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, int version, EProfil symbolTable->push(); - - //Initialize the Preprocessor - int ret = InitPreprocessor(); - if (ret) { - infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor"); - return false; - } - for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin(); i != BuiltInStrings[parseContext.language].end(); ++i) { const char* builtInShaders[1]; @@ -136,14 +126,13 @@ bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, int version, EProfil builtInShaders[0] = (*i).c_str(); builtInLengths[0] = (int) (*i).size(); - if (! parseContext.parseShaderStrings(const_cast(builtInShaders), builtInLengths, 1) != 0) { + if (! parseContext.parseShaderStrings(ppContext, const_cast(builtInShaders), builtInLengths, 1) != 0) { infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins"); printf("Unable to parse built-ins\n"); return false; } } - FinalizePreprocessor(); if (resources) { IdentifyBuiltIns(version, profile, parseContext.language, *symbolTable, *resources); @@ -418,7 +407,9 @@ int ShCompile( TParseContext parseContext(symbolTable, intermediate, false, version, profile, compiler->getLanguage(), compiler->infoSink, forwardCompatible, messages); glslang::TScanContext scanContext(parseContext); + TPpContext ppContext(parseContext); parseContext.scanContext = &scanContext; + parseContext.ppContext = &ppContext; TSourceLoc beginning; beginning.line = 1; @@ -433,10 +424,6 @@ int ShCompile( else if (profile == EEsProfile && version >= 300 && versionNotFirst) parseContext.error(beginning, "statement must appear first in ESSL shader; before comments or newlines", "#version", ""); - ThreadLocalParseContext() = &parseContext; - - InitPreprocessor(); - // // Parse the application's shaders. All the following symbol table // work will be throw-away, so push a new allocation scope that can @@ -451,7 +438,7 @@ int ShCompile( if (parseContext.insertBuiltInArrayAtGlobalLevel()) success = false; - bool ret = parseContext.parseShaderStrings(const_cast(shaderStrings), lengths, numStrings); + bool ret = parseContext.parseShaderStrings(ppContext, const_cast(shaderStrings), lengths, numStrings); if (! ret) success = false; intermediate.addSymbolLinkageNodes(parseContext.treeRoot, parseContext.linkage, parseContext.language, symbolTable); @@ -490,7 +477,6 @@ int ShCompile( while (! symbolTable.atSharedBuiltInLevel()) symbolTable.pop(0); - FinalizePreprocessor(); // // Throw away all the temporary memory used by the compilation process. // diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y index f8244004..486b639a 100644 --- a/glslang/MachineIndependent/glslang.y +++ b/glslang/MachineIndependent/glslang.y @@ -59,20 +59,6 @@ Jutta Degener, 1995 #include "ParseHelper.h" #include "../Public/ShaderLang.h" -#ifdef _WIN32 - #define YYPARSE_PARAM parseContext - #define YYPARSE_PARAM_DECL TParseContext& - #define YY_DECL int yylex(YYSTYPE* pyylval, TParseContext& parseContext) - #define YYLEX_PARAM parseContext -#else - #define YYPARSE_PARAM parseContextLocal - #define parseContext (*((TParseContext*)(parseContextLocal))) - #define YY_DECL int yylex(YYSTYPE* pyylval, void* parseContextLocal) - #define YYLEX_PARAM (void*)(parseContextLocal) -#endif - -extern void yyerror(const char*); - %} %union { @@ -109,13 +95,18 @@ extern void yyerror(const char*); } %{ -#ifndef _WIN32 - extern int yylex(YYSTYPE*, void*); -#endif + +#define YYPARSE_PARAM voidParseContext +#define parseContext (*(TParseContext*)voidParseContext) +#define YYLEX_PARAM parseContext +#define yyerror(msg) parseContext.parserError(msg) + +extern int yylex(YYSTYPE*, TParseContext&); + %} -%pure_parser /* Just in case is called from multiple threads */ -%expect 1 /* One shift reduce conflict because of if | else */ +%pure_parser // enable thread safety +%expect 1 // One shift reduce conflict because of if | else %token ATTRIBUTE VARYING %token CONST BOOL FLOAT DOUBLE INT UINT diff --git a/glslang/MachineIndependent/preprocessor/Makefile b/glslang/MachineIndependent/preprocessor/Makefile index 73af8abe..467e2a16 100644 --- a/glslang/MachineIndependent/preprocessor/Makefile +++ b/glslang/MachineIndependent/preprocessor/Makefile @@ -3,9 +3,10 @@ CC = gcc CPPFLAGS=$(DEFINE) $(INCLUDE) -fPIC -OBJECTS = atom.o cpp.o cppstruct.o memory.o scanner.o symbols.o tokens.o +OBJECTS = PpAtom.o PpScanner.o PpTokens.o Pp.o PpContext.o PpMemory.o PpSymbols.o AR=ar -SRCS=scanner.c atom.c memory.c tokens. cpp.c cppstruct.c symbols.c +SRCS = PpAtom.cpp PpScanner.cpp PpTokens.cpp Pp.cpp PpContext.cpp PpMemory.cpp PpSymbols.cpp + default: all all : libPreprocessor.a @@ -28,14 +29,10 @@ depend: # DO NOT DELETE -scanner.o: slglobals.h memory.h atom.h scanner.h parser.h cpp.h tokens.h -scanner.o: symbols.h compile.h -atom.o: slglobals.h memory.h atom.h scanner.h parser.h cpp.h tokens.h -atom.o: symbols.h compile.h -memory.o: memory.h -cpp.o: slglobals.h memory.h atom.h scanner.h parser.h cpp.h tokens.h -cpp.o: symbols.h compile.h -cppstruct.o: slglobals.h memory.h atom.h scanner.h parser.h cpp.h tokens.h -cppstruct.o: symbols.h compile.h -symbols.o: slglobals.h memory.h atom.h scanner.h parser.h cpp.h tokens.h -symbols.o: symbols.h compile.h +PpAtom.o: PpContext.h PpToken.h +PpScanner.o: PpContext.h PpToken.h +PpTokens.o: PpContext.h PpToken.h +Pp.o: PpContext.h PpToken.h +PpContext.o: PpContext.h PpToken.h +PpMemory.o: PpContext.h PpToken.h +PpSymbols.o: PpContext.h PpToken.h diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp new file mode 100644 index 00000000..3f2b6899 --- /dev/null +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -0,0 +1,1076 @@ +// +//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +/****************************************************************************\ +Copyright (c) 2002, NVIDIA Corporation. + +NVIDIA Corporation("NVIDIA") supplies this software to you in +consideration of your agreement to the following terms, and your use, +installation, modification or redistribution of this NVIDIA software +constitutes acceptance of these terms. If you do not agree with these +terms, please do not use, install, modify or redistribute this NVIDIA +software. + +In consideration of your agreement to abide by the following terms, and +subject to these terms, NVIDIA grants you a personal, non-exclusive +license, under NVIDIA's copyrights in this original NVIDIA software (the +"NVIDIA Software"), to use, reproduce, modify and redistribute the +NVIDIA Software, with or without modifications, in source and/or binary +forms; provided that if you redistribute the NVIDIA Software, you must +retain the copyright notice of NVIDIA, this notice and the following +text and disclaimers in all such redistributions of the NVIDIA Software. +Neither the name, trademarks, service marks nor logos of NVIDIA +Corporation may be used to endorse or promote products derived from the +NVIDIA Software without specific prior written permission from NVIDIA. +Except as expressly stated in this notice, no other rights or licenses +express or implied, are granted by NVIDIA herein, including but not +limited to any patent rights that may be infringed by your derivative +works or by other works in which the NVIDIA Software may be +incorporated. No hardware is licensed hereunder. + +THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER +PRODUCTS. + +IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, +INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY +OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE +NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, +TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF +NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\****************************************************************************/ +// +// cpp.c +// + +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include +#include + +#include "PpContext.h" +#include "PpTokens.h" + +/* Don't use memory.c's replacements, as we clean up properly here */ +#undef malloc +#undef free + +int TPpContext::InitCPP() +{ + TPpContext::AtomTable* atable = &atomTable; + // Add various atoms needed by the CPP line scanner: + bindAtom = LookUpAddString(atable, "bind"); + constAtom = LookUpAddString(atable, "const"); + defaultAtom = LookUpAddString(atable, "default"); + defineAtom = LookUpAddString(atable, "define"); + definedAtom = LookUpAddString(atable, "defined"); + elifAtom = LookUpAddString(atable, "elif"); + elseAtom = LookUpAddString(atable, "else"); + endifAtom = LookUpAddString(atable, "endif"); + ifAtom = LookUpAddString(atable, "if"); + ifdefAtom = LookUpAddString(atable, "ifdef"); + ifndefAtom = LookUpAddString(atable, "ifndef"); + includeAtom = LookUpAddString(atable, "include"); + lineAtom = LookUpAddString(atable, "line"); + pragmaAtom = LookUpAddString(atable, "pragma"); + texunitAtom = LookUpAddString(atable, "texunit"); + undefAtom = LookUpAddString(atable, "undef"); + errorAtom = LookUpAddString(atable, "error"); + __LINE__Atom = LookUpAddString(atable, "__LINE__"); + __FILE__Atom = LookUpAddString(atable, "__FILE__"); + __VERSION__Atom = LookUpAddString(atable, "__VERSION__"); + versionAtom = LookUpAddString(atable, "version"); + coreAtom = LookUpAddString(atable, "core"); + compatibilityAtom = LookUpAddString(atable, "compatibility"); + esAtom = LookUpAddString(atable, "es"); + extensionAtom = LookUpAddString(atable, "extension"); + macros = NewScopeInPool(mem_CreatePool(0, 0)); + + return 1; +} // InitCPP + +int TPpContext::FreeCPP() +{ + if (macros) { + mem_FreePool(macros->pool); + macros = 0; + } + + return 1; +} + +int TPpContext::FinalCPP() +{ + if (ifdepth) + parseContext.error(parseContext.currentLoc, "missing #endif", "#if", ""); + return 1; +} + +int TPpContext::CPPdefine(TPpToken * yylvalpp) +{ + int token, name, args[maxMacroArgs], argc; + MacroSymbol mac; + Symbol *symb; + memset(&mac, 0, sizeof(mac)); + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != CPP_IDENTIFIER) { + parseContext.error(yylvalpp->loc, "must be followed by macro name", "#define", ""); + return token; + } + name = yylvalpp->atom; + token = currentInput->scan(this, currentInput, yylvalpp); + if (token == '(' && !yylvalpp->ival) { + // gather arguments + argc = 0; + do { + token = currentInput->scan(this, currentInput, yylvalpp); + if (argc == 0 && token == ')') + break; + if (token != CPP_IDENTIFIER) { + parseContext.error(yylvalpp->loc, "bad argument", "#define", ""); + + return token; + } + if (argc < maxMacroArgs) + args[argc++] = yylvalpp->atom; + token = currentInput->scan(this, currentInput, yylvalpp); + } while (token == ','); + if (token != ')') { + parseContext.error(yylvalpp->loc, "missing parenthesis", "#define", ""); + + return token; + } + mac.argc = argc; + mac.args = (int*)mem_Alloc(macros->pool, argc * sizeof(int)); + memcpy(mac.args, args, argc * sizeof(int)); + token = currentInput->scan(this, currentInput, yylvalpp); + } + mac.body = NewTokenStream(GetAtomString(&atomTable, name), macros->pool); + while (token != '\n') { + while (token == '\\') { + token = currentInput->scan(this, currentInput, yylvalpp); + if (token == '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + else + RecordToken(mac.body, '\\', yylvalpp); + } + RecordToken(mac.body, token, yylvalpp); + token = currentInput->scan(this, currentInput, yylvalpp); + }; + + symb = LookUpSymbol(macros, name); + if (symb) { + if (!symb->details.mac.undef) { + // already defined -- need to make sure they are identical + if (symb->details.mac.argc != mac.argc) + goto error; + for (argc=0; argc < mac.argc; argc++) + if (symb->details.mac.args[argc] != mac.args[argc]) + goto error; + RewindTokenStream(symb->details.mac.body); + RewindTokenStream(mac.body); + do { + int old_lval, old_token; + old_token = ReadToken(symb->details.mac.body, yylvalpp); + old_lval = yylvalpp->ival; + token = ReadToken(mac.body, yylvalpp); + if (token != old_token || yylvalpp->ival != old_lval) { +error: + parseContext.error(yylvalpp->loc, "Macro Redefined", "#define", GetStringOfAtom(&atomTable, name)); + break; + } + } while (token > 0); + } + //FreeMacro(&symb->details.mac); + } else { + symb = AddSymbol(&yylvalpp->loc, macros, name, MACRO_S); + } + symb->details.mac = mac; + + return '\n'; +} // CPPdefine + +int TPpContext::CPPundef(TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + Symbol *symb; + if (token == '\n') { + parseContext.error(yylvalpp->loc, "must be followed by macro name", "#undef", ""); + + return token; + } + if (token != CPP_IDENTIFIER) { + parseContext.error(yylvalpp->loc, "must be followed by macro name", "#undef", ""); + + return token; + } + + symb = LookUpSymbol(macros, yylvalpp->atom); + if (symb) { + symb->details.mac.undef = 1; + } + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != '\n') + parseContext.error(yylvalpp->loc, "can only be followed by a single macro name", "#undef", ""); + + return token; +} // CPPundef + +/* CPPelse -- skip forward to appropriate spot. This is actually used +** to skip to a #endif after seeing an #else, AND to skip to a #else, +** #elif, or #endif after a #if/#ifdef/#ifndef/#elif test was false +*/ + +int TPpContext::CPPelse(int matchelse, TPpToken * yylvalpp) +{ + int atom; + int depth = 0; + int token = currentInput->scan(this, currentInput, yylvalpp); + + while (token > 0) { + if (token != '#') { + while (token != '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + + token = currentInput->scan(this, currentInput, yylvalpp); + continue; + } + + if ((token = currentInput->scan(this, currentInput, yylvalpp)) != CPP_IDENTIFIER) + continue; + + atom = yylvalpp->atom; + if (atom == ifAtom || atom == ifdefAtom || atom == ifndefAtom) { + depth++; + ifdepth++; + elsetracker++; + } else if (atom == endifAtom) { + elsedepth[elsetracker] = 0; + --elsetracker; + if (depth == 0) { + // found the #endif we are looking for + if (ifdepth) + --ifdepth; + break; + } + --depth; + --ifdepth; + } else if (matchelse && depth == 0) { + if (atom == elseAtom ) { + // found the #else we are looking for + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != '\n') { + parseContext.warn(yylvalpp->loc, "#else", "unexpected tokens following #else directive - expected a newline", ""); + while (token != '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + } + break; + } else if (atom == elifAtom) { + /* we decrement ifdepth here, because CPPif will increment + * it and we really want to leave it alone */ + if (ifdepth) { + --ifdepth; + elsedepth[elsetracker] = 0; + --elsetracker; + } + + return CPPif (yylvalpp); + } + } else if ((atom == elseAtom) && (!ChkCorrectElseNesting())) + parseContext.error(yylvalpp->loc, "#else after #else", "#else", ""); + }; // end while + + return token; +} + +enum eval_prec { + MIN_PREC, + COND, LOGOR, LOGAND, OR, XOR, AND, EQUAL, RELATION, SHIFT, ADD, MUL, UNARY, + MAX_PREC +}; + +namespace { + + int op_logor(int a, int b) { return a || b; } + int op_logand(int a, int b) { return a && b; } + int op_or(int a, int b) { return a | b; } + int op_xor(int a, int b) { return a ^ b; } + int op_and(int a, int b) { return a & b; } + int op_eq(int a, int b) { return a == b; } + int op_ne(int a, int b) { return a != b; } + int op_ge(int a, int b) { return a >= b; } + int op_le(int a, int b) { return a <= b; } + int op_gt(int a, int b) { return a > b; } + int op_lt(int a, int b) { return a < b; } + int op_shl(int a, int b) { return a << b; } + int op_shr(int a, int b) { return a >> b; } + int op_add(int a, int b) { return a + b; } + int op_sub(int a, int b) { return a - b; } + int op_mul(int a, int b) { return a * b; } + int op_div(int a, int b) { return a / b; } + int op_mod(int a, int b) { return a % b; } + int op_pos(int a) { return a; } + int op_neg(int a) { return -a; } + int op_cmpl(int a) { return ~a; } + int op_not(int a) { return !a; } + +}; + +struct Tbinops { + int token, prec, (*op)(int, int); +} binop[] = { + { CPP_OR_OP, LOGOR, op_logor }, + { CPP_AND_OP, LOGAND, op_logand }, + { '|', OR, op_or }, + { '^', XOR, op_xor }, + { '&', AND, op_and }, + { CPP_EQ_OP, EQUAL, op_eq }, + { CPP_NE_OP, EQUAL, op_ne }, + { '>', RELATION, op_gt }, + { CPP_GE_OP, RELATION, op_ge }, + { '<', RELATION, op_lt }, + { CPP_LE_OP, RELATION, op_le }, + { CPP_LEFT_OP, SHIFT, op_shl }, + { CPP_RIGHT_OP, SHIFT, op_shr }, + { '+', ADD, op_add }, + { '-', ADD, op_sub }, + { '*', MUL, op_mul }, + { '/', MUL, op_div }, + { '%', MUL, op_mod }, +}; + +struct tunops { + int token, (*op)(int); +} unop[] = { + { '+', op_pos }, + { '-', op_neg }, + { '~', op_cmpl }, + { '!', op_not }, +}; + +#define ALEN(A) (sizeof(A)/sizeof(A[0])) + +int TPpContext::eval(int token, int prec, int *res, int *err, TPpToken * yylvalpp) +{ + int i, val; + Symbol *s; + + if (token == CPP_IDENTIFIER) { + if (yylvalpp->atom == definedAtom) { + bool needclose = 0; + token = currentInput->scan(this, currentInput, yylvalpp); + if (token == '(') { + needclose = true; + token = currentInput->scan(this, currentInput, yylvalpp); + } + if (token != CPP_IDENTIFIER) { + parseContext.error(yylvalpp->loc, "incorrect directive, expected identifier", "preprocessor", ""); + *err = 1; + *res = 0; + + return token; + } + *res = (s = LookUpSymbol(macros, yylvalpp->atom)) + ? !s->details.mac.undef : 0; + token = currentInput->scan(this, currentInput, yylvalpp); + if (needclose) { + if (token != ')') { + parseContext.error(yylvalpp->loc, "#else after #else", "", ""); + *err = 1; + *res = 0; + + return token; + } + token = currentInput->scan(this, currentInput, yylvalpp); + } + } else { + int macroReturn = MacroExpand(yylvalpp->atom, yylvalpp, 1); + if (macroReturn == 0) { + parseContext.error(yylvalpp->loc, "can't evaluate expression", "preprocessor", ""); + *err = 1; + *res = 0; + + return token; + } else { + if (macroReturn == -1) { + if (parseContext.profile == EEsProfile) { + if (parseContext.messages & EShMsgRelaxedErrors) + parseContext.warn(yylvalpp->loc, "undefined macro in expression not allowed in es profile", "preprocessor", ""); + else { + parseContext.error(yylvalpp->loc, "undefined macro in expression", "preprocessor", ""); + + *err = 1; + } + } + } + token = currentInput->scan(this, currentInput, yylvalpp); + + return eval(token, prec, res, err, yylvalpp); + } + } + } else if (token == CPP_INTCONSTANT) { + *res = yylvalpp->ival; + token = currentInput->scan(this, currentInput, yylvalpp); + } else if (token == '(') { + token = currentInput->scan(this, currentInput, yylvalpp); + token = eval(token, MIN_PREC, res, err, yylvalpp); + if (!*err) { + if (token != ')') { + parseContext.error(yylvalpp->loc, "expected ')'", "preprocessor", ""); + *err = 1; + *res = 0; + + return token; + } + token = currentInput->scan(this, currentInput, yylvalpp); + } + } else { + for (i = ALEN(unop) - 1; i >= 0; i--) { + if (unop[i].token == token) + break; + } + if (i >= 0) { + token = currentInput->scan(this, currentInput, yylvalpp); + token = eval(token, UNARY, res, err, yylvalpp); + *res = unop[i].op(*res); + } else { + parseContext.error(yylvalpp->loc, "", "bad expression", ""); + *err = 1; + *res = 0; + + return token; + } + } + while (!*err) { + if (token == ')' || token == '\n') + break; + for (i = ALEN(binop) - 1; i >= 0; i--) { + if (binop[i].token == token) + break; + } + if (i < 0 || binop[i].prec <= prec) + break; + val = *res; + token = currentInput->scan(this, currentInput, yylvalpp); + token = eval(token, binop[i].prec, res, err, yylvalpp); + *res = binop[i].op(val, *res); + } + + return token; +} // eval + +int TPpContext::CPPif (TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + int res = 0, err = 0; + elsetracker++; + if (! ifdepth++) + ifloc = yylvalpp->loc; + if (ifdepth > maxIfNesting) { + parseContext.error(yylvalpp->loc, "maximum nesting depth exceeded", "#if", ""); + return 0; + } + token = eval(token, MIN_PREC, &res, &err, yylvalpp); + if (token != '\n') { + parseContext.warn(yylvalpp->loc, "unexpected tokens following #if directive - expected a newline", "#if", ""); + while (token != '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + } + if (!res && !err) { + token = CPPelse(1, yylvalpp); + } + + return token; +} // CPPif + +int TPpContext::CPPifdef(int defined, TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + int name = yylvalpp->atom; + if (++ifdepth > maxIfNesting) { + parseContext.error(yylvalpp->loc, "maximum nesting depth exceededextension name not specified", "#ifdef", ""); + return 0; + } + elsetracker++; + if (token != CPP_IDENTIFIER) { + if (defined) + parseContext.error(yylvalpp->loc, "must be followed by macro name", "#ifdef", ""); + else + parseContext.error(yylvalpp->loc, "must be followed by macro name", "#ifndef", ""); + } else { + Symbol *s = LookUpSymbol(macros, name); + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != '\n') { + parseContext.error(yylvalpp->loc, "unexpected tokens following #ifdef directive - expected a newline", "#ifdef", ""); + while (token != '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + } + if (((s && !s->details.mac.undef) ? 1 : 0) != defined) + token = CPPelse(1, yylvalpp); + } + return token; +} // CPPifdef + +// Handle #line +int TPpContext::CPPline(TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + if (token == '\n') { + parseContext.error(yylvalpp->loc, "must by followed by an integral literal", "#line", ""); + return token; + } + else if (token == CPP_INTCONSTANT) { + parseContext.currentLoc.line = atoi(yylvalpp->name); + token = currentInput->scan(this, currentInput, yylvalpp); + + if (token == CPP_INTCONSTANT) { + parseContext.currentLoc.string = atoi(yylvalpp->name); + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != '\n') + parseContext.error(parseContext.currentLoc, "cannot be followed by more than two integral literals", "#line", ""); + } else if (token == '\n') + + return token; + else + parseContext.error(parseContext.currentLoc, "second argument can only be an integral literal", "#line", ""); + } else + parseContext.error(parseContext.currentLoc, "first argument can only be an integral literal", "#line", ""); + + return token; +} + +// Handle #error +int TPpContext::CPPerror(TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + std::string message; + TSourceLoc loc = yylvalpp->loc; + + while (token != '\n') { + if (token == CPP_INTCONSTANT || token == CPP_UINTCONSTANT || + token == CPP_FLOATCONSTANT || token == CPP_DOUBLECONSTANT) { + message.append(yylvalpp->name); + } else if (token == CPP_IDENTIFIER || token == CPP_STRCONSTANT) { + message.append(GetStringOfAtom(&atomTable, yylvalpp->atom)); + } else { + message.append(GetStringOfAtom(&atomTable, token)); + } + message.append(" "); + token = currentInput->scan(this, currentInput, yylvalpp); + } + //store this msg into the shader's information log..set the Compile Error flag!!!! + parseContext.error(loc, message.c_str(), "#error", ""); + + return '\n'; +} + +int TPpContext::CPPpragma(TPpToken * yylvalpp) +{ + char SrcStrName[2]; + char** allTokens; + int tokenCount = 0; + int maxTokenCount = 10; + const char* SrcStr; + int i; + + int token = currentInput->scan(this, currentInput, yylvalpp); + + if (token=='\n') { + parseContext.error(yylvalpp->loc, "must be followed by pragma arguments", "#pragma", ""); + return token; + } + + allTokens = (char**)malloc(sizeof(char*) * maxTokenCount); + + while (token != '\n') { + if (tokenCount >= maxTokenCount) { + maxTokenCount *= 2; + allTokens = (char**)realloc((char**)allTokens, sizeof(char*) * maxTokenCount); + } + switch (token) { + case CPP_IDENTIFIER: + SrcStr = GetAtomString(&atomTable, yylvalpp->atom); + allTokens[tokenCount] = (char*)malloc(strlen(SrcStr) + 1); + strcpy(allTokens[tokenCount++], SrcStr); + break; + case CPP_INTCONSTANT: + case CPP_UINTCONSTANT: + case CPP_FLOATCONSTANT: + case CPP_DOUBLECONSTANT: + SrcStr = yylvalpp->name; + allTokens[tokenCount] = (char*)malloc(strlen(SrcStr) + 1); + strcpy(allTokens[tokenCount++], SrcStr); + break; + case EOF: + parseContext.error(yylvalpp->loc, "directive must end with a newline", "#pragma", ""); + return token; + default: + SrcStrName[0] = token; + SrcStrName[1] = '\0'; + allTokens[tokenCount] = (char*)malloc(2); + strcpy(allTokens[tokenCount++], SrcStrName); + } + token = currentInput->scan(this, currentInput, yylvalpp); + } + + currentInput->ungetch(this, currentInput, token, yylvalpp); + parseContext.handlePragma((const char**)allTokens, tokenCount); + token = currentInput->scan(this, currentInput, yylvalpp); + + for (i = 0; i < tokenCount; ++i) { + free (allTokens[i]); + } + free (allTokens); + + return token; +} // CPPpragma + +// This is just for error checking: the version and profile are decided before preprocessing starts +int TPpContext::CPPversion(TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + + if (notAVersionToken) + parseContext.error(yylvalpp->loc, "must occur before any other statement in the program", "#version", ""); + + if (token == '\n') { + parseContext.error(yylvalpp->loc, "must be followed by version number", "#version", ""); + + return token; + } + + if (token != CPP_INTCONSTANT) + parseContext.error(yylvalpp->loc, "must be followed by version number", "#version", ""); + + yylvalpp->ival = atoi(yylvalpp->name); + + token = currentInput->scan(this, currentInput, yylvalpp); + + if (token == '\n') + return token; + else { + if (yylvalpp->atom != coreAtom && + yylvalpp->atom != compatibilityAtom && + yylvalpp->atom != esAtom) + parseContext.error(yylvalpp->loc, "bad profile name; use es, core, or compatibility", "#version", ""); + + token = currentInput->scan(this, currentInput, yylvalpp); + + if (token == '\n') + return token; + else + parseContext.error(yylvalpp->loc, "bad tokens following profile -- expected newline", "#version", ""); + } + + return token; +} // CPPversion + +int TPpContext::CPPextension(TPpToken * yylvalpp) +{ + + int token = currentInput->scan(this, currentInput, yylvalpp); + char extensionName[80]; + + if (token=='\n') { + parseContext.error(yylvalpp->loc, "extension name not specified", "#extension", ""); + return token; + } + + if (token != CPP_IDENTIFIER) + parseContext.error(yylvalpp->loc, "extension name expected", "#extension", ""); + + strcpy(extensionName, GetAtomString(&atomTable, yylvalpp->atom)); + + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != ':') { + parseContext.error(yylvalpp->loc, "':' missing after extension name", "#extension", ""); + return token; + } + + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != CPP_IDENTIFIER) { + parseContext.error(yylvalpp->loc, "behavior for extension not specified", "#extension", ""); + return token; + } + + parseContext.updateExtensionBehavior(extensionName, GetAtomString(&atomTable, yylvalpp->atom)); + + token = currentInput->scan(this, currentInput, yylvalpp); + if (token == '\n') + return token; + else + parseContext.error(yylvalpp->loc, "extra tokens -- expected newline", "#extension",""); + + return token; +} // CPPextension + +int TPpContext::readCPPline(TPpToken * yylvalpp) +{ + int token = currentInput->scan(this, currentInput, yylvalpp); + bool isVersion = false; + + if (token == CPP_IDENTIFIER) { + if (yylvalpp->atom == defineAtom) { + token = CPPdefine(yylvalpp); + } else if (yylvalpp->atom == elseAtom) { + if (ChkCorrectElseNesting()) { + if (! ifdepth) { + parseContext.error(yylvalpp->loc, "mismatched statements", "#else", ""); + } + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != '\n') { + parseContext.warn(yylvalpp->loc, "unexpected tokens following #else directive - expected a newline", "#else", ""); + while (token != '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + } + token = CPPelse(0, yylvalpp); + } else { + parseContext.error(yylvalpp->loc, "#else after a #else", "#else", ""); + ifdepth = 0; + notAVersionToken = true; + return 0; + } + } else if (yylvalpp->atom == elifAtom) { + if (! ifdepth) { + parseContext.error(yylvalpp->loc, "mismatched statements", "#elif", ""); + } + // this token is really a dont care, but we still need to eat the tokens + token = currentInput->scan(this, currentInput, yylvalpp); + while (token != '\n') + token = currentInput->scan(this, currentInput, yylvalpp); + token = CPPelse(0, yylvalpp); + } else if (yylvalpp->atom == endifAtom) { + elsedepth[elsetracker] = 0; + --elsetracker; + if (! ifdepth) + parseContext.error(yylvalpp->loc, "mismatched statements", "#endif", ""); + else + --ifdepth; + } else if (yylvalpp->atom == ifAtom) { + token = CPPif (yylvalpp); + } else if (yylvalpp->atom == ifdefAtom) { + token = CPPifdef(1, yylvalpp); + } else if (yylvalpp->atom == ifndefAtom) { + token = CPPifdef(0, yylvalpp); + } else if (yylvalpp->atom == lineAtom) { + token = CPPline(yylvalpp); + } else if (yylvalpp->atom == pragmaAtom) { + token = CPPpragma(yylvalpp); + } else if (yylvalpp->atom == undefAtom) { + token = CPPundef(yylvalpp); + } else if (yylvalpp->atom == errorAtom) { + token = CPPerror(yylvalpp); + } else if (yylvalpp->atom == versionAtom) { + token = CPPversion(yylvalpp); + isVersion = true; + } else if (yylvalpp->atom == extensionAtom) { + token = CPPextension(yylvalpp); + } else { + parseContext.error(yylvalpp->loc, "Invalid Directive", "#", GetStringOfAtom(&atomTable, yylvalpp->atom)); + } + } + while (token != '\n' && token != 0 && token != EOF) { + token = currentInput->scan(this, currentInput, yylvalpp); + } + + notAVersionToken = ! isVersion; + + return token; +} // readCPPline + +void TPpContext::FreeMacro(MacroSymbol *s) { + DeleteTokenStream(s->body); +} + +static int eof_scan(TPpContext*, TPpContext::InputSrc* in, TPpToken* yylvalpp) { return -1; } +static void noop(TPpContext*, TPpContext::InputSrc* in, int ch, TPpToken* yylvalpp) { } + +void TPpContext::PushEofSrc() +{ + InputSrc *in = (InputSrc*)malloc(sizeof(InputSrc)); + memset(in, 0, sizeof(InputSrc)); + in->scan = eof_scan; + in->getch = eof_scan; + in->ungetch = noop; + in->prev = currentInput; + currentInput = in; +} + +void TPpContext::PopEofSrc() +{ + if (currentInput->scan == eof_scan) { + InputSrc *in = currentInput; + currentInput = in->prev; + free(in); + } +} + +TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream *a, TPpToken * yylvalpp) +{ + int token; + TokenStream *n; + RewindTokenStream(a); + do { + token = ReadToken(a, yylvalpp); + if (token == CPP_IDENTIFIER && LookUpSymbol(macros, yylvalpp->atom)) + break; + } while (token > 0); + if (token <= 0) return a; + n = NewTokenStream("macro arg", 0); + PushEofSrc(); + ReadFromTokenStream(a, 0, 0); + while ((token = currentInput->scan(this, currentInput, yylvalpp)) > 0) { + if (token == CPP_IDENTIFIER && MacroExpand(yylvalpp->atom, yylvalpp, 0) == 1) + continue; + RecordToken(n, token, yylvalpp); + } + PopEofSrc(); + DeleteTokenStream(a); + return n; +} // PrescanMacroArg + +// +// These are called through function pointers +// + +/* macro_scan --- +** return the next token for a macro expansion, handling macro args +*/ +int TPpContext::macro_scan(TPpContext* pp, TPpContext::InputSrc* inInput, TPpToken* yylvalpp) +{ + TPpContext::MacroInputSrc* in = (TPpContext::MacroInputSrc*)inInput; + + int i; + int token = pp->ReadToken(in->mac->body, yylvalpp); + if (token == CPP_IDENTIFIER) { + for (i = in->mac->argc-1; i>=0; i--) + if (in->mac->args[i] == yylvalpp->atom) + break; + if (i >= 0) { + pp->ReadFromTokenStream(in->args[i], yylvalpp->atom, 0); + + return pp->currentInput->scan(pp, pp->currentInput, yylvalpp); + } + } + + if (token > 0) + return token; + + in->mac->busy = 0; + pp->currentInput = in->base.prev; + if (in->args) { + for (i=in->mac->argc-1; i>=0; i--) + pp->DeleteTokenStream(in->args[i]); + free(in->args); + } + free(in); + + return pp->currentInput->scan(pp, pp->currentInput, yylvalpp); +} // macro_scan + +// return a zero, for scanning a macro that was never defined +int TPpContext::zero_scan(TPpContext* pp, InputSrc *inInput, TPpToken* yylvalpp) +{ + MacroInputSrc* in = (MacroInputSrc*)inInput; + + strcpy(yylvalpp->name, "0"); + yylvalpp->ival = 0; + + // pop input + pp->currentInput = in->base.prev; + free(in); + + return CPP_INTCONSTANT; +} + +/* MacroExpand +** Check an identifier (atom) to see if it is a macro that should be expanded. +** If it is, push an InputSrc that will produce the appropriate expansion +** and return 1. +** If it is, but undefined, it should expand to 0, push an InputSrc that will +** expand to 0 and return -1. +** Otherwise, return 0. +*/ +int TPpContext::MacroExpand(int atom, TPpToken* yylvalpp, int expandUndef) +{ + Symbol *sym = LookUpSymbol(macros, atom); + MacroInputSrc *in; + int i, j, token; + int depth = 0; + + if (atom == __LINE__Atom) { + yylvalpp->ival = parseContext.currentLoc.line; + sprintf(yylvalpp->name, "%d", yylvalpp->ival); + UngetToken(CPP_INTCONSTANT, yylvalpp); + + return 1; + } + + if (atom == __FILE__Atom) { + yylvalpp->ival = parseContext.currentLoc.string; + sprintf(yylvalpp->name, "%d", yylvalpp->ival); + UngetToken(CPP_INTCONSTANT, yylvalpp); + + return 1; + } + + if (atom == __VERSION__Atom) { + yylvalpp->ival = parseContext.version; + sprintf(yylvalpp->name, "%d", yylvalpp->ival); + UngetToken(CPP_INTCONSTANT, yylvalpp); + + return 1; + } + + // no recursive expansions + if (sym && sym->details.mac.busy) + return 0; + + // not expanding of undefined symbols + if ((! sym || sym->details.mac.undef) && ! expandUndef) + return 0; + + in = (MacroInputSrc*)malloc(sizeof(*in)); + memset(in, 0, sizeof(*in)); + in->base.line = currentInput->line; + in->base.name = currentInput->name; + + if ((! sym || sym->details.mac.undef) && expandUndef) { + // push input + in->base.scan = zero_scan; + in->base.prev = currentInput; + currentInput = &in->base; + + return -1; + } + + in->base.scan = macro_scan; + in->mac = &sym->details.mac; + if (sym->details.mac.args) { + token = currentInput->scan(this, currentInput, yylvalpp); + if (token != '(') { + UngetToken(token, yylvalpp); + yylvalpp->atom = atom; + + return 0; + } + in->args = (TokenStream**)malloc(in->mac->argc * sizeof(TokenStream *)); + for (i = 0; i < in->mac->argc; i++) + in->args[i] = NewTokenStream("macro arg", 0); + i = 0; + j = 0; + do { + depth = 0; + while (1) { + token = currentInput->scan(this, currentInput, yylvalpp); + if (token <= 0) { + parseContext.error(yylvalpp->loc, "EOF in macro", "preprocessor", GetStringOfAtom(&atomTable, atom)); + + return 1; + } + if ((in->mac->argc==0) && (token!=')')) break; + if (depth == 0 && (token == ',' || token == ')')) break; + if (token == '(') depth++; + if (token == ')') depth--; + RecordToken(in->args[i], token, yylvalpp); + j=1; + } + if (token == ')') { + if ((in->mac->argc==1) &&j==0) + break; + i++; + break; + } + i++; + } while (i < in->mac->argc); + + if (i < in->mac->argc) + parseContext.error(yylvalpp->loc, "Too few args in Macro", "preprocessor", GetStringOfAtom(&atomTable, atom)); + else if (token != ')') { + depth=0; + while (token >= 0 && (depth > 0 || token != ')')) { + if (token == ')') + depth--; + token = currentInput->scan(this, currentInput, yylvalpp); + if (token == '(') + depth++; + } + + if (token <= 0) { + parseContext.error(yylvalpp->loc, "EOF in macro", "preprocessor", GetStringOfAtom(&atomTable, atom)); + + return 1; + } + parseContext.error(yylvalpp->loc, "Too many args in Macro", "preprocessor", GetStringOfAtom(&atomTable, atom)); + } + for (i = 0; imac->argc; i++) { + in->args[i] = PrescanMacroArg(in->args[i], yylvalpp); + } + } +#if 0 + printf(" <%s:%d>found macro %s\n", GetAtomString(atable, loc.file), + loc.line, GetAtomString(atable, atom)); + for (i = 0; imac->argc; i++) { + printf("\targ %s = '", GetAtomString(atable, in->mac->args[i])); + DumpTokenStream(stdout, in->args[i]); + printf("'\n"); + } +#endif + /*retain the input source*/ + in->base.prev = currentInput; + sym->details.mac.busy = 1; + RewindTokenStream(sym->details.mac.body); + currentInput = &in->base; + + return 1; +} // MacroExpand + +int TPpContext::ChkCorrectElseNesting() +{ + if (elsedepth[elsetracker] == 0) { + elsedepth[elsetracker] = 1; + + return 1; + } + + return 0; +} diff --git a/glslang/MachineIndependent/preprocessor/atom.c b/glslang/MachineIndependent/preprocessor/PpAtom.cpp similarity index 70% rename from glslang/MachineIndependent/preprocessor/atom.c rename to glslang/MachineIndependent/preprocessor/PpAtom.cpp index e473e78f..379f25cb 100644 --- a/glslang/MachineIndependent/preprocessor/atom.c +++ b/glslang/MachineIndependent/preprocessor/PpAtom.cpp @@ -1,5 +1,6 @@ // //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. //All rights reserved. // //Redistribution and use in source and binary forms, with or without @@ -86,7 +87,8 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include "slglobals.h" +#include "PpContext.h" +#include "PpTokens.h" #undef malloc #undef realloc @@ -129,18 +131,12 @@ static const struct { #define INIT_STRING_TABLE_SIZE 16384 -typedef struct StringTable_Rec { - char *strings; - int nextFree; - int size; -} StringTable; - /* - * InitStringTable() - Initialize the string table. - * - */ +* InitStringTable() - Initialize the string table. +* +*/ -static int InitStringTable(StringTable *stable) +int InitStringTable(TPpContext::StringTable *stable) { stable->strings = (char *) malloc(INIT_STRING_TABLE_SIZE); if (!stable->strings) @@ -152,11 +148,11 @@ static int InitStringTable(StringTable *stable) } // InitStringTable /* - * FreeStringTable() - Free the string table. - * - */ +* FreeStringTable() - Free the string table. +* +*/ -static void FreeStringTable(StringTable *stable) +void FreeStringTable(TPpContext::StringTable *stable) { if (stable->strings) free(stable->strings); @@ -166,9 +162,9 @@ static void FreeStringTable(StringTable *stable) } // FreeStringTable /* - * HashString() - Hash a string with the base hash function. - * - */ +* HashString() - Hash a string with the base hash function. +* +*/ static int HashString(const char *s) { @@ -182,9 +178,9 @@ static int HashString(const char *s) } // HashString /* - * HashString2() - Hash a string with the incrimenting hash function. - * - */ +* HashString2() - Hash a string with the incrimenting hash function. +* +*/ static int HashString2(const char *s) { @@ -198,11 +194,11 @@ static int HashString2(const char *s) } // HashString2 /* - * AddString() - Add a string to a string table. Return it's offset. - * - */ +* AddString() - Add a string to a string table. Return it's offset. +* +*/ -static int AddString(StringTable *stable, const char *s) +static int AddString(TPpContext::StringTable *stable, const char *s) { int len, loc; char *str; @@ -226,31 +222,18 @@ static int AddString(StringTable *stable, const char *s) /////////////////////////////////////////////////////////////////////////////////////////////// #define INIT_HASH_TABLE_SIZE 2047 -#define HASH_TABLE_MAX_COLLISIONS 3 - -typedef struct HashEntry_Rec { - int index; // String table offset of string representation - int value; // Atom (symbol) value -} HashEntry; - -typedef struct HashTable_Rec { - HashEntry *entry; - int size; - int entries; - int counts[HASH_TABLE_MAX_COLLISIONS + 1]; -} HashTable; /* - * InitHashTable() - Initialize the hash table. - * - */ +* InitHashTable() - Initialize the hash table. +* +*/ -static int InitHashTable(HashTable *htable, int fsize) +static int InitHashTable(TPpContext::HashTable *htable, int fsize) { int ii; - htable->entry = (HashEntry *) malloc(sizeof(HashEntry)*fsize); - if (!htable->entry) + htable->entry = (TPpContext::HashEntry *) malloc(sizeof(TPpContext::HashEntry)*fsize); + if (! htable->entry) return 0; htable->size = fsize; for (ii = 0; ii < fsize; ii++) { @@ -258,17 +241,17 @@ static int InitHashTable(HashTable *htable, int fsize) htable->entry[ii].value = 0; } htable->entries = 0; - for (ii = 0; ii <= HASH_TABLE_MAX_COLLISIONS; ii++) + for (ii = 0; ii <= TPpContext::hashTableMaxCollisions; ii++) htable->counts[ii] = 0; return 1; } // InitHashTable /* - * FreeHashTable() - Free the hash table. - * - */ +* FreeHashTable() - Free the hash table. +* +*/ -static void FreeHashTable(HashTable *htable) +static void FreeHashTable(TPpContext::HashTable *htable) { if (htable->entry) free(htable->entry); @@ -278,11 +261,11 @@ static void FreeHashTable(HashTable *htable) } // FreeHashTable /* - * Empty() - See if a hash table entry is empty. - * - */ +* Empty() - See if a hash table entry is empty. +* +*/ -static int Empty(HashTable *htable, int hashloc) +static int Empty(TPpContext::HashTable *htable, int hashloc) { assert(hashloc >= 0 && hashloc < htable->size); if (htable->entry[hashloc].index == 0) { @@ -293,11 +276,11 @@ static int Empty(HashTable *htable, int hashloc) } // Empty /* - * Match() - See if a hash table entry is matches a string. - * - */ +* Match() - See if a hash table entry is matches a string. +* +*/ -static int Match(HashTable *htable, StringTable *stable, const char *s, int hashloc) +static int Match(TPpContext::HashTable *htable, TPpContext::StringTable *stable, const char *s, int hashloc) { int strloc; @@ -315,34 +298,12 @@ static int Match(HashTable *htable, StringTable *stable, const char *s, int hash #define INIT_ATOM_TABLE_SIZE 1024 - -struct AtomTable_Rec { - StringTable stable; // String table. - HashTable htable; // Hashes string to atom number and token value. Multiple strings can - // have the same token value but each unique string is a unique atom. - int *amap; // Maps atom value to offset in string table. Atoms all map to unique - // strings except for some undefined values in the lower, fixed part - // of the atom table that map to "". The lowest 256 atoms - // correspond to single character ASCII values except for alphanumeric - // characters and '_', which can be other tokens. Next come the - // language tokens with their atom values equal to the token value. - // Then come predefined atoms, followed by user specified identifiers. - int *arev; // Reversed atom for symbol table use. - int nextFree; - int size; -}; - -static AtomTable latable = { { 0 } }; -AtomTable *atable = &latable; - -static int AddAtomFixed(AtomTable *atable, const char *s, int atom); - /* - * GrowAtomTable() - Grow the atom table to at least "size" if it's smaller. - * - */ +* GrowAtomTable() - Grow the atom table to at least "size" if it's smaller. +* +*/ -static int GrowAtomTable(AtomTable *atable, int size) +int GrowAtomTable(TPpContext::AtomTable *atable, int size) { int *newmap, *newrev; @@ -373,9 +334,9 @@ static int GrowAtomTable(AtomTable *atable, int size) } // GrowAtomTable /* - * lReverse() - Reverse the bottom 20 bits of a 32 bit int. - * - */ +* lReverse() - Reverse the bottom 20 bits of a 32 bit int. +* +*/ static int lReverse(int fval) { @@ -398,11 +359,11 @@ static int lReverse(int fval) } // lReverse /* - * AllocateAtom() - Allocate a new atom. Associated with the "undefined" value of -1. - * - */ +* AllocateAtom() - Allocate a new atom. Associated with the "undefined" value of -1. +* +*/ -static int AllocateAtom(AtomTable *atable) +int AllocateAtom(TPpContext::AtomTable *atable) { if (atable->nextFree >= atable->size) GrowAtomTable(atable, atable->nextFree*2); @@ -413,26 +374,26 @@ static int AllocateAtom(AtomTable *atable) } // AllocateAtom /* - * SetAtomValue() - Allocate a new atom associated with "hashindex". - * - */ +* SetAtomValue() - Allocate a new atom associated with "hashindex". +* +*/ -static void SetAtomValue(AtomTable *atable, int atomnumber, int hashindex) +void SetAtomValue(TPpContext::AtomTable *atable, int atomnumber, int hashindex) { atable->amap[atomnumber] = atable->htable.entry[hashindex].index; atable->htable.entry[hashindex].value = atomnumber; } // SetAtomValue /* - * FindHashLoc() - Find the hash location for this string. Return -1 it hash table is full. - * - */ +* FindHashLoc() - Find the hash location for this string. Return -1 it hash table is full. +* +*/ -static int FindHashLoc(AtomTable *atable, const char *s) +int FindHashLoc(TPpContext::AtomTable *atable, const char *s) { int hashloc, hashdelta, count; int FoundEmptySlot = 0; - int collision[HASH_TABLE_MAX_COLLISIONS + 1]; + int collision[TPpContext::hashTableMaxCollisions + 1]; hashloc = HashString(s) % atable->htable.size; if (!Empty(&atable->htable, hashloc)) { @@ -441,7 +402,7 @@ static int FindHashLoc(AtomTable *atable, const char *s) collision[0] = hashloc; hashdelta = HashString2(s); count = 0; - while (count < HASH_TABLE_MAX_COLLISIONS) { + while (count < TPpContext::hashTableMaxCollisions) { hashloc = ((hashloc + hashdelta) & 0x7fffffff) % atable->htable.size; if (!Empty(&atable->htable, hashloc)) { if (Match(&atable->htable, &atable->stable, s, hashloc)) { @@ -455,22 +416,20 @@ static int FindHashLoc(AtomTable *atable, const char *s) collision[count] = hashloc; } - if (!FoundEmptySlot) { - if (cpp->options.DumpAtomTable) { + if (! FoundEmptySlot) { +#ifdef DUMP_TABLE + { int ii; char str[200]; - sprintf(str, "*** Hash failed with more than %d collisions. Must increase hash table size. ***", - HASH_TABLE_MAX_COLLISIONS); - ShPpErrorToInfoLog(str); - - sprintf(str, "*** New string \"%s\", hash=%04x, delta=%04x", s, collision[0], hashdelta); - ShPpErrorToInfoLog(str); - for (ii = 0; ii <= HASH_TABLE_MAX_COLLISIONS; ii++) { - sprintf(str, "*** Collides on try %d at hash entry %04x with \"%s\"", - ii + 1, collision[ii], GetAtomString(atable, atable->htable.entry[collision[ii]].value)); - ShPpErrorToInfoLog(str); + printf(str, "*** Hash failed with more than %d collisions. Must increase hash table size. ***", + hashTableMaxCollisions); + printf(str, "*** New string \"%s\", hash=%04x, delta=%04x", s, collision[0], hashdelta); + for (ii = 0; ii <= hashTableMaxCollisions; ii++) { + printf(str, "*** Collides on try %d at hash entry %04x with \"%s\"", + ii + 1, collision[ii], GetAtomString(atable, atable->htable.entry[collision[ii]].value)); } } +#endif return -1; } else { atable->htable.counts[count]++; @@ -480,11 +439,11 @@ static int FindHashLoc(AtomTable *atable, const char *s) } // FindHashLoc /* - * IncreaseHashTableSize() - * - */ +* IncreaseHashTableSize() +* +*/ -static int IncreaseHashTableSize(AtomTable *atable) +int TPpContext::IncreaseHashTableSize(AtomTable *atable) { int ii, strloc, oldhashloc, value, size; AtomTable oldtable; @@ -494,7 +453,7 @@ static int IncreaseHashTableSize(AtomTable *atable) oldtable = *atable; size = oldtable.htable.size*2 + 1; - if (!InitAtomTable(atable, size)) + if (! InitAtomTable(atable, size)) return 0; // Add all the existing values to the new atom table preserving their atom values: @@ -508,15 +467,16 @@ static int IncreaseHashTableSize(AtomTable *atable) AddAtomFixed(atable, s, value); } FreeAtomTable(&oldtable); + return 1; } // IncreaseHashTableSize /* - * LookUpAddStringHash() - Lookup a string in the hash table. If it's not there, add it and - * initialize the atom value in the hash table to 0. Return the hash table index. - */ +* LookUpAddStringHash() - Lookup a string in the hash table. If it's not there, add it and +* initialize the atom value in the hash table to 0. Return the hash table index. +*/ -static int LookUpAddStringHash(AtomTable *atable, const char *s) +int TPpContext::LookUpAddStringHash(AtomTable *atable, const char *s) { int hashloc, strloc; @@ -537,12 +497,12 @@ static int LookUpAddStringHash(AtomTable *atable, const char *s) } // LookUpAddStringHash /* - * LookUpAddString() - Lookup a string in the hash table. If it's not there, add it and - * initialize the atom value in the hash table to the next atom number. - * Return the atom value of string. - */ +* LookUpAddString() - Lookup a string in the hash table. If it's not there, add it and +* initialize the atom value in the hash table to the next atom number. +* Return the atom value of string. +*/ -int LookUpAddString(AtomTable *atable, const char *s) +int TPpContext::LookUpAddString(AtomTable *atable, const char *s) { int hashindex, atom; @@ -556,11 +516,11 @@ int LookUpAddString(AtomTable *atable, const char *s) } // LookUpAddString /* - * GetAtomString() - * - */ +* GetAtomString() +* +*/ -const char *GetAtomString(AtomTable *atable, int atom) +const char *TPpContext::GetAtomString(AtomTable *atable, int atom) { int soffset; @@ -585,38 +545,35 @@ const char *GetAtomString(AtomTable *atable, int atom) } // GetAtomString /* - * GetReversedAtom() - * - */ +* GetReversedAtom() +* +*/ -int GetReversedAtom(AtomTable *atable, int atom) +int TPpContext::GetReversedAtom(TPpContext::AtomTable *atable, int atom) { - if (atom > 0 && atom < atable->nextFree) { + if (atom > 0 && atom < atable->nextFree) return atable->arev[atom]; - } else { + else return 0; - } } // GetReversedAtom /* - * AddAtom() - Add a string to the atom, hash and string tables if it isn't already there. - * Return it's atom index. - */ +* AddAtom() - Add a string to the atom, hash and string tables if it isn't already there. +* Return it's atom index. +*/ -int AddAtom(AtomTable *atable, const char *s) +int TPpContext::AddAtom(TPpContext::AtomTable *atable, const char *s) { - int atom; - - atom = LookUpAddString(atable, s); + int atom = LookUpAddString(atable, s); return atom; } // AddAtom /* - * AddAtomFixed() - Add an atom to the hash and string tables if it isn't already there. - * Assign it the atom value of "atom". - */ +* AddAtomFixed() - Add an atom to the hash and string tables if it isn't already there. +* Assign it the atom value of "atom". +*/ -static int AddAtomFixed(AtomTable *atable, const char *s, int atom) +int TPpContext::AddAtomFixed(AtomTable *atable, const char *s, int atom) { int hashindex, lsize; @@ -639,23 +596,24 @@ static int AddAtomFixed(AtomTable *atable, const char *s, int atom) } // AddAtomFixed /* - * InitAtomTable() - Initialize the atom table. - * - */ +* InitAtomTable() - Initialize the atom table. +* +*/ -int InitAtomTable(AtomTable *atable, int htsize) +int TPpContext::InitAtomTable(AtomTable *atable, int htsize) { int ii; htsize = htsize <= 0 ? INIT_HASH_TABLE_SIZE : htsize; - if (!InitStringTable(&atable->stable)) + if (! InitStringTable(&atable->stable)) return 0; - if (!InitHashTable(&atable->htable, htsize)) + if (! InitHashTable(&atable->htable, htsize)) return 0; atable->nextFree = 0; atable->amap = NULL; atable->size = 0; + atable->arev = 0; GrowAtomTable(atable, INIT_ATOM_TABLE_SIZE); if (!atable->amap) return 0; @@ -669,7 +627,7 @@ int InitAtomTable(AtomTable *atable, int htsize) // Add single character tokens to the atom table: { - const char *s = "~!%^&*()-+=|,.<>/?;:[]{}#"; + const char *s = "~!%^&*()-+=|,.<>/?;:[]{}#"; char t[2]; t[1] = '\0'; @@ -685,11 +643,6 @@ int InitAtomTable(AtomTable *atable, int htsize) for (ii = 0; ii < sizeof(tokens)/sizeof(tokens[0]); ii++) AddAtomFixed(atable, tokens[ii].str, tokens[ii].val); - // Add error symbol if running in error mode: - - if (cpp->options.ErrorMode) - AddAtomFixed(atable, "error", CPP_ERROR_SY); - AddAtom(atable, "<*** end fixed atoms ***>"); return 1; @@ -700,48 +653,45 @@ int InitAtomTable(AtomTable *atable, int htsize) /////////////////////////////////////////////////////////////////////////////////////////////// /* - * PrintAtomTable() - * - */ +* PrintAtomTable() +* +*/ -void PrintAtomTable(AtomTable *atable) +void TPpContext::PrintAtomTable(AtomTable *atable) { int ii; char str[200]; for (ii = 0; ii < atable->nextFree; ii++) { - sprintf(str, "%d: \"%s\"", ii, &atable->stable.strings[atable->amap[ii]]); - ShPpDebugLogMsg(str); + printf(str, "%d: \"%s\"", ii, &atable->stable.strings[atable->amap[ii]]); } - sprintf(str, "Hash table: size=%d, entries=%d, collisions=", - atable->htable.size, atable->htable.entries); - ShPpDebugLogMsg(str); - for (ii = 0; ii < HASH_TABLE_MAX_COLLISIONS; ii++) { - sprintf(str, " %d", atable->htable.counts[ii]); - ShPpDebugLogMsg(str); + printf(str, "Hash table: size=%d, entries=%d, collisions=", + atable->htable.size, atable->htable.entries); + for (ii = 0; ii < hashTableMaxCollisions; ii++) { + printf(str, " %d", atable->htable.counts[ii]); } } // PrintAtomTable /* - * GetStringOfAtom() - * - */ +* GetStringOfAtom() +* +*/ -char* GetStringOfAtom(AtomTable *atable, int atom) +char* TPpContext::GetStringOfAtom(AtomTable *atable, int atom) { - char* chr_str; - chr_str=&atable->stable.strings[atable->amap[atom]]; - return chr_str; + char* chr_str; + chr_str=&atable->stable.strings[atable->amap[atom]]; + return chr_str; } // GetStringOfAtom /* - * FreeAtomTable() - Free the atom table and associated memory - * - */ +* FreeAtomTable() - Free the atom table and associated memory +* +*/ -void FreeAtomTable(AtomTable *atable) +void TPpContext::FreeAtomTable(AtomTable *atable) { FreeStringTable(&atable->stable); FreeHashTable(&atable->htable); diff --git a/glslang/MachineIndependent/preprocessor/scanner.h b/glslang/MachineIndependent/preprocessor/PpContext.cpp similarity index 77% rename from glslang/MachineIndependent/preprocessor/scanner.h rename to glslang/MachineIndependent/preprocessor/PpContext.cpp index 86d30084..1021d63a 100644 --- a/glslang/MachineIndependent/preprocessor/scanner.h +++ b/glslang/MachineIndependent/preprocessor/PpContext.cpp @@ -1,5 +1,6 @@ // //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. //All rights reserved. // //Redistribution and use in source and binary forms, with or without @@ -74,36 +75,52 @@ NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \****************************************************************************/ -// -// scanner.h -// -#if !defined(__SCANNER_H) -#define __SCANNER_H 1 +#include +#include -#include "preprocess.h" -#include "parser.h" +#include "PpContext.h" -// Not really atom table stuff but needed first... -#ifdef __cplusplus -extern "C" { -#endif +TPpContext::TPpContext(TParseContext& pc) : + parseContext(pc), preamble(0), strings(0), notAVersionToken(false), + ScopeList(0), CurrentScope(0), GlobalScope(0) +{ + InitAtomTable(&atomTable, 0); + InitScanner(this); -int yyparse (void); - -int InitScanner(CPPStruct *cpp); // Intialise the cpp scanner. -int ScanFromString(char *); // Start scanning the input from the string mentioned. -int check_EOF(int); // check if we hit a EOF abruptly -void ShPpErrorToInfoLog(const char *); // sticking the msg,line into the Shader's.Info.log -void SetLineNumber(int); -void SetStringNumber(int); -void IncLineNumber(void); -void DecLineNumber(void); -int FreeScanner(void); // Free the cpp scanner - -#ifdef __cplusplus + ifdepth = 0; + for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++) + elsedepth[elsetracker] = 0; + elsetracker = 0; } -#endif -#endif // !(defined(__SCANNER_H) +TPpContext::~TPpContext() +{ + delete [] preamble; + FreeAtomTable(&atomTable); + FreeScanner(); +} +void TPpContext::setPreamble(const char* p, int l) +{ + if (p && l > 0) { + // preAmble could be a hard-coded string; make writable copy + // TODO: efficiency PP: make it not need writable strings + preambleLength = l; + preamble = new char[preambleLength + 1]; + memcpy(preamble, p, preambleLength + 1); // TODO: PP: assuming nul-terminated strings + ScanFromString(preamble); + currentString = -1; + } +} + +void TPpContext::setShaderStrings(char* s[], int l[], int n) +{ + strings = s; + lengths = l; + numStrings = n; + if (! preamble) { + ScanFromString(strings[0]); + currentString = 0; + } +} diff --git a/glslang/MachineIndependent/preprocessor/PpContext.h b/glslang/MachineIndependent/preprocessor/PpContext.h new file mode 100644 index 00000000..7f070200 --- /dev/null +++ b/glslang/MachineIndependent/preprocessor/PpContext.h @@ -0,0 +1,389 @@ +// +//Copyright (C) 2013 LunarG, Inc. +//All rights reserved. +// +//Redistribution and use in source and binary forms, with or without +//modification, are permitted provided that the following conditions +//are met: +// +// Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// +// Neither the name of 3Dlabs Inc. Ltd. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//POSSIBILITY OF SUCH DAMAGE. +// +/****************************************************************************\ +Copyright (c) 2002, NVIDIA Corporation. + +NVIDIA Corporation("NVIDIA") supplies this software to you in +consideration of your agreement to the following terms, and your use, +installation, modification or redistribution of this NVIDIA software +constitutes acceptance of these terms. If you do not agree with these +terms, please do not use, install, modify or redistribute this NVIDIA +software. + +In consideration of your agreement to abide by the following terms, and +subject to these terms, NVIDIA grants you a personal, non-exclusive +license, under NVIDIA's copyrights in this original NVIDIA software (the +"NVIDIA Software"), to use, reproduce, modify and redistribute the +NVIDIA Software, with or without modifications, in source and/or binary +forms; provided that if you redistribute the NVIDIA Software, you must +retain the copyright notice of NVIDIA, this notice and the following +text and disclaimers in all such redistributions of the NVIDIA Software. +Neither the name, trademarks, service marks nor logos of NVIDIA +Corporation may be used to endorse or promote products derived from the +NVIDIA Software without specific prior written permission from NVIDIA. +Except as expressly stated in this notice, no other rights or licenses +express or implied, are granted by NVIDIA herein, including but not +limited to any patent rights that may be infringed by your derivative +works or by other works in which the NVIDIA Software may be +incorporated. No hardware is licensed hereunder. + +THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER +PRODUCTS. + +IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, +INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY +OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE +NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, +TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF +NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\****************************************************************************/ + +#ifndef PPCONTEXT_H +#define PPCONTEXT_H + +#include "../ParseHelper.h" + +class TPpToken { +public: + static const int maxTokenLength = 1024; + + TSourceLoc loc; + int ppToken; + int ival; + double dval; + int atom; + char name[maxTokenLength+1]; +}; + +// This class is the result of turning a huge pile of C code communicating through globals +// into a class. This was done to allowing instancing to attain thread safety. +// Don't expect too much in terms of OO design. +class TPpContext { +public: + TPpContext(TParseContext&); + virtual ~TPpContext(); + + void setPreamble(const char* preamble, int length); + void setShaderStrings(char* strings[], int lengths[], int numStrings); + + const char* tokenize(TPpToken* yylvalpp); + + struct InputSrc { + struct InputSrc *prev; + int (*scan)(TPpContext*, struct InputSrc *, TPpToken *); + int (*getch)(TPpContext*, struct InputSrc *, TPpToken *); + void (*ungetch)(TPpContext*, struct InputSrc *, int, TPpToken *); + int name; /* atom */ + int line; + }; + + struct TokenBlock { + TokenBlock *next; + int current; + int count; + int max; + unsigned char *data; + }; + + struct TokenStream { + TokenStream *next; + char *name; + TokenBlock *head; + TokenBlock *current; + }; + + struct MemoryPool { + struct chunk *next; + uintptr_t free, end; + size_t chunksize; + uintptr_t alignmask; + struct cleanup *cleanup; + }; + + // + // From PpAtom.cpp + // + struct StringTable { + char *strings; + int nextFree; + int size; + }; + typedef struct HashEntry_Rec { + int index; // String table offset of string representation + int value; // Atom (symbol) value + } HashEntry; + + static const int hashTableMaxCollisions = 3; + + typedef struct HashTable_Rec { + HashEntry *entry; + int size; + int entries; + int counts[hashTableMaxCollisions + 1]; + } HashTable; + struct AtomTable { + StringTable stable; // String table. + HashTable htable; // Hashes string to atom number and token value. Multiple strings can + // have the same token value but each unique string is a unique atom. + int *amap; // Maps atom value to offset in string table. Atoms all map to unique + // strings except for some undefined values in the lower, fixed part + // of the atom table that map to "". The lowest 256 atoms + // correspond to single character ASCII values except for alphanumeric + // characters and '_', which can be other tokens. Next come the + // language tokens with their atom values equal to the token value. + // Then come predefined atoms, followed by user specified identifiers. + int *arev; // Reversed atom for symbol table use. + int nextFree; + int size; + }; + + struct MacroSymbol { + int argc; + int *args; + TokenStream *body; + unsigned busy:1; + unsigned undef:1; + }; + + typedef enum symbolkind { + MACRO_S + } symbolkind; + + struct Symbol { + Symbol *left, *right; + Symbol *next; + int name; // Name atom + TSourceLoc loc; + symbolkind kind; + union { + MacroSymbol mac; + } details; + }; + + typedef struct SymbolList { + struct SymbolList_Rec *next; + Symbol *symb; + }; + + struct Scope { + Scope *next, *prev; // doubly-linked list of all scopes + Scope *parent; + Scope *funScope; // Points to base scope of enclosing function + MemoryPool *pool; // pool used for allocation in this scope + Symbol *symbols; + + int level; // 0 = super globals, 1 = globals, etc. + + // Only used at global scope (level 1): + SymbolList *programs; // List of programs for this compilation. + }; + +protected: + char* preamble; // string to parse, all before line 1 of string 0, it is 0 if no preamble + int preambleLength; + char** strings; // official strings of shader, starting a string 0 line 1 + int* lengths; + int numStrings; // how many official strings there are + int currentString; // which string we're currently parsing (-1 for preamble) + + // Scanner data: + int mostRecentToken; // Most recent token seen by the scanner + int previous_token; + bool notAVersionToken; // used to make sure that #version is the first token seen in the file, if present + TParseContext& parseContext; + + static const int maxMacroArgs = 64; + static const int maxIfNesting = 64; + + int ifdepth; // current #if-#else-#endif nesting in the cpp.c file (pre-processor) + int elsedepth[maxIfNesting]; // Keep a track of #if depth..Max allowed is 64. + int elsetracker; // #if-#else and #endif constructs...Counter. + const char *ErrMsg; + + typedef struct MacroInputSrc { + InputSrc base; + MacroSymbol *mac; + TokenStream **args; + } MacroInputSrc; + + InputSrc *currentInput; + + // + // from Pp.cpp + // + int bindAtom; + int constAtom; + int defaultAtom; + int defineAtom; + int definedAtom; + int elseAtom; + int elifAtom; + int endifAtom; + int ifAtom; + int ifdefAtom; + int ifndefAtom; + int includeAtom; + int lineAtom; + int pragmaAtom; + int texunitAtom; + int undefAtom; + int errorAtom; + int __LINE__Atom; + int __FILE__Atom; + int __VERSION__Atom; + int versionAtom; + int coreAtom; + int compatibilityAtom; + int esAtom; + int extensionAtom; + Scope *macros; + TSourceLoc ifloc; /* outermost #if */ + + int InitCPP(); + int FreeCPP(); + int FinalCPP(); + int CPPdefine(TPpToken * yylvalpp); + int CPPundef(TPpToken * yylvalpp); + int CPPelse(int matchelse, TPpToken * yylvalpp); + int eval(int token, int prec, int *res, int *err, TPpToken * yylvalpp); + int CPPif (TPpToken * yylvalpp); + int CPPifdef(int defined, TPpToken * yylvalpp); + int CPPline(TPpToken * yylvalpp); + int CPPerror(TPpToken * yylvalpp); + int CPPpragma(TPpToken * yylvalpp); + int CPPversion(TPpToken * yylvalpp); + int CPPextension(TPpToken * yylvalpp); + int readCPPline(TPpToken * yylvalpp); + void FreeMacro(MacroSymbol *s); + void PushEofSrc(); + void PopEofSrc(); + TokenStream* PrescanMacroArg(TokenStream *a, TPpToken * yylvalpp); + static int macro_scan(TPpContext* pp, InputSrc *inInput, TPpToken * yylvalpp); + static int zero_scan(TPpContext* pp, InputSrc *inInput, TPpToken * yylvalpp); + int MacroExpand(int atom, TPpToken* yylvalpp, int expandUndef); + int ChkCorrectElseNesting(); + + // + // from PpSymbols.cpp + // + Scope *ScopeList; + Scope *CurrentScope; + Scope *GlobalScope; + + Scope *NewScopeInPool(MemoryPool *pool); + void PushScope(Scope *fScope); + Scope *PopScope(void); + Symbol *NewSymbol(TSourceLoc *loc, Scope *fScope, int name, symbolkind kind); + void lAddToTree(Symbol **fSymbols, Symbol *fSymb, AtomTable *atable); + Symbol *AddSymbol(TSourceLoc *loc, Scope *fScope, int atom, symbolkind kind); + Symbol *LookUpLocalSymbol(Scope *fScope, int atom); + Symbol *LookUpSymbol(Scope *fScope, int atom); + + // + // From PpTokens.cpp + // + char* idstr(const char *fstr, MemoryPool *pool); + TPpContext::TokenBlock* lNewBlock(TokenStream *fTok, MemoryPool *pool); + void lAddByte(TokenStream *fTok, unsigned char fVal); + int lReadByte(TokenStream *pTok); + TokenStream *NewTokenStream(const char *name, MemoryPool *pool); + void DeleteTokenStream(TokenStream *pTok); + void RecordToken(TokenStream *pTok, int token, TPpToken * yylvalpp); + void RewindTokenStream(TokenStream *pTok); + int ReadToken(TokenStream *pTok, TPpToken * yylvalpp); + int ReadFromTokenStream(TokenStream *ts, int name, int (*final)(TPpContext *)); + void UngetToken(int token, TPpToken * yylvalpp); + void DumpTokenStream(FILE *fp, TokenStream *s, TPpToken * yylvalpp); + struct TokenInputSrc { + InputSrc base; + TokenStream *tokens; + int (*final)(TPpContext *); + }; + static int scan_token(TPpContext*, TokenInputSrc *in, TPpToken * yylvalpp); + struct UngotToken { + InputSrc base; + int token; + TPpToken lval; + }; + static int reget_token(TPpContext *, UngotToken *t, TPpToken * yylvalpp); + + // + // From PpScanner.cpp + // + struct StringInputSrc { + InputSrc base; + char *p; + }; + int InitScanner(TPpContext *cpp); + int FreeScanner(void); + static int str_getch(TPpContext*, StringInputSrc *in); + static void str_ungetch(TPpContext*, StringInputSrc *in, int ch, TPpToken *type); + int ScanFromString(char *s); + int check_EOF(int token); + int lFloatConst(char *str, int len, int ch, TPpToken * yylvalpp); + static int byte_scan(TPpContext*, InputSrc *in, TPpToken * yylvalpp); + + // + // From PpAtom.cpp + // + AtomTable atomTable; + int InitAtomTable(AtomTable *atable, int htsize); + void FreeAtomTable(AtomTable *atable); + int AddAtom(AtomTable *atable, const char *s); + int AddAtomFixed(AtomTable *atable, const char *s, int atom); + void PrintAtomTable(AtomTable *atable); + int IncreaseHashTableSize(TPpContext::AtomTable *atable); + int LookUpAddStringHash(AtomTable *atable, const char *s); + int LookUpAddString(AtomTable *atable, const char *s); + const char *GetAtomString(AtomTable *atable, int atom); + int GetReversedAtom(AtomTable *atable, int atom); + char* GetStringOfAtom(AtomTable *atable, int atom); + + // + // From PpMemory.cpp + // + MemoryPool *mem_CreatePool(size_t chunksize, unsigned align); + void mem_FreePool(MemoryPool *); + void *mem_Alloc(MemoryPool *p, size_t size); + int mem_AddCleanup(MemoryPool *p, void (*fn)(void *, void*), void *arg1, void* arg2); +}; + +#endif // PPCONTEXT_H + diff --git a/glslang/MachineIndependent/preprocessor/memory.c b/glslang/MachineIndependent/preprocessor/PpMemory.cpp similarity index 87% rename from glslang/MachineIndependent/preprocessor/memory.c rename to glslang/MachineIndependent/preprocessor/PpMemory.cpp index a01351bb..e59f242b 100644 --- a/glslang/MachineIndependent/preprocessor/memory.c +++ b/glslang/MachineIndependent/preprocessor/PpMemory.cpp @@ -1,5 +1,6 @@ // //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. //All rights reserved. // //Redistribution and use in source and binary forms, with or without @@ -80,7 +81,7 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include "memory.h" +#include "PpContext.h" // default alignment and chunksize, if called with 0 arguments #define CHUNKSIZE (64*1024) @@ -96,28 +97,28 @@ struct chunk { struct cleanup { struct cleanup *next; - void (*fn)(void *); - void *arg; + void (*fn)(void *, void *); + void *arg1; + void *arg2; }; -struct MemoryPool_rec { - struct chunk *next; - uintptr_t free, end; - size_t chunksize; - uintptr_t alignmask; - struct cleanup *cleanup; -}; - -MemoryPool *mem_CreatePool(size_t chunksize, unsigned int align) +TPpContext::MemoryPool* TPpContext::mem_CreatePool(size_t chunksize, unsigned int align) { MemoryPool *pool; - if (align == 0) align = ALIGN; - if (chunksize == 0) chunksize = CHUNKSIZE; - if (align & (align-1)) return 0; - if (chunksize < sizeof(MemoryPool)) return 0; - if (chunksize & (align-1)) return 0; - if (!(pool = (MemoryPool*)malloc(chunksize))) return 0; + if (align == 0) + align = ALIGN; + if (chunksize == 0) + chunksize = CHUNKSIZE; + if (align & (align-1)) + return 0; + if (chunksize < sizeof(MemoryPool)) + return 0; + if (chunksize & (align-1)) + return 0; + if (!(pool = (MemoryPool*)malloc(chunksize))) + return 0; + pool->next = 0; pool->chunksize = chunksize; pool->alignmask = (uintptr_t)(align)-1; @@ -127,13 +128,13 @@ MemoryPool *mem_CreatePool(size_t chunksize, unsigned int align) return pool; } -void mem_FreePool(MemoryPool *pool) +void TPpContext::mem_FreePool(MemoryPool *pool) { struct cleanup *cleanup; struct chunk *p, *next; for (cleanup = pool->cleanup; cleanup; cleanup = cleanup->next) { - cleanup->fn(cleanup->arg); + cleanup->fn(cleanup->arg1, cleanup->arg2); } for (p = (struct chunk *)pool; p; p = next) { next = p->next; @@ -141,7 +142,7 @@ void mem_FreePool(MemoryPool *pool) } } -void *mem_Alloc(MemoryPool *pool, size_t size) +void* TPpContext::mem_Alloc(MemoryPool *pool, size_t size) { struct chunk *ch; void *rv = (void *)pool->free; @@ -149,8 +150,7 @@ void *mem_Alloc(MemoryPool *pool, size_t size) if (size <= 0) size = pool->alignmask; pool->free += size; if (pool->free > pool->end || pool->free < (uintptr_t)rv) { - size_t minreq = (size + sizeof(struct chunk) + pool->alignmask) - & ~pool->alignmask; + size_t minreq = (size + sizeof(struct chunk) + pool->alignmask) & ~pool->alignmask; pool->free = (uintptr_t)rv; if (minreq >= pool->chunksize) { // request size is too big for the chunksize, so allocate it as @@ -170,7 +170,8 @@ void *mem_Alloc(MemoryPool *pool, size_t size) return rv; } -int mem_AddCleanup(MemoryPool *pool, void (*fn)(void *), void *arg) { +int TPpContext::mem_AddCleanup(MemoryPool *pool, void (*fn)(void *, void*), void* arg1, void* arg2) +{ struct cleanup *cleanup; pool->free = (pool->free + sizeof(void *) - 1) & ~(sizeof(void *)-1); @@ -178,7 +179,8 @@ int mem_AddCleanup(MemoryPool *pool, void (*fn)(void *), void *arg) { if (!cleanup) return -1; cleanup->next = pool->cleanup; cleanup->fn = fn; - cleanup->arg = arg; + cleanup->arg1 = arg1; + cleanup->arg2 = arg2; pool->cleanup = cleanup; return 0; } diff --git a/glslang/MachineIndependent/preprocessor/scanner.c b/glslang/MachineIndependent/preprocessor/PpScanner.cpp similarity index 56% rename from glslang/MachineIndependent/preprocessor/scanner.c rename to glslang/MachineIndependent/preprocessor/PpScanner.cpp index f117625d..299e5c27 100644 --- a/glslang/MachineIndependent/preprocessor/scanner.c +++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp @@ -1,5 +1,6 @@ // //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. //All rights reserved. // //Redistribution and use in source and binary forms, with or without @@ -86,140 +87,104 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #if 0 - #include - #else - #define isinff(x) (((*(int *)&(x) & 0x7f800000L)==0x7f800000L) && \ - ((*(int *)&(x) & 0x007fffffL)==0000000000L)) +#include +#else +#define isinff(x) (((*(int *)&(x) & 0x7f800000L)==0x7f800000L) && \ + ((*(int *)&(x) & 0x007fffffL)==0000000000L)) #endif -#include "slglobals.h" +#include "PpContext.h" +#include "PpTokens.h" - -typedef struct StringInputSrc { - InputSrc base; - char *p; -} StringInputSrc; - -static int eof_scan(InputSrc *is, yystypepp * yylvalpp) +static int eof_scan(TPpContext*, TPpContext::InputSrc*, TPpToken*) { return EOF; } // eof_scan -static void noop(InputSrc *in, int ch, yystypepp * yylvalpp) {} +static void noop(TPpContext*, TPpContext::InputSrc *in, int ch, TPpToken * yylvalpp) {} +static TPpContext::InputSrc eof_inputsrc = { 0, &eof_scan, &eof_scan, &noop }; -static InputSrc eof_inputsrc = { 0, &eof_scan, &eof_scan, &noop }; - -static int byte_scan(InputSrc *, yystypepp * yylvalpp); - -#define EOL_SY '\n' - -#if defined(_WIN32) - #define DBG_BREAKPOINT() __asm int 3 - #elif defined(_M_AMD64) - #define DBG_BREAKPOINT() assert(!"Dbg_Breakpoint"); - #else - #define DBG_BREAKPOINT() - #endif - - #if defined(_WIN32) && !defined(_M_AMD64) - __int64 RDTSC ( void ) { - - __int64 v; - - __asm __emit 0x0f - __asm __emit 0x31 - __asm mov dword ptr v, eax - __asm mov dword ptr v+4, edx - - return v; - } -#endif - - -int InitScanner(CPPStruct *cpp) +int TPpContext::InitScanner(TPpContext *cpp) { // Add various atoms needed by the CPP line scanner: if (!InitCPP()) return 0; - cpp->mostRecentToken = 0; - cpp->tokenLoc = &cpp->ltokenLoc; - - cpp->ltokenLoc.file = 0; - cpp->ltokenLoc.line = 0; - - cpp->currentInput = &eof_inputsrc; - cpp->previous_token = '\n'; - cpp->notAVersionToken = 0; + mostRecentToken = 0; + currentInput = &eof_inputsrc; + previous_token = '\n'; + notAVersionToken = false; return 1; } // InitScanner -int FreeScanner(void) +int TPpContext::FreeScanner(void) { return (FreeCPP()); } /* - * str_getch() - * takes care of reading from multiple strings. - * returns the next-char from the input stream. - * returns EOF when the complete shader is parsed. - */ -static int str_getch(StringInputSrc *in) +* str_getch() +* takes care of reading from multiple strings. +* returns the next-char from the input stream. +* returns EOF when the complete shader is parsed. +*/ +int TPpContext::str_getch(TPpContext* pp, StringInputSrc *in) { - for(;;) { - if (*in->p) { - if (*in->p == '\n') { - in->base.line++; - IncLineNumber(); - } - return *in->p++; - } - if (cpp->PaWhichStr < 0) { - // we only parsed the built-in pre-amble; start with clean slate for user code - cpp->notAVersionToken = 0; - } - if (++(cpp->PaWhichStr) < cpp->PaArgc) { - free(in); - SetStringNumber(cpp->PaWhichStr); - SetLineNumber(1); - ScanFromString(cpp->PaArgv[cpp->PaWhichStr]); - in=(StringInputSrc*)cpp->currentInput; - continue; - } else { - cpp->currentInput = in->base.prev; - cpp->PaWhichStr=0; - free(in); - return EOF; - } - } + for(;;) { + if (*in->p) { + if (*in->p == '\n') { + in->base.line++; + ++pp->parseContext.currentLoc.line; + } + return *in->p++; + } + if (pp->currentString < 0) { + // we only parsed the built-in pre-amble; start with clean slate for user code + pp->notAVersionToken = false; + } + if (++(pp->currentString) < pp->numStrings) { + free(in); + pp->parseContext.currentLoc.string = pp->currentString; + pp->parseContext.currentLoc.line = 1; + pp->ScanFromString(pp->strings[pp->currentString]); + in=(StringInputSrc*)pp->currentInput; + continue; + } else { + pp->currentInput = in->base.prev; + pp->currentString = 0; + free(in); + return EOF; + } + } } // str_getch -static void str_ungetch(StringInputSrc *in, int ch, yystypepp *type) { +void TPpContext::str_ungetch(TPpContext* pp, StringInputSrc *in, int ch, TPpToken *type) +{ if (in->p[-1] == ch)in->p--; - else { - *(in->p)='\0'; //this would take care of shifting to the previous string. - cpp->PaWhichStr--; - } - if (ch == '\n') { + else { + *(in->p)='\0'; //this would take care of shifting to the previous string. + pp->currentString--; + pp->parseContext.currentLoc.string = pp->currentString; + } + if (ch == '\n') { in->base.line--; - DecLineNumber(); + --pp->parseContext.currentLoc.line; } } // str_ungetch -int ScanFromString(char *s) +int TPpContext::ScanFromString(char *s) { - - StringInputSrc *in = (StringInputSrc *)malloc(sizeof(StringInputSrc)); + + StringInputSrc *in = (StringInputSrc *)malloc(sizeof(StringInputSrc)); memset(in, 0, sizeof(StringInputSrc)); - in->p = s; + in->p = s; in->base.line = 1; in->base.scan = byte_scan; - in->base.getch = (int (*)(InputSrc *, yystypepp *))str_getch; - in->base.ungetch = (void (*)(InputSrc *, int, yystypepp *))str_ungetch; - in->base.prev = cpp->currentInput; - cpp->currentInput = &in->base; + in->base.getch = (int (*)(TPpContext*, InputSrc *, TPpToken *))str_getch; + in->base.ungetch = (void (*)(TPpContext*, InputSrc *, int, TPpToken *))str_ungetch; + in->base.prev = currentInput; + currentInput = &in->base; return 1; } @@ -230,36 +195,36 @@ int ScanFromString(char *s) /////////////////////////////////////////////////////////////////////////////////////////////// /* - * lFloatConst() - Scan a single- or double-precision floating point constant. Assumes that the scanner - * has seen at least one digit, followed by either a decimal '.' or the - * letter 'e'. - */ +* lFloatConst() - Scan a single- or double-precision floating point constant. Assumes that the scanner +* has seen at least one digit, followed by either a decimal '.' or the +* letter 'e'. +*/ -static int lFloatConst(char *str, int len, int ch, yystypepp * yylvalpp) +int TPpContext::lFloatConst(char *str, int len, int ch, TPpToken * yylvalpp) { int HasDecimal, declen, exp, ExpSign; int str_len; int isDouble = 0; - + HasDecimal = 0; declen = 0; exp = 0; - + str_len=len; if (ch == '.') { - str[len++]=ch; + str[len++]=ch; HasDecimal = 1; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = currentInput->getch(this, currentInput, yylvalpp); while (ch >= '0' && ch <= '9') { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { declen++; if (len > 0 || ch != '0') { str[len] = ch; len++;str_len++; } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = currentInput->getch(this, currentInput, yylvalpp); } else { - ShPpErrorToInfoLog("floating-point literal too long"); + parseContext.error(yylvalpp->loc,"float literal too long", "", ""); len = 1,str_len=1; } } @@ -268,74 +233,74 @@ static int lFloatConst(char *str, int len, int ch, yystypepp * yylvalpp) // Exponent: if (ch == 'e' || ch == 'E') { - if (len >= MAX_TOKEN_LENGTH) { - ShPpErrorToInfoLog("floating-point literal too long"); + if (len >= TPpToken::maxTokenLength) { + parseContext.error(yylvalpp->loc,"float literal too long", "", ""); len = 1,str_len=1; } else { ExpSign = 1; - str[len++]=ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + str[len++]=ch; + ch = currentInput->getch(this, currentInput, yylvalpp); if (ch == '+') { str[len++]=ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = currentInput->getch(this, currentInput, yylvalpp); } else if (ch == '-') { ExpSign = -1; - str[len++]=ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + str[len++]=ch; + ch = currentInput->getch(this, currentInput, yylvalpp); } if (ch >= '0' && ch <= '9') { while (ch >= '0' && ch <= '9') { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { exp = exp*10 + ch - '0'; - str[len++]=ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + str[len++]=ch; + ch = currentInput->getch(this, currentInput, yylvalpp); } else { - ShPpErrorToInfoLog("floating-point literal too long"); + parseContext.error(yylvalpp->loc,"float literal too long", "", ""); len = 1,str_len=1; } } } else { - ShPpErrorToInfoLog("bad character in exponent"); + parseContext.error(yylvalpp->loc,"bad character in float exponent", "", ""); } exp *= ExpSign; } } - + if (len == 0) { - yylvalpp->sc_dval = 0.0; - strcpy(str, "0.0"); + yylvalpp->dval = 0.0; + strcpy(str, "0.0"); } else { if (ch == 'l' || ch == 'L') { - int ch2 = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + int ch2 = currentInput->getch(this, currentInput, yylvalpp); if (ch2 != 'f' && ch2 != 'F') { - cpp->currentInput->ungetch(cpp->currentInput, ch2, yylvalpp); - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + currentInput->ungetch(this, currentInput, ch2, yylvalpp); + currentInput->ungetch(this, currentInput, ch, yylvalpp); } else { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { str[len++] = ch; str[len++] = ch2; isDouble = 1; } else { - ShPpErrorToInfoLog("floating-point literal too long"); + parseContext.error(yylvalpp->loc,"float literal too long", "", ""); len = 1,str_len=1; } } } else if (ch == 'f' || ch == 'F') { - if (len < MAX_TOKEN_LENGTH) + if (len < TPpToken::maxTokenLength) str[len++] = ch; else { - ShPpErrorToInfoLog("floating-point literal too long"); + parseContext.error(yylvalpp->loc,"float literal too long", "", ""); len = 1,str_len=1; } } else - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + currentInput->ungetch(this, currentInput, ch, yylvalpp); str[len]='\0'; - - yylvalpp->sc_dval = strtod(str, 0); + + yylvalpp->dval = strtod(str, 0); } // Suffix: - strcpy(yylvalpp->symbol_name, str); + strcpy(yylvalpp->name, str); if (isDouble) return CPP_DOUBLECONSTANT; @@ -346,32 +311,31 @@ static int lFloatConst(char *str, int len, int ch, yystypepp * yylvalpp) /////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////// Normal Scanner ////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// - -static int byte_scan(InputSrc *in, yystypepp * yylvalpp) + +int TPpContext::byte_scan(TPpContext* pp, InputSrc *in, TPpToken * yylvalpp) { - char tokenText[MAX_TOKEN_LENGTH + 1]; + char tokenText[TPpToken::maxTokenLength + 1]; int AlreadyComplained = 0; int len, ch, ii; unsigned ival = 0; for (;;) { - yylvalpp->sc_int = 0; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); - + yylvalpp->ival = 0; + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); + while (ch == ' ' || ch == '\t' || ch == '\r') { - yylvalpp->sc_int = 1; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + yylvalpp->ival = 1; + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } - - cpp->ltokenLoc.file = cpp->currentInput->name; - cpp->ltokenLoc.line = cpp->currentInput->line; + + yylvalpp->loc = pp->parseContext.currentLoc; len = 0; switch (ch) { default: - return ch; // Single character token + return ch; // Single character token case EOF: return EOF; - case 'A': case 'B': case 'C': case 'D': case 'E': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': @@ -386,43 +350,43 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp) do { if (ch == '\\') { // escaped character - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '\r' || ch == '\n') { - int nextch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + int nextch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '\r' && nextch == '\n') - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); else ch = nextch; } else - ShPpErrorToInfoLog("can only escape newlines"); - } else if (len < MAX_TOKEN_LENGTH) { + pp->parseContext.error(yylvalpp->loc,"can only escape newlines", "\\", ""); + } else if (len < TPpToken::maxTokenLength) { tokenText[len++] = ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } else { if (! AlreadyComplained) { - ShPpErrorToInfoLog("name too long"); + pp->parseContext.error(yylvalpp->loc,"name too long", "", ""); AlreadyComplained = 1; } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } } while ((ch >= 'a' && ch <= 'z') || - (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || - ch == '_' || - ch == '\\'); + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '_' || + ch == '\\'); tokenText[len] = '\0'; - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - yylvalpp->sc_ident = LookUpAddString(atable, tokenText); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + yylvalpp->atom = pp->LookUpAddString(&pp->atomTable, tokenText); return CPP_IDENTIFIER; case '0': - yylvalpp->symbol_name[len++] = ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + yylvalpp->name[len++] = ch; + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == 'x' || ch == 'X') { int uint = 0; - yylvalpp->symbol_name[len++] = ch; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + yylvalpp->name[len++] = ch; + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) @@ -430,7 +394,7 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp) ival = 0; do { if (ival <= 0x0fffffff) { - yylvalpp->symbol_name[len++] = ch; + yylvalpp->name[len++] = ch; if (ch >= '0' && ch <= '9') { ii = ch - '0'; } else if (ch >= 'A' && ch <= 'F') { @@ -438,30 +402,30 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp) } else if (ch >= 'a' && ch <= 'f') { ii = ch - 'a' + 10; } else - ShPpErrorToInfoLog("bad digit in hexidecimal literal"); + pp->parseContext.error(yylvalpp->loc,"bad digit in hexidecimal literal", "", ""); ival = (ival << 4) | ii; } else { if (! AlreadyComplained) { - ShPpErrorToInfoLog("hexidecimal literal too big"); + pp->parseContext.error(yylvalpp->loc,"hexidecimal literal too big literal", "", ""); AlreadyComplained = 1; } ival = 0xffffffff; } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } while ((ch >= '0' && ch <= '9') || - (ch >= 'A' && ch <= 'F') || - (ch >= 'a' && ch <= 'f')); + (ch >= 'A' && ch <= 'F') || + (ch >= 'a' && ch <= 'f')); } else { - ShPpErrorToInfoLog("bad digit in hexidecimal literal"); + pp->parseContext.error(yylvalpp->loc,"bad digit in hexidecimal literal", "", ""); } if (ch == 'u' || ch == 'U') { - if (len < MAX_TOKEN_LENGTH) - yylvalpp->symbol_name[len++] = ch; + if (len < TPpToken::maxTokenLength) + yylvalpp->name[len++] = ch; uint = 1; } else - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - yylvalpp->symbol_name[len] = '\0'; - yylvalpp->sc_int = (int)ival; + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + yylvalpp->name[len] = '\0'; + yylvalpp->ival = (int)ival; if (uint) return CPP_UINTCONSTANT; @@ -472,79 +436,79 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp) ival = 0; do { if (ival <= 0x1fffffff) { - yylvalpp->symbol_name[len++] = ch; + yylvalpp->name[len++] = ch; ii = ch - '0'; ival = (ival << 3) | ii; } else { if (!AlreadyComplained) { - ShPpErrorToInfoLog("octal literal too big"); + pp->parseContext.error(yylvalpp->loc,"octal literal too big", "", ""); AlreadyComplained = 1; } ival = 0xffffffff; } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } while (ch >= '0' && ch <= '7'); if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'h' || ch == 'x'|| ch == 'E' || ch == 'F' || ch == 'l' || ch == 'L') - return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp); + return pp->lFloatConst(yylvalpp->name, len, ch, yylvalpp); else if (ch == 'u' || ch == 'U') { - if (len < MAX_TOKEN_LENGTH) - yylvalpp->symbol_name[len++] = ch; + if (len < TPpToken::maxTokenLength) + yylvalpp->name[len++] = ch; uint = 1; } else - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - yylvalpp->symbol_name[len] = '\0'; - yylvalpp->sc_int = (int)ival; + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + yylvalpp->name[len] = '\0'; + yylvalpp->ival = (int)ival; if (uint) return CPP_UINTCONSTANT; else return CPP_INTCONSTANT; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - ch = '0'; + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + ch = '0'; } // Fall through... case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': do { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { if (len > 0 || ch != '0') { - yylvalpp->symbol_name[len] = ch; + yylvalpp->name[len] = ch; len++; } } else { if (! AlreadyComplained) { - ShPpErrorToInfoLog("integer literal too long"); + pp->parseContext.error(yylvalpp->loc,"numeric literal too long", "", ""); AlreadyComplained = 1; } } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } while (ch >= '0' && ch <= '9'); if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'h' || ch == 'x'|| ch == 'E' || ch == 'F' || ch == 'l' || ch == 'L') { - return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp); + return pp->lFloatConst(yylvalpp->name, len, ch, yylvalpp); } else { // Finish handling signed and unsigned integers int numericLen = len; int uint = 0; if (ch == 'u' || ch == 'U') { - if (len < MAX_TOKEN_LENGTH) - yylvalpp->symbol_name[len++] = ch; + if (len < TPpToken::maxTokenLength) + yylvalpp->name[len++] = ch; uint = 1; } else - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); - yylvalpp->symbol_name[len] = '\0'; + yylvalpp->name[len] = '\0'; ival = 0; for (ii = 0; ii < numericLen; ii++) { - ch = yylvalpp->symbol_name[ii] - '0'; + ch = yylvalpp->name[ii] - '0'; if ((ival > 429496729) || (ival == 429496729 && ch >= 6)) { - ShPpErrorToInfoLog("integral literal too big"); + pp->parseContext.error(yylvalpp->loc,"numeric literal too big", "", ""); ival = -1; break; } else ival = ival * 10 + ch; } - yylvalpp->sc_int = (int)ival; + yylvalpp->ival = (int)ival; if (uint) return CPP_UINTCONSTANT; @@ -553,112 +517,112 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp) } break; case '-': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '-') { return CPP_DEC_OP; } else if (ch == '=') { return CPP_SUB_ASSIGN; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '-'; } case '+': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '+') { return CPP_INC_OP; } else if (ch == '=') { return CPP_ADD_ASSIGN; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '+'; } case '*': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '=') { return CPP_MUL_ASSIGN; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '*'; } case '%': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '=') { return CPP_MOD_ASSIGN; } else if (ch == '>'){ return CPP_RIGHT_BRACE; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '%'; } case ':': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '>') { return CPP_RIGHT_BRACKET; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return ':'; } case '^': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '^') { return CPP_XOR_OP; } else { if (ch == '=') return CPP_XOR_ASSIGN; else{ - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - return '^'; + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + return '^'; } } - + case '=': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '=') { return CPP_EQ_OP; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '='; } case '!': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '=') { return CPP_NE_OP; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '!'; } case '|': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '|') { return CPP_OR_OP; } else { if (ch == '=') return CPP_OR_ASSIGN; else{ - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - return '|'; + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + return '|'; } } case '&': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '&') { return CPP_AND_OP; } else { if (ch == '=') return CPP_AND_ASSIGN; else{ - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - return '&'; + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + return '&'; } } case '<': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '<') { - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); - if(ch == '=') + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); + if (ch == '=') return CPP_LEFT_ASSIGN; else{ - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return CPP_LEFT_OP; } } else { @@ -670,159 +634,161 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp) else if (ch == ':') return CPP_LEFT_BRACKET; else{ - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '<'; } } } case '>': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '>') { - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); - if(ch == '=') + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); + if (ch == '=') return CPP_RIGHT_ASSIGN; else{ - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return CPP_RIGHT_OP; } } else { if (ch == '=') { return CPP_GE_OP; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '>'; } } case '.': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch >= '0' && ch <= '9') { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); - return lFloatConst(yylvalpp->symbol_name, 0, '.', yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); + return pp->lFloatConst(yylvalpp->name, 0, '.', yylvalpp); } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '.'; } case '/': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '/') { do { - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '\\') { // allow an escaped newline, otherwise escapes in comments are meaningless - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '\r' || ch == '\n') { - int nextch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + int nextch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '\r' && nextch == '\n') - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); else ch = nextch; } } } while (ch != '\n' && ch != EOF); if (ch == EOF) - return -1; + return EOF; return '\n'; } else if (ch == '*') { int nlcount = 0; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); do { while (ch != '*') { - if (ch == '\n') nlcount++; + if (ch == '\n') + nlcount++; if (ch == EOF) { - ShPpErrorToInfoLog("EOF in comment"); - return -1; + pp->parseContext.error(yylvalpp->loc,"EOF in comment", "comment", ""); + + return EOF; } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == EOF) { - ShPpErrorToInfoLog("EOF in comment"); - return -1; + pp->parseContext.error(yylvalpp->loc,"EOF in comment", "comment", ""); + + return EOF; } } while (ch != '/'); - if (nlcount) { + if (nlcount) return '\n'; - } // Go try it again... } else if (ch == '=') { return CPP_DIV_ASSIGN; } else { - cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp); + pp->currentInput->ungetch(pp, pp->currentInput, ch, yylvalpp); return '/'; } break; case '"': - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); while (ch != '"' && ch != '\n' && ch != EOF) { if (ch == '\\') { - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); if (ch == '\n' || ch == EOF) { break; } } - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { tokenText[len] = ch; len++; - ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp); + ch = pp->currentInput->getch(pp, pp->currentInput, yylvalpp); } else break; }; tokenText[len] = '\0'; if (ch == '"') { - yylvalpp->sc_ident = LookUpAddString(atable, tokenText); + yylvalpp->atom = pp->LookUpAddString(&pp->atomTable, tokenText); return CPP_STRCONSTANT; } else { - ShPpErrorToInfoLog("end of line in string"); + pp->parseContext.error(yylvalpp->loc,"end of line in string", "string", ""); return CPP_ERROR_SY; } } } } // byte_scan -const char* PpTokenize(yystypepp* yylvalpp) +const char* TPpContext::tokenize(TPpToken* yylvalpp) { - int token = '\n'; + int token = '\n'; for(;;) { char* tokenString = 0; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); + token = currentInput->scan(this, currentInput, yylvalpp); yylvalpp->ppToken = token; if (check_EOF(token)) return 0; if (token == '#') { - if (cpp->previous_token == '\n'|| cpp->previous_token == 0) { + if (previous_token == '\n' || previous_token == 0) { token = readCPPline(yylvalpp); - if(check_EOF(token)) + if (check_EOF(token)) return 0; continue; } else { - ShPpErrorToInfoLog("preprocessor directive cannot be preceded by another token"); + parseContext.error(yylvalpp->loc,"preprocessor directive cannot be preceded by another token", "#", ""); return 0; } } - cpp->previous_token = token; + previous_token = token; if (token == '\n') continue; - cpp->notAVersionToken = 1; + notAVersionToken = true; // expand macros - if (token == CPP_IDENTIFIER && MacroExpand(yylvalpp->sc_ident, yylvalpp, 0) == 1) + if (token == CPP_IDENTIFIER && MacroExpand(yylvalpp->atom, yylvalpp, 0) == 1) continue; if (token == CPP_IDENTIFIER) - tokenString = GetStringOfAtom(atable, yylvalpp->sc_ident); + tokenString = GetStringOfAtom(&atomTable, yylvalpp->atom); else if (token == CPP_INTCONSTANT || token == CPP_UINTCONSTANT || token == CPP_FLOATCONSTANT || token == CPP_DOUBLECONSTANT) - tokenString = yylvalpp->symbol_name; + tokenString = yylvalpp->name; else - tokenString = GetStringOfAtom(atable, token); + tokenString = GetStringOfAtom(&atomTable, token); if (tokenString) { if (tokenString[0] != 0) - cpp->tokensBeforeEOF = 1; + parseContext.tokensBeforeEOF = 1; return tokenString; } @@ -832,16 +798,14 @@ const char* PpTokenize(yystypepp* yylvalpp) } // PpTokenize //Checks if the token just read is EOF or not. -int check_EOF(int token) +int TPpContext::check_EOF(int token) { - if(token==-1){ - if(cpp->ifdepth >0){ - ShPpErrorToInfoLog("missing #endif"); - cpp->CompileError=1; - } - return 1; - } - return 0; + if (token == EOF) { + if (ifdepth > 0) + parseContext.error(parseContext.currentLoc, "missing #endif", "#if", ""); + return 1; + } + return 0; } /////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/glslang/MachineIndependent/preprocessor/symbols.c b/glslang/MachineIndependent/preprocessor/PpSymbols.cpp similarity index 82% rename from glslang/MachineIndependent/preprocessor/symbols.c rename to glslang/MachineIndependent/preprocessor/PpSymbols.cpp index f48fbf4a..45ea537b 100644 --- a/glslang/MachineIndependent/preprocessor/symbols.c +++ b/glslang/MachineIndependent/preprocessor/PpSymbols.cpp @@ -1,5 +1,6 @@ // //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. //All rights reserved. // //Redistribution and use in source and binary forms, with or without @@ -83,32 +84,29 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include "slglobals.h" +#include "PpContext.h" /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////// Symbol Table Variables: /////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// -Scope *ScopeList = NULL; -Scope *CurrentScope = NULL; -Scope *GlobalScope = NULL; - -static void unlinkScope(void *_scope) { - Scope *scope = (Scope*)_scope; +static void unlinkScope(void *_scope, void* scopeList) +{ + TPpContext::Scope *scope = (TPpContext::Scope*)_scope; if (scope->next) scope->next->prev = scope->prev; if (scope->prev) scope->prev->next = scope->next; else - ScopeList = scope->next; + *(TPpContext::Scope**)scopeList = scope->next; } /* - * NewScope() - * - */ -Scope *NewScopeInPool(MemoryPool *pool) +* NewScope() +* +*/ +TPpContext::Scope* TPpContext::NewScopeInPool(MemoryPool *pool) { Scope *lScope; @@ -117,7 +115,7 @@ Scope *NewScopeInPool(MemoryPool *pool) lScope->parent = NULL; lScope->funScope = NULL; lScope->symbols = NULL; - + lScope->level = 0; lScope->programs = NULL; @@ -125,16 +123,17 @@ Scope *NewScopeInPool(MemoryPool *pool) ScopeList->prev = lScope; lScope->prev = 0; ScopeList = lScope; - mem_AddCleanup(pool, unlinkScope, lScope); + mem_AddCleanup(pool, unlinkScope, lScope, &ScopeList); + return lScope; } // NewScope /* - * PushScope() - * - */ +* PushScope() +* +*/ -void PushScope(Scope *fScope) +void TPpContext::PushScope(Scope *fScope) { Scope *lScope; @@ -143,9 +142,9 @@ void PushScope(Scope *fScope) if (fScope->level == 1) { if (!GlobalScope) { /* HACK - CTD -- if GlobalScope==NULL and level==1, we're - * defining a function in the superglobal scope. Things - * will break if we leave the level as 1, so we arbitrarily - * set it to 2 */ + * defining a function in the superglobal scope. Things + * will break if we leave the level as 1, so we arbitrarily + * set it to 2 */ fScope->level = 2; } } @@ -163,11 +162,11 @@ void PushScope(Scope *fScope) } // PushScope /* - * PopScope() - * - */ +* PopScope() +* +*/ -Scope *PopScope(void) +TPpContext::Scope* TPpContext::PopScope(void) { Scope *lScope; @@ -178,11 +177,11 @@ Scope *PopScope(void) } // PopScope /* - * NewSymbol() - Allocate a new symbol node; - * - */ +* NewSymbol() - Allocate a new symbol node; +* +*/ -Symbol *NewSymbol(SourceLoc *loc, Scope *fScope, int name, symbolkind kind) +TPpContext::Symbol* TPpContext::NewSymbol(TSourceLoc *loc, Scope *fScope, int name, symbolkind kind) { Symbol *lSymb; char *pch; @@ -195,7 +194,7 @@ Symbol *NewSymbol(SourceLoc *loc, Scope *fScope, int name, symbolkind kind) lSymb->name = name; lSymb->loc = *loc; lSymb->kind = kind; - + // Clear union area: pch = (char *) &lSymb->details; @@ -205,13 +204,13 @@ Symbol *NewSymbol(SourceLoc *loc, Scope *fScope, int name, symbolkind kind) } // NewSymbol /* - * lAddToTree() - Using a binary tree is not a good idea for basic atom values because they - * are generated in order. We'll fix this later (by reversing the bit pattern). - */ +* lAddToTree() - Using a binary tree is not a good idea for basic atom values because they +* are generated in order. We'll fix this later (by reversing the bit pattern). +*/ -static void lAddToTree(Symbol **fSymbols, Symbol *fSymb) +void TPpContext::lAddToTree(Symbol **fSymbols, Symbol *fSymb, AtomTable *atable) { - Symbol *lSymb; + TPpContext::Symbol *lSymb; int lrev, frev; lSymb = *fSymbols; @@ -220,7 +219,7 @@ static void lAddToTree(Symbol **fSymbols, Symbol *fSymb) while (lSymb) { lrev = GetReversedAtom(atable, lSymb->name); if (lrev == frev) { - ShPpErrorToInfoLog("GetAtomString(atable, fSymb->name)"); + printf("GetAtomString(atable, fSymb->name)"); break; } else { if (lrev > frev) { @@ -247,18 +246,18 @@ static void lAddToTree(Symbol **fSymbols, Symbol *fSymb) /* - * AddSymbol() - Add a variable, type, or function name to a scope. - * - */ +* AddSymbol() - Add a variable, type, or function name to a scope. +* +*/ -Symbol *AddSymbol(SourceLoc *loc, Scope *fScope, int atom, symbolkind kind) +TPpContext::Symbol* TPpContext::AddSymbol(TSourceLoc *loc, Scope *fScope, int atom, symbolkind kind) { Symbol *lSymb; if (!fScope) fScope = CurrentScope; lSymb = NewSymbol(loc, fScope, atom, kind); - lAddToTree(&fScope->symbols, lSymb); + lAddToTree(&fScope->symbols, lSymb, &atomTable); return lSymb; } // AddSymbol @@ -268,21 +267,21 @@ Symbol *AddSymbol(SourceLoc *loc, Scope *fScope, int atom, symbolkind kind) /*********************************************************************************************/ /* - * LookUpLocalSymbol() - * - */ +* LookUpLocalSymbol() +* +*/ -Symbol *LookUpLocalSymbol(Scope *fScope, int atom) +TPpContext::Symbol* TPpContext::LookUpLocalSymbol(Scope *fScope, int atom) { Symbol *lSymb; int rname, ratom; - ratom = GetReversedAtom(atable, atom); + ratom = GetReversedAtom(&atomTable, atom); if (!fScope) fScope = CurrentScope; lSymb = fScope->symbols; while (lSymb) { - rname = GetReversedAtom(atable, lSymb->name); + rname = GetReversedAtom(&atomTable, lSymb->name); if (rname == ratom) { return lSymb; } else { @@ -297,11 +296,11 @@ Symbol *LookUpLocalSymbol(Scope *fScope, int atom) } // LookUpLocalSymbol /* - * LookUpSymbol() - * - */ +* LookUpSymbol() +* +*/ -Symbol *LookUpSymbol(Scope *fScope, int atom) +TPpContext::Symbol* TPpContext::LookUpSymbol(Scope *fScope, int atom) { Symbol *lSymb; diff --git a/glslang/MachineIndependent/preprocessor/tokens.c b/glslang/MachineIndependent/preprocessor/PpTokens.cpp similarity index 72% rename from glslang/MachineIndependent/preprocessor/tokens.c rename to glslang/MachineIndependent/preprocessor/PpTokens.cpp index a5e76690..13a91b51 100644 --- a/glslang/MachineIndependent/preprocessor/tokens.c +++ b/glslang/MachineIndependent/preprocessor/PpTokens.cpp @@ -1,5 +1,6 @@ // //Copyright (C) 2002-2005 3Dlabs Inc. Ltd. +//Copyright (C) 2013 LunarG, Inc. //All rights reserved. // //Redistribution and use in source and binary forms, with or without @@ -78,8 +79,8 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // tokens.c // #ifdef _WIN32 - #define _CRT_SECURE_NO_WARNINGS - #define snprintf sprintf_s +#define _CRT_SECURE_NO_WARNINGS +#define snprintf sprintf_s #endif #include @@ -88,20 +89,21 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include "slglobals.h" +#include "PpContext.h" +#include "PpTokens.h" /////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////// Preprocessor and Token Recorder and Playback: //////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// /* - * idstr() - * Copy a string to a malloc'ed block and convert it into something suitable - * for an ID - * - */ +* idstr() +* Copy a string to a malloc'ed block and convert it into something suitable +* for an ID +* +*/ -static char *idstr(const char *fstr, MemoryPool *pool) +char* TPpContext::idstr(const char *fstr, MemoryPool *pool) { size_t len; char *str, *t; @@ -112,7 +114,7 @@ static char *idstr(const char *fstr, MemoryPool *pool) str = (char *) malloc(len + 1); else str = (char *) mem_Alloc(pool, len + 1); - + for (f=fstr, t=str; *f; f++) { if (isalnum(*f)) *t++ = *f; else if (*f == '.' || *f == '/') *t++ = '_'; @@ -123,11 +125,11 @@ static char *idstr(const char *fstr, MemoryPool *pool) /* - * lNewBlock() - * - */ +* lNewBlock() +* +*/ -static TokenBlock *lNewBlock(TokenStream *fTok, MemoryPool *pool) +TPpContext::TokenBlock* TPpContext::lNewBlock(TokenStream *fTok, MemoryPool *pool) { TokenBlock *lBlock; @@ -146,15 +148,16 @@ static TokenBlock *lNewBlock(TokenStream *fTok, MemoryPool *pool) fTok->head = lBlock; } fTok->current = lBlock; + return lBlock; } // lNewBlock /* - * lAddByte() - * - */ +* lAddByte() +* +*/ -static void lAddByte(TokenStream *fTok, unsigned char fVal) +void TPpContext::lAddByte(TokenStream *fTok, unsigned char fVal) { TokenBlock *lBlock; lBlock = fTok->current; @@ -164,13 +167,12 @@ static void lAddByte(TokenStream *fTok, unsigned char fVal) } // lAddByte - /* - * lReadByte() - Get the next byte from a stream. - * - */ +* lReadByte() - Get the next byte from a stream. +* +*/ -static int lReadByte(TokenStream *pTok) +int TPpContext::lReadByte(TokenStream *pTok) { TokenBlock *lBlock; int lval = -1; @@ -192,11 +194,11 @@ static int lReadByte(TokenStream *pTok) /////////////////////////////////////// Global Functions:////////////////////////////////////// /* - * NewTokenStream() - * - */ +* NewTokenStream() +* +*/ -TokenStream *NewTokenStream(const char *name, MemoryPool *pool) +TPpContext::TokenStream* TPpContext::NewTokenStream(const char *name, MemoryPool *pool) { TokenStream *pTok; @@ -213,11 +215,11 @@ TokenStream *NewTokenStream(const char *name, MemoryPool *pool) } // NewTokenStream /* - * DeleteTokenStream() - * - */ +* DeleteTokenStream() +* +*/ -void DeleteTokenStream(TokenStream *pTok) +void TPpContext::DeleteTokenStream(TokenStream *pTok) { TokenBlock *pBlock, *nBlock; @@ -235,11 +237,11 @@ void DeleteTokenStream(TokenStream *pTok) } // DeleteTokenStream /* - * RecordToken() - Add a token to the end of a list for later playback or printout. - * - */ +* RecordToken() - Add a token to the end of a list for later playback or printout. +* +*/ -void RecordToken(TokenStream *pTok, int token, yystypepp * yylvalpp) +void TPpContext::RecordToken(TokenStream *pTok, int token, TPpToken * yylvalpp) { const char *s; char *str = NULL; @@ -252,7 +254,7 @@ void RecordToken(TokenStream *pTok, int token, yystypepp * yylvalpp) case CPP_IDENTIFIER: case CPP_TYPEIDENTIFIER: case CPP_STRCONSTANT: - s = GetAtomString(atable, yylvalpp->sc_ident); + s = GetAtomString(&atomTable, yylvalpp->atom); while (*s) lAddByte(pTok, (unsigned char) *s++); lAddByte(pTok, 0); @@ -261,26 +263,26 @@ void RecordToken(TokenStream *pTok, int token, yystypepp * yylvalpp) case CPP_UINTCONSTANT: case CPP_FLOATCONSTANT: case CPP_DOUBLECONSTANT: - str = yylvalpp->symbol_name; - while (*str){ + str = yylvalpp->name; + while (*str){ lAddByte(pTok, (unsigned char) *str); str++; - } - lAddByte(pTok, 0); - break; + } + lAddByte(pTok, 0); + break; case '(': - lAddByte(pTok, (unsigned char)(yylvalpp->sc_int ? 1 : 0)); + lAddByte(pTok, (unsigned char)(yylvalpp->ival ? 1 : 0)); default: break; } } // RecordToken /* - * RewindTokenStream() - Reset a token stream in preperation for reading. - * - */ +* RewindTokenStream() - Reset a token stream in preperation for reading. +* +*/ -void RewindTokenStream(TokenStream *pTok) +void TPpContext::RewindTokenStream(TokenStream *pTok) { if (pTok->head) { pTok->current = pTok->head; @@ -289,19 +291,20 @@ void RewindTokenStream(TokenStream *pTok) } // RewindTokenStream /* - * ReadToken() - Read the next token from a stream. - * - */ +* ReadToken() - Read the next token from a stream. +* +*/ -int ReadToken(TokenStream *pTok, yystypepp * yylvalpp) +int TPpContext::ReadToken(TokenStream *pTok, TPpToken * yylvalpp) { //TODO: PP: why is this different than byte_scan - char tokenText[MAX_TOKEN_LENGTH + 1]; + char tokenText[TPpToken::maxTokenLength + 1]; int ltoken, len; char ch; ltoken = lReadByte(pTok); + yylvalpp->loc = parseContext.currentLoc; if (ltoken >= 0) { if (ltoken > 127) ltoken += 128; @@ -311,35 +314,35 @@ int ReadToken(TokenStream *pTok, yystypepp * yylvalpp) len = 0; ch = lReadByte(pTok); while ((ch >= 'a' && ch <= 'z') || - (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || - ch == '_') + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '_') { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { tokenText[len] = ch; len++; ch = lReadByte(pTok); } else { - ShPpErrorToInfoLog("token too long"); + parseContext.error(yylvalpp->loc,"name too long", "", ""); break; } } tokenText[len] = '\0'; assert(ch == '\0'); - yylvalpp->sc_ident = LookUpAddString(atable, tokenText); + yylvalpp->atom = LookUpAddString(&atomTable, tokenText); return CPP_IDENTIFIER; break; case CPP_STRCONSTANT: len = 0; while ((ch = lReadByte(pTok)) != 0) { - if (len < MAX_TOKEN_LENGTH) + if (len < TPpToken::maxTokenLength) tokenText[len++] = ch; else break; } tokenText[len] = 0; - yylvalpp->sc_ident = LookUpAddString(atable, tokenText); + yylvalpp->atom = LookUpAddString(&atomTable, tokenText); break; case CPP_FLOATCONSTANT: case CPP_DOUBLECONSTANT: @@ -347,19 +350,19 @@ int ReadToken(TokenStream *pTok, yystypepp * yylvalpp) ch = lReadByte(pTok); while ((ch >= '0' && ch <= '9') || ch=='e' || ch=='E' || ch=='.' || ch=='+' || ch=='-' || ch=='l' || ch=='L' || ch=='f'|| ch=='F') { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { tokenText[len] = ch; len++; ch = lReadByte(pTok); } else { - ShPpErrorToInfoLog("token too long"); + parseContext.error(yylvalpp->loc,"float literal too long", "", ""); break; } } tokenText[len] = '\0'; assert(ch == '\0'); - strcpy(yylvalpp->symbol_name, tokenText); - yylvalpp->sc_dval = atof(yylvalpp->symbol_name); + strcpy(yylvalpp->name, tokenText); + yylvalpp->dval = atof(yylvalpp->name); break; case CPP_INTCONSTANT: case CPP_UINTCONSTANT: @@ -367,102 +370,94 @@ int ReadToken(TokenStream *pTok, yystypepp * yylvalpp) ch = lReadByte(pTok); while ((ch >= '0' && ch <= '9') || ch == 'u' || ch == 'U') { - if (len < MAX_TOKEN_LENGTH) { + if (len < TPpToken::maxTokenLength) { tokenText[len] = ch; len++; ch = lReadByte(pTok); } else { - ShPpErrorToInfoLog("token too long"); + parseContext.error(yylvalpp->loc,"integer literal too long", "", ""); break; } } tokenText[len] = '\0'; assert(ch == '\0'); - strcpy(yylvalpp->symbol_name,tokenText); - yylvalpp->sc_int = atoi(yylvalpp->symbol_name); + strcpy(yylvalpp->name,tokenText); + yylvalpp->ival = atoi(yylvalpp->name); break; case '(': - yylvalpp->sc_int = lReadByte(pTok); + yylvalpp->ival = lReadByte(pTok); break; } return ltoken; } - return EOF_SY; + return EOF; } // ReadToken -typedef struct TokenInputSrc { - InputSrc base; - TokenStream *tokens; - int (*final)(CPPStruct *); -} TokenInputSrc; - -static int scan_token(TokenInputSrc *in, yystypepp * yylvalpp) +int TPpContext::scan_token(TPpContext* pp, TokenInputSrc *in, TPpToken * yylvalpp) { - int token = ReadToken(in->tokens, yylvalpp); - int (*final)(CPPStruct *); - cpp->tokenLoc->file = cpp->currentInput->name; - cpp->tokenLoc->line = cpp->currentInput->line; + int token = pp->ReadToken(in->tokens, yylvalpp); + int (*final)(TPpContext *); + yylvalpp->loc.string = pp->currentInput->name; + yylvalpp->loc.line = pp->currentInput->line; if (token == '\n') { in->base.line++; return token; } - if (token > 0) return token; - cpp->currentInput = in->base.prev; + if (token > 0) + return token; + pp->currentInput = in->base.prev; final = in->final; free(in); - if (final && !final(cpp)) return -1; - return cpp->currentInput->scan(cpp->currentInput, yylvalpp); + if (final && !final(pp)) + return -1; + + return pp->currentInput->scan(pp, pp->currentInput, yylvalpp); } -int ReadFromTokenStream(TokenStream *ts, int name, int (*final)(CPPStruct *)) +int TPpContext::ReadFromTokenStream(TokenStream *ts, int name, int (*final)(TPpContext *)) { TokenInputSrc *in = (TokenInputSrc *) malloc(sizeof(TokenInputSrc)); memset(in, 0, sizeof(TokenInputSrc)); in->base.name = name; - in->base.prev = cpp->currentInput; - in->base.scan = (int (*)(InputSrc *, yystypepp *))scan_token; + in->base.prev = currentInput; + in->base.scan = (int (*)(TPpContext*, InputSrc*, TPpToken*))scan_token; in->base.line = 1; in->tokens = ts; in->final = final; RewindTokenStream(ts); - cpp->currentInput = &in->base; + currentInput = &in->base; + return 1; } -typedef struct UngotToken { - InputSrc base; - int token; - yystypepp lval; -} UngotToken; - -static int reget_token(UngotToken *t, yystypepp * yylvalpp) +int TPpContext::reget_token(TPpContext* pp, UngotToken *t, TPpToken * yylvalpp) { int token = t->token; *yylvalpp = t->lval; - cpp->currentInput = t->base.prev; + pp->currentInput = t->base.prev; free(t); return token; } -typedef int (*scanFnPtr_t)(struct InputSrc *, yystypepp *); +typedef int (*scanFnPtr_t); -void UngetToken(int token, yystypepp * yylvalpp) { +void TPpContext::UngetToken(int token, TPpToken * yylvalpp) +{ UngotToken *t = (UngotToken *) malloc(sizeof(UngotToken)); memset(t, 0, sizeof(UngotToken)); t->token = token; t->lval = *yylvalpp; - t->base.scan = (scanFnPtr_t)reget_token; - t->base.prev = cpp->currentInput; - t->base.name = cpp->currentInput->name; - t->base.line = cpp->currentInput->line; - cpp->currentInput = &t->base; + t->base.scan = (int(*)(TPpContext*, struct InputSrc *, TPpToken *))reget_token; + t->base.prev = currentInput; + t->base.name = currentInput->name; + t->base.line = currentInput->line; + currentInput = &t->base; } -void DumpTokenStream(FILE *fp, TokenStream *s, yystypepp * yylvalpp) { +void TPpContext::DumpTokenStream(FILE *fp, TokenStream *s, TPpToken * yylvalpp) +{ int token; - const int maxSize = MAX_TOKEN_LENGTH + 5; - char str[100]; if (fp == 0) fp = stdout; RewindTokenStream(s); @@ -470,27 +465,26 @@ void DumpTokenStream(FILE *fp, TokenStream *s, yystypepp * yylvalpp) { switch (token) { case CPP_IDENTIFIER: case CPP_TYPEIDENTIFIER: - snprintf(str, maxSize, "%s ", GetAtomString(atable, yylvalpp->sc_ident)); + printf("%s ", GetAtomString(&atomTable, yylvalpp->atom)); break; case CPP_STRCONSTANT: - snprintf(str, maxSize, "\"%s\"", GetAtomString(atable, yylvalpp->sc_ident)); + printf("\"%s\"", GetAtomString(&atomTable, yylvalpp->atom)); break; case CPP_FLOATCONSTANT: case CPP_DOUBLECONSTANT: - printf("%g9.6 ", yylvalpp->sc_dval); + printf("%g9.6 ", yylvalpp->dval); break; case CPP_INTCONSTANT: case CPP_UINTCONSTANT: - printf("%d ", yylvalpp->sc_int); + printf("%d ", yylvalpp->ival); break; default: if (token >= 127) - snprintf(str, maxSize, "%s ", GetAtomString(atable, token)); + printf("%s ", GetAtomString(&atomTable, token)); else - snprintf(str, maxSize, "%c", token); + printf("%c", token); break; } - ShPpDebugLogMsg(str); } } diff --git a/glslang/MachineIndependent/preprocessor/parser.h b/glslang/MachineIndependent/preprocessor/PpTokens.h similarity index 79% rename from glslang/MachineIndependent/preprocessor/parser.h rename to glslang/MachineIndependent/preprocessor/PpTokens.h index 5cd32b8d..fa044eb6 100644 --- a/glslang/MachineIndependent/preprocessor/parser.h +++ b/glslang/MachineIndependent/preprocessor/PpTokens.h @@ -76,41 +76,42 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \****************************************************************************/ #ifndef PARSER_H -# define PARSER_H +#define PARSER_H -# define CPP_AND_OP 257 -# define CPP_SUB_ASSIGN 259 -# define CPP_MOD_ASSIGN 260 -# define CPP_ADD_ASSIGN 261 -# define CPP_DIV_ASSIGN 262 -# define CPP_MUL_ASSIGN 263 -# define CPP_EQ_OP 264 -# define CPP_XOR_OP 265 -# define CPP_ERROR_SY 266 -# define CPP_FLOATCONSTANT 267 -# define CPP_GE_OP 268 -# define CPP_RIGHT_OP 269 -# define CPP_IDENTIFIER 270 -# define CPP_INTCONSTANT 271 -# define CPP_LE_OP 272 -# define CPP_LEFT_OP 273 -# define CPP_DEC_OP 274 -# define CPP_NE_OP 275 -# define CPP_OR_OP 276 -# define CPP_INC_OP 277 -# define CPP_STRCONSTANT 278 -# define CPP_TYPEIDENTIFIER 279 -# define CPP_RIGHT_ASSIGN 280 -# define CPP_LEFT_ASSIGN 281 -# define CPP_AND_ASSIGN 282 -# define CPP_OR_ASSIGN 283 -# define CPP_XOR_ASSIGN 284 -# define CPP_LEFT_BRACKET 285 -# define CPP_RIGHT_BRACKET 286 -# define CPP_LEFT_BRACE 287 -# define CPP_RIGHT_BRACE 288 -# define CPP_UINTCONSTANT 289 -# define CPP_DOUBLECONSTANT 290 -# define CPP_FIRST_USER_TOKEN_SY 291 +#define CPP_AND_OP 257 +#define CPP_SUB_ASSIGN 259 +#define CPP_MOD_ASSIGN 260 +#define CPP_ADD_ASSIGN 261 +#define CPP_DIV_ASSIGN 262 +#define CPP_MUL_ASSIGN 263 +#define CPP_EQ_OP 264 +#define CPP_XOR_OP 265 +#define CPP_ERROR_SY 266 +#define CPP_FLOATCONSTANT 267 +#define CPP_GE_OP 268 +#define CPP_RIGHT_OP 269 +#define CPP_IDENTIFIER 270 +#define CPP_INTCONSTANT 271 +#define CPP_LE_OP 272 +#define CPP_LEFT_OP 273 +#define CPP_DEC_OP 274 +#define CPP_NE_OP 275 +#define CPP_OR_OP 276 +#define CPP_INC_OP 277 +#define CPP_STRCONSTANT 278 +#define CPP_TYPEIDENTIFIER 279 +#define CPP_RIGHT_ASSIGN 280 +#define CPP_LEFT_ASSIGN 281 +#define CPP_AND_ASSIGN 282 +#define CPP_OR_ASSIGN 283 +#define CPP_XOR_ASSIGN 284 +#define CPP_LEFT_BRACKET 285 +#define CPP_RIGHT_BRACKET 286 +#define CPP_LEFT_BRACE 287 +#define CPP_RIGHT_BRACE 288 +#define CPP_UINTCONSTANT 289 +#define CPP_DOUBLECONSTANT 290 + +#define CPP_FIRST_USER_TOKEN_SY 291 #endif /* not PARSER_H */ diff --git a/glslang/MachineIndependent/preprocessor/atom.h b/glslang/MachineIndependent/preprocessor/atom.h deleted file mode 100644 index 6d8898d1..00000000 --- a/glslang/MachineIndependent/preprocessor/atom.h +++ /dev/null @@ -1,96 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// atom.h -// - -#if !defined(__ATOM_H) -#define __ATOM_H 1 - -typedef struct AtomTable_Rec AtomTable; - -extern AtomTable *atable; - -int InitAtomTable(AtomTable *atable, int htsize); -void FreeAtomTable(AtomTable *atable); -int AddAtom(AtomTable *atable, const char *s); -void PrintAtomTable(AtomTable *atable); -int LookUpAddString(AtomTable *atable, const char *s); -const char *GetAtomString(AtomTable *atable, int atom); -int GetReversedAtom(AtomTable *atable, int atom); -char* GetStringOfAtom(AtomTable *atable, int atom); -#endif // !defined(__ATOM_H) diff --git a/glslang/MachineIndependent/preprocessor/cpp.c b/glslang/MachineIndependent/preprocessor/cpp.c deleted file mode 100644 index d001da71..00000000 --- a/glslang/MachineIndependent/preprocessor/cpp.c +++ /dev/null @@ -1,1153 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// cpp.c -// - -#define _CRT_SECURE_NO_WARNINGS - -#include -#include -#include -#include -#include - -#include "slglobals.h" - -static int CPPif(yystypepp * yylvalpp); - -/* Don't use memory.c's replacements, as we clean up properly here */ -#undef malloc -#undef free - -static int bindAtom = 0; -static int constAtom = 0; -static int defaultAtom = 0; -static int defineAtom = 0; -static int definedAtom = 0; -static int elseAtom = 0; -static int elifAtom = 0; -static int endifAtom = 0; -static int ifAtom = 0; -static int ifdefAtom = 0; -static int ifndefAtom = 0; -static int includeAtom = 0; -static int lineAtom = 0; -static int pragmaAtom = 0; -static int texunitAtom = 0; -static int undefAtom = 0; -static int errorAtom = 0; -static int __LINE__Atom = 0; -static int __FILE__Atom = 0; -static int __VERSION__Atom = 0; -static int versionAtom = 0; -static int coreAtom = 0; -static int compatibilityAtom = 0; -static int esAtom = 0; -static int extensionAtom = 0; - -static Scope *macros = 0; -#define MAX_MACRO_ARGS 64 -#define MAX_IF_NESTING 64 - -static SourceLoc ifloc; /* outermost #if */ - -int ChkCorrectElseNesting(void); -int PredefineMacro(char *); -void FreeMacro(MacroSymbol *); - -int InitCPP(void) -{ - char buffer[64], *t; - const char *f; - // Add various atoms needed by the CPP line scanner: - bindAtom = LookUpAddString(atable, "bind"); - constAtom = LookUpAddString(atable, "const"); - defaultAtom = LookUpAddString(atable, "default"); - defineAtom = LookUpAddString(atable, "define"); - definedAtom = LookUpAddString(atable, "defined"); - elifAtom = LookUpAddString(atable, "elif"); - elseAtom = LookUpAddString(atable, "else"); - endifAtom = LookUpAddString(atable, "endif"); - ifAtom = LookUpAddString(atable, "if"); - ifdefAtom = LookUpAddString(atable, "ifdef"); - ifndefAtom = LookUpAddString(atable, "ifndef"); - includeAtom = LookUpAddString(atable, "include"); - lineAtom = LookUpAddString(atable, "line"); - pragmaAtom = LookUpAddString(atable, "pragma"); - texunitAtom = LookUpAddString(atable, "texunit"); - undefAtom = LookUpAddString(atable, "undef"); - errorAtom = LookUpAddString(atable, "error"); - __LINE__Atom = LookUpAddString(atable, "__LINE__"); - __FILE__Atom = LookUpAddString(atable, "__FILE__"); - __VERSION__Atom = LookUpAddString(atable, "__VERSION__"); - versionAtom = LookUpAddString(atable, "version"); - coreAtom = LookUpAddString(atable, "core"); - compatibilityAtom = LookUpAddString(atable, "compatibility"); - esAtom = LookUpAddString(atable, "es"); - extensionAtom = LookUpAddString(atable, "extension"); - macros = NewScopeInPool(mem_CreatePool(0, 0)); - strcpy(buffer, "PROFILE_"); - t = buffer + strlen(buffer); - f = cpp->options.profileString; - while ((isalnum(*f) || *f == '_') && t < buffer + sizeof(buffer) - 1) - *t++ = toupper(*f++); - *t = 0; - return 1; -} // InitCPP - -int FreeCPP(void) -{ - if (macros) - { - mem_FreePool(macros->pool); - macros = 0; - } - - return 1; -} - -int FinalCPP(void) -{ - if (cpp->ifdepth) - ShPpErrorToInfoLog("missing #endif"); - return 1; -} - -static int CPPdefine(yystypepp * yylvalpp) -{ - int token, name, args[MAX_MACRO_ARGS], argc; - const char *message; - MacroSymbol mac; - Symbol *symb; - SourceLoc dummyLoc; - memset(&mac, 0, sizeof(mac)); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != CPP_IDENTIFIER) { - ShPpErrorToInfoLog("#define not followed by macro name"); - return token; - } - name = yylvalpp->sc_ident; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token == '(' && !yylvalpp->sc_int) { - // gather arguments - argc = 0; - do { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (argc == 0 && token == ')') - break; - if (token != CPP_IDENTIFIER) { - ShPpErrorToInfoLog("#define: bad argument"); - - return token; - } - if (argc < MAX_MACRO_ARGS) - args[argc++] = yylvalpp->sc_ident; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } while (token == ','); - if (token != ')') { - ShPpErrorToInfoLog("#define: missing parenthesis"); - - return token; - } - mac.argc = argc; - mac.args = (int*)mem_Alloc(macros->pool, argc * sizeof(int)); - memcpy(mac.args, args, argc * sizeof(int)); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - mac.body = NewTokenStream(GetAtomString(atable, name), macros->pool); - while (token != '\n') { - while (token == '\\') { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token == '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - else - RecordToken(mac.body, '\\', yylvalpp); - } - RecordToken(mac.body, token, yylvalpp); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - }; - - symb = LookUpSymbol(macros, name); - if (symb) { - if (!symb->details.mac.undef) { - // already defined -- need to make sure they are identical - if (symb->details.mac.argc != mac.argc) - goto error; - for (argc=0; argc < mac.argc; argc++) - if (symb->details.mac.args[argc] != mac.args[argc]) - goto error; - RewindTokenStream(symb->details.mac.body); - RewindTokenStream(mac.body); - do { - int old_lval, old_token; - old_token = ReadToken(symb->details.mac.body, yylvalpp); - old_lval = yylvalpp->sc_int; - token = ReadToken(mac.body, yylvalpp); - if (token != old_token || yylvalpp->sc_int != old_lval) { - error: - StoreStr("Macro Redefined"); - StoreStr(GetStringOfAtom(atable, name)); - message = GetStrfromTStr(); - DecLineNumber(); - ShPpErrorToInfoLog(message); - IncLineNumber(); - ResetTString(); - break; - } - } while (token > 0); - } - //FreeMacro(&symb->details.mac); - } else { - dummyLoc.file = 0; - dummyLoc.line = 0; - symb = AddSymbol(&dummyLoc, macros, name, MACRO_S); - } - symb->details.mac = mac; - - return '\n'; -} // CPPdefine - -static int CPPundef(yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - Symbol *symb; - if (token == '\n') { - ShPpErrorToInfoLog("#undef must be followed by macro name"); - - return token; - } - if (token != CPP_IDENTIFIER) { - ShPpErrorToInfoLog("#undef must be followed by macro name"); - - return token; - } - - symb = LookUpSymbol(macros, yylvalpp->sc_ident); - if (symb) { - symb->details.mac.undef = 1; - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != '\n') { - ShPpErrorToInfoLog("#undef can only be followed by a single macro name"); - } - - return token; -} // CPPundef - -/* CPPelse -- skip forward to appropriate spot. This is actually used -** to skip to a #endif after seeing an #else, AND to skip to a #else, -** #elif, or #endif after a #if/#ifdef/#ifndef/#elif test was false -*/ - -static int CPPelse(int matchelse, yystypepp * yylvalpp) -{ - int atom; - int depth = 0; - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - while (token > 0) { - if (token != '#') { - while (token != '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - continue; - } - - if ((token = cpp->currentInput->scan(cpp->currentInput, yylvalpp)) != CPP_IDENTIFIER) - continue; - - atom = yylvalpp->sc_ident; - if (atom == ifAtom || atom == ifdefAtom || atom == ifndefAtom) { - depth++; - cpp->ifdepth++; - cpp->elsetracker++; - } else if (atom == endifAtom) { - cpp->elsedepth[cpp->elsetracker] = 0; - --cpp->elsetracker; - if (depth == 0) { - // found the #endif we are looking for - if (cpp->ifdepth) - --cpp->ifdepth; - break; - } - --depth; - --cpp->ifdepth; - } else if (matchelse && depth == 0) { - if (atom == elseAtom ) { - // found the #else we are looking for - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != '\n') { - ShPpWarningToInfoLog("unexpected tokens following #else directive - expected a newline"); - while (token != '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - break; - } else if (atom == elifAtom) { - /* we decrement cpp->ifdepth here, because CPPif will increment - * it and we really want to leave it alone */ - if (cpp->ifdepth) { - --cpp->ifdepth; - cpp->elsedepth[cpp->elsetracker] = 0; - --cpp->elsetracker; - } - - return CPPif(yylvalpp); - } - } else if((atom == elseAtom) && (!ChkCorrectElseNesting())) { - ShPpErrorToInfoLog("#else after #else"); - cpp->CompileError = 1; - } - }; // end while - - return token; -} - -enum eval_prec { - MIN_PREC, - COND, LOGOR, LOGAND, OR, XOR, AND, EQUAL, RELATION, SHIFT, ADD, MUL, UNARY, - MAX_PREC -}; - -static int op_logor(int a, int b) { return a || b; } -static int op_logand(int a, int b) { return a && b; } -static int op_or(int a, int b) { return a | b; } -static int op_xor(int a, int b) { return a ^ b; } -static int op_and(int a, int b) { return a & b; } -static int op_eq(int a, int b) { return a == b; } -static int op_ne(int a, int b) { return a != b; } -static int op_ge(int a, int b) { return a >= b; } -static int op_le(int a, int b) { return a <= b; } -static int op_gt(int a, int b) { return a > b; } -static int op_lt(int a, int b) { return a < b; } -static int op_shl(int a, int b) { return a << b; } -static int op_shr(int a, int b) { return a >> b; } -static int op_add(int a, int b) { return a + b; } -static int op_sub(int a, int b) { return a - b; } -static int op_mul(int a, int b) { return a * b; } -static int op_div(int a, int b) { return a / b; } -static int op_mod(int a, int b) { return a % b; } -static int op_pos(int a) { return a; } -static int op_neg(int a) { return -a; } -static int op_cmpl(int a) { return ~a; } -static int op_not(int a) { return !a; } - -struct Tbinops { - int token, prec, (*op)(int, int); -} binop[] = { - { CPP_OR_OP, LOGOR, op_logor }, - { CPP_AND_OP, LOGAND, op_logand }, - { '|', OR, op_or }, - { '^', XOR, op_xor }, - { '&', AND, op_and }, - { CPP_EQ_OP, EQUAL, op_eq }, - { CPP_NE_OP, EQUAL, op_ne }, - { '>', RELATION, op_gt }, - { CPP_GE_OP, RELATION, op_ge }, - { '<', RELATION, op_lt }, - { CPP_LE_OP, RELATION, op_le }, - { CPP_LEFT_OP, SHIFT, op_shl }, - { CPP_RIGHT_OP, SHIFT, op_shr }, - { '+', ADD, op_add }, - { '-', ADD, op_sub }, - { '*', MUL, op_mul }, - { '/', MUL, op_div }, - { '%', MUL, op_mod }, -}; - -struct tunops { - int token, (*op)(int); -} unop[] = { - { '+', op_pos }, - { '-', op_neg }, - { '~', op_cmpl }, - { '!', op_not }, -}; - -#define ALEN(A) (sizeof(A)/sizeof(A[0])) - -static int eval(int token, int prec, int *res, int *err, yystypepp * yylvalpp) -{ - int i, val; - Symbol *s; - - if (token == CPP_IDENTIFIER) { - if (yylvalpp->sc_ident == definedAtom) { - int needclose = 0; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token == '(') { - needclose = 1; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - if (token != CPP_IDENTIFIER) { - ShPpErrorToInfoLog("incorrect preprocessor directive"); - *err = 1; - *res = 0; - - return token; - } - *res = (s = LookUpSymbol(macros, yylvalpp->sc_ident)) - ? !s->details.mac.undef : 0; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (needclose) { - if (token != ')') { - ShPpErrorToInfoLog("missing ')'"); - *err = 1; - *res = 0; - - return token; - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - } else { - int macroReturn = MacroExpand(yylvalpp->sc_ident, yylvalpp, 1); - if (macroReturn == 0) { - ShPpErrorToInfoLog("can't evaluate expression"); - *err = 1; - *res = 0; - - return token; - } else { - if (macroReturn == -1) { - if (ShPpMacrosMustBeDefinedError()) - *err = 1; - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - return eval(token, prec, res, err, yylvalpp); - } - } - } else if (token == CPP_INTCONSTANT) { - *res = yylvalpp->sc_int; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } else if (token == '(') { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - token = eval(token, MIN_PREC, res, err, yylvalpp); - if (!*err) { - if (token != ')') { - ShPpErrorToInfoLog("expected ')'"); - *err = 1; - *res = 0; - - return token; - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - } else { - for (i = ALEN(unop) - 1; i >= 0; i--) { - if (unop[i].token == token) - break; - } - if (i >= 0) { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - token = eval(token, UNARY, res, err, yylvalpp); - *res = unop[i].op(*res); - } else { - ShPpErrorToInfoLog("bad expression"); - *err = 1; - *res = 0; - - return token; - } - } - while (!*err) { - if (token == ')' || token == '\n') - break; - for (i = ALEN(binop) - 1; i >= 0; i--) { - if (binop[i].token == token) - break; - } - if (i < 0 || binop[i].prec <= prec) - break; - val = *res; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - token = eval(token, binop[i].prec, res, err, yylvalpp); - *res = binop[i].op(val, *res); - } - - return token; -} // eval - -static int CPPif(yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - int res = 0, err = 0; - cpp->elsetracker++; - if (!cpp->ifdepth++) - ifloc = *cpp->tokenLoc; - if (cpp->ifdepth > MAX_IF_NESTING){ - ShPpErrorToInfoLog("max #if nesting depth exceeded"); - return 0; - } - token = eval(token, MIN_PREC, &res, &err, yylvalpp); - if (token != '\n') { - ShPpWarningToInfoLog("unexpected tokens following directive - expected a newline"); - while (token != '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - if (!res && !err) { - token = CPPelse(1, yylvalpp); - } - - return token; -} // CPPif - -static int CPPifdef(int defined, yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - int name = yylvalpp->sc_ident; - if(++cpp->ifdepth > MAX_IF_NESTING){ - ShPpErrorToInfoLog("max #if nesting depth exceeded"); - return 0; - } - cpp->elsetracker++; - if (token != CPP_IDENTIFIER) { - defined ? ShPpErrorToInfoLog("#ifdef not followed by macro name") : ShPpErrorToInfoLog("#ifndef not followed by macro name"); - } else { - Symbol *s = LookUpSymbol(macros, name); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != '\n') { - ShPpWarningToInfoLog("unexpected tokens following #ifdef - expected a newline"); - while (token != '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - if (((s && !s->details.mac.undef) ? 1 : 0) != defined) - token = CPPelse(1, yylvalpp); - } - return token; -} // CPPifdef - -static int CPPline(yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token=='\n') { - DecLineNumber(); - ShPpErrorToInfoLog("#line must by followed by an integral literal"); - IncLineNumber(); - return token; - } - else if (token == CPP_INTCONSTANT) { - yylvalpp->sc_int=atoi(yylvalpp->symbol_name); - SetLineNumber(yylvalpp->sc_int); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - if (token == CPP_INTCONSTANT) { - yylvalpp->sc_int=atoi(yylvalpp->symbol_name); - SetStringNumber(yylvalpp->sc_int); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if(token!='\n') - ShPpErrorToInfoLog("#line cannot be followed by more than two integral literals"); - } - else if (token == '\n') - - return token; - else - ShPpErrorToInfoLog("#line second argument can only be an integral literal"); - } else - ShPpErrorToInfoLog("#line first argument can only be an integral literal"); - - return token; -} - -static int CPPerror(yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - const char *message; - - while (token != '\n') { - if (token == CPP_INTCONSTANT || token == CPP_UINTCONSTANT || - token == CPP_FLOATCONSTANT || token == CPP_DOUBLECONSTANT) { - StoreStr(yylvalpp->symbol_name); - }else if(token == CPP_IDENTIFIER || token == CPP_STRCONSTANT){ - StoreStr(GetStringOfAtom(atable, yylvalpp->sc_ident)); - }else { - StoreStr(GetStringOfAtom(atable, token)); - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - DecLineNumber(); - //store this msg into the shader's information log..set the Compile Error flag!!!! - message=GetStrfromTStr(); - ShPpErrorToInfoLog(message); - ResetTString(); - cpp->CompileError=1; - IncLineNumber(); - return '\n'; -}//CPPerror - -static int CPPpragma(yystypepp * yylvalpp) -{ - char SrcStrName[2]; - char** allTokens; - int tokenCount = 0; - int maxTokenCount = 10; - const char* SrcStr; - int i; - - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - if (token=='\n') { - DecLineNumber(); - ShPpErrorToInfoLog("#pragma must be followed by pragma arguments"); - IncLineNumber(); - return token; - } - - allTokens = (char**)malloc(sizeof(char*) * maxTokenCount); - - while (token != '\n') { - if (tokenCount >= maxTokenCount) { - maxTokenCount *= 2; - allTokens = (char**)realloc((char**)allTokens, sizeof(char*) * maxTokenCount); - } - switch (token) { - case CPP_IDENTIFIER: - SrcStr = GetAtomString(atable, yylvalpp->sc_ident); - allTokens[tokenCount] = (char*)malloc(strlen(SrcStr) + 1); - strcpy(allTokens[tokenCount++], SrcStr); - break; - case CPP_INTCONSTANT: - case CPP_UINTCONSTANT: - case CPP_FLOATCONSTANT: - case CPP_DOUBLECONSTANT: - SrcStr = yylvalpp->symbol_name; - allTokens[tokenCount] = (char*)malloc(strlen(SrcStr) + 1); - strcpy(allTokens[tokenCount++], SrcStr); - break; - case -1: - // EOF - ShPpErrorToInfoLog("#pragma directive must end with a newline"); - return token; - default: - SrcStrName[0] = token; - SrcStrName[1] = '\0'; - allTokens[tokenCount] = (char*)malloc(2); - strcpy(allTokens[tokenCount++], SrcStrName); - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - - cpp->currentInput->ungetch(cpp->currentInput, token, yylvalpp); - HandlePragma((const char**)allTokens, tokenCount); - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - for (i = 0; i < tokenCount; ++i) { - free (allTokens[i]); - } - free (allTokens); - - return token; -} // CPPpragma - -// This is just for error checking: the version and profile are decided before preprocessing starts -static int CPPversion(yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - if (cpp->notAVersionToken == 1) - ShPpErrorToInfoLog("#version must occur before any other statement in the program"); - - if (token == '\n'){ - DecLineNumber(); - ShPpErrorToInfoLog("#version"); - IncLineNumber(); - - return token; - } - - if (token != CPP_INTCONSTANT) - ShPpErrorToInfoLog("#version"); - - yylvalpp->sc_int = atoi(yylvalpp->symbol_name); - - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - if (token == '\n') - return token; - else { - if (yylvalpp->sc_ident != coreAtom && - yylvalpp->sc_ident != compatibilityAtom && - yylvalpp->sc_ident != esAtom) - ShPpErrorToInfoLog("#version profile name"); - - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - - if (token == '\n') - return token; - else - ShPpErrorToInfoLog("#version"); - } - - return token; -} // CPPversion - -static int CPPextension(yystypepp * yylvalpp) -{ - - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - char extensionName[80]; - - if(token=='\n'){ - DecLineNumber(); - ShPpErrorToInfoLog("extension name not specified"); - IncLineNumber(); - return token; - } - - if (token != CPP_IDENTIFIER) - ShPpErrorToInfoLog("#extension"); - - strcpy(extensionName, GetAtomString(atable, yylvalpp->sc_ident)); - - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != ':') { - ShPpErrorToInfoLog("':' missing after extension name"); - return token; - } - - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != CPP_IDENTIFIER) { - ShPpErrorToInfoLog("behavior for extension not specified"); - return token; - } - - updateExtensionBehavior(extensionName, GetAtomString(atable, yylvalpp->sc_ident)); - - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token == '\n'){ - return token; - } - else{ - ShPpErrorToInfoLog("#extension"); - } - return token; -} // CPPextension - -int readCPPline(yystypepp * yylvalpp) -{ - int token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - const char *message; - int isVersion = 0; - - if (token == CPP_IDENTIFIER) { - if (yylvalpp->sc_ident == defineAtom) { - token = CPPdefine(yylvalpp); - } else if (yylvalpp->sc_ident == elseAtom) { - if (ChkCorrectElseNesting()) { - if (! cpp->ifdepth) { - ShPpErrorToInfoLog("#else mismatch"); - cpp->CompileError = 1; - } - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != '\n') { - ShPpWarningToInfoLog("unexpected tokens following #else - expected a newline"); - while (token != '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - token = CPPelse(0, yylvalpp); - } else { - ShPpErrorToInfoLog("#else after a #else"); - cpp->ifdepth = 0; - cpp->notAVersionToken = 1; - return 0; - } - } else if (yylvalpp->sc_ident == elifAtom) { - if (!cpp->ifdepth){ - ShPpErrorToInfoLog("#elif mismatch"); - cpp->CompileError=1; - } - // this token is really a dont care, but we still need to eat the tokens - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - while (token != '\n') - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - token = CPPelse(0, yylvalpp); - } else if (yylvalpp->sc_ident == endifAtom) { - cpp->elsedepth[cpp->elsetracker] = 0; - --cpp->elsetracker; - if (!cpp->ifdepth){ - ShPpErrorToInfoLog("#endif mismatch"); - cpp->CompileError=1; - } - else - --cpp->ifdepth; - } else if (yylvalpp->sc_ident == ifAtom) { - token = CPPif(yylvalpp); - } else if (yylvalpp->sc_ident == ifdefAtom) { - token = CPPifdef(1, yylvalpp); - } else if (yylvalpp->sc_ident == ifndefAtom) { - token = CPPifdef(0, yylvalpp); - } else if (yylvalpp->sc_ident == lineAtom) { - token = CPPline(yylvalpp); - } else if (yylvalpp->sc_ident == pragmaAtom) { - token = CPPpragma(yylvalpp); - } else if (yylvalpp->sc_ident == undefAtom) { - token = CPPundef(yylvalpp); - } else if (yylvalpp->sc_ident == errorAtom) { - token = CPPerror(yylvalpp); - } else if (yylvalpp->sc_ident == versionAtom) { - token = CPPversion(yylvalpp); - isVersion = 1; - } else if (yylvalpp->sc_ident == extensionAtom) { - token = CPPextension(yylvalpp); - } else { - StoreStr("Invalid Directive"); - StoreStr(GetStringOfAtom(atable, yylvalpp->sc_ident)); - message=GetStrfromTStr(); - ShPpErrorToInfoLog(message); - ResetTString(); - } - } - while (token != '\n' && token != 0 && token != EOF) { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - - cpp->notAVersionToken = !isVersion; - - return token; -} // readCPPline - -void FreeMacro(MacroSymbol *s) { - DeleteTokenStream(s->body); -} - -static int eof_scan(InputSrc *in, yystypepp * yylvalpp) { return -1; } -static void noop(InputSrc *in, int ch, yystypepp * yylvalpp) { } - -static void PushEofSrc() { - InputSrc *in = (InputSrc*)malloc(sizeof(InputSrc)); - memset(in, 0, sizeof(InputSrc)); - in->scan = eof_scan; - in->getch = eof_scan; - in->ungetch = noop; - in->prev = cpp->currentInput; - cpp->currentInput = in; -} - -static void PopEofSrc() { - if (cpp->currentInput->scan == eof_scan) { - InputSrc *in = cpp->currentInput; - cpp->currentInput = in->prev; - free(in); - } -} - -static TokenStream *PrescanMacroArg(TokenStream *a, yystypepp * yylvalpp) { - int token; - TokenStream *n; - RewindTokenStream(a); - do { - token = ReadToken(a, yylvalpp); - if (token == CPP_IDENTIFIER && LookUpSymbol(macros, yylvalpp->sc_ident)) - break; - } while (token > 0); - if (token <= 0) return a; - n = NewTokenStream("macro arg", 0); - PushEofSrc(); - ReadFromTokenStream(a, 0, 0); - while ((token = cpp->currentInput->scan(cpp->currentInput, yylvalpp)) > 0) { - if (token == CPP_IDENTIFIER && MacroExpand(yylvalpp->sc_ident, yylvalpp, 0) == 1) - continue; - RecordToken(n, token, yylvalpp); - } - PopEofSrc(); - DeleteTokenStream(a); - return n; -} // PrescanMacroArg - -typedef struct MacroInputSrc { - InputSrc base; - MacroSymbol *mac; - TokenStream **args; -} MacroInputSrc; - -/* macro_scan --- -** return the next token for a macro expansion, handling macro args -*/ -static int macro_scan(InputSrc *inInput, yystypepp * yylvalpp) -{ - MacroInputSrc* in = (MacroInputSrc*)inInput; - - int i; - int token = ReadToken(in->mac->body, yylvalpp); - if (token == CPP_IDENTIFIER) { - for (i = in->mac->argc-1; i>=0; i--) - if (in->mac->args[i] == yylvalpp->sc_ident) - break; - if (i >= 0) { - ReadFromTokenStream(in->args[i], yylvalpp->sc_ident, 0); - - return cpp->currentInput->scan(cpp->currentInput, yylvalpp); - } - } - - if (token > 0) - return token; - - in->mac->busy = 0; - cpp->currentInput = in->base.prev; - if (in->args) { - for (i=in->mac->argc-1; i>=0; i--) - DeleteTokenStream(in->args[i]); - free(in->args); - } - free(in); - - return cpp->currentInput->scan(cpp->currentInput, yylvalpp); -} // macro_scan - -// return a zero, for scanning a macro that was never defined -static int zero_scan(InputSrc *inInput, yystypepp * yylvalpp) -{ - MacroInputSrc* in = (MacroInputSrc*)inInput; - - strcpy(yylvalpp->symbol_name, "0"); - yylvalpp->sc_int = 0; - - // pop input - cpp->currentInput = in->base.prev; - free(in); - - return CPP_INTCONSTANT; -} - -/* MacroExpand -** Check an identifier (atom) to see if it is a macro that should be expanded. -** If it is, push an InputSrc that will produce the appropriate expansion -** and return 1. -** If it is, but undefined, it should expand to 0, push an InputSrc that will -** expand to 0 and return -1. -** Otherwise, return 0. -*/ -int MacroExpand(int atom, yystypepp* yylvalpp, int expandUndef) -{ - Symbol *sym = LookUpSymbol(macros, atom); - MacroInputSrc *in; - int i, j, token; - int depth = 0; - const char *message; - - if (atom == __LINE__Atom) { - yylvalpp->sc_int = GetLineNumber(); - sprintf(yylvalpp->symbol_name, "%d", yylvalpp->sc_int); - UngetToken(CPP_INTCONSTANT, yylvalpp); - - return 1; - } - - if (atom == __FILE__Atom) { - yylvalpp->sc_int = GetStringNumber(); - sprintf(yylvalpp->symbol_name, "%d", yylvalpp->sc_int); - UngetToken(CPP_INTCONSTANT, yylvalpp); - - return 1; - } - - if (atom == __VERSION__Atom) { - yylvalpp->sc_int = GetShaderVersion(cpp->pC); - sprintf(yylvalpp->symbol_name, "%d", yylvalpp->sc_int); - UngetToken(CPP_INTCONSTANT, yylvalpp); - - return 1; - } - - // no recursive expansions - if (sym && sym->details.mac.busy) - return 0; - - // not expanding of undefined symbols - if ((! sym || sym->details.mac.undef) && ! expandUndef) - return 0; - - in = (MacroInputSrc*)malloc(sizeof(*in)); - memset(in, 0, sizeof(*in)); - in->base.line = cpp->currentInput->line; - in->base.name = cpp->currentInput->name; - - if ((! sym || sym->details.mac.undef) && expandUndef) { - // push input - in->base.scan = zero_scan; - in->base.prev = cpp->currentInput; - cpp->currentInput = &in->base; - - return -1; - } - - in->base.scan = macro_scan; - in->mac = &sym->details.mac; - if (sym->details.mac.args) { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token != '(') { - UngetToken(token, yylvalpp); - yylvalpp->sc_ident = atom; - - return 0; - } - in->args = (TokenStream**)malloc(in->mac->argc * sizeof(TokenStream *)); - for (i=0; imac->argc; i++) - in->args[i] = NewTokenStream("macro arg", 0); - i=0;j=0; - do { - depth = 0; - while (1) { - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token <= 0) { - StoreStr("EOF in Macro "); - StoreStr(GetStringOfAtom(atable, atom)); - message=GetStrfromTStr(); - ShPpErrorToInfoLog(message); - ResetTString(); - - return 1; - } - if((in->mac->argc==0) && (token!=')')) break; - if (depth == 0 && (token == ',' || token == ')')) break; - if (token == '(') depth++; - if (token == ')') depth--; - RecordToken(in->args[i], token, yylvalpp); - j=1; - } - if (token == ')') { - if((in->mac->argc==1) &&j==0) - break; - i++; - break; - } - i++; - } while (i < in->mac->argc); - - if (i < in->mac->argc) { - StoreStr("Too few args in Macro "); - StoreStr(GetStringOfAtom(atable, atom)); - message=GetStrfromTStr(); - ShPpErrorToInfoLog(message); - ResetTString(); - } else if (token != ')') { - depth=0; - while (token >= 0 && (depth > 0 || token != ')')) { - if (token == ')') depth--; - token = cpp->currentInput->scan(cpp->currentInput, yylvalpp); - if (token == '(') depth++; - } - - if (token <= 0) { - StoreStr("EOF in Macro "); - StoreStr(GetStringOfAtom(atable, atom)); - message=GetStrfromTStr(); - ShPpErrorToInfoLog(message); - ResetTString(); - - return 1; - } - StoreStr("Too many args in Macro "); - StoreStr(GetStringOfAtom(atable, atom)); - message=GetStrfromTStr(); - ShPpErrorToInfoLog(message); - ResetTString(); - } - for (i=0; imac->argc; i++) { - in->args[i] = PrescanMacroArg(in->args[i], yylvalpp); - } - } -#if 0 - printf(" <%s:%d>found macro %s\n", GetAtomString(atable, loc.file), - loc.line, GetAtomString(atable, atom)); - for (i=0; imac->argc; i++) { - printf("\targ %s = '", GetAtomString(atable, in->mac->args[i])); - DumpTokenStream(stdout, in->args[i]); - printf("'\n"); - } -#endif - /*retain the input source*/ - in->base.prev = cpp->currentInput; - sym->details.mac.busy = 1; - RewindTokenStream(sym->details.mac.body); - cpp->currentInput = &in->base; - - return 1; -} // MacroExpand - -int ChkCorrectElseNesting(void) -{ - if (cpp->elsedepth[cpp->elsetracker] == 0) { - cpp->elsedepth[cpp->elsetracker] = 1; - - return 1; - } - - return 0; -} diff --git a/glslang/MachineIndependent/preprocessor/cpp.h b/glslang/MachineIndependent/preprocessor/cpp.h deleted file mode 100644 index 7fcab551..00000000 --- a/glslang/MachineIndependent/preprocessor/cpp.h +++ /dev/null @@ -1,128 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// cpp.h -// - -#if !defined(__CPP_H) -#define __CPP_H 1 - -#include "parser.h" -#include "tokens.h" -#include "Versions.h" - -typedef struct MacroSymbol { - int argc; - int *args; - TokenStream *body; - unsigned busy:1; - unsigned undef:1; -} MacroSymbol; - -int InitCPP(void); -int FinalCPP(void); -int readCPPline(yystypepp * yylvalpp); -int MacroExpand(int atom, yystypepp * yylvalpp, int expandUndef); - -#ifdef __cplusplus -extern "C" { -#endif - -void ShPpDebugLogMsg(const char *msg); // Prints information into debug log -void ShPpErrorToInfoLog(const char*); // Store cpp Err Msg into Sh.Info.Log -void ShPpWarningToInfoLog(const char *msg); // Prints warning messages into info log -int ShPpMacrosMustBeDefinedError(); - -void HandlePragma(const char**, int numTokens); // #pragma directive container. -void ResetTString(void); // #error Message as TString. -void StoreStr(const char*); // Store the TString in Parse Context. -void SetLineNumber(int); // Set line number. -void SetStringNumber(int); // Set string number. -int GetLineNumber(void); // Get the current String Number. -int GetStringNumber(void); // Get the current String Number. -const char* GetStrfromTStr(void); // Convert TString to String. -void SetVersion(int); -int GetShaderVersion(void*); -void updateExtensionBehavior(const char* extName, const char* behavior); -int FreeCPP(void); - -#ifdef __cplusplus -} -#endif - - -#endif // !(defined(__CPP_H) diff --git a/glslang/MachineIndependent/preprocessor/cppstruct.c b/glslang/MachineIndependent/preprocessor/cppstruct.c deleted file mode 100644 index b7b65335..00000000 --- a/glslang/MachineIndependent/preprocessor/cppstruct.c +++ /dev/null @@ -1,183 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// cppstruct.c -// - -#include -#include - -#include "slglobals.h" - -CPPStruct *cpp = NULL; -static int refCount = 0; - -int ResetPreprocessor(void); -int FreeCPPStruct(void); - -/* - * InitCPPStruct() - Initilaize the CPP structure. - * - */ - -int InitCPPStruct(void) -{ - int len; - char *p; - - cpp = (CPPStruct *) malloc(sizeof(CPPStruct)); - if (cpp == NULL) - return 0; - - refCount++; - - // Initialize public members: - cpp->pLastSourceLoc = &cpp->lastSourceLoc; - - p = (char *) &cpp->options; - len = sizeof(cpp->options); - while (--len >= 0) - p[len] = 0; - - ResetPreprocessor(); - return 1; -} // InitCPPStruct - -int ResetPreprocessor(void) -{ - // Initialize private members: - - cpp->lastSourceLoc.file = 0; - cpp->lastSourceLoc.line = 0; - cpp->pC=0; - cpp->CompileError=0; - cpp->ifdepth=0; - for(cpp->elsetracker=0; cpp->elsetracker<64; cpp->elsetracker++) - cpp->elsedepth[cpp->elsetracker]=0; - cpp->elsetracker=0; - cpp->tokensBeforeEOF = 0; - return 1; -} - -//Intializing the Preprocessor. - -int InitPreprocessor(void) -{ - # define CPP_STUFF true - # ifdef CPP_STUFF - FreeCPPStruct(); - InitCPPStruct(); - cpp->options.Quiet = 1; - cpp->options.profileString = "generic"; - if (!InitAtomTable(atable, 0)) - return 1; - if (!InitScanner(cpp)) - return 1; - # endif - return 0; -} - -//FreeCPPStruct() - Free the CPP structure. - -int FreeCPPStruct(void) -{ - if (refCount) - { - free(cpp); - refCount--; - } - - return 1; -} - -//Finalizing the Preprocessor. - -int FinalizePreprocessor(void) -{ - # define CPP_STUFF true - # ifdef CPP_STUFF - FreeAtomTable(atable); - FreeCPPStruct(); - FreeScanner(); - # endif - return 0; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////// End of cppstruct.c ////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/glslang/MachineIndependent/preprocessor/memory.h b/glslang/MachineIndependent/preprocessor/memory.h deleted file mode 100644 index dbd6fbdd..00000000 --- a/glslang/MachineIndependent/preprocessor/memory.h +++ /dev/null @@ -1,89 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -#ifndef __MEMORY_H -#define __MEMORY_H - -typedef struct MemoryPool_rec MemoryPool; - -extern MemoryPool *mem_CreatePool(size_t chunksize, unsigned align); -extern void mem_FreePool(MemoryPool *); -extern void *mem_Alloc(MemoryPool *p, size_t size); -extern void *mem_Realloc(MemoryPool *p, void *old, size_t oldsize, size_t newsize); -extern int mem_AddCleanup(MemoryPool *p, void (*fn)(void *), void *arg); - -#endif /* __MEMORY_H */ diff --git a/glslang/MachineIndependent/preprocessor/preprocess.h b/glslang/MachineIndependent/preprocessor/preprocess.h deleted file mode 100644 index 22c8a28d..00000000 --- a/glslang/MachineIndependent/preprocessor/preprocess.h +++ /dev/null @@ -1,158 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ - -#ifndef PREPROCESS_H -#define PREPROCESS_H - -typedef struct SourceLoc_Rec { - int file; - int line; -} SourceLoc; - -typedef struct Options_Rec { - const char *profileString; - int ErrorMode; - int Quiet; - - // Debug The Compiler options: - int DumpAtomTable; -} Options; - -#define MAX_TOKEN_LENGTH 1024 - -typedef struct { - int ppToken; - int sc_int; - double sc_dval; - int sc_ident; - char symbol_name[MAX_TOKEN_LENGTH+1]; -} yystypepp; - -typedef struct InputSrc { - struct InputSrc *prev; - int (*scan)(struct InputSrc *, yystypepp *); - int (*getch)(struct InputSrc *, yystypepp *); - void (*ungetch)(struct InputSrc *, int, yystypepp *); - int name; /* atom */ - int line; -} InputSrc; - -typedef struct CPPStruct { - // Public members - SourceLoc *pLastSourceLoc; // Set at the start of each statement by the tree walkers - Options options; // Compile options and parameters - - // Private members - SourceLoc lastSourceLoc; - - // Scanner data: - - SourceLoc *tokenLoc; // Source location of most recent token seen by the scanner - int mostRecentToken; // Most recent token seen by the scanner - InputSrc *currentInput; - int previous_token; - int notAVersionToken; // used to make sure that #version is the first token seen in the file, if present - - void *pC; // storing the parseContext of the compile object in cpp. - - // Private members: - SourceLoc ltokenLoc; - int ifdepth; //current #if-#else-#endif nesting in the cpp.c file (pre-processor) - int elsedepth[64]; //Keep a track of #if depth..Max allowed is 64. - int elsetracker; //#if-#else and #endif constructs...Counter. - const char *ErrMsg; - int CompileError; //Indicate compile error when #error, #else,#elif mismatch. - - // - // Globals used to communicate between parseStrings() and yy_input()and - // also across the files.(gen_glslang.cpp and scanner.c) - // - int PaWhichStr; // which string we're parsing - int* PaStrLen; // array of lengths of the PaArgv strings - int PaArgc; // count of strings in the array - char** PaArgv; // our array of strings to parse - unsigned int tokensBeforeEOF : 1; -} CPPStruct; - -extern CPPStruct *cpp; - -int InitPreprocessor(void); -int FinalizePreprocessor(void); -int ScanFromString(char *s); -const char* PpTokenize(yystypepp*); - -#endif diff --git a/glslang/MachineIndependent/preprocessor/slglobals.h b/glslang/MachineIndependent/preprocessor/slglobals.h deleted file mode 100644 index 9027f0a1..00000000 --- a/glslang/MachineIndependent/preprocessor/slglobals.h +++ /dev/null @@ -1,116 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// slglobals.h -// - -#if !defined(__SLGLOBALS_H) -#define __SLGLOBALS_H 1 - -#include "preprocess.h" - -// TODO: threading: Multi-threading note: The existence of this global makes -// this preprocessing single-threaded only. -extern CPPStruct *cpp; - -#undef CPPC_DEBUG_THE_COMPILER -#if defined(_DEBUG) -#define CPPC_DEBUG_THE_COMPILER 1 -#endif - -#undef CPPC_ENABLE_TOOLS -#define CPPC_ENABLE_TOOLS 1 - -#include "memory.h" -#include "atom.h" -#include "scanner.h" -#include "cpp.h" -#include "tokens.h" -#include "symbols.h" -#if !defined(NO_PARSER) -#include "parser.h" -#endif - -#if !defined(NULL) -#define NULL 0 -#endif - -#endif // !(defined(__SLGLOBALS_H) - - - - diff --git a/glslang/MachineIndependent/preprocessor/symbols.h b/glslang/MachineIndependent/preprocessor/symbols.h deleted file mode 100644 index 3a4f6b3e..00000000 --- a/glslang/MachineIndependent/preprocessor/symbols.h +++ /dev/null @@ -1,143 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// symbols.h -// - -#if !defined(__SYMBOLS_H) -#define __SYMBOLS_H 1 - -#include "memory.h" - -typedef enum symbolkind { - MACRO_S -} symbolkind; - -// Typedefs for things defined here in "symbols.h": - -typedef struct Scope_Rec Scope; -typedef struct Symbol_Rec Symbol; - -typedef struct SymbolList_Rec { - struct SymbolList_Rec *next; - Symbol *symb; -} SymbolList; - -struct Scope_Rec { - Scope *next, *prev; // doubly-linked list of all scopes - Scope *parent; - Scope *funScope; // Points to base scope of enclosing function - MemoryPool *pool; // pool used for allocation in this scope - Symbol *symbols; - - int level; // 0 = super globals, 1 = globals, etc. - - // Only used at global scope (level 1): - SymbolList *programs; // List of programs for this compilation. -}; - - -// Symbol table is a simple binary tree. - -#include "cpp.h" // to get MacroSymbol def - -struct Symbol_Rec { - Symbol *left, *right; - Symbol *next; - int name; // Name atom - SourceLoc loc; - symbolkind kind; - union { - MacroSymbol mac; - } details; -}; - -extern Scope *CurrentScope; -extern Scope *GlobalScope; -extern Scope *ScopeList; - -Scope *NewScopeInPool(MemoryPool *); -#define NewScope() NewScopeInPool(CurrentScope->pool) -void PushScope(Scope *fScope); -Scope *PopScope(void); -Symbol *NewSymbol(SourceLoc *loc, Scope *fScope, int name, symbolkind kind); -Symbol *AddSymbol(SourceLoc *loc, Scope *fScope, int atom, symbolkind kind); -Symbol *LookUpLocalSymbol(Scope *fScope, int atom); -Symbol *LookUpSymbol(Scope *fScope, int atom); - -#endif // !defined(__SYMBOLS_H) - diff --git a/glslang/MachineIndependent/preprocessor/tokens.h b/glslang/MachineIndependent/preprocessor/tokens.h deleted file mode 100644 index dda09caa..00000000 --- a/glslang/MachineIndependent/preprocessor/tokens.h +++ /dev/null @@ -1,122 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// -/****************************************************************************\ -Copyright (c) 2002, NVIDIA Corporation. - -NVIDIA Corporation("NVIDIA") supplies this software to you in -consideration of your agreement to the following terms, and your use, -installation, modification or redistribution of this NVIDIA software -constitutes acceptance of these terms. If you do not agree with these -terms, please do not use, install, modify or redistribute this NVIDIA -software. - -In consideration of your agreement to abide by the following terms, and -subject to these terms, NVIDIA grants you a personal, non-exclusive -license, under NVIDIA's copyrights in this original NVIDIA software (the -"NVIDIA Software"), to use, reproduce, modify and redistribute the -NVIDIA Software, with or without modifications, in source and/or binary -forms; provided that if you redistribute the NVIDIA Software, you must -retain the copyright notice of NVIDIA, this notice and the following -text and disclaimers in all such redistributions of the NVIDIA Software. -Neither the name, trademarks, service marks nor logos of NVIDIA -Corporation may be used to endorse or promote products derived from the -NVIDIA Software without specific prior written permission from NVIDIA. -Except as expressly stated in this notice, no other rights or licenses -express or implied, are granted by NVIDIA herein, including but not -limited to any patent rights that may be infringed by your derivative -works or by other works in which the NVIDIA Software may be -incorporated. No hardware is licensed hereunder. - -THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, -INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR -ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER -PRODUCTS. - -IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, -INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY -OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE -NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, -TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF -NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -\****************************************************************************/ -// -// tokens.h -// - -#if !defined(__TOKENS_H) -#define __TOKENS_H 1 - -#include "parser.h" - -#define EOF_SY (-1) - -typedef struct TokenBlock_Rec TokenBlock; - -typedef struct TokenStream_Rec { - struct TokenStream_Rec *next; - char *name; - TokenBlock *head; - TokenBlock *current; -} TokenStream; - -struct TokenBlock_Rec { - TokenBlock *next; - int current; - int count; - int max; - unsigned char *data; -}; - -extern TokenStream stdlib_cpp_stream; - - -TokenStream *NewTokenStream(const char *name, MemoryPool *pool); -void DeleteTokenStream(TokenStream *pTok); -void RecordToken(TokenStream *pTok, int token, yystypepp * yylvalpp); -void RewindTokenStream(TokenStream *pTok); -int ReadToken(TokenStream *pTok, yystypepp * yylvalpp); -int ReadFromTokenStream(TokenStream *pTok, int name, int (*final)(CPPStruct *)); -void UngetToken(int, yystypepp * yylvalpp); - -#if defined(CPPC_ENABLE_TOOLS) - -void DumpTokenStream(FILE *, TokenStream *, yystypepp * yylvalpp); - -#endif // defined(CPPC_ENABLE_TOOLS) - -#endif // !defined(__TOKENS_H) diff --git a/tools/bison.exe b/tools/bison.exe index 4881bf604916b1331205bdd5f32624831e2a2331..bdc1101efbbda2be1841ae9b2d4bd52a711d49e0 100644 GIT binary patch literal 513536 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

+dILQK#P#{|NsA6 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%0DbifACK^V11u|%E1oT{~f;nT2An{ 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 z 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

5xJLrB7=r>{?5YJtkig4+@X`{HBtE}=^2Xt} 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 z + + + + + +

GNU Bison XML Automaton Report

+

+ input grammar: +

+ + +

Table of Contents

+ + + + + + +
+ + +

+ + Reductions +

+ + + +
+ + +

+ + Nonterminals useless in grammar +

+ + +

+ + + + + + +

+
+ + + +

+ + Terminals unused in grammar +

+ + +

+ + + + + + + +

+
+ + + +

+ + Rules useless in grammar +

+ + + +

+ + + + +

+
+ + + + + +

+ + Rules useless in parser due to conflicts +

+ +

+ + + +

+ + + + + +

+ + Grammar +

+ +

+ + + +

+ + + + + + + + + + + + + + + + + + + + + +

+ + Conflicts +

+ + + + + +

+ + +

+
+ + + + + + + + + +
+ + + + + + conflicts: + + + + + + + + + + + + + + +

+ + Terminals, with rules where they appear +

+ +

+ +

+ +
+ + +

+ + Nonterminals, with rules where they appear +

+ +

+ +

+ + + + + + + + + + + + + + + + + on left: + + + + + + + + + on right: + + + + + + + + + +
+ + + + + + + + +

+ + Automaton +

+ + + +
+ + + + +

+ + + + + + state + +

+ +

+ + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + ε + + + + [ + + ] + + + + + + , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + error + ( + + ) + + + + + + + + + + + + [ + + + + accept + + + + + + + + + ( + + ) + + + + ] + + + + + + + + + + + + + Conflict between + + + + + + + and token + + resolved as + + an + + + ( + + ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + diff --git a/tools/data/yacc.c b/tools/data/yacc.c new file mode 100644 index 00000000..b34549f1 --- /dev/null +++ b/tools/data/yacc.c @@ -0,0 +1,2065 @@ + -*- C -*- + +# Yacc compatible skeleton for Bison + +# Copyright (C) 1984, 1989-1990, 2000-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Check the value of %define api.push-pull. +b4_percent_define_default([[api.push-pull]], [[pull]]) +b4_percent_define_check_values([[[[api.push-pull]], + [[pull]], [[push]], [[both]]]]) +b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]]) +b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]]) +m4_case(b4_percent_define_get([[api.push-pull]]), + [pull], [m4_define([b4_push_flag], [[0]])], + [push], [m4_define([b4_pull_flag], [[0]])]) + +# Handle BISON_USE_PUSH_FOR_PULL for the test suite. So that push parsing +# tests function as written, do not let BISON_USE_PUSH_FOR_PULL modify the +# behavior of Bison at all when push parsing is already requested. +b4_define_flag_if([use_push_for_pull]) +b4_use_push_for_pull_if([ + b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])], + [m4_define([b4_push_flag], [[1]])])]) + +# Check the value of %define parse.lac and friends, where LAC stands for +# lookahead correction. +b4_percent_define_default([[parse.lac]], [[none]]) +b4_percent_define_default([[parse.lac.es-capacity-initial]], [[20]]) +b4_percent_define_default([[parse.lac.memory-trace]], [[failures]]) +b4_percent_define_check_values([[[[parse.lac]], [[full]], [[none]]]], + [[[[parse.lac.memory-trace]], + [[failures]], [[full]]]]) +b4_define_flag_if([lac]) +m4_define([b4_lac_flag], + [m4_if(b4_percent_define_get([[parse.lac]]), + [none], [[0]], [[1]])]) + +m4_include(b4_pkgdatadir/[c.m4]) + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Stack parameters. +m4_define_default([b4_stack_depth_max], [10000]) +m4_define_default([b4_stack_depth_init], [200]) + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + +b4_percent_define_default([[api.pure]], [[false]]) +b4_percent_define_check_values([[[[api.pure]], + [[false]], [[true]], [[]], [[full]]]]) + +m4_define([b4_pure_flag], [[0]]) +m4_case(b4_percent_define_get([[api.pure]]), + [false], [m4_define([b4_pure_flag], [[0]])], + [true], [m4_define([b4_pure_flag], [[1]])], + [], [m4_define([b4_pure_flag], [[1]])], + [full], [m4_define([b4_pure_flag], [[2]])]) + +m4_define([b4_pure_if], +[m4_case(b4_pure_flag, + [0], [$2], + [1], [$1], + [2], [$1])]) + [m4_fatal([invalid api.pure value: ]$1)])]) + +# b4_yyerror_arg_loc_if(ARG) +# -------------------------- +# Expand ARG iff yyerror is to be given a location as argument. +m4_define([b4_yyerror_arg_loc_if], +[b4_locations_if([m4_case(b4_pure_flag, + [1], [m4_ifset([b4_parse_param], [$1])], + [2], [$1])])]) + +# b4_yyerror_args +# --------------- +# Arguments passed to yyerror: user args plus yylloc. +m4_define([b4_yyerror_args], +[b4_yyerror_arg_loc_if([&yylloc, ])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_lex_param +# ------------ +# Accumulate in b4_lex_param all the yylex arguments. +# b4_lex_param arrives quoted twice, but we want to keep only one level. +m4_define([b4_lex_param], +m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl +b4_locations_if([, [[YYLTYPE *], [&yylloc]]])m4_ifdef([b4_lex_param], [, ])])dnl +m4_ifdef([b4_lex_param], b4_lex_param))) + + +## ------------ ## +## Data Types. ## +## ------------ ## + +# b4_int_type(MIN, MAX) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# MIN to MAX (included). Overwrite the version from c.m4, which +# uses only C89 types, so that the user can override the shorter +# types, and so that pre-C89 compilers are handled correctly. +m4_define([b4_int_type], +[m4_if(b4_ints_in($@, [0], [255]), [1], [yytype_uint8], + b4_ints_in($@, [-128], [127]), [1], [yytype_int8], + + b4_ints_in($@, [0], [65535]), [1], [yytype_uint16], + b4_ints_in($@, [-32768], [32767]), [1], [yytype_int16], + + m4_eval([0 <= $1]), [1], [unsigned int], + + [int])]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[(yyval[]m4_ifval([$1], [.$1]))]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[(yyvsp@{($2) - ($1)@}m4_ifval([$3], [.$3]))]) + + + +## ----------- ## +## Locations. ## +## ----------- ## + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[(yyloc)]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[(yylsp@{($2) - ($1)@})]) + + +## -------------- ## +## Declarations. ## +## -------------- ## + +# b4_declare_scanner_communication_variables +# ------------------------------------------ +# Declare the variables that are global, or local to YYPARSE if +# pure-parser. +m4_define([b4_declare_scanner_communication_variables], [[ +/* The lookahead symbol. */ +int yychar; + +]b4_pure_if([[ +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +static YYSTYPE yyval_default; +# define YY_INITIAL_VALUE(Value) = Value +#endif]b4_locations_if([[ +static YYLTYPE yyloc_default][]b4_yyloc_default[;]])])[ +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);]b4_locations_if([[ + +/* Location data for the lookahead symbol. */ +YYLTYPE yylloc]b4_pure_if([ = yyloc_default], [b4_yyloc_default])[; +]])b4_pure_if([], [[ + +/* Number of syntax errors so far. */ +int yynerrs;]])]) + + +# b4_declare_parser_state_variables +# --------------------------------- +# Declare all the variables that are needed to maintain the parser state +# between calls to yypush_parse. +m4_define([b4_declare_parser_state_variables], [b4_pure_if([[ + /* Number of syntax errors so far. */ + int yynerrs; +]])[ + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values.]b4_locations_if([[ + `yyls': related to locations.]])[ + + Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp;]b4_locations_if([[ + + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls; + YYLTYPE *yylsp; + + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[3];]])[ + + YYSIZE_T yystacksize;]b4_lac_if([[ + + yytype_int16 yyesa@{]b4_percent_define_get([[parse.lac.es-capacity-initial]])[@}; + yytype_int16 *yyes; + YYSIZE_T yyes_capacity;]])]) + + +# b4_declare_yyparse_push_ +# ------------------------ +# Declaration of yyparse (and dependencies) when using the push parser +# (including in pull mode). +m4_define([b4_declare_yyparse_push_], +[[#ifndef YYPUSH_MORE_DEFINED +# define YYPUSH_MORE_DEFINED +enum { YYPUSH_MORE = 4 }; +#endif + +typedef struct ]b4_prefix[pstate ]b4_prefix[pstate; + +]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param) +])b4_c_function_decl([b4_prefix[push_parse]], [[int]], + [[b4_prefix[pstate *ps]], [[ps]]]b4_pure_if([, + [[[int pushed_char]], [[pushed_char]]], + [[b4_api_PREFIX[STYPE const *pushed_val]], [[pushed_val]]]b4_locations_if([, + [[b4_api_PREFIX[LTYPE *pushed_loc]], [[pushed_loc]]]])])m4_ifset([b4_parse_param], [, + b4_parse_param])) +b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]], + [[b4_prefix[pstate *ps]], [[ps]]]m4_ifset([b4_parse_param], [, + b4_parse_param]))]) +b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]], + [[[void]], []]) +b4_c_function_decl([b4_prefix[pstate_delete]], [[void]], + [[b4_prefix[pstate *ps]], [[ps]]])dnl +]) + +# b4_declare_yyparse_ +# ------------------- +# When not the push parser. +m4_define([b4_declare_yyparse_], +[[#ifdef YYPARSE_PARAM +]b4_c_function_decl(b4_prefix[parse], [int], + [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[ +#else /* ! YYPARSE_PARAM */ +]b4_c_function_decl(b4_prefix[parse], [int], b4_parse_param)[ +#endif /* ! YYPARSE_PARAM */]dnl +]) + + +# b4_declare_yyparse +# ------------------ +m4_define([b4_declare_yyparse], +[b4_push_if([b4_declare_yyparse_push_], + [b4_declare_yyparse_])[]dnl +]) + + +# b4_shared_declarations +# ---------------------- +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. +m4_define([b4_shared_declarations], +[b4_cpp_guard_open([b4_spec_defines_file])[ +]b4_declare_yydebug[ +]b4_percent_code_get([[requires]])[ +]b4_token_enums_defines(b4_tokens)[ +]b4_declare_yylstype[ +]b4_declare_yyparse[ +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file])[]dnl +]) + + +## -------------- ## +## Output files. ## +## -------------- ## + +b4_output_begin([b4_parser_file_name]) +b4_copyright([Bison implementation for Yacc-like parsers in C], + [1984, 1989-1990, 2000-2012])[ + +/* 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 library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +]b4_identification +b4_percent_code_get([[top]])[]dnl +m4_if(b4_api_prefix, [yy], [], +[[/* Substitute the type names. */ +#define YYSTYPE ]b4_api_PREFIX[STYPE]b4_locations_if([[ +#define YYLTYPE ]b4_api_PREFIX[LTYPE]])])[ +]m4_if(b4_prefix, [yy], [], +[[/* Substitute the variable and function names. */]b4_pull_if([[ +#define yyparse ]b4_prefix[parse]])b4_push_if([[ +#define yypush_parse ]b4_prefix[push_parse]b4_pull_if([[ +#define yypull_parse ]b4_prefix[pull_parse]])[ +#define yypstate_new ]b4_prefix[pstate_new +#define yypstate_delete ]b4_prefix[pstate_delete +#define yypstate ]b4_prefix[pstate]])[ +#define yylex ]b4_prefix[lex +#define yyerror ]b4_prefix[error +#define yylval ]b4_prefix[lval +#define yychar ]b4_prefix[char +#define yydebug ]b4_prefix[debug +#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[ +#define yylloc ]b4_prefix[lloc]])])[ + +/* Copy the first part of user declarations. */ +]b4_user_pre_prologue[ + +]b4_null_define[ + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE ]b4_error_verbose_flag[ +#endif + +]m4_ifval(m4_quote(b4_spec_defines_file), +[[/* In a future release of Bison, this section will be replaced + by #include "@basename(]b4_spec_defines_file[@)". */ +]])dnl +b4_shared_declarations[ + +/* Copy the second part of user declarations. */ +]b4_user_post_prologue +b4_percent_code_get[]dnl + +[#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif ]b4_c_modern[ +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && ]b4_c_modern[ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(N) (N) +#else +]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[ +{ + return yyi; +} +#endif + +#if ]b4_lac_if([[1]], [[! defined yyoverflow || YYERROR_VERBOSE]])[ + +/* The parser invokes alloca or malloc; define the necessary symbols. */]dnl +b4_push_if([], [b4_lac_if([], [[ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && ]b4_c_modern[ +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif]])])[ + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS && ]b4_c_modern[ +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS && ]b4_c_modern[ +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif]b4_lac_if([[ +# define YYCOPY_NEEDED 1]])[ +#endif]b4_lac_if([], [[ /* ! defined yyoverflow || YYERROR_VERBOSE */]])[ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \ + && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc;]b4_locations_if([ + YYLTYPE yyls_alloc;])[ +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +]b4_locations_if( +[# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM)], +[# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM)])[ + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL ]b4_final_state_number[ +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST ]b4_last[ + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS ]b4_tokens_number[ +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS ]b4_nterms_number[ +/* YYNRULES -- Number of rules. */ +#define YYNRULES ]b4_rules_number[ +/* YYNRULES -- Number of states. */ +#define YYNSTATES ]b4_states_number[ + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK ]b4_undef_token_number[ +#define YYMAXUTOK ]b4_user_token_number_max[ + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const ]b4_int_type_for([b4_translate])[ yytranslate[] = +{ + ]b4_translate[ +}; + +#if ]b4_api_PREFIX[DEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = +{ + ]b4_prhs[ +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = +{ + ]b4_rhs[ +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const ]b4_int_type_for([b4_rline])[ yyrline[] = +{ + ]b4_rline[ +}; +#endif + +#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[ +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + ]b4_tname[ +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const ]b4_int_type_for([b4_toknum])[ yytoknum[] = +{ + ]b4_toknum[ +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const ]b4_int_type_for([b4_r1])[ yyr1[] = +{ + ]b4_r1[ +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const ]b4_int_type_for([b4_r2])[ yyr2[] = +{ + ]b4_r2[ +}; + +/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const ]b4_int_type_for([b4_defact])[ yydefact[] = +{ + ]b4_defact[ +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] = +{ + ]b4_defgoto[ +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF ]b4_pact_ninf[ +static const ]b4_int_type_for([b4_pact])[ yypact[] = +{ + ]b4_pact[ +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] = +{ + ]b4_pgoto[ +}; + +/* 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 YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF ]b4_table_ninf[ +static const ]b4_int_type_for([b4_table])[ yytable[] = +{ + ]b4_table[ +}; + +#define yypact_value_is_default(Yystate) \ + ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[ + +#define yytable_value_is_error(Yytable_value) \ + ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf])[ + +static const ]b4_int_type_for([b4_check])[ yycheck[] = +{ + ]b4_check[ +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const ]b4_int_type_for([b4_stos])[ yystos[] = +{ + ]b4_stos[ +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \]b4_lac_if([[ + YY_LAC_DISCARD ("YYBACKUP"); \]])[ + goto yybackup; \ + } \ + else \ + { \ + yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + +/* Error token number */ +#define YYTERROR 1 +#define YYERRCODE 256 + +]b4_locations_if([[ +]b4_yylloc_default_define[ +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +]])[ +]b4_yy_location_print_define[ + +/* YYLEX -- calling `yylex' with the right arguments. */ +#ifdef YYLEX_PARAM +# define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_if([, &yylloc]), ])[YYLEX_PARAM) +#else +# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ +#endif + +/* Enable debugging if requested. */ +#if ]b4_api_PREFIX[DEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value]b4_locations_if([, Location])[]b4_user_args[); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + +]b4_yy_symbol_print_generate([b4_c_function_def])[ + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +]b4_c_function_def([yy_stack_print], [static void], + [[yytype_int16 *yybottom], [yybottom]], + [[yytype_int16 *yytop], [yytop]])[ +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +]b4_c_function_def([yy_reduce_print], [static void], + [[YYSTYPE *yyvsp], [yyvsp]], + b4_locations_if([[[YYLTYPE *yylsp], [yylsp]], + ])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [, + b4_parse_param]))[ +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &]b4_rhs_value(yynrhs, yyi + 1)[ + ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl + b4_user_args[); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !]b4_api_PREFIX[DEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !]b4_api_PREFIX[DEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH ]b4_stack_depth_init[ +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH ]b4_stack_depth_max[ +#endif]b4_lac_if([[ + +/* Given a state stack such that *YYBOTTOM is its bottom, such that + *YYTOP is either its top or is YYTOP_EMPTY to indicate an empty + stack, and such that *YYCAPACITY is the maximum number of elements it + can hold without a reallocation, make sure there is enough room to + store YYADD more elements. If not, allocate a new stack using + YYSTACK_ALLOC, copy the existing elements, and adjust *YYBOTTOM, + *YYTOP, and *YYCAPACITY to reflect the new capacity and memory + location. If *YYBOTTOM != YYBOTTOM_NO_FREE, then free the old stack + using YYSTACK_FREE. Return 0 if successful or if no reallocation is + required. Return 1 if memory is exhausted. */ +static int +yy_lac_stack_realloc (YYSIZE_T *yycapacity, YYSIZE_T yyadd, +#if ]b4_api_PREFIX[DEBUG + char const *yydebug_prefix, + char const *yydebug_suffix, +#endif + yytype_int16 **yybottom, + yytype_int16 *yybottom_no_free, + yytype_int16 **yytop, yytype_int16 *yytop_empty) +{ + YYSIZE_T yysize_old = + *yytop == yytop_empty ? 0 : *yytop - *yybottom + 1; + YYSIZE_T yysize_new = yysize_old + yyadd; + if (*yycapacity < yysize_new) + { + YYSIZE_T yyalloc = 2 * yysize_new; + yytype_int16 *yybottom_new; + /* Use YYMAXDEPTH for maximum stack size given that the stack + should never need to grow larger than the main state stack + needs to grow without LAC. */ + if (YYMAXDEPTH < yysize_new) + { + YYDPRINTF ((stderr, "%smax size exceeded%s", yydebug_prefix, + yydebug_suffix)); + return 1; + } + if (YYMAXDEPTH < yyalloc) + yyalloc = YYMAXDEPTH; + yybottom_new = + (yytype_int16*) YYSTACK_ALLOC (yyalloc * sizeof *yybottom_new); + if (!yybottom_new) + { + YYDPRINTF ((stderr, "%srealloc failed%s", yydebug_prefix, + yydebug_suffix)); + return 1; + } + if (*yytop != yytop_empty) + { + YYCOPY (yybottom_new, *yybottom, yysize_old); + *yytop = yybottom_new + (yysize_old - 1); + } + if (*yybottom != yybottom_no_free) + YYSTACK_FREE (*yybottom); + *yybottom = yybottom_new; + *yycapacity = yyalloc;]m4_if(b4_percent_define_get([[parse.lac.memory-trace]]), + [full], [[ + YYDPRINTF ((stderr, "%srealloc to %lu%s", yydebug_prefix, + (unsigned long int) yyalloc, yydebug_suffix));]])[ + } + return 0; +} + +/* Establish the initial context for the current lookahead if no initial + context is currently established. + + We define a context as a snapshot of the parser stacks. We define + the initial context for a lookahead as the context in which the + parser initially examines that lookahead in order to select a + syntactic action. Thus, if the lookahead eventually proves + syntactically unacceptable (possibly in a later context reached via a + series of reductions), the initial context can be used to determine + the exact set of tokens that would be syntactically acceptable in the + lookahead's place. Moreover, it is the context after which any + further semantic actions would be erroneous because they would be + determined by a syntactically unacceptable token. + + YY_LAC_ESTABLISH should be invoked when a reduction is about to be + performed in an inconsistent state (which, for the purposes of LAC, + includes consistent states that don't know they're consistent because + their default reductions have been disabled). Iff there is a + lookahead token, it should also be invoked before reporting a syntax + error. This latter case is for the sake of the debugging output. + + For parse.lac=full, the implementation of YY_LAC_ESTABLISH is as + follows. If no initial context is currently established for the + current lookahead, then check if that lookahead can eventually be + shifted if syntactic actions continue from the current context. + Report a syntax error if it cannot. */ +#define YY_LAC_ESTABLISH \ +do { \ + if (!yy_lac_established) \ + { \ + YYDPRINTF ((stderr, \ + "LAC: initial context established for %s\n", \ + yytname[yytoken])); \ + yy_lac_established = 1; \ + { \ + int yy_lac_status = \ + yy_lac (yyesa, &yyes, &yyes_capacity, yyssp, yytoken); \ + if (yy_lac_status == 2) \ + goto yyexhaustedlab; \ + if (yy_lac_status == 1) \ + goto yyerrlab; \ + } \ + } \ +} while (YYID (0)) + +/* Discard any previous initial lookahead context because of Event, + which may be a lookahead change or an invalidation of the currently + established initial context for the current lookahead. + + The most common example of a lookahead change is a shift. An example + of both cases is syntax error recovery. That is, a syntax error + occurs when the lookahead is syntactically erroneous for the + currently established initial context, so error recovery manipulates + the parser stacks to try to find a new initial context in which the + current lookahead is syntactically acceptable. If it fails to find + such a context, it discards the lookahead. */ +#if ]b4_api_PREFIX[DEBUG +# define YY_LAC_DISCARD(Event) \ +do { \ + if (yy_lac_established) \ + { \ + if (yydebug) \ + YYFPRINTF (stderr, "LAC: initial context discarded due to " \ + Event "\n"); \ + yy_lac_established = 0; \ + } \ +} while (YYID (0)) +#else +# define YY_LAC_DISCARD(Event) yy_lac_established = 0 +#endif + +/* Given the stack whose top is *YYSSP, return 0 iff YYTOKEN can + eventually (after perhaps some reductions) be shifted, return 1 if + not, or return 2 if memory is exhausted. As preconditions and + postconditions: *YYES_CAPACITY is the allocated size of the array to + which *YYES points, and either *YYES = YYESA or *YYES points to an + array allocated with YYSTACK_ALLOC. yy_lac may overwrite the + contents of either array, alter *YYES and *YYES_CAPACITY, and free + any old *YYES other than YYESA. */ +static int +yy_lac (yytype_int16 *yyesa, yytype_int16 **yyes, + YYSIZE_T *yyes_capacity, yytype_int16 *yyssp, int yytoken) +{ + yytype_int16 *yyes_prev = yyssp; + yytype_int16 *yyesp = yyes_prev; + YYDPRINTF ((stderr, "LAC: checking lookahead %s:", yytname[yytoken])); + if (yytoken == YYUNDEFTOK) + { + YYDPRINTF ((stderr, " Always Err\n")); + return 1; + } + while (1) + { + int yyrule = yypact[*yyesp]; + if (yypact_value_is_default (yyrule) + || (yyrule += yytoken) < 0 || YYLAST < yyrule + || yycheck[yyrule] != yytoken) + { + yyrule = yydefact[*yyesp]; + if (yyrule == 0) + { + YYDPRINTF ((stderr, " Err\n")); + return 1; + } + } + else + { + yyrule = yytable[yyrule]; + if (yytable_value_is_error (yyrule)) + { + YYDPRINTF ((stderr, " Err\n")); + return 1; + } + if (0 < yyrule) + { + YYDPRINTF ((stderr, " S%d\n", yyrule)); + return 0; + } + yyrule = -yyrule; + } + { + YYSIZE_T yylen = yyr2[yyrule]; + YYDPRINTF ((stderr, " R%d", yyrule - 1)); + if (yyesp != yyes_prev) + { + YYSIZE_T yysize = yyesp - *yyes + 1; + if (yylen < yysize) + { + yyesp -= yylen; + yylen = 0; + } + else + { + yylen -= yysize; + yyesp = yyes_prev; + } + } + if (yylen) + yyesp = yyes_prev -= yylen; + } + { + int yystate; + { + int yylhs = yyr1[yyrule] - YYNTOKENS; + yystate = yypgoto[yylhs] + *yyesp; + if (yystate < 0 || YYLAST < yystate + || yycheck[yystate] != *yyesp) + yystate = yydefgoto[yylhs]; + else + yystate = yytable[yystate]; + } + if (yyesp == yyes_prev) + { + yyesp = *yyes; + *yyesp = yystate; + } + else + { + if (yy_lac_stack_realloc (yyes_capacity, 1, +#if ]b4_api_PREFIX[DEBUG + " (", ")", +#endif + yyes, yyesa, &yyesp, yyes_prev)) + { + YYDPRINTF ((stderr, "\n")); + return 2; + } + *++yyesp = yystate; + } + YYDPRINTF ((stderr, " G%d", yystate)); + } + } +}]])[ + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +]b4_c_function_def([yystrlen], [static YYSIZE_T], + [[const char *yystr], [yystr]])[ +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +]b4_c_function_def([yystpcpy], [static char *], + [[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[ +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP.]b4_lac_if([[ In order to see if a particular token T is a + valid looakhead, invoke yy_lac (YYESA, YYES, YYES_CAPACITY, YYSSP, T).]])[ + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store]b4_lac_if([[ or if + yy_lac returned 2]])[. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + ]b4_lac_if([[yytype_int16 *yyesa, yytype_int16 **yyes, + YYSIZE_T *yyes_capacity, ]])[yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULL; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + + for details. YYERROR is fine as it does not invoke this + function. + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar.]b4_lac_if([[ + In the first two cases, it might appear that the current syntax + error should have been detected in the previous state when yy_lac + was invoked. However, at that time, there might have been a + different syntax error that discarded a different initial context + during error recovery, leaving behind the current lookahead.]], [[ + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state.]])[ + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp];]b4_lac_if([[ + YYDPRINTF ((stderr, "Constructing syntax error message\n"));]])[ + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + {]b4_lac_if([], [[ + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;]])[ + int yyx;]b4_lac_if([[ + + for (yyx = 0; yyx < YYNTOKENS; ++yyx) + if (yyx != YYTERROR && yyx != YYUNDEFTOK) + { + { + int yy_lac_status = yy_lac (yyesa, yyes, yyes_capacity, + yyssp, yyx); + if (yy_lac_status == 2) + return 2; + if (yy_lac_status == 1) + continue; + }]], [[ + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + {]])[ + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + }]b4_lac_if([[ +# if ]b4_api_PREFIX[DEBUG + else if (yydebug) + YYFPRINTF (stderr, "No expected tokens.\n"); +# endif]])[ + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +]b4_yydestruct_generate([b4_c_function_def])[ + +]b4_pure_if([], [ + +b4_declare_scanner_communication_variables])[]b4_push_if([[ + +struct yypstate + {]b4_declare_parser_state_variables[ + /* Used to determine if this is the first time this instance has + been used. */ + int yynew; + };]b4_pure_if([], [[ + +static char yypstate_allocated = 0;]])b4_pull_if([ + +b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[ +{ + return yypull_parse (YY_NULL]m4_ifset([b4_parse_param], + [[, ]b4_c_args(b4_parse_param)])[); +} + +]b4_c_function_def([[yypull_parse]], [[int]], + [[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [, + b4_parse_param]))[ +{ + int yystatus; + yypstate *yyps_local;]b4_pure_if([[ + int yychar; + YYSTYPE yylval;]b4_locations_if([[ + static YYLTYPE yyloc_default][]b4_yyloc_default[; + YYLTYPE yylloc = yyloc_default;]])])[ + if (yyps) + yyps_local = yyps; + else + { + yyps_local = yypstate_new (); + if (!yyps_local) + {]b4_pure_if([[ + yyerror (]b4_yyerror_args[YY_("memory exhausted"));]], [[ + if (!yypstate_allocated) + yyerror (]b4_yyerror_args[YY_("memory exhausted"));]])[ + return 2; + } + } + do { + yychar = YYLEX; + yystatus = + yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[); + } while (yystatus == YYPUSH_MORE); + if (!yyps) + yypstate_delete (yyps_local); + return yystatus; +}]])[ + +/* Initialize the parser data structure. */ +]b4_c_function_def([[yypstate_new]], [[yypstate *]])[ +{ + yypstate *yyps;]b4_pure_if([], [[ + if (yypstate_allocated) + return YY_NULL;]])[ + yyps = (yypstate *) malloc (sizeof *yyps); + if (!yyps) + return YY_NULL; + yyps->yynew = 1;]b4_pure_if([], [[ + yypstate_allocated = 1;]])[ + return yyps; +} + +]b4_c_function_def([[yypstate_delete]], [[void]], + [[[yypstate *yyps]], [[yyps]]])[ +{ +#ifndef yyoverflow + /* If the stack was reallocated but the parse did not complete, then the + stack still needs to be freed. */ + if (!yyps->yynew && yyps->yyss != yyps->yyssa) + YYSTACK_FREE (yyps->yyss); +#endif]b4_lac_if([[ + if (!yyps->yynew && yyps->yyes != yyps->yyesa) + YYSTACK_FREE (yyps->yyes);]])[ + free (yyps);]b4_pure_if([], [[ + yypstate_allocated = 0;]])[ +} +]b4_pure_if([[ +#define ]b4_prefix[nerrs yyps->]b4_prefix[nerrs]])[ +#define yystate yyps->yystate +#define yyerrstatus yyps->yyerrstatus +#define yyssa yyps->yyssa +#define yyss yyps->yyss +#define yyssp yyps->yyssp +#define yyvsa yyps->yyvsa +#define yyvs yyps->yyvs +#define yyvsp yyps->yyvsp]b4_locations_if([[ +#define yylsa yyps->yylsa +#define yyls yyps->yyls +#define yylsp yyps->yylsp +#define yyerror_range yyps->yyerror_range]])[ +#define yystacksize yyps->yystacksize]b4_lac_if([[ +#define yyesa yyps->yyesa +#define yyes yyps->yyes +#define yyes_capacity yyps->yyes_capacity]])[ + + +/*---------------. +| yypush_parse. | +`---------------*/ + +]b4_c_function_def([[yypush_parse]], [[int]], + [[[yypstate *yyps]], [[yyps]]]b4_pure_if([, + [[[int yypushed_char]], [[yypushed_char]]], + [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([, + [[[YYLTYPE *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [, + b4_parse_param]))], [[ + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +]b4_c_function_def([yyparse], [int], + [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[ +#else /* ! YYPARSE_PARAM */ +]b4_c_function_def([yyparse], [int], b4_parse_param)[ +#endif]])[ +{]b4_pure_if([b4_declare_scanner_communication_variables +])b4_push_if([b4_pure_if([], [[ + int yypushed_char = yychar; + YYSTYPE yypushed_val = yylval;]b4_locations_if([[ + YYLTYPE yypushed_loc = yylloc;]]) +])], + [b4_declare_parser_state_variables +])b4_lac_if([[ + int yy_lac_established = 0;]])[ + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval;]b4_locations_if([[ + YYLTYPE yyloc;]])[ + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0;]b4_push_if([[ + + if (!yyps->yynew) + { + yyn = yypact[yystate]; + goto yyread_pushed_token; + }]])[ + + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa;]b4_locations_if([[ + yylsp = yyls = yylsa;]])[ + yystacksize = YYINITDEPTH;]b4_lac_if([[ + + yyes = yyesa; + yyes_capacity = sizeof yyesa / sizeof *yyes; + if (YYMAXDEPTH < yyes_capacity) + yyes_capacity = YYMAXDEPTH;]])[ + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ +]m4_ifdef([b4_initial_action], [ +b4_dollar_pushdef([m4_define([b4_dollar_dollar_used])yylval], [], + [b4_push_if([b4_pure_if([*])yypushed_loc], [yylloc])])dnl +/* User initialization code. */ +b4_user_initial_action +b4_dollar_popdef[]dnl +m4_ifdef([b4_dollar_dollar_used],[[ yyvsp[0] = yylval; +]])])dnl +b4_locations_if([[ yylsp[0] = ]b4_push_if([b4_pure_if([*])yypushed_loc], [yylloc])[; +]])dnl +[ goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss;]b4_locations_if([ + YYLTYPE *yyls1 = yyls;])[ + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([ + &yyls1, yysize * sizeof (*yylsp),])[ + &yystacksize); +]b4_locations_if([ + yyls = yyls1;])[ + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([ + YYSTACK_RELOCATE (yyls_alloc, yyls);])[ +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1;]b4_locations_if([ + yylsp = yyls + yysize - 1;])[ + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + {]b4_push_if([[ + if (!yyps->yynew) + {]b4_use_push_for_pull_if([], [[ + YYDPRINTF ((stderr, "Return for a new token:\n"));]])[ + yyresult = YYPUSH_MORE; + goto yypushreturn; + } + yyps->yynew = 0;]b4_pure_if([], [[ + /* Restoring the pushed token is only necessary for the first + yypush_parse invocation since subsequent invocations don't overwrite + it before jumping to yyread_pushed_token. */ + yychar = yypushed_char; + yylval = yypushed_val;]b4_locations_if([[ + yylloc = yypushed_loc;]])])[ +yyread_pushed_token:]])[ + YYDPRINTF ((stderr, "Reading a token: "));]b4_push_if([b4_pure_if([[ + yychar = yypushed_char; + if (yypushed_val) + yylval = *yypushed_val;]b4_locations_if([[ + if (yypushed_loc) + yylloc = *yypushed_loc;]])])], [[ + yychar = YYLEX;]])[ + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)]b4_lac_if([[ + { + YY_LAC_ESTABLISH; + goto yydefault; + }]], [[ + goto yydefault;]])[ + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab;]b4_lac_if([[ + YY_LAC_ESTABLISH;]])[ + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY;]b4_lac_if([[ + YY_LAC_DISCARD ("shift");]])[ + + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END +]b4_locations_if([ *++yylsp = yylloc;])[ + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + +]b4_locations_if( +[[ /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);]])[ + YY_REDUCE_PRINT (yyn);]b4_lac_if([[ + { + int yychar_backup = yychar; + switch (yyn) + { + ]b4_user_actions[ + default: break; + } + if (yychar_backup != yychar) + YY_LAC_DISCARD ("yychar change"); + }]], [[ + switch (yyn) + { + ]b4_user_actions[ + default: break; + }]])[ + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval;]b4_locations_if([ + *++yylsp = yyloc;])[ + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (]b4_yyerror_args[YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \]b4_lac_if([[ + yyesa, &yyes, &yyes_capacity, \]])[ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status;]b4_lac_if([[ + if (yychar != YYEMPTY) + YY_LAC_ESTABLISH;]])[ + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (]b4_yyerror_args[yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + +]b4_locations_if([[ yyerror_range[1] = yylloc;]])[ + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + +]b4_locations_if([[ yyerror_range[1] = yylsp[1-yylen]; +]])[ /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + +]b4_locations_if([[ yyerror_range[1] = *yylsp;]])[ + yydestruct ("Error: popping", + yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + }]b4_lac_if([[ + + /* If the stack popping above didn't lose the initial context for the + current lookahead token, the shift below will for sure. */ + YY_LAC_DISCARD ("error recovery");]])[ + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END +]b4_locations_if([[ + yyerror_range[2] = yylloc; + /* Using YYLLOC is tempting, but would change the location of + the lookahead. YYLOC is available though. */ + YYLLOC_DEFAULT (yyloc, yyerror_range, 2); + *++yylsp = yyloc;]])[ + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if ]b4_lac_if([[1]], [[!defined yyoverflow || YYERROR_VERBOSE]])[ +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (]b4_yyerror_args[YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[); + } + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif]b4_lac_if([[ + if (yyes != yyesa) + YYSTACK_FREE (yyes);]])b4_push_if([[ + yyps->yynew = 1; + +yypushreturn:]])[ +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +]b4_epilogue[]dnl +b4_output_end() + +b4_defines_if( +[b4_output_begin([b4_spec_defines_file])[ +]b4_copyright([Bison interface for Yacc-like parsers in C], + [1984, 1989-1990, 2000-2012])[ + +]b4_shared_declarations[ +]b4_output_end() +]) diff --git a/tools/flex.exe b/tools/flex.exe deleted file mode 100644 index 58f10ce3561e8b693e3e4d3ef247bc6507c38608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181248 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�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 literal 196096 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 diff --git a/tools/bison.hairy b/tools/bison.hairy deleted file mode 100644 index 260b687c..00000000 --- a/tools/bison.hairy +++ /dev/null @@ -1,334 +0,0 @@ - -extern int timeclock; - - -int yyerror; /* Yyerror and yycost are set by guards. */ -int yycost; /* If yyerror is set to a nonzero value by a */ - /* guard, the reduction with which the guard */ - /* is associated is not performed, and the */ - /* error recovery mechanism is invoked. */ - /* Yycost indicates the cost of performing */ - /* the reduction given the attributes of the */ - /* symbols. */ - - -/* YYMAXDEPTH indicates the size of the parser's state and value */ -/* stacks. */ - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 500 -#endif - -/* YYMAXRULES must be at least as large as the number of rules that */ -/* could be placed in the rule queue. That number could be determined */ -/* from the grammar and the size of the stack, but, as yet, it is not. */ - -#ifndef YYMAXRULES -#define YYMAXRULES 100 -#endif - -#ifndef YYMAXBACKUP -#define YYMAXBACKUP 100 -#endif - - -short yyss[YYMAXDEPTH]; /* the state stack */ -YYSTYPE yyvs[YYMAXDEPTH]; /* the semantic value stack */ -YYLTYPE yyls[YYMAXDEPTH]; /* the location stack */ -short yyrq[YYMAXRULES]; /* the rule queue */ -int yychar; /* the lookahead symbol */ - -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -YYSTYPE yytval; /* the semantic value for the state */ - /* at the top of the state stack. */ - -YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ - -YYLTYPE yytloc; /* location data for the state at the */ - /* top of the state stack */ - - -int yynunlexed; -short yyunchar[YYMAXBACKUP]; -YYSTYPE yyunval[YYMAXBACKUP]; -YYLTYPE yyunloc[YYMAXBACKUP]; - -short *yygssp; /* a pointer to the top of the state */ - /* stack; only set during error */ - /* recovery. */ - -YYSTYPE *yygvsp; /* a pointer to the top of the value */ - /* stack; only set during error */ - /* recovery. */ - -YYLTYPE *yyglsp; /* a pointer to the top of the */ - /* location stack; only set during */ - /* error recovery. */ - - -/* Yyget is an interface between the parser and the lexical analyzer. */ -/* It is costly to provide such an interface, but it avoids requiring */ -/* the lexical analyzer to be able to back up the scan. */ - -yyget() -{ - if (yynunlexed > 0) - { - yynunlexed--; - yychar = yyunchar[yynunlexed]; - yylval = yyunval[yynunlexed]; - yylloc = yyunloc[yynunlexed]; - } - else if (yychar <= 0) - yychar = 0; - else - { - yychar = yylex(); - if (yychar < 0) - yychar = 0; - else yychar = YYTRANSLATE(yychar); - } -} - - - -yyunlex(chr, val, loc) -int chr; -YYSTYPE val; -YYLTYPE loc; -{ - yyunchar[yynunlexed] = chr; - yyunval[yynunlexed] = val; - yyunloc[yynunlexed] = loc; - yynunlexed++; -} - - - -yyrestore(first, last) -register short *first; -register short *last; -{ - register short *ssp; - register short *rp; - register int symbol; - register int state; - register int tvalsaved; - - ssp = yygssp; - yyunlex(yychar, yylval, yylloc); - - tvalsaved = 0; - while (first != last) - { - symbol = yystos[*ssp]; - if (symbol < YYNTBASE) - { - yyunlex(symbol, yytval, yytloc); - tvalsaved = 1; - ssp--; - } - - ssp--; - - if (first == yyrq) - first = yyrq + YYMAXRULES; - - first--; - - for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++) - { - if (symbol < YYNTBASE) - state = yytable[yypact[*ssp] + symbol]; - else - { - state = yypgoto[symbol - YYNTBASE] + *ssp; - - if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp) - state = yytable[state]; - else - state = yydefgoto[symbol - YYNTBASE]; - } - - *++ssp = state; - } - } - - if ( ! tvalsaved && ssp > yyss) - { - yyunlex(yystos[*ssp], yytval, yytloc); - ssp--; - } - - yygssp = ssp; -} - - - -int -yyparse() -{ - register int yystate; - register int yyn; - register short *yyssp; - register short *yyrq0; - register short *yyptr; - register YYSTYPE *yyvsp; - - int yylen; - YYLTYPE *yylsp; - short *yyrq1; - short *yyrq2; - - yystate = 0; - yyssp = yyss - 1; - yyvsp = yyvs - 1; - yylsp = yyls - 1; - yyrq0 = yyrq; - yyrq1 = yyrq0; - yyrq2 = yyrq0; - - yychar = yylex(); - if (yychar < 0) - yychar = 0; - else yychar = YYTRANSLATE(yychar); - -yynewstate: - - if (yyssp >= yyss + YYMAXDEPTH - 1) - { - yyabort("Parser Stack Overflow"); - YYABORT; - } - - *++yyssp = yystate; - -yyresume: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - yyn += yychar; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar) - goto yydefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - yystate = yyn; - - yyptr = yyrq2; - while (yyptr != yyrq1) - { - yyn = *yyptr++; - yylen = yyr2[yyn]; - yyvsp -= yylen; - yylsp -= yylen; - - yyguard(yyn, yyvsp, yylsp); - if (yyerror) - goto yysemerr; - - yyaction(yyn, yyvsp, yylsp); - *++yyvsp = yyval; - - yylsp++; - if (yylen == 0) - { - yylsp->timestamp = timeclock; - yylsp->first_line = yytloc.first_line; - yylsp->first_column = yytloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } - - if (yyptr == yyrq + YYMAXRULES) - yyptr = yyrq; - } - - if (yystate == YYFINAL) - YYACCEPT; - - yyrq2 = yyptr; - yyrq1 = yyrq0; - - *++yyvsp = yytval; - *++yylsp = yytloc; - yytval = yylval; - yytloc = yylloc; - yyget(); - - goto yynewstate; - -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -yyreduce: - - *yyrq0++ = yyn; - - if (yyrq0 == yyrq + YYMAXRULES) - yyrq0 = yyrq; - - if (yyrq0 == yyrq2) - { - yyabort("Parser Rule Queue Overflow"); - YYABORT; - } - - yyssp -= yyr2[yyn]; - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yysemerr: - *--yyptr = yyn; - yyrq2 = yyptr; - yyvsp += yyr2[yyn]; - -yyerrlab: - - yygssp = yyssp; - yygvsp = yyvsp; - yyglsp = yylsp; - yyrestore(yyrq0, yyrq2); - yyrecover(); - yystate = *yygssp; - yyssp = yygssp; - yyvsp = yygvsp; - yyrq0 = yyrq; - yyrq1 = yyrq0; - yyrq2 = yyrq0; - goto yyresume; -} - -$ diff --git a/tools/bison.simple b/tools/bison.simple deleted file mode 100644 index 690fb2e5..00000000 --- a/tools/bison.simple +++ /dev/null @@ -1,699 +0,0 @@ -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not __GNUC__ */ -#if HAVE_ALLOCA_H -#include -#else /* not HAVE_ALLOCA_H */ -#ifdef _AIX - #pragma alloca -#else /* not _AIX */ -char *alloca (); -#endif /* not _AIX */ -#endif /* not HAVE_ALLOCA_H */ -#endif /* not __GNUC__ */ - -extern void yyerror(char* s); - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include -#else /* not sparc */ -#if (defined (MSDOS) && !defined (__TURBOC__)) || defined (WIN32) -#include -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - size_t count; -{ - register char *f = from; - register char *t = to; - register size_t i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, size_t count) -{ - register char *f = from; - register char *t = to; - register size_t i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifndef YYPARSE_PARAM_DECL -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -extern YY_DECL; - -int -yyparse(YYPARSE_PARAM_DECL YYPARSE_PARAM) { - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - size_t yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - size_t size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - -$ /* the action file gets copied in in place of this dollarsign */ - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} diff --git a/tools/data/Makefile.am b/tools/data/Makefile.am new file mode 100644 index 00000000..e209325c --- /dev/null +++ b/tools/data/Makefile.am @@ -0,0 +1,30 @@ +## Copyright (C) 2002, 2005-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +dist_pkgdata_DATA = README bison.m4 \ + c-like.m4 \ + c-skel.m4 c.m4 yacc.c glr.c \ + c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc stack.hh \ + java-skel.m4 java.m4 lalr1.java + +m4sugardir = $(pkgdatadir)/m4sugar +dist_m4sugar_DATA = m4sugar/m4sugar.m4 m4sugar/foreach.m4 + +xsltdir = $(pkgdatadir)/xslt +dist_xslt_DATA = \ + xslt/bison.xsl \ + xslt/xml2dot.xsl \ + xslt/xml2text.xsl \ + xslt/xml2xhtml.xsl diff --git a/tools/data/Makefile.in b/tools/data/Makefile.in new file mode 100644 index 00000000..a15e670b --- /dev/null +++ b/tools/data/Makefile.in @@ -0,0 +1,1639 @@ +# Makefile.in generated by automake 1.12.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2012 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = data +DIST_COMMON = README $(dist_m4sugar_DATA) $(dist_pkgdata_DATA) \ + $(dist_xslt_DATA) $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ + $(top_srcdir)/m4/alloca.m4 $(top_srcdir)/m4/asm-underscore.m4 \ + $(top_srcdir)/m4/assert.m4 $(top_srcdir)/m4/bison-i18n.m4 \ + $(top_srcdir)/m4/c-working.m4 $(top_srcdir)/m4/calloc.m4 \ + $(top_srcdir)/m4/close-stream.m4 $(top_srcdir)/m4/close.m4 \ + $(top_srcdir)/m4/closeout.m4 $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/config-h.m4 $(top_srcdir)/m4/configmake.m4 \ + $(top_srcdir)/m4/cxx.m4 $(top_srcdir)/m4/dirname.m4 \ + $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \ + $(top_srcdir)/m4/environ.m4 $(top_srcdir)/m4/errno_h.m4 \ + $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/exponentd.m4 \ + $(top_srcdir)/m4/exponentf.m4 $(top_srcdir)/m4/exponentl.m4 \ + $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/extern-inline.m4 \ + $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/fcntl.m4 $(top_srcdir)/m4/fcntl_h.m4 \ + $(top_srcdir)/m4/flex.m4 $(top_srcdir)/m4/float_h.m4 \ + $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpending.m4 \ + $(top_srcdir)/m4/fpieee.m4 $(top_srcdir)/m4/fprintf-posix.m4 \ + $(top_srcdir)/m4/frexp.m4 $(top_srcdir)/m4/frexpl.m4 \ + $(top_srcdir)/m4/fseterr.m4 $(top_srcdir)/m4/fstat.m4 \ + $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \ + $(top_srcdir)/m4/getline.m4 $(top_srcdir)/m4/getopt.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/gnulib-common.m4 \ + $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/include_next.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isnan.m4 \ + $(top_srcdir)/m4/isnand.m4 $(top_srcdir)/m4/isnanf.m4 \ + $(top_srcdir)/m4/isnanl.m4 $(top_srcdir)/m4/iswblank.m4 \ + $(top_srcdir)/m4/javacomp.m4 $(top_srcdir)/m4/javaexec.m4 \ + $(top_srcdir)/m4/largefile.m4 $(top_srcdir)/m4/ldexp.m4 \ + $(top_srcdir)/m4/ldexpl.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libunistring-base.m4 \ + $(top_srcdir)/m4/localcharset.m4 $(top_srcdir)/m4/locale-fr.m4 \ + $(top_srcdir)/m4/locale-ja.m4 $(top_srcdir)/m4/locale-zh.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/malloc.m4 \ + $(top_srcdir)/m4/math_h.m4 $(top_srcdir)/m4/mbchar.m4 \ + $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrtowc.m4 \ + $(top_srcdir)/m4/mbsinit.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/memchr.m4 \ + $(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/mode_t.m4 \ + $(top_srcdir)/m4/msvc-inval.m4 \ + $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/nocrash.m4 \ + $(top_srcdir)/m4/obstack-printf.m4 $(top_srcdir)/m4/off_t.m4 \ + $(top_srcdir)/m4/open.m4 $(top_srcdir)/m4/pathmax.m4 \ + $(top_srcdir)/m4/perror.m4 $(top_srcdir)/m4/pipe2.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/posix_spawn.m4 \ + $(top_srcdir)/m4/printf-frexp.m4 \ + $(top_srcdir)/m4/printf-frexpl.m4 \ + $(top_srcdir)/m4/printf-posix-rpl.m4 \ + $(top_srcdir)/m4/printf.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \ + $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/sched_h.m4 \ + $(top_srcdir)/m4/setenv.m4 $(top_srcdir)/m4/sig_atomic_t.m4 \ + $(top_srcdir)/m4/sigaction.m4 $(top_srcdir)/m4/signal_h.m4 \ + $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/signbit.m4 \ + $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/snprintf-posix.m4 \ + $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/spawn-pipe.m4 \ + $(top_srcdir)/m4/spawn_h.m4 $(top_srcdir)/m4/sprintf-posix.m4 \ + $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \ + $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \ + $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strchrnul.m4 \ + $(top_srcdir)/m4/strdup.m4 $(top_srcdir)/m4/strerror.m4 \ + $(top_srcdir)/m4/strerror_r.m4 $(top_srcdir)/m4/string_h.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/strtoul.m4 $(top_srcdir)/m4/strverscmp.m4 \ + $(top_srcdir)/m4/sys_socket_h.m4 \ + $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_types_h.m4 \ + $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/threadlib.m4 \ + $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unistd-safer.m4 $(top_srcdir)/m4/unistd_h.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/vasnprintf.m4 \ + $(top_srcdir)/m4/vfprintf-posix.m4 \ + $(top_srcdir)/m4/vsnprintf-posix.m4 \ + $(top_srcdir)/m4/vsnprintf.m4 \ + $(top_srcdir)/m4/vsprintf-posix.m4 \ + $(top_srcdir)/m4/wait-process.m4 $(top_srcdir)/m4/waitpid.m4 \ + $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/warnings.m4 \ + $(top_srcdir)/m4/wchar_h.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \ + $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/lib/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)" \ + "$(DESTDIR)$(xsltdir)" +DATA = $(dist_m4sugar_DATA) $(dist_pkgdata_DATA) $(dist_xslt_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkglibexecdir = @pkglibexecdir@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BISON_CXX_WORKS = @BISON_CXX_WORKS@ +BISON_C_WORKS = @BISON_C_WORKS@ +BISON_LOCALEDIR = @BISON_LOCALEDIR@ +BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ +BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ +BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ +BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ +BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLASSPATH = @CLASSPATH@ +CLASSPATH_SEPARATOR = @CLASSPATH_SEPARATOR@ +CONFIG_INCLUDE = @CONFIG_INCLUDE@ +CONF_JAVA = @CONF_JAVA@ +CONF_JAVAC = @CONF_JAVAC@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CXX_COMPILER_POSIXLY_CORRECT = @CXX_COMPILER_POSIXLY_CORRECT@ +CYGPATH_W = @CYGPATH_W@ +C_COMPILER_POSIXLY_CORRECT = @C_COMPILER_POSIXLY_CORRECT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DOT = @DOT@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ +EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ +ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ +ENOLINK_VALUE = @ENOLINK_VALUE@ +EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ +EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ +ERRNO_H = @ERRNO_H@ +EXEEXT = @EXEEXT@ +FLOAT_H = @FLOAT_H@ +GCC = @GCC@ +GETOPT_H = @GETOPT_H@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_ACOSF = @GNULIB_ACOSF@ +GNULIB_ACOSL = @GNULIB_ACOSL@ +GNULIB_ASINF = @GNULIB_ASINF@ +GNULIB_ASINL = @GNULIB_ASINL@ +GNULIB_ATAN2F = @GNULIB_ATAN2F@ +GNULIB_ATANF = @GNULIB_ATANF@ +GNULIB_ATANL = @GNULIB_ATANL@ +GNULIB_ATOLL = @GNULIB_ATOLL@ +GNULIB_BTOWC = @GNULIB_BTOWC@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@ +GNULIB_CBRT = @GNULIB_CBRT@ +GNULIB_CBRTF = @GNULIB_CBRTF@ +GNULIB_CBRTL = @GNULIB_CBRTL@ +GNULIB_CEIL = @GNULIB_CEIL@ +GNULIB_CEILF = @GNULIB_CEILF@ +GNULIB_CEILL = @GNULIB_CEILL@ +GNULIB_CHDIR = @GNULIB_CHDIR@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_CLOSE = @GNULIB_CLOSE@ +GNULIB_COPYSIGN = @GNULIB_COPYSIGN@ +GNULIB_COPYSIGNF = @GNULIB_COPYSIGNF@ +GNULIB_COPYSIGNL = @GNULIB_COPYSIGNL@ +GNULIB_COSF = @GNULIB_COSF@ +GNULIB_COSHF = @GNULIB_COSHF@ +GNULIB_COSL = @GNULIB_COSL@ +GNULIB_DPRINTF = @GNULIB_DPRINTF@ +GNULIB_DUP = @GNULIB_DUP@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_DUP3 = @GNULIB_DUP3@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@ +GNULIB_EXP2 = @GNULIB_EXP2@ +GNULIB_EXP2F = @GNULIB_EXP2F@ +GNULIB_EXP2L = @GNULIB_EXP2L@ +GNULIB_EXPF = @GNULIB_EXPF@ +GNULIB_EXPL = @GNULIB_EXPL@ +GNULIB_EXPM1 = @GNULIB_EXPM1@ +GNULIB_EXPM1F = @GNULIB_EXPM1F@ +GNULIB_EXPM1L = @GNULIB_EXPM1L@ +GNULIB_FABSF = @GNULIB_FABSF@ +GNULIB_FABSL = @GNULIB_FABSL@ +GNULIB_FACCESSAT = @GNULIB_FACCESSAT@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FCHMODAT = @GNULIB_FCHMODAT@ +GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@ +GNULIB_FCLOSE = @GNULIB_FCLOSE@ +GNULIB_FCNTL = @GNULIB_FCNTL@ +GNULIB_FDATASYNC = @GNULIB_FDATASYNC@ +GNULIB_FDOPEN = @GNULIB_FDOPEN@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FFSL = @GNULIB_FFSL@ +GNULIB_FFSLL = @GNULIB_FFSLL@ +GNULIB_FGETC = @GNULIB_FGETC@ +GNULIB_FGETS = @GNULIB_FGETS@ +GNULIB_FLOOR = @GNULIB_FLOOR@ +GNULIB_FLOORF = @GNULIB_FLOORF@ +GNULIB_FLOORL = @GNULIB_FLOORL@ +GNULIB_FMA = @GNULIB_FMA@ +GNULIB_FMAF = @GNULIB_FMAF@ +GNULIB_FMAL = @GNULIB_FMAL@ +GNULIB_FMOD = @GNULIB_FMOD@ +GNULIB_FMODF = @GNULIB_FMODF@ +GNULIB_FMODL = @GNULIB_FMODL@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF = @GNULIB_FPRINTF@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FPURGE = @GNULIB_FPURGE@ +GNULIB_FPUTC = @GNULIB_FPUTC@ +GNULIB_FPUTS = @GNULIB_FPUTS@ +GNULIB_FREAD = @GNULIB_FREAD@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +GNULIB_FREXP = @GNULIB_FREXP@ +GNULIB_FREXPF = @GNULIB_FREXPF@ +GNULIB_FREXPL = @GNULIB_FREXPL@ +GNULIB_FSCANF = @GNULIB_FSCANF@ +GNULIB_FSEEK = @GNULIB_FSEEK@ +GNULIB_FSEEKO = @GNULIB_FSEEKO@ +GNULIB_FSTAT = @GNULIB_FSTAT@ +GNULIB_FSTATAT = @GNULIB_FSTATAT@ +GNULIB_FSYNC = @GNULIB_FSYNC@ +GNULIB_FTELL = @GNULIB_FTELL@ +GNULIB_FTELLO = @GNULIB_FTELLO@ +GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@ +GNULIB_FUTIMENS = @GNULIB_FUTIMENS@ +GNULIB_FWRITE = @GNULIB_FWRITE@ +GNULIB_GETC = @GNULIB_GETC@ +GNULIB_GETCHAR = @GNULIB_GETCHAR@ +GNULIB_GETCWD = @GNULIB_GETCWD@ +GNULIB_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@ +GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@ +GNULIB_GETGROUPS = @GNULIB_GETGROUPS@ +GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@ +GNULIB_GETLOGIN = @GNULIB_GETLOGIN@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@ +GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@ +GNULIB_GRANTPT = @GNULIB_GRANTPT@ +GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@ +GNULIB_HYPOT = @GNULIB_HYPOT@ +GNULIB_HYPOTF = @GNULIB_HYPOTF@ +GNULIB_HYPOTL = @GNULIB_HYPOTL@ +GNULIB_ILOGB = @GNULIB_ILOGB@ +GNULIB_ILOGBF = @GNULIB_ILOGBF@ +GNULIB_ILOGBL = @GNULIB_ILOGBL@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_ISATTY = @GNULIB_ISATTY@ +GNULIB_ISFINITE = @GNULIB_ISFINITE@ +GNULIB_ISINF = @GNULIB_ISINF@ +GNULIB_ISNAN = @GNULIB_ISNAN@ +GNULIB_ISNAND = @GNULIB_ISNAND@ +GNULIB_ISNANF = @GNULIB_ISNANF@ +GNULIB_ISNANL = @GNULIB_ISNANL@ +GNULIB_ISWBLANK = @GNULIB_ISWBLANK@ +GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@ +GNULIB_LCHMOD = @GNULIB_LCHMOD@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LDEXPF = @GNULIB_LDEXPF@ +GNULIB_LDEXPL = @GNULIB_LDEXPL@ +GNULIB_LINK = @GNULIB_LINK@ +GNULIB_LINKAT = @GNULIB_LINKAT@ +GNULIB_LOG = @GNULIB_LOG@ +GNULIB_LOG10 = @GNULIB_LOG10@ +GNULIB_LOG10F = @GNULIB_LOG10F@ +GNULIB_LOG10L = @GNULIB_LOG10L@ +GNULIB_LOG1P = @GNULIB_LOG1P@ +GNULIB_LOG1PF = @GNULIB_LOG1PF@ +GNULIB_LOG1PL = @GNULIB_LOG1PL@ +GNULIB_LOG2 = @GNULIB_LOG2@ +GNULIB_LOG2F = @GNULIB_LOG2F@ +GNULIB_LOG2L = @GNULIB_LOG2L@ +GNULIB_LOGB = @GNULIB_LOGB@ +GNULIB_LOGBF = @GNULIB_LOGBF@ +GNULIB_LOGBL = @GNULIB_LOGBL@ +GNULIB_LOGF = @GNULIB_LOGF@ +GNULIB_LOGL = @GNULIB_LOGL@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_LSTAT = @GNULIB_LSTAT@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +GNULIB_MBRLEN = @GNULIB_MBRLEN@ +GNULIB_MBRTOWC = @GNULIB_MBRTOWC@ +GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@ +GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@ +GNULIB_MBSCHR = @GNULIB_MBSCHR@ +GNULIB_MBSCSPN = @GNULIB_MBSCSPN@ +GNULIB_MBSINIT = @GNULIB_MBSINIT@ +GNULIB_MBSLEN = @GNULIB_MBSLEN@ +GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@ +GNULIB_MBSNLEN = @GNULIB_MBSNLEN@ +GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@ +GNULIB_MBSPBRK = @GNULIB_MBSPBRK@ +GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@ +GNULIB_MBSRCHR = @GNULIB_MBSRCHR@ +GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@ +GNULIB_MBSSEP = @GNULIB_MBSSEP@ +GNULIB_MBSSPN = @GNULIB_MBSSPN@ +GNULIB_MBSSTR = @GNULIB_MBSSTR@ +GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@ +GNULIB_MBTOWC = @GNULIB_MBTOWC@ +GNULIB_MEMCHR = @GNULIB_MEMCHR@ +GNULIB_MEMMEM = @GNULIB_MEMMEM@ +GNULIB_MEMPCPY = @GNULIB_MEMPCPY@ +GNULIB_MEMRCHR = @GNULIB_MEMRCHR@ +GNULIB_MKDIRAT = @GNULIB_MKDIRAT@ +GNULIB_MKDTEMP = @GNULIB_MKDTEMP@ +GNULIB_MKFIFO = @GNULIB_MKFIFO@ +GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@ +GNULIB_MKNOD = @GNULIB_MKNOD@ +GNULIB_MKNODAT = @GNULIB_MKNODAT@ +GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@ +GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@ +GNULIB_MKSTEMP = @GNULIB_MKSTEMP@ +GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@ +GNULIB_MKTIME = @GNULIB_MKTIME@ +GNULIB_MODF = @GNULIB_MODF@ +GNULIB_MODFF = @GNULIB_MODFF@ +GNULIB_MODFL = @GNULIB_MODFL@ +GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@ +GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@ +GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@ +GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@ +GNULIB_OPEN = @GNULIB_OPEN@ +GNULIB_OPENAT = @GNULIB_OPENAT@ +GNULIB_PCLOSE = @GNULIB_PCLOSE@ +GNULIB_PERROR = @GNULIB_PERROR@ +GNULIB_PIPE = @GNULIB_PIPE@ +GNULIB_PIPE2 = @GNULIB_PIPE2@ +GNULIB_POPEN = @GNULIB_POPEN@ +GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@ +GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@ +GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@ +GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@ +GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@ +GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@ +GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@ +GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@ +GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@ +GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@ +GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@ +GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@ +GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@ +GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@ +GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@ +GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@ +GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@ +GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@ +GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@ +GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@ +GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@ +GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@ +GNULIB_POWF = @GNULIB_POWF@ +GNULIB_PREAD = @GNULIB_PREAD@ +GNULIB_PRINTF = @GNULIB_PRINTF@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@ +GNULIB_PTSNAME = @GNULIB_PTSNAME@ +GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@ +GNULIB_PUTC = @GNULIB_PUTC@ +GNULIB_PUTCHAR = @GNULIB_PUTCHAR@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_PUTS = @GNULIB_PUTS@ +GNULIB_PWRITE = @GNULIB_PWRITE@ +GNULIB_RAISE = @GNULIB_RAISE@ +GNULIB_RANDOM = @GNULIB_RANDOM@ +GNULIB_RANDOM_R = @GNULIB_RANDOM_R@ +GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@ +GNULIB_READ = @GNULIB_READ@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_READLINKAT = @GNULIB_READLINKAT@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_REALPATH = @GNULIB_REALPATH@ +GNULIB_REMAINDER = @GNULIB_REMAINDER@ +GNULIB_REMAINDERF = @GNULIB_REMAINDERF@ +GNULIB_REMAINDERL = @GNULIB_REMAINDERL@ +GNULIB_REMOVE = @GNULIB_REMOVE@ +GNULIB_RENAME = @GNULIB_RENAME@ +GNULIB_RENAMEAT = @GNULIB_RENAMEAT@ +GNULIB_RINT = @GNULIB_RINT@ +GNULIB_RINTF = @GNULIB_RINTF@ +GNULIB_RINTL = @GNULIB_RINTL@ +GNULIB_RMDIR = @GNULIB_RMDIR@ +GNULIB_ROUND = @GNULIB_ROUND@ +GNULIB_ROUNDF = @GNULIB_ROUNDF@ +GNULIB_ROUNDL = @GNULIB_ROUNDL@ +GNULIB_RPMATCH = @GNULIB_RPMATCH@ +GNULIB_SCANF = @GNULIB_SCANF@ +GNULIB_SETENV = @GNULIB_SETENV@ +GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@ +GNULIB_SIGACTION = @GNULIB_SIGACTION@ +GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@ +GNULIB_SIGNBIT = @GNULIB_SIGNBIT@ +GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@ +GNULIB_SINF = @GNULIB_SINF@ +GNULIB_SINHF = @GNULIB_SINHF@ +GNULIB_SINL = @GNULIB_SINL@ +GNULIB_SLEEP = @GNULIB_SLEEP@ +GNULIB_SNPRINTF = @GNULIB_SNPRINTF@ +GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@ +GNULIB_SQRTF = @GNULIB_SQRTF@ +GNULIB_SQRTL = @GNULIB_SQRTL@ +GNULIB_STAT = @GNULIB_STAT@ +GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@ +GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@ +GNULIB_STPCPY = @GNULIB_STPCPY@ +GNULIB_STPNCPY = @GNULIB_STPNCPY@ +GNULIB_STRCASESTR = @GNULIB_STRCASESTR@ +GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@ +GNULIB_STRDUP = @GNULIB_STRDUP@ +GNULIB_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRERROR_R = @GNULIB_STRERROR_R@ +GNULIB_STRNCAT = @GNULIB_STRNCAT@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRPTIME = @GNULIB_STRPTIME@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOLL = @GNULIB_STRTOLL@ +GNULIB_STRTOULL = @GNULIB_STRTOULL@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@ +GNULIB_SYMLINK = @GNULIB_SYMLINK@ +GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@ +GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@ +GNULIB_TANF = @GNULIB_TANF@ +GNULIB_TANHF = @GNULIB_TANHF@ +GNULIB_TANL = @GNULIB_TANL@ +GNULIB_TIMEGM = @GNULIB_TIMEGM@ +GNULIB_TIME_R = @GNULIB_TIME_R@ +GNULIB_TMPFILE = @GNULIB_TMPFILE@ +GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@ +GNULIB_TRUNC = @GNULIB_TRUNC@ +GNULIB_TRUNCF = @GNULIB_TRUNCF@ +GNULIB_TRUNCL = @GNULIB_TRUNCL@ +GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@ +GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@ +GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@ +GNULIB_UNLINK = @GNULIB_UNLINK@ +GNULIB_UNLINKAT = @GNULIB_UNLINKAT@ +GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +GNULIB_USLEEP = @GNULIB_USLEEP@ +GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@ +GNULIB_VASPRINTF = @GNULIB_VASPRINTF@ +GNULIB_VDPRINTF = @GNULIB_VDPRINTF@ +GNULIB_VFPRINTF = @GNULIB_VFPRINTF@ +GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@ +GNULIB_VFSCANF = @GNULIB_VFSCANF@ +GNULIB_VPRINTF = @GNULIB_VPRINTF@ +GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@ +GNULIB_VSCANF = @GNULIB_VSCANF@ +GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@ +GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@ +GNULIB_WAITPID = @GNULIB_WAITPID@ +GNULIB_WCPCPY = @GNULIB_WCPCPY@ +GNULIB_WCPNCPY = @GNULIB_WCPNCPY@ +GNULIB_WCRTOMB = @GNULIB_WCRTOMB@ +GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@ +GNULIB_WCSCAT = @GNULIB_WCSCAT@ +GNULIB_WCSCHR = @GNULIB_WCSCHR@ +GNULIB_WCSCMP = @GNULIB_WCSCMP@ +GNULIB_WCSCOLL = @GNULIB_WCSCOLL@ +GNULIB_WCSCPY = @GNULIB_WCSCPY@ +GNULIB_WCSCSPN = @GNULIB_WCSCSPN@ +GNULIB_WCSDUP = @GNULIB_WCSDUP@ +GNULIB_WCSLEN = @GNULIB_WCSLEN@ +GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@ +GNULIB_WCSNCAT = @GNULIB_WCSNCAT@ +GNULIB_WCSNCMP = @GNULIB_WCSNCMP@ +GNULIB_WCSNCPY = @GNULIB_WCSNCPY@ +GNULIB_WCSNLEN = @GNULIB_WCSNLEN@ +GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@ +GNULIB_WCSPBRK = @GNULIB_WCSPBRK@ +GNULIB_WCSRCHR = @GNULIB_WCSRCHR@ +GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@ +GNULIB_WCSSPN = @GNULIB_WCSSPN@ +GNULIB_WCSSTR = @GNULIB_WCSSTR@ +GNULIB_WCSTOK = @GNULIB_WCSTOK@ +GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@ +GNULIB_WCSXFRM = @GNULIB_WCSXFRM@ +GNULIB_WCTOB = @GNULIB_WCTOB@ +GNULIB_WCTOMB = @GNULIB_WCTOMB@ +GNULIB_WCTRANS = @GNULIB_WCTRANS@ +GNULIB_WCTYPE = @GNULIB_WCTYPE@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GNULIB_WMEMCHR = @GNULIB_WMEMCHR@ +GNULIB_WMEMCMP = @GNULIB_WMEMCMP@ +GNULIB_WMEMCPY = @GNULIB_WMEMCPY@ +GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@ +GNULIB_WMEMSET = @GNULIB_WMEMSET@ +GNULIB_WRITE = @GNULIB_WRITE@ +GNULIB__EXIT = @GNULIB__EXIT@ +GREP = @GREP@ +HAVE_ACOSF = @HAVE_ACOSF@ +HAVE_ACOSL = @HAVE_ACOSL@ +HAVE_ASINF = @HAVE_ASINF@ +HAVE_ASINL = @HAVE_ASINL@ +HAVE_ATAN2F = @HAVE_ATAN2F@ +HAVE_ATANF = @HAVE_ATANF@ +HAVE_ATANL = @HAVE_ATANL@ +HAVE_ATOLL = @HAVE_ATOLL@ +HAVE_BTOWC = @HAVE_BTOWC@ +HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ +HAVE_CBRT = @HAVE_CBRT@ +HAVE_CBRTF = @HAVE_CBRTF@ +HAVE_CBRTL = @HAVE_CBRTL@ +HAVE_CHOWN = @HAVE_CHOWN@ +HAVE_COPYSIGN = @HAVE_COPYSIGN@ +HAVE_COPYSIGNL = @HAVE_COPYSIGNL@ +HAVE_COSF = @HAVE_COSF@ +HAVE_COSHF = @HAVE_COSHF@ +HAVE_COSL = @HAVE_COSL@ +HAVE_DECL_ACOSL = @HAVE_DECL_ACOSL@ +HAVE_DECL_ASINL = @HAVE_DECL_ASINL@ +HAVE_DECL_ATANL = @HAVE_DECL_ATANL@ +HAVE_DECL_CBRTF = @HAVE_DECL_CBRTF@ +HAVE_DECL_CBRTL = @HAVE_DECL_CBRTL@ +HAVE_DECL_CEILF = @HAVE_DECL_CEILF@ +HAVE_DECL_CEILL = @HAVE_DECL_CEILL@ +HAVE_DECL_COPYSIGNF = @HAVE_DECL_COPYSIGNF@ +HAVE_DECL_COSL = @HAVE_DECL_COSL@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_EXP2 = @HAVE_DECL_EXP2@ +HAVE_DECL_EXP2F = @HAVE_DECL_EXP2F@ +HAVE_DECL_EXP2L = @HAVE_DECL_EXP2L@ +HAVE_DECL_EXPL = @HAVE_DECL_EXPL@ +HAVE_DECL_EXPM1L = @HAVE_DECL_EXPM1L@ +HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ +HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ +HAVE_DECL_FLOORF = @HAVE_DECL_FLOORF@ +HAVE_DECL_FLOORL = @HAVE_DECL_FLOORL@ +HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ +HAVE_DECL_FREXPL = @HAVE_DECL_FREXPL@ +HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ +HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ +HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ +HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ +HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ +HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@ +HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@ +HAVE_DECL_LDEXPL = @HAVE_DECL_LDEXPL@ +HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ +HAVE_DECL_LOG10L = @HAVE_DECL_LOG10L@ +HAVE_DECL_LOG2 = @HAVE_DECL_LOG2@ +HAVE_DECL_LOG2F = @HAVE_DECL_LOG2F@ +HAVE_DECL_LOG2L = @HAVE_DECL_LOG2L@ +HAVE_DECL_LOGB = @HAVE_DECL_LOGB@ +HAVE_DECL_LOGL = @HAVE_DECL_LOGL@ +HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ +HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ +HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ +HAVE_DECL_REMAINDER = @HAVE_DECL_REMAINDER@ +HAVE_DECL_REMAINDERL = @HAVE_DECL_REMAINDERL@ +HAVE_DECL_RINTF = @HAVE_DECL_RINTF@ +HAVE_DECL_ROUND = @HAVE_DECL_ROUND@ +HAVE_DECL_ROUNDF = @HAVE_DECL_ROUNDF@ +HAVE_DECL_ROUNDL = @HAVE_DECL_ROUNDL@ +HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ +HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ +HAVE_DECL_SINL = @HAVE_DECL_SINL@ +HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ +HAVE_DECL_SQRTL = @HAVE_DECL_SQRTL@ +HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ +HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_TANL = @HAVE_DECL_TANL@ +HAVE_DECL_TRUNC = @HAVE_DECL_TRUNC@ +HAVE_DECL_TRUNCF = @HAVE_DECL_TRUNCF@ +HAVE_DECL_TRUNCL = @HAVE_DECL_TRUNCL@ +HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ +HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DPRINTF = @HAVE_DPRINTF@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_DUP3 = @HAVE_DUP3@ +HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ +HAVE_EXPF = @HAVE_EXPF@ +HAVE_EXPL = @HAVE_EXPL@ +HAVE_EXPM1 = @HAVE_EXPM1@ +HAVE_EXPM1F = @HAVE_EXPM1F@ +HAVE_FABSF = @HAVE_FABSF@ +HAVE_FABSL = @HAVE_FABSL@ +HAVE_FACCESSAT = @HAVE_FACCESSAT@ +HAVE_FCHDIR = @HAVE_FCHDIR@ +HAVE_FCHMODAT = @HAVE_FCHMODAT@ +HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ +HAVE_FCNTL = @HAVE_FCNTL@ +HAVE_FDATASYNC = @HAVE_FDATASYNC@ +HAVE_FEATURES_H = @HAVE_FEATURES_H@ +HAVE_FFSL = @HAVE_FFSL@ +HAVE_FFSLL = @HAVE_FFSLL@ +HAVE_FMA = @HAVE_FMA@ +HAVE_FMAF = @HAVE_FMAF@ +HAVE_FMAL = @HAVE_FMAL@ +HAVE_FMODF = @HAVE_FMODF@ +HAVE_FMODL = @HAVE_FMODL@ +HAVE_FREXPF = @HAVE_FREXPF@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FSTATAT = @HAVE_FSTATAT@ +HAVE_FSYNC = @HAVE_FSYNC@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_FUTIMENS = @HAVE_FUTIMENS@ +HAVE_GCJ_C = @HAVE_GCJ_C@ +HAVE_GCJ_IN_PATH = @HAVE_GCJ_IN_PATH@ +HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ +HAVE_GETGROUPS = @HAVE_GETGROUPS@ +HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ +HAVE_GETLOGIN = @HAVE_GETLOGIN@ +HAVE_GETOPT_H = @HAVE_GETOPT_H@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ +HAVE_GIJ = @HAVE_GIJ@ +HAVE_GIJ_IN_PATH = @HAVE_GIJ_IN_PATH@ +HAVE_GRANTPT = @HAVE_GRANTPT@ +HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ +HAVE_HYPOTF = @HAVE_HYPOTF@ +HAVE_HYPOTL = @HAVE_HYPOTL@ +HAVE_ILOGB = @HAVE_ILOGB@ +HAVE_ILOGBF = @HAVE_ILOGBF@ +HAVE_ILOGBL = @HAVE_ILOGBL@ +HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ +HAVE_ISNAND = @HAVE_ISNAND@ +HAVE_ISNANF = @HAVE_ISNANF@ +HAVE_ISNANL = @HAVE_ISNANL@ +HAVE_ISWBLANK = @HAVE_ISWBLANK@ +HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ +HAVE_JAVA = @HAVE_JAVA@ +HAVE_JAVAC = @HAVE_JAVAC@ +HAVE_JAVAC_ENVVAR = @HAVE_JAVAC_ENVVAR@ +HAVE_JAVAC_IN_PATH = @HAVE_JAVAC_IN_PATH@ +HAVE_JAVA_ENVVAR = @HAVE_JAVA_ENVVAR@ +HAVE_JAVA_IN_PATH = @HAVE_JAVA_IN_PATH@ +HAVE_JIKES = @HAVE_JIKES@ +HAVE_JIKES_IN_PATH = @HAVE_JIKES_IN_PATH@ +HAVE_JRE = @HAVE_JRE@ +HAVE_JRE_IN_PATH = @HAVE_JRE_IN_PATH@ +HAVE_JVIEW = @HAVE_JVIEW@ +HAVE_JVIEW_IN_PATH = @HAVE_JVIEW_IN_PATH@ +HAVE_LCHMOD = @HAVE_LCHMOD@ +HAVE_LCHOWN = @HAVE_LCHOWN@ +HAVE_LDEXPF = @HAVE_LDEXPF@ +HAVE_LINK = @HAVE_LINK@ +HAVE_LINKAT = @HAVE_LINKAT@ +HAVE_LOG10F = @HAVE_LOG10F@ +HAVE_LOG10L = @HAVE_LOG10L@ +HAVE_LOG1P = @HAVE_LOG1P@ +HAVE_LOG1PF = @HAVE_LOG1PF@ +HAVE_LOG1PL = @HAVE_LOG1PL@ +HAVE_LOGBF = @HAVE_LOGBF@ +HAVE_LOGBL = @HAVE_LOGBL@ +HAVE_LOGF = @HAVE_LOGF@ +HAVE_LOGL = @HAVE_LOGL@ +HAVE_LONG_LONG_INT = @HAVE_LONG_LONG_INT@ +HAVE_LSTAT = @HAVE_LSTAT@ +HAVE_MBRLEN = @HAVE_MBRLEN@ +HAVE_MBRTOWC = @HAVE_MBRTOWC@ +HAVE_MBSINIT = @HAVE_MBSINIT@ +HAVE_MBSLEN = @HAVE_MBSLEN@ +HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ +HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ +HAVE_MEMCHR = @HAVE_MEMCHR@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDIRAT = @HAVE_MKDIRAT@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_MKFIFO = @HAVE_MKFIFO@ +HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ +HAVE_MKNOD = @HAVE_MKNOD@ +HAVE_MKNODAT = @HAVE_MKNODAT@ +HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ +HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ +HAVE_MKSTEMP = @HAVE_MKSTEMP@ +HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ +HAVE_MODFF = @HAVE_MODFF@ +HAVE_MODFL = @HAVE_MODFL@ +HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ +HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ +HAVE_OPENAT = @HAVE_OPENAT@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_PCLOSE = @HAVE_PCLOSE@ +HAVE_PIPE = @HAVE_PIPE@ +HAVE_PIPE2 = @HAVE_PIPE2@ +HAVE_POPEN = @HAVE_POPEN@ +HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ +HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ +HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@ +HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@ +HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@ +HAVE_POWF = @HAVE_POWF@ +HAVE_PREAD = @HAVE_PREAD@ +HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ +HAVE_PTSNAME = @HAVE_PTSNAME@ +HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ +HAVE_PWRITE = @HAVE_PWRITE@ +HAVE_RAISE = @HAVE_RAISE@ +HAVE_RANDOM = @HAVE_RANDOM@ +HAVE_RANDOM_H = @HAVE_RANDOM_H@ +HAVE_RANDOM_R = @HAVE_RANDOM_R@ +HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_READLINKAT = @HAVE_READLINKAT@ +HAVE_REALPATH = @HAVE_REALPATH@ +HAVE_REMAINDER = @HAVE_REMAINDER@ +HAVE_REMAINDERF = @HAVE_REMAINDERF@ +HAVE_RENAMEAT = @HAVE_RENAMEAT@ +HAVE_RINT = @HAVE_RINT@ +HAVE_RINTL = @HAVE_RINTL@ +HAVE_RPMATCH = @HAVE_RPMATCH@ +HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = @HAVE_SAME_LONG_DOUBLE_AS_DOUBLE@ +HAVE_SCHED_H = @HAVE_SCHED_H@ +HAVE_SETENV = @HAVE_SETENV@ +HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ +HAVE_SIGACTION = @HAVE_SIGACTION@ +HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ +HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ +HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ +HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ +HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ +HAVE_SIGSET_T = @HAVE_SIGSET_T@ +HAVE_SINF = @HAVE_SINF@ +HAVE_SINHF = @HAVE_SINHF@ +HAVE_SINL = @HAVE_SINL@ +HAVE_SLEEP = @HAVE_SLEEP@ +HAVE_SPAWN_H = @HAVE_SPAWN_H@ +HAVE_SQRTF = @HAVE_SQRTF@ +HAVE_SQRTL = @HAVE_SQRTL@ +HAVE_STDINT_H = @HAVE_STDINT_H@ +HAVE_STPCPY = @HAVE_STPCPY@ +HAVE_STPNCPY = @HAVE_STPNCPY@ +HAVE_STRCASESTR = @HAVE_STRCASESTR@ +HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ +HAVE_STRPBRK = @HAVE_STRPBRK@ +HAVE_STRPTIME = @HAVE_STRPTIME@ +HAVE_STRSEP = @HAVE_STRSEP@ +HAVE_STRTOD = @HAVE_STRTOD@ +HAVE_STRTOLL = @HAVE_STRTOLL@ +HAVE_STRTOULL = @HAVE_STRTOULL@ +HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ +HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@ +HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ +HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ +HAVE_SYMLINK = @HAVE_SYMLINK@ +HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ +HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ +HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ +HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ +HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_TANF = @HAVE_TANF@ +HAVE_TANHF = @HAVE_TANHF@ +HAVE_TANL = @HAVE_TANL@ +HAVE_TIMEGM = @HAVE_TIMEGM@ +HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNLINKAT = @HAVE_UNLINKAT@ +HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_USLEEP = @HAVE_USLEEP@ +HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_VDPRINTF = @HAVE_VDPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCHAR_T = @HAVE_WCHAR_T@ +HAVE_WCPCPY = @HAVE_WCPCPY@ +HAVE_WCPNCPY = @HAVE_WCPNCPY@ +HAVE_WCRTOMB = @HAVE_WCRTOMB@ +HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ +HAVE_WCSCAT = @HAVE_WCSCAT@ +HAVE_WCSCHR = @HAVE_WCSCHR@ +HAVE_WCSCMP = @HAVE_WCSCMP@ +HAVE_WCSCOLL = @HAVE_WCSCOLL@ +HAVE_WCSCPY = @HAVE_WCSCPY@ +HAVE_WCSCSPN = @HAVE_WCSCSPN@ +HAVE_WCSDUP = @HAVE_WCSDUP@ +HAVE_WCSLEN = @HAVE_WCSLEN@ +HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ +HAVE_WCSNCAT = @HAVE_WCSNCAT@ +HAVE_WCSNCMP = @HAVE_WCSNCMP@ +HAVE_WCSNCPY = @HAVE_WCSNCPY@ +HAVE_WCSNLEN = @HAVE_WCSNLEN@ +HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ +HAVE_WCSPBRK = @HAVE_WCSPBRK@ +HAVE_WCSRCHR = @HAVE_WCSRCHR@ +HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ +HAVE_WCSSPN = @HAVE_WCSSPN@ +HAVE_WCSSTR = @HAVE_WCSSTR@ +HAVE_WCSTOK = @HAVE_WCSTOK@ +HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ +HAVE_WCSXFRM = @HAVE_WCSXFRM@ +HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ +HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE_WMEMCHR = @HAVE_WMEMCHR@ +HAVE_WMEMCMP = @HAVE_WMEMCMP@ +HAVE_WMEMCPY = @HAVE_WMEMCPY@ +HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ +HAVE_WMEMSET = @HAVE_WMEMSET@ +HAVE__BOOL = @HAVE__BOOL@ +HAVE__EXIT = @HAVE__EXIT@ +HELP2MAN = @HELP2MAN@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +ISNAND_LIBM = @ISNAND_LIBM@ +ISNANF_LIBM = @ISNANF_LIBM@ +ISNANL_LIBM = @ISNANL_LIBM@ +ISNAN_LIBM = @ISNAN_LIBM@ +LDEXPL_LIBM = @LDEXPL_LIBM@ +LDEXP_LIBM = @LDEXP_LIBM@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_IS_FLEX = @LEX_IS_FLEX@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBBISON_LIBDEPS = @LIBBISON_LIBDEPS@ +LIBBISON_LTLIBDEPS = @LIBBISON_LTLIBDEPS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@ +LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ +LOCALE_JA = @LOCALE_JA@ +LOCALE_ZH_CN = @LOCALE_ZH_CN@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +M4 = @M4@ +M4_DEBUGFILE = @M4_DEBUGFILE@ +M4_GNU = @M4_GNU@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ +NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ +NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ +NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ +NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@ +NEXT_AS_FIRST_DIRECTIVE_MATH_H = @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ +NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@ +NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ +NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@ +NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ +NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ +NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ +NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ +NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@ +NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ +NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ +NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ +NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ +NEXT_ERRNO_H = @NEXT_ERRNO_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_GETOPT_H = @NEXT_GETOPT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_MATH_H = @NEXT_MATH_H@ +NEXT_SCHED_H = @NEXT_SCHED_H@ +NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ +NEXT_SPAWN_H = @NEXT_SPAWN_H@ +NEXT_STDDEF_H = @NEXT_STDDEF_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ +NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_COPYRIGHT_YEAR = @PACKAGE_COPYRIGHT_YEAR@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSUB = @POSUB@ +PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ +PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ +PRIPTR_PREFIX = @PRIPTR_PREFIX@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ +PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ +RANLIB = @RANLIB@ +REPLACE_BTOWC = @REPLACE_BTOWC@ +REPLACE_CALLOC = @REPLACE_CALLOC@ +REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ +REPLACE_CBRTF = @REPLACE_CBRTF@ +REPLACE_CBRTL = @REPLACE_CBRTL@ +REPLACE_CEIL = @REPLACE_CEIL@ +REPLACE_CEILF = @REPLACE_CEILF@ +REPLACE_CEILL = @REPLACE_CEILL@ +REPLACE_CHOWN = @REPLACE_CHOWN@ +REPLACE_CLOSE = @REPLACE_CLOSE@ +REPLACE_DPRINTF = @REPLACE_DPRINTF@ +REPLACE_DUP = @REPLACE_DUP@ +REPLACE_DUP2 = @REPLACE_DUP2@ +REPLACE_EXP2 = @REPLACE_EXP2@ +REPLACE_EXP2L = @REPLACE_EXP2L@ +REPLACE_EXPM1 = @REPLACE_EXPM1@ +REPLACE_EXPM1F = @REPLACE_EXPM1F@ +REPLACE_FABSL = @REPLACE_FABSL@ +REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ +REPLACE_FCLOSE = @REPLACE_FCLOSE@ +REPLACE_FCNTL = @REPLACE_FCNTL@ +REPLACE_FDOPEN = @REPLACE_FDOPEN@ +REPLACE_FFLUSH = @REPLACE_FFLUSH@ +REPLACE_FLOOR = @REPLACE_FLOOR@ +REPLACE_FLOORF = @REPLACE_FLOORF@ +REPLACE_FLOORL = @REPLACE_FLOORL@ +REPLACE_FMA = @REPLACE_FMA@ +REPLACE_FMAF = @REPLACE_FMAF@ +REPLACE_FMAL = @REPLACE_FMAL@ +REPLACE_FMOD = @REPLACE_FMOD@ +REPLACE_FMODF = @REPLACE_FMODF@ +REPLACE_FMODL = @REPLACE_FMODL@ +REPLACE_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FPURGE = @REPLACE_FPURGE@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FREXP = @REPLACE_FREXP@ +REPLACE_FREXPF = @REPLACE_FREXPF@ +REPLACE_FREXPL = @REPLACE_FREXPL@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FSTAT = @REPLACE_FSTAT@ +REPLACE_FSTATAT = @REPLACE_FSTATAT@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ +REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETDELIM = @REPLACE_GETDELIM@ +REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ +REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_HUGE_VAL = @REPLACE_HUGE_VAL@ +REPLACE_HYPOT = @REPLACE_HYPOT@ +REPLACE_HYPOTF = @REPLACE_HYPOTF@ +REPLACE_HYPOTL = @REPLACE_HYPOTL@ +REPLACE_ILOGB = @REPLACE_ILOGB@ +REPLACE_ILOGBF = @REPLACE_ILOGBF@ +REPLACE_ISATTY = @REPLACE_ISATTY@ +REPLACE_ISFINITE = @REPLACE_ISFINITE@ +REPLACE_ISINF = @REPLACE_ISINF@ +REPLACE_ISNAN = @REPLACE_ISNAN@ +REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ +REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ +REPLACE_ITOLD = @REPLACE_ITOLD@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LDEXPL = @REPLACE_LDEXPL@ +REPLACE_LINK = @REPLACE_LINK@ +REPLACE_LINKAT = @REPLACE_LINKAT@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LOG = @REPLACE_LOG@ +REPLACE_LOG10 = @REPLACE_LOG10@ +REPLACE_LOG10F = @REPLACE_LOG10F@ +REPLACE_LOG10L = @REPLACE_LOG10L@ +REPLACE_LOG1P = @REPLACE_LOG1P@ +REPLACE_LOG1PF = @REPLACE_LOG1PF@ +REPLACE_LOG1PL = @REPLACE_LOG1PL@ +REPLACE_LOG2 = @REPLACE_LOG2@ +REPLACE_LOG2F = @REPLACE_LOG2F@ +REPLACE_LOG2L = @REPLACE_LOG2L@ +REPLACE_LOGB = @REPLACE_LOGB@ +REPLACE_LOGBF = @REPLACE_LOGBF@ +REPLACE_LOGBL = @REPLACE_LOGBL@ +REPLACE_LOGF = @REPLACE_LOGF@ +REPLACE_LOGL = @REPLACE_LOGL@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_LSTAT = @REPLACE_LSTAT@ +REPLACE_MALLOC = @REPLACE_MALLOC@ +REPLACE_MBRLEN = @REPLACE_MBRLEN@ +REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ +REPLACE_MBSINIT = @REPLACE_MBSINIT@ +REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ +REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ +REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ +REPLACE_MBTOWC = @REPLACE_MBTOWC@ +REPLACE_MEMCHR = @REPLACE_MEMCHR@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKDIR = @REPLACE_MKDIR@ +REPLACE_MKFIFO = @REPLACE_MKFIFO@ +REPLACE_MKNOD = @REPLACE_MKNOD@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_MKTIME = @REPLACE_MKTIME@ +REPLACE_MODF = @REPLACE_MODF@ +REPLACE_MODFF = @REPLACE_MODFF@ +REPLACE_MODFL = @REPLACE_MODFL@ +REPLACE_NAN = @REPLACE_NAN@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_NULL = @REPLACE_NULL@ +REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_OPENAT = @REPLACE_OPENAT@ +REPLACE_PERROR = @REPLACE_PERROR@ +REPLACE_POPEN = @REPLACE_POPEN@ +REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@ +REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@ +REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@ +REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@ +REPLACE_PREAD = @REPLACE_PREAD@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ +REPLACE_PTSNAME = @REPLACE_PTSNAME@ +REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_PWRITE = @REPLACE_PWRITE@ +REPLACE_RAISE = @REPLACE_RAISE@ +REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ +REPLACE_READ = @REPLACE_READ@ +REPLACE_READLINK = @REPLACE_READLINK@ +REPLACE_REALLOC = @REPLACE_REALLOC@ +REPLACE_REALPATH = @REPLACE_REALPATH@ +REPLACE_REMAINDER = @REPLACE_REMAINDER@ +REPLACE_REMAINDERF = @REPLACE_REMAINDERF@ +REPLACE_REMAINDERL = @REPLACE_REMAINDERL@ +REPLACE_REMOVE = @REPLACE_REMOVE@ +REPLACE_RENAME = @REPLACE_RENAME@ +REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ +REPLACE_RMDIR = @REPLACE_RMDIR@ +REPLACE_ROUND = @REPLACE_ROUND@ +REPLACE_ROUNDF = @REPLACE_ROUNDF@ +REPLACE_ROUNDL = @REPLACE_ROUNDL@ +REPLACE_SETENV = @REPLACE_SETENV@ +REPLACE_SIGNBIT = @REPLACE_SIGNBIT@ +REPLACE_SIGNBIT_USING_GCC = @REPLACE_SIGNBIT_USING_GCC@ +REPLACE_SLEEP = @REPLACE_SLEEP@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_SQRTL = @REPLACE_SQRTL@ +REPLACE_STAT = @REPLACE_STAT@ +REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ +REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ +REPLACE_STPNCPY = @REPLACE_STPNCPY@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ +REPLACE_STRDUP = @REPLACE_STRDUP@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ +REPLACE_STRNCAT = @REPLACE_STRNCAT@ +REPLACE_STRNDUP = @REPLACE_STRNDUP@ +REPLACE_STRNLEN = @REPLACE_STRNLEN@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@ +REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ +REPLACE_SYMLINK = @REPLACE_SYMLINK@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_TMPFILE = @REPLACE_TMPFILE@ +REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ +REPLACE_TRUNC = @REPLACE_TRUNC@ +REPLACE_TRUNCF = @REPLACE_TRUNCF@ +REPLACE_TRUNCL = @REPLACE_TRUNCL@ +REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ +REPLACE_UNLINK = @REPLACE_UNLINK@ +REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ +REPLACE_UNSETENV = @REPLACE_UNSETENV@ +REPLACE_USLEEP = @REPLACE_USLEEP@ +REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ +REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ +REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ +REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ +REPLACE_WCTOB = @REPLACE_WCTOB@ +REPLACE_WCTOMB = @REPLACE_WCTOMB@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +REPLACE_WRITE = @REPLACE_WRITE@ +SCHED_H = @SCHED_H@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDBOOL_H = @STDBOOL_H@ +STDDEF_H = @STDDEF_H@ +STDINT_H = @STDINT_H@ +STRIP = @STRIP@ +SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ +TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ +UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ +UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VALGRIND_PREBISON = @VALGRIND_PREBISON@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +WARN_CFLAGS_TEST = @WARN_CFLAGS_TEST@ +WARN_CXXFLAGS = @WARN_CXXFLAGS@ +WARN_CXXFLAGS_TEST = @WARN_CXXFLAGS_TEST@ +WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +WERROR_CXXFLAGS = @WERROR_CXXFLAGS@ +WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ +WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ +WINT_T_SUFFIX = @WINT_T_SUFFIX@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XSLTPROC = @XSLTPROC@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +YFLAGS = @YFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +aclocaldir = @aclocaldir@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gl_LIBOBJS = @gl_LIBOBJS@ +gl_LTLIBOBJS = @gl_LTLIBOBJS@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ +gltests_WITNESS = @gltests_WITNESS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +lispdir = @lispdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +dist_pkgdata_DATA = README bison.m4 \ + c-like.m4 \ + c-skel.m4 c.m4 yacc.c glr.c \ + c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc stack.hh \ + java-skel.m4 java.m4 lalr1.java + +m4sugardir = $(pkgdatadir)/m4sugar +dist_m4sugar_DATA = m4sugar/m4sugar.m4 m4sugar/foreach.m4 +xsltdir = $(pkgdatadir)/xslt +dist_xslt_DATA = \ + xslt/bison.xsl \ + xslt/xml2dot.xsl \ + xslt/xml2text.xsl \ + xslt/xml2xhtml.xsl + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits data/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnits data/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-dist_m4sugarDATA: $(dist_m4sugar_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_m4sugar_DATA)'; test -n "$(m4sugardir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(m4sugardir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(m4sugardir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4sugardir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(m4sugardir)" || exit $$?; \ + done + +uninstall-dist_m4sugarDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_m4sugar_DATA)'; test -n "$(m4sugardir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(m4sugardir)'; $(am__uninstall_files_from_dir) +install-dist_pkgdataDATA: $(dist_pkgdata_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ + done + +uninstall-dist_pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) +install-dist_xsltDATA: $(dist_xslt_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_xslt_DATA)'; test -n "$(xsltdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(xsltdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(xsltdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xsltdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(xsltdir)" || exit $$?; \ + done + +uninstall-dist_xsltDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_xslt_DATA)'; test -n "$(xsltdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(xsltdir)'; $(am__uninstall_files_from_dir) +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(xsltdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_m4sugarDATA install-dist_pkgdataDATA \ + install-dist_xsltDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \ + uninstall-dist_xsltDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_m4sugarDATA install-dist_pkgdataDATA \ + install-dist_xsltDATA install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \ + uninstall-dist_xsltDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/tools/data/README b/tools/data/README new file mode 100644 index 00000000..d88e5aa9 --- /dev/null +++ b/tools/data/README @@ -0,0 +1,70 @@ +-*- outline -*- + +This directory contains data needed by Bison. + +* Skeletons +Bison skeletons: the general shapes of the different parser kinds, +that are specialized for specific grammars by the bison program. + +Currently, the supported skeletons are: + +- yacc.c + It used to be named bison.simple: it corresponds to C Yacc + compatible LALR(1) parsers. + +- lalr1.cc + Produces a C++ parser class. + +- lalr1.java + Produces a Java parser class. + +- glr.c + A Generalized LR C parser based on Bison's LALR(1) tables. + +- glr.cc + A Generalized LR C++ parser. Actually a C++ wrapper around glr.c. + +These skeletons are the only ones supported by the Bison team. +Because the interface between skeletons and the bison program is not +finished, *we are not bound to it*. In particular, Bison is not +mature enough for us to consider that ``foreign skeletons'' are +supported. + +* m4sugar +This directory contains M4sugar, sort of an extended library for M4, +which is used by Bison to instantiate the skeletons. + +* xslt +This directory contains XSLT programs that transform Bison's XML output +into various formats. + +- bison.xsl + A library of routines used by the other XSLT programs. + +- xml2dot.xsl + Conversion into GraphViz's dot format. + +- xml2text.xsl + Conversion into text. + +- xml2xhtml.xsl + Conversion into XHTML. + +----- + +Copyright (C) 2002, 2008-2012 Free Software Foundation, Inc. + +This file is part of GNU Bison. + +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 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/tools/data/bison.m4 b/tools/data/bison.m4 new file mode 100644 index 00000000..102d5fbd --- /dev/null +++ b/tools/data/bison.m4 @@ -0,0 +1,610 @@ + -*- Autoconf -*- + +# Language-independent M4 Macros for Bison. + +# Copyright (C) 2002, 2004-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +## ---------------- ## +## Identification. ## +## ---------------- ## + +# b4_copyright(TITLE, YEARS) +# -------------------------- +m4_define([b4_copyright], +[b4_comment([A Bison parser, made by GNU Bison b4_version.]) + +b4_comment([$1 + +m4_text_wrap([Copyright (C) $2 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 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see .]) + +b4_comment([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.])]) + + +## -------- ## +## Output. ## +## -------- ## + +# b4_output_begin(FILE) +# --------------------- +# Enable output, i.e., send to diversion 0, expand after "#", and +# generate the tag to output into FILE. Must be followed by EOL. +m4_define([b4_output_begin], +[m4_changecom() +m4_divert_push(0)dnl +@output(m4_unquote([$1])@)@dnl +]) + + +# b4_output_end() +# --------------- +# Output nothing, restore # as comment character (no expansions after #). +m4_define([b4_output_end], +[m4_divert_pop(0) +m4_changecom([#]) +]) + + +## ---------------- ## +## Error handling. ## +## ---------------- ## + +# The following error handling macros print error directives that should not +# become arguments of other macro invocations since they would likely then be +# mangled. Thus, they print to stdout directly. + +# b4_cat(TEXT) +# ------------ +# Write TEXT to stdout. Precede the final newline with an @ so that it's +# escaped. For example: +# +# b4_cat([[@complain(invalid input@)]]) +m4_define([b4_cat], +[m4_syscmd([cat <<'_m4eof' +]m4_bpatsubst(m4_dquote($1), [_m4eof], [_m4@`eof])[@ +_m4eof +])dnl +m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])]) + +# b4_error(KIND, FORMAT, [ARG1], [ARG2], ...) +# ------------------------------------------- +# Write @KIND(FORMAT@,ARG1@,ARG2@,...@) to stdout. +# +# For example: +# +# b4_error([[warn]], [[invalid value for '%s': %s]], [[foo]], [[3]]) +m4_define([b4_error], +[b4_cat([[@]$1[(]$2[]]dnl +[m4_if([$#], [2], [], + [m4_foreach([b4_arg], + m4_dquote(m4_shift(m4_shift($@))), + [[@,]b4_arg])])[@)]])]) + +# b4_error_at(KIND, START, END, FORMAT, [ARG1], [ARG2], ...) +# ---------------------------------------------------------- +# Write @KIND_at(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout. +# +# For example: +# +# b4_error_at([[complain]], [[input.y:2.3]], [[input.y:5.4]], +# [[invalid %s]], [[foo]]) +m4_define([b4_error_at], +[b4_cat([[@]$1[_at(]$2[@,]$3[@,]$4[]]dnl +[m4_if([$#], [4], [], + [m4_foreach([b4_arg], + m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))), + [[@,]b4_arg])])[@)]])]) + +# b4_warn(FORMAT, [ARG1], [ARG2], ...) +# ------------------------------------ +# Write @warn(FORMAT@,ARG1@,ARG2@,...@) to stdout. +# +# For example: +# +# b4_warn([[invalid value for '%s': %s]], [[foo]], [[3]]) +# +# As a simple test suite, this: +# +# m4_divert(-1) +# m4_define([asdf], [ASDF]) +# m4_define([fsa], [FSA]) +# m4_define([fdsa], [FDSA]) +# b4_warn([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]]) +# b4_warn([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]]) +# b4_warn() +# b4_warn(1) +# b4_warn(1, 2) +# +# Should produce this without newlines: +# +# @warn([asdf), asdf]@,[fsa), fsa]@,[fdsa), fdsa]@) +# @warn(asdf), asdf@,fsa), fsa@,fdsa), fdsa@) +# @warn(@) +# @warn(1@) +# @warn(1@,2@) +m4_define([b4_warn], +[b4_error([[warn]], $@)]) + +# b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...) +# --------------------------------------------------- +# Write @warn(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout. +# +# For example: +# +# b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]]) +m4_define([b4_warn_at], +[b4_error_at([[warn]], $@)]) + +# b4_complain(FORMAT, [ARG1], [ARG2], ...) +# ---------------------------------------- +# Write @complain(FORMAT@,ARG1@,ARG2@,...@) to stdout. +# +# See b4_warn example. +m4_define([b4_complain], +[b4_error([[complain]], $@)]) + +# b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...) +# ------------------------------------------------------- +# Write @complain(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout. +# +# See b4_warn_at example. +m4_define([b4_complain_at], +[b4_error_at([[complain]], $@)]) + +# b4_fatal(FORMAT, [ARG1], [ARG2], ...) +# ------------------------------------- +# Write @fatal(FORMAT@,ARG1@,ARG2@,...@) to stdout and exit. +# +# See b4_warn example. +m4_define([b4_fatal], +[b4_error([[fatal]], $@)dnl +m4_exit(1)]) + +# b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...) +# ---------------------------------------------------- +# Write @fatal(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout and exit. +# +# See b4_warn_at example. +m4_define([b4_fatal_at], +[b4_error_at([[fatal]], $@)dnl +m4_exit(1)]) + + +## ------------ ## +## Data Types. ## +## ------------ ## + +# b4_ints_in(INT1, INT2, LOW, HIGH) +# --------------------------------- +# Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise. +m4_define([b4_ints_in], +[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])]) + + + +## ------------------ ## +## Decoding options. ## +## ------------------ ## + +# b4_flag_if(FLAG, IF-TRUE, IF-FALSE) +# ----------------------------------- +# Run IF-TRUE if b4_FLAG_flag is 1, IF-FALSE if FLAG is 0, otherwise fail. +m4_define([b4_flag_if], +[m4_case(b4_$1_flag, + [0], [$3], + [1], [$2], + [m4_fatal([invalid $1 value: ]$1)])]) + + +# b4_define_flag_if(FLAG) +# ----------------------- +# Define "b4_FLAG_if(IF-TRUE, IF-FALSE)" that depends on the +# value of the Boolean FLAG. +m4_define([b4_define_flag_if], +[_b4_define_flag_if($[1], $[2], [$1])]) + +# _b4_define_flag_if($1, $2, FLAG) +# -------------------------------- +# Work around the impossibility to define macros inside macros, +# because issuing `[$1]' is not possible in M4. GNU M4 should provide +# $$1 a la M5/TeX. +m4_define([_b4_define_flag_if], +[m4_if([$1$2], $[1]$[2], [], + [m4_fatal([$0: Invalid arguments: $@])])dnl +m4_define([b4_$3_if], + [b4_flag_if([$3], [$1], [$2])])]) + + +# b4_FLAG_if(IF-TRUE, IF-FALSE) +# ----------------------------- +# Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise. +b4_define_flag_if([defines]) # Whether headers are requested. +b4_define_flag_if([error_verbose]) # Whether error are verbose. +b4_define_flag_if([glr]) # Whether a GLR parser is requested. +b4_define_flag_if([locations]) # Whether locations are tracked. +b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled. +b4_define_flag_if([token_table]) # Whether yytoken_table is demanded. +b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. + +# yytoken_table is needed to support verbose errors. +b4_error_verbose_if([m4_define([b4_token_table_flag], [1])]) + + + +## ----------- ## +## Synclines. ## +## ----------- ## + +# b4_basename(NAME) +# ----------------- +# Similar to POSIX basename; the differences don't matter here. +# Beware that NAME is not evaluated. +m4_define([b4_basename], +[m4_bpatsubst([$1], [^.*/\([^/]+\)/*$], [\1])]) + + +# b4_syncline(LINE, FILE) +# ----------------------- +m4_define([b4_syncline], +[b4_flag_if([synclines], +[b4_sync_end([__line__], [b4_basename(m4_quote(__file__))]) +b4_sync_start([$1], [$2])])]) + +m4_define([b4_sync_end], [b4_comment([Line $1 of $2])]) +m4_define([b4_sync_start], [b4_comment([Line $1 of $2])]) + +# b4_user_code(USER-CODE) +# ----------------------- +# Emit code from the user, ending it with synclines. +m4_define([b4_user_code], +[$1 +b4_syncline([@oline@], [@ofile@])]) + + +# b4_define_user_code(MACRO) +# -------------------------- +# From b4_MACRO, build b4_user_MACRO that includes the synclines. +m4_define([b4_define_user_code], +[m4_define([b4_user_$1], +[b4_user_code([b4_$1])])]) + + +# b4_user_actions +# b4_user_initial_action +# b4_user_post_prologue +# b4_user_pre_prologue +# b4_user_stype +# ---------------------- +# Macros that issue user code, ending with synclines. +b4_define_user_code([actions]) +b4_define_user_code([initial_action]) +b4_define_user_code([post_prologue]) +b4_define_user_code([pre_prologue]) +b4_define_user_code([stype]) + + +# b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE) +# ----------------------------------------------------- +# Complain if any name of type WHAT is used by the user (as recorded in +# USER-LIST) but is not used by Bison (as recorded by macros in the +# namespace BISON-NAMESPACE). +# +# USER-LIST must expand to a list specifying all user occurrences of all names +# of type WHAT. Each item in the list must be a triplet specifying one +# occurrence: name, start boundary, and end boundary. Empty string names are +# fine. An empty list is fine. +# +# For example, to define b4_foo_user_names to be used for USER-LIST with three +# name occurrences and with correct quoting: +# +# m4_define([b4_foo_user_names], +# [[[[[[bar]], [[parser.y:1.7]], [[parser.y:1.16]]]], +# [[[[bar]], [[parser.y:5.7]], [[parser.y:5.16]]]], +# [[[[baz]], [[parser.y:8.7]], [[parser.y:8.16]]]]]]) +# +# The macro BISON-NAMESPACE(bar) must be defined iff the name bar of type WHAT +# is used by Bison (in the front-end or in the skeleton). Empty string names +# are fine, but it would be ugly for Bison to actually use one. +# +# For example, to use b4_foo_bison_names for BISON-NAMESPACE and define that +# the names bar and baz are used by Bison: +# +# m4_define([b4_foo_bison_names(bar)]) +# m4_define([b4_foo_bison_names(baz)]) +# +# To invoke b4_check_user_names with TYPE foo, with USER-LIST +# b4_foo_user_names, with BISON-NAMESPACE b4_foo_bison_names, and with correct +# quoting: +# +# b4_check_user_names([[foo]], [b4_foo_user_names], +# [[b4_foo_bison_names]]) +m4_define([b4_check_user_names], +[m4_foreach([b4_occurrence], $2, +[m4_pushdef([b4_occurrence], b4_occurrence)dnl +m4_pushdef([b4_user_name], m4_car(b4_occurrence))dnl +m4_pushdef([b4_start], m4_car(m4_shift(b4_occurrence)))dnl +m4_pushdef([b4_end], m4_shift(m4_shift(b4_occurrence)))dnl +m4_ifndef($3[(]m4_quote(b4_user_name)[)], + [b4_complain_at([b4_start], [b4_end], + [[%s '%s' is not used]], + [$1], [b4_user_name])])[]dnl +m4_popdef([b4_occurrence])dnl +m4_popdef([b4_user_name])dnl +m4_popdef([b4_start])dnl +m4_popdef([b4_end])dnl +])]) + + + + +## --------------------- ## +## b4_percent_define_*. ## +## --------------------- ## + + +# b4_percent_define_use(VARIABLE) +# ------------------------------- +# Declare that VARIABLE was used. +m4_define([b4_percent_define_use], +[m4_define([b4_percent_define_bison_variables(]$1[)])dnl +]) + +# b4_percent_define_get(VARIABLE, [DEFAULT]) +# ------------------------------------------ +# Mimic muscle_percent_define_get in ../src/muscle-tab.h. That is, if +# the %define variable VARIABLE is defined, emit its value. Contrary +# to its C counterpart, return DEFAULT otherwise. Also, record +# Bison's usage of VARIABLE by defining +# b4_percent_define_bison_variables(VARIABLE). +# +# For example: +# +# b4_percent_define_get([[foo]]) +m4_define([b4_percent_define_get], +[b4_percent_define_use([$1])dnl +m4_ifdef([b4_percent_define(]$1[)], + [m4_indir([b4_percent_define(]$1[)])], + [$2])]) + + +# b4_percent_define_get_loc(VARIABLE) +# ----------------------------------- +# Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly. That is, +# if the %define variable VARIABLE is undefined, complain fatally since that's +# a Bison or skeleton error. Otherwise, return its definition location in a +# form approriate for the first two arguments of b4_warn_at, b4_complain_at, or +# b4_fatal_at. Don't record this as a Bison usage of VARIABLE as there's no +# reason to suspect that the user-supplied value has yet influenced the output. +# +# For example: +# +# b4_complain_at(b4_percent_define_get_loc([[foo]]), [[invalid foo]]) +m4_define([b4_percent_define_get_loc], +[m4_ifdef([b4_percent_define_loc(]$1[)], + [m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl +b4_loc[]dnl +m4_popdef([b4_loc])], + [b4_fatal([[b4_percent_define_get_loc: undefined %%define variable '%s']], [$1])])]) + +# b4_percent_define_get_syncline(VARIABLE) +# ---------------------------------------- +# Mimic muscle_percent_define_get_syncline in ../src/muscle-tab.h exactly. +# That is, if the %define variable VARIABLE is undefined, complain fatally +# since that's a Bison or skeleton error. Otherwise, return its definition +# location as a b4_syncline invocation. Don't record this as a Bison usage of +# VARIABLE as there's no reason to suspect that the user-supplied value has yet +# influenced the output. +# +# For example: +# +# b4_percent_define_get_syncline([[foo]]) +m4_define([b4_percent_define_get_syncline], +[m4_ifdef([b4_percent_define_syncline(]$1[)], + [m4_indir([b4_percent_define_syncline(]$1[)])], + [b4_fatal([[b4_percent_define_get_syncline: undefined %%define variable '%s']], [$1])])]) + +# b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE]) +# ------------------------------------------------------ +# Mimic muscle_percent_define_ifdef in ../src/muscle-tab.h exactly. That is, +# if the %define variable VARIABLE is defined, expand IF-TRUE, else expand +# IF-FALSE. Also, record Bison's usage of VARIABLE by defining +# b4_percent_define_bison_variables(VARIABLE). +# +# For example: +# +# b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]]) +m4_define([b4_percent_define_ifdef], +[m4_ifdef([b4_percent_define(]$1[)], + [m4_define([b4_percent_define_bison_variables(]$1[)])$2], + [$3])]) + +# b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE]) +# -------------------------------------------------------- +# Mimic muscle_percent_define_flag_if in ../src/muscle-tab.h exactly. That is, +# if the %define variable VARIABLE is defined to "" or "true", expand IF-TRUE. +# If it is defined to "false", expand IF-FALSE. Complain if it is undefined +# (a Bison or skeleton error since the default value should have been set +# already) or defined to any other value (possibly a user error). Also, record +# Bison's usage of VARIABLE by defining +# b4_percent_define_bison_variables(VARIABLE). +# +# For example: +# +# b4_percent_define_flag_if([[foo]], [[it's true]], [[it's false]]) +m4_define([b4_percent_define_flag_if], +[b4_percent_define_ifdef([$1], + [m4_case(b4_percent_define_get([$1]), + [], [$2], [true], [$2], [false], [$3], + [m4_expand_once([b4_complain_at(b4_percent_define_get_loc([$1]), + [[invalid value for %%define Boolean variable '%s']], + [$1])], + [[b4_percent_define_flag_if($1)]])])], + [b4_fatal([[b4_percent_define_flag_if: undefined %%define variable '%s']], [$1])])]) + +# b4_percent_define_default(VARIABLE, DEFAULT) +# -------------------------------------------- +# Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly. That is, +# if the %define variable VARIABLE is undefined, set its value to DEFAULT. +# Don't record this as a Bison usage of VARIABLE as there's no reason to +# suspect that the value has yet influenced the output. +# +# For example: +# +# b4_percent_define_default([[foo]], [[default value]]) +m4_define([b4_percent_define_default], +[m4_ifndef([b4_percent_define(]$1[)], + [m4_define([b4_percent_define(]$1[)], [$2])dnl + m4_define([b4_percent_define_loc(]$1[)], + [[[[:-1.-1]], + [[:-1.-1]]]])dnl + m4_define([b4_percent_define_syncline(]$1[)], [[]])])]) + +# b4_percent_define_check_values(VALUES) +# -------------------------------------- +# Mimic muscle_percent_define_check_values in ../src/muscle-tab.h exactly +# except that the VALUES structure is more appropriate for M4. That is, VALUES +# is a list of sublists of strings. For each sublist, the first string is the +# name of a %define variable, and all remaining strings in that sublist are the +# valid values for that variable. Complain if such a variable is undefined (a +# Bison error since the default value should have been set already) or defined +# to any other value (possibly a user error). Don't record this as a Bison +# usage of the variable as there's no reason to suspect that the value has yet +# influenced the output. +# +# For example: +# +# b4_percent_define_check_values([[[[foo]], [[foo-value1]], [[foo-value2]]]], +# [[[[bar]], [[bar-value1]]]]) +m4_define([b4_percent_define_check_values], +[m4_foreach([b4_sublist], m4_quote($@), + [_b4_percent_define_check_values(b4_sublist)])]) + +m4_define([_b4_percent_define_check_values], +[m4_ifdef([b4_percent_define(]$1[)], + [m4_pushdef([b4_good_value], [0])dnl + m4_if($#, 1, [], + [m4_foreach([b4_value], m4_dquote(m4_shift($@)), + [m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value, + [m4_define([b4_good_value], [1])])])])dnl + m4_if(b4_good_value, [0], + [b4_complain_at(b4_percent_define_get_loc([$1]), + [[invalid value for %%define variable '%s': '%s']], + [$1], + m4_dquote(m4_indir([b4_percent_define(]$1[)]))) + m4_foreach([b4_value], m4_dquote(m4_shift($@)), + [b4_complain_at(b4_percent_define_get_loc([$1]), + [[accepted value: '%s']], + m4_dquote(b4_value))])])dnl + m4_popdef([b4_good_value])], + [b4_fatal([[b4_percent_define_check_values: undefined %%define variable '%s']], [$1])])]) + +# b4_percent_code_get([QUALIFIER]) +# -------------------------------- +# If any %code blocks for QUALIFIER are defined, emit them beginning with a +# comment and ending with synclines and a newline. If QUALIFIER is not +# specified or empty, do this for the unqualified %code blocks. Also, record +# Bison's usage of QUALIFIER (if specified) by defining +# b4_percent_code_bison_qualifiers(QUALIFIER). +# +# For example, to emit any unqualified %code blocks followed by any %code +# blocks for the qualifier foo: +# +# b4_percent_code_get +# b4_percent_code_get([[foo]]) +m4_define([b4_percent_code_get], +[m4_pushdef([b4_macro_name], [[b4_percent_code(]$1[)]])dnl +m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])dnl +m4_ifdef(b4_macro_name, +[b4_comment([m4_if([$#], [0], [[Unqualified %code]], + [["%code ]$1["]])[ blocks.]]) +b4_user_code([m4_indir(b4_macro_name)]) +])dnl +m4_popdef([b4_macro_name])]) + +# b4_percent_code_ifdef(QUALIFIER, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------- +# If any %code blocks for QUALIFIER (or unqualified %code blocks if +# QUALIFIER is empty) are defined, expand IF-TRUE, else expand IF-FALSE. +# Also, record Bison's usage of QUALIFIER (if specified) by defining +# b4_percent_code_bison_qualifiers(QUALIFIER). +m4_define([b4_percent_code_ifdef], +[m4_ifdef([b4_percent_code(]$1[)], + [m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2], + [$3])]) + + +## ----------------------------------------------------------- ## +## After processing the skeletons, check that all the user's ## +## %define variables and %code qualifiers were used by Bison. ## +## ----------------------------------------------------------- ## + +m4_define([b4_check_user_names_wrap], +[m4_ifdef([b4_percent_]$1[_user_]$2[s], + [b4_check_user_names([[%]$1 $2], + [b4_percent_]$1[_user_]$2[s], + [[b4_percent_]$1[_bison_]$2[s]])])]) + +m4_wrap_lifo([ +b4_check_user_names_wrap([[define]], [[variable]]) +b4_check_user_names_wrap([[code]], [[qualifier]]) +]) + + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# m4_define_default([b4_lex_param], []) dnl breaks other skeletons +m4_define_default([b4_pre_prologue], []) +m4_define_default([b4_post_prologue], []) +m4_define_default([b4_epilogue], []) +m4_define_default([b4_parse_param], []) + +# The initial column and line. +m4_define_default([b4_location_initial_column], [1]) +m4_define_default([b4_location_initial_line], [1]) + +# Sanity checks. +b4_percent_define_ifdef([api.prefix], +[m4_ifdef([b4_prefix], +[b4_complain_at(b4_percent_define_get_loc([api.prefix]), + [['%s' and '%s' cannot be used together]], + [%name-prefix], + [%define api.prefix])])]) diff --git a/tools/data/c++-skel.m4 b/tools/data/c++-skel.m4 new file mode 100644 index 00000000..149e4300 --- /dev/null +++ b/tools/data/c++-skel.m4 @@ -0,0 +1,26 @@ + -*- Autoconf -*- + +# C++ skeleton dispatching for Bison. + +# Copyright (C) 2006-2007, 2009-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +b4_glr_if( [m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.cc]])]) +b4_nondeterministic_if([m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.cc]])]) + +m4_define_default([b4_used_skeleton], [b4_pkgdatadir/[lalr1.cc]]) +m4_define_default([b4_skeleton], ["b4_basename(b4_used_skeleton)"]) + +m4_include(b4_used_skeleton) diff --git a/tools/data/c++.m4 b/tools/data/c++.m4 new file mode 100644 index 00000000..eac88a78 --- /dev/null +++ b/tools/data/c++.m4 @@ -0,0 +1,205 @@ + -*- Autoconf -*- + +# C++ skeleton for Bison + +# Copyright (C) 2002-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_include(b4_pkgdatadir/[c.m4]) + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Default parser class name. +b4_percent_define_default([[parser_class_name]], [[parser]]) + +# Don't do that so that we remember whether we're using a user +# request, or the default value. +# +# b4_percent_define_default([[api.location.type]], [[location]]) + +b4_percent_define_default([[filename_type]], [[std::string]]) +b4_percent_define_default([[namespace]], m4_defn([b4_prefix])) +b4_percent_define_default([[global_tokens_and_yystype]], [[false]]) +b4_percent_define_default([[define_location_comparison]], + [m4_if(b4_percent_define_get([[filename_type]]), + [std::string], [[true]], [[false]])]) + + +## ----------- ## +## Namespace. ## +## ----------- ## + +m4_define([b4_namespace_ref], [b4_percent_define_get([[namespace]])]) + +# Don't permit an empty b4_namespace_ref. Any `::parser::foo' appended to it +# would compile as an absolute reference with `parser' in the global namespace. +# b4_namespace_open would open an anonymous namespace and thus establish +# internal linkage. This would compile. However, it's cryptic, and internal +# linkage for the parser would be specified in all translation units that +# include the header, which is always generated. If we ever need to permit +# internal linkage somehow, surely we can find a cleaner approach. +m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [], +[b4_complain_at(b4_percent_define_get_loc([[namespace]]), + [[namespace reference is empty]])]) + +# Instead of assuming the C++ compiler will do it, Bison should reject any +# invalid b4_namepsace_ref that would be converted to a valid +# b4_namespace_open. The problem is that Bison doesn't always output +# b4_namespace_ref to uncommented code but should reserve the ability to do so +# in future releases without risking breaking any existing user grammars. +# Specifically, don't allow empty names as b4_namespace_open would just convert +# those into anonymous namespaces, and that might tempt some users. +m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*::]), [-1], [], +[b4_complain_at(b4_percent_define_get_loc([[namespace]]), + [[namespace reference has consecutive "::"]])]) +m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [], +[b4_complain_at(b4_percent_define_get_loc([[namespace]]), + [[namespace reference has a trailing "::"]])]) + +m4_define([b4_namespace_open], +[b4_user_code([b4_percent_define_get_syncline([[namespace]]) +[namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref), + [^\(.\)[ ]*::], [\1])), + [::], [ { namespace ])[ {]])]) + +m4_define([b4_namespace_close], +[b4_user_code([b4_percent_define_get_syncline([[namespace]]) +m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]), + [^\(.\)[ ]*\(::\)?\([^][:]\|:[^:]\)*], + [\1])), + [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])]) + + +# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ----------------------------------------------------- +# Output the definition of the tokens as enums. +m4_define([b4_token_enums], +[/* Tokens. */ + enum yytokentype { +m4_map_sep([ b4_token_enum], [, +], + [$@]) + }; +]) + + + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[(yyval[]m4_ifval([$1], [.$1]))]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[(yysemantic_stack_@{($1) - ($2)@}m4_ifval([$3], [.$3]))]) + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[(yyloc)]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[(yylocation_stack_@{($1) - ($2)@})]) + + +# b4_parse_param_decl +# ------------------- +# Extra formal arguments of the constructor. +# Change the parameter names from "foo" into "foo_yyarg", so that +# there is no collision bw the user chosen attribute name, and the +# argument name in the constructor. +m4_define([b4_parse_param_decl], +[m4_ifset([b4_parse_param], + [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])]) + +m4_define([b4_parse_param_decl_1], +[$1_yyarg]) + + + +# b4_parse_param_cons +# ------------------- +# Extra initialisations of the constructor. +m4_define([b4_parse_param_cons], + [m4_ifset([b4_parse_param], + [ + b4_cc_constructor_calls(b4_parse_param)])]) +m4_define([b4_cc_constructor_calls], + [m4_map_sep([b4_cc_constructor_call], [, + ], [$@])]) +m4_define([b4_cc_constructor_call], + [$2 ($2_yyarg)]) + +# b4_parse_param_vars +# ------------------- +# Extra instance variables. +m4_define([b4_parse_param_vars], + [m4_ifset([b4_parse_param], + [ + /* User arguments. */ +b4_cc_var_decls(b4_parse_param)])]) +m4_define([b4_cc_var_decls], + [m4_map_sep([b4_cc_var_decl], [ +], [$@])]) +m4_define([b4_cc_var_decl], + [ $1;]) + + +## ---------## +## Values. ## +## ---------## + +# b4_yylloc_default_define +# ------------------------ +# Define YYLLOC_DEFAULT. +m4_define([b4_yylloc_default_define], +[[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +# ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).begin = YYRHSLOC (Rhs, 1).begin; \ + (Current).end = YYRHSLOC (Rhs, N).end; \ + } \ + else \ + { \ + (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ + } \ + while (/*CONSTCOND*/ false) +# endif +]]) diff --git a/tools/data/c-like.m4 b/tools/data/c-like.m4 new file mode 100644 index 00000000..5b96fbaf --- /dev/null +++ b/tools/data/c-like.m4 @@ -0,0 +1,44 @@ + -*- Autoconf -*- + +# Common code for C-like languages (C, C++, Java, etc.) + +# Copyright (C) 2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# b4_dollar_dollar_(VALUE, FIELD, DEFAULT-FIELD) +# ---------------------------------------------- +# If FIELD (or DEFAULT-FIELD) is non-null, return "VALUE.FIELD", +# otherwise just VALUE. Be sure to pass "(VALUE)" is VALUE is a +# pointer. +m4_define([b4_dollar_dollar_], +[m4_if([$2], [[]], + [m4_ifval([$3], [($1.$3)], + [$1])], + [($1.$2)])]) + +# b4_dollar_pushdef(VALUE-POINTER, DEFAULT-FIELD, LOCATION) +# b4_dollar_popdef +# --------------------------------------------------------- +# Define b4_dollar_dollar for VALUE and DEFAULT-FIELD, +# and b4_at_dollar for LOCATION. +m4_define([b4_dollar_pushdef], +[m4_pushdef([b4_dollar_dollar], + [b4_dollar_dollar_([$1], m4_dquote($][1), [$2])])dnl +m4_pushdef([b4_at_dollar], [$3])dnl +]) +m4_define([b4_dollar_popdef], +[m4_popdef([b4_at_dollar])dnl +m4_popdef([b4_dollar_dollar])dnl +]) diff --git a/tools/data/c-skel.m4 b/tools/data/c-skel.m4 new file mode 100644 index 00000000..ccd4ae16 --- /dev/null +++ b/tools/data/c-skel.m4 @@ -0,0 +1,26 @@ + -*- Autoconf -*- + +# C skeleton dispatching for Bison. + +# Copyright (C) 2006-2007, 2009-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +b4_glr_if( [m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.c]])]) +b4_nondeterministic_if([m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.c]])]) + +m4_define_default([b4_used_skeleton], [b4_pkgdatadir/[yacc.c]]) +m4_define_default([b4_skeleton], ["b4_basename(b4_used_skeleton)"]) + +m4_include(b4_used_skeleton) diff --git a/tools/data/c.m4 b/tools/data/c.m4 new file mode 100644 index 00000000..b6646062 --- /dev/null +++ b/tools/data/c.m4 @@ -0,0 +1,722 @@ + -*- Autoconf -*- + +# C M4 Macros for Bison. + +# Copyright (C) 2002, 2004-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_include(b4_pkgdatadir/[c-like.m4]) + +# b4_tocpp(STRING) +# ---------------- +# Convert STRING into a valid C macro name. +m4_define([b4_tocpp], +[m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))]) + + +# b4_cpp_guard(FILE) +# ------------------ +# A valid C macro name to use as a CPP header guard for FILE. +m4_define([b4_cpp_guard], +[[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]]) + + +# b4_cpp_guard_open(FILE) +# b4_cpp_guard_close(FILE) +# ------------------------ +# If FILE does not expand to nothing, open/close CPP inclusion guards for FILE. +m4_define([b4_cpp_guard_open], +[m4_ifval(m4_quote($1), +[#ifndef b4_cpp_guard([$1]) +# define b4_cpp_guard([$1])])]) + +m4_define([b4_cpp_guard_close], +[m4_ifval(m4_quote($1), +[#endif b4_comment([!b4_cpp_guard([$1])])])]) + + +## ---------------- ## +## Identification. ## +## ---------------- ## + +# b4_comment(TEXT) +# ---------------- +m4_define([b4_comment], [/* m4_bpatsubst([$1], [ +], [ + ]) */]) + +# b4_identification +# ----------------- +# Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or +# b4_pull_flag if they use the values of the %define variables api.pure or +# api.push-pull. +m4_define([b4_identification], +[[/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "]b4_version[" + +/* Skeleton name. */ +#define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[ + +/* Pure parsers. */ +#define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[ + +/* Push parsers. */ +#define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[ + +/* Pull parsers. */ +#define YYPULL ]b4_pull_flag])[ +]]) + + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# b4_api_prefix, b4_api_PREFIX +# ---------------------------- +# Corresponds to %define api.prefix +b4_percent_define_default([[api.prefix]], [[yy]]) +m4_define([b4_api_prefix], +[b4_percent_define_get([[api.prefix]])]) +m4_define([b4_api_PREFIX], +[m4_toupper(b4_api_prefix)]) + + +# b4_prefix +# --------- +# If the %name-prefix is not given, it is api.prefix. +m4_define_default([b4_prefix], [b4_api_prefix]) + +# If the %union is not named, its name is YYSTYPE. +m4_define_default([b4_union_name], [b4_api_PREFIX[]STYPE]) + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + +# b4_user_args +# ------------ +m4_define([b4_user_args], +[m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])]) + + +# b4_parse_param +# -------------- +# If defined, b4_parse_param arrives double quoted, but below we prefer +# it to be single quoted. +m4_define([b4_parse_param], +b4_parse_param) + + +# b4_parse_param_for(DECL, FORMAL, BODY) +# --------------------------------------- +# Iterate over the user parameters, binding the declaration to DECL, +# the formal name to FORMAL, and evaluating the BODY. +m4_define([b4_parse_param_for], +[m4_foreach([$1_$2], m4_defn([b4_parse_param]), +[m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl +m4_pushdef([$2], m4_shift($1_$2))dnl +$3[]dnl +m4_popdef([$2])dnl +m4_popdef([$1])dnl +])]) + +# b4_parse_param_use +# ------------------ +# `YYUSE' all the parse-params. +m4_define([b4_parse_param_use], +[b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal); +])dnl +]) + + +## ------------ ## +## Data Types. ## +## ------------ ## + +# b4_int_type(MIN, MAX) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# MIN to MAX (included). +m4_define([b4_int_type], +[m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char], + b4_ints_in($@, [-128], [127]), [1], [signed char], + + b4_ints_in($@, [0], [65535]), [1], [unsigned short int], + b4_ints_in($@, [-32768], [32767]), [1], [short int], + + m4_eval([0 <= $1]), [1], [unsigned int], + + [int])]) + + +# b4_int_type_for(NAME) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# `NAME_min' to `NAME_max' (included). +m4_define([b4_int_type_for], +[b4_int_type($1_min, $1_max)]) + + +# b4_table_value_equals(TABLE, VALUE, LITERAL) +# -------------------------------------------- +# Without inducing a comparison warning from the compiler, check if the +# literal value LITERAL equals VALUE from table TABLE, which must have +# TABLE_min and TABLE_max defined. YYID must be defined as an identity +# function that suppresses warnings about constant conditions. +m4_define([b4_table_value_equals], +[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min]) + || m4_indir([b4_]$1[_max]) < $3), [1], + [[YYID (0)]], + [(!!(($2) == ($3)))])]) + + +## ---------## +## Values. ## +## ---------## + + +# b4_null_define +# -------------- +# Portability issues: define a YY_NULL appropriate for the current +# language (C, C++98, or C++11). +m4_define([b4_null_define], +[# ifndef YY_NULL +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULL nullptr +# else +# define YY_NULL 0 +# endif +# endif[]dnl +]) + + +# b4_null +# ------- +# Return a null pointer constant. +m4_define([b4_null], [YY_NULL]) + + + +## ------------------------- ## +## Assigning token numbers. ## +## ------------------------- ## + +# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) +# ----------------------------------------- +# Output the definition of this token as #define. +m4_define([b4_token_define], +[#define $1 $2 +]) + + +# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------- +# Output the definition of the tokens (if there are) as #defines. +m4_define([b4_token_defines], +[m4_if([$#$1], [1], [], +[/* Tokens. */ +m4_map([b4_token_define], [$@])]) +]) + + +# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) +# --------------------------------------- +# Output the definition of this token as an enum. +m4_define([b4_token_enum], +[$1 = $2]) + + +# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ----------------------------------------------------- +# Output the definition of the tokens (if there are) as enums. +m4_define([b4_token_enums], +[m4_if([$#$1], [1], [], +[[/* Tokens. */ +#ifndef ]b4_api_PREFIX[TOKENTYPE +# define ]b4_api_PREFIX[TOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum ]b4_api_prefix[tokentype { +]m4_map_sep([ b4_token_enum], [, +], + [$@])[ + }; +#endif +]])]) + + +# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------------- +# Output the definition of the tokens (if there are any) as enums and, if POSIX +# Yacc is enabled, as #defines. +m4_define([b4_token_enums_defines], +[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], []) +]) + + + +## --------------------------------------------- ## +## Defining C functions in both K&R and ANSI-C. ## +## --------------------------------------------- ## + + +# b4_modern_c +# ----------- +# A predicate useful in #if to determine whether C is ancient or modern. +# +# If __STDC__ is defined, the compiler is modern. IBM xlc 7.0 when run +# as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic +# reasons, but it defines __C99__FUNC__ so check that as well. +# Microsoft C normally doesn't define these macros, but it defines _MSC_VER. +# Consider a C++ compiler to be modern if it defines __cplusplus. +# +m4_define([b4_c_modern], + [[(defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER)]]) + +# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ---------------------------------------------------------- +# Declare the function NAME. +m4_define([b4_c_function_def], +[#if b4_c_modern +b4_c_ansi_function_def($@) +#else +$2 +$1 (b4_c_knr_formal_names(m4_shift2($@))) +b4_c_knr_formal_decls(m4_shift2($@)) +#endif[]dnl +]) + + +# b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# --------------------------------------------------------------- +# Declare the function NAME in ANSI. +m4_define([b4_c_ansi_function_def], +[$2 +$1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl +]) + + +# b4_c_ansi_formals([DECL1, NAME1], ...) +# -------------------------------------- +# Output the arguments ANSI-C definition. +m4_define([b4_c_ansi_formals], +[m4_if([$#], [0], [void], + [$#$1], [1], [void], + [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])]) + +m4_define([b4_c_ansi_formal], +[$1]) + + +# b4_c_knr_formal_names([DECL1, NAME1], ...) +# ------------------------------------------ +# Output the argument names. +m4_define([b4_c_knr_formal_names], +[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])]) + +m4_define([b4_c_knr_formal_name], +[$2]) + + +# b4_c_knr_formal_decls([DECL1, NAME1], ...) +# ------------------------------------------ +# Output the K&R argument declarations. +m4_define([b4_c_knr_formal_decls], +[m4_map_sep([b4_c_knr_formal_decl], + [ +], + [$@])]) + +m4_define([b4_c_knr_formal_decl], +[ $1;]) + + + +## ------------------------------------------------------------ ## +## Declaring (prototyping) C functions in both K&R and ANSI-C. ## +## ------------------------------------------------------------ ## + + +# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ---------------------------------------------------------------- +# Declare the function NAME ANSI C style. +m4_define([b4_c_ansi_function_decl], +[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl +]) + + + +# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ----------------------------------------------------------- +# Declare the function NAME in both K&R and ANSI C. +m4_define([b4_c_function_decl], +[#if defined __STDC__ || defined __cplusplus +b4_c_ansi_function_decl($@) +#else +$2 $1 (); +#endif[]dnl +]) + + + +## --------------------- ## +## Calling C functions. ## +## --------------------- ## + + +# b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ----------------------------------------------------------- +# Call the function NAME with arguments NAME1, NAME2 etc. +m4_define([b4_c_function_call], +[$1 (b4_c_args(m4_shift2($@)))[]dnl +]) + + +# b4_c_args([DECL1, NAME1], ...) +# ------------------------------ +# Output the arguments NAME1, NAME2... +m4_define([b4_c_args], +[m4_map_sep([b4_c_arg], [, ], [$@])]) + +m4_define([b4_c_arg], +[$2]) + + +## ----------- ## +## Synclines. ## +## ----------- ## + +# b4_sync_start(LINE, FILE) +# ----------------------- +m4_define([b4_sync_start], [[#]line $1 $2]) + + +## -------------- ## +## User actions. ## +## -------------- ## + +# b4_case(LABEL, STATEMENTS) +# -------------------------- +m4_define([b4_case], +[ case $1: +$2 + break;]) + +# b4_symbol_actions(FILENAME, LINENO, +# SYMBOL-TAG, SYMBOL-NUM, +# SYMBOL-ACTION, SYMBOL-TYPENAME) +# ------------------------------------------------- +# Issue the code for a symbol action (e.g., %printer). +# +# Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are +# invoked where $$ and @$ were specified by the user. +m4_define([b4_symbol_actions], +[b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl + case $4: /* $3 */ +b4_syncline([$2], [$1]) + $5; +b4_syncline([@oline@], [@ofile@]) + break; +b4_dollar_popdef[]dnl +]) + + +# b4_yydestruct_generate(FUNCTION-DECLARATOR) +# ------------------------------------------- +# Generate the "yydestruct" function, which declaration is issued using +# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C +# or "b4_c_function_def" for K&R. +m4_define_default([b4_yydestruct_generate], +[[/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +]$1([yydestruct], + [static void], + [[const char *yymsg], [yymsg]], + [[int yytype], [yytype]], + [[YYSTYPE *yyvaluep], [yyvaluep]][]dnl +b4_locations_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl +m4_ifset([b4_parse_param], [, b4_parse_param]))[ +{ + YYUSE (yyvaluep); +]b4_locations_if([ YYUSE (yylocationp); +])dnl +b4_parse_param_use[]dnl +[ + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { +]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ + default: + break; + } +}]dnl +]) + + +# b4_yy_symbol_print_generate(FUNCTION-DECLARATOR) +# ------------------------------------------------ +# Generate the "yy_symbol_print" function, which declaration is issued using +# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C +# or "b4_c_function_def" for K&R. +m4_define_default([b4_yy_symbol_print_generate], +[[ +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +]$1([yy_symbol_value_print], + [static void], + [[FILE *yyoutput], [yyoutput]], + [[int yytype], [yytype]], + [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl +b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl +m4_ifset([b4_parse_param], [, b4_parse_param]))[ +{ + FILE *yyo = yyoutput; + YYUSE (yyo); + if (!yyvaluep) + return; +]b4_locations_if([ YYUSE (yylocationp); +])dnl +b4_parse_param_use[]dnl +[# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { +]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl +[ default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +]$1([yy_symbol_print], + [static void], + [[FILE *yyoutput], [yyoutput]], + [[int yytype], [yytype]], + [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl +b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl +m4_ifset([b4_parse_param], [, b4_parse_param]))[ +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + +]b4_locations_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp); + YYFPRINTF (yyoutput, ": "); +])dnl +[ yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl +b4_locations_if([, yylocationp])[]b4_user_args[); + YYFPRINTF (yyoutput, ")"); +}]dnl +]) + +## -------------- ## +## Declarations. ## +## -------------- ## + +# b4_declare_yylstype +# ------------------- +# Declarations that might either go into the header (if --defines) or +# in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc. +m4_define([b4_declare_yylstype], +[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED +]m4_ifdef([b4_stype], +[[typedef union ]b4_union_name[ +{ +]b4_user_stype[ +} ]b4_api_PREFIX[STYPE; +# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]], +[m4_if(b4_tag_seen_flag, 0, +[[typedef int ]b4_api_PREFIX[STYPE; +# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[ +# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */ +# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1 +#endif]b4_locations_if([[ + +#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED +typedef struct ]b4_api_PREFIX[LTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} ]b4_api_PREFIX[LTYPE; +# define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */ +# define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1 +# define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1 +#endif]]) + +b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval; +]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl +]) + +# b4_YYDEBUG_define +# ------------------ +m4_define([b4_YYDEBUG_define], +[[/* Enabling traces. */ +]m4_if(b4_api_prefix, [yy], +[[#ifndef YYDEBUG +# define YYDEBUG ]b4_debug_flag[ +#endif]], +[[#ifndef ]b4_api_PREFIX[DEBUG +# if defined YYDEBUG +# if YYDEBUG +# define ]b4_api_PREFIX[DEBUG 1 +# else +# define ]b4_api_PREFIX[DEBUG 0 +# endif +# else /* ! defined YYDEBUG */ +# define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[ +# endif /* ! defined YYDEBUG */ +#endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl +]) + +# b4_declare_yydebug +# ------------------ +m4_define([b4_declare_yydebug], +[b4_YYDEBUG_define[ +#if ]b4_api_PREFIX[DEBUG +extern int ]b4_prefix[debug; +#endif][]dnl +]) + +# b4_yylloc_default_define +# ------------------------ +# Define YYLLOC_DEFAULT. +m4_define([b4_yylloc_default_define], +[[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif +]]) + +# b4_yy_location_print_define +# --------------------------- +# Define YY_LOCATION_PRINT. +m4_define([b4_yy_location_print_define], +[b4_locations_if([[ +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if (! defined __GNUC__ || __GNUC__ < 2 \ + || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) +# define __attribute__(Spec) /* empty */ +# endif +#endif + +#ifndef YY_LOCATION_PRINT +# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL + +/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ + +__attribute__((__unused__)) +]b4_c_function_def([yy_location_print_], + [static unsigned], + [[FILE *yyo], [yyo]], + [[YYLTYPE const * const yylocp], [yylocp]])[ +{ + unsigned res = 0; + int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; + if (0 <= yylocp->first_line) + { + res += fprintf (yyo, "%d", yylocp->first_line); + if (0 <= yylocp->first_column) + res += fprintf (yyo, ".%d", yylocp->first_column); + } + if (0 <= yylocp->last_line) + { + if (yylocp->first_line < yylocp->last_line) + { + res += fprintf (yyo, "-%d", yylocp->last_line); + if (0 <= end_col) + res += fprintf (yyo, ".%d", end_col); + } + else if (0 <= end_col && yylocp->first_column < end_col) + res += fprintf (yyo, "-%d", end_col); + } + return res; + } + +# define YY_LOCATION_PRINT(File, Loc) \ + yy_location_print_ (File, &(Loc)) + +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif]], +[[/* This macro is provided for backward compatibility. */ +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif]]) +]) + +# b4_yyloc_default +# ---------------- +# Expand to a possible default value for yylloc. +m4_define([b4_yyloc_default], +[[ +# if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL + = { ]m4_join([, ], + m4_defn([b4_location_initial_line]), + m4_defn([b4_location_initial_column]), + m4_defn([b4_location_initial_line]), + m4_defn([b4_location_initial_column]))[ } +# endif +]]) diff --git a/tools/data/glr.c b/tools/data/glr.c new file mode 100644 index 00000000..02a76c21 --- /dev/null +++ b/tools/data/glr.c @@ -0,0 +1,2589 @@ + -*- C -*- + +# GLR skeleton for Bison + +# Copyright (C) 2002-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# If we are loaded by glr.cc, do not override c++.m4 definitions by +# those of c.m4. +m4_if(b4_skeleton, ["glr.c"], + [m4_include(b4_pkgdatadir/[c.m4])]) + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Stack parameters. +m4_define_default([b4_stack_depth_max], [10000]) +m4_define_default([b4_stack_depth_init], [200]) + + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + +b4_define_flag_if([pure]) +# If glr.cc is including this file and thus has already set b4_pure_flag, +# do not change the value of b4_pure_flag, and do not record a use of api.pure. +m4_ifndef([b4_pure_flag], +[b4_percent_define_default([[api.pure]], [[false]]) + m4_define([b4_pure_flag], + [b4_percent_define_flag_if([[api.pure]], [[1]], [[0]])])]) + +# b4_user_formals +# --------------- +# The possible parse-params formal arguments preceded by a comma. +# +# This is not shared with yacc.c in c.m4 because GLR relies on ISO C +# formal argument declarations. +m4_define([b4_user_formals], +[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])]) + + +# b4_lex_param +# ------------ +# Accumule in b4_lex_param all the yylex arguments. +# Yes, this is quite ugly... +m4_define([b4_lex_param], +m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl +b4_locations_if([, [[YYLTYPE *], [&yylloc]]])])dnl +m4_ifdef([b4_lex_param], [, ]b4_lex_param))) + + +# b4_yyerror_args +# --------------- +# Optional effective arguments passed to yyerror: user args plus yylloc, and +# a trailing comma. +m4_define([b4_yyerror_args], +[b4_pure_if([b4_locations_if([yylocp, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_lyyerror_args +# ---------------- +# Same as above, but on the lookahead, hence &yylloc instead of yylocp. +m4_define([b4_lyyerror_args], +[b4_pure_if([b4_locations_if([&yylloc, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_pure_args +# ------------ +# Same as b4_yyerror_args, but with a leading comma. +m4_define([b4_pure_args], +[b4_pure_if([b4_locations_if([, yylocp])])[]b4_user_args]) + + +# b4_lpure_args +# ------------- +# Same as above, but on the lookahead, hence &yylloc instead of yylocp. +m4_define([b4_lpure_args], +[b4_pure_if([b4_locations_if([, &yylloc])])[]b4_user_args]) + + + +# b4_pure_formals +# --------------- +# Arguments passed to yyerror: user formals plus yylocp with leading comma. +m4_define([b4_pure_formals], +[b4_pure_if([b4_locations_if([, YYLTYPE *yylocp])])[]b4_user_formals]) + + +# b4_locuser_formals(LOC = yylocp) +# -------------------------------- +m4_define([b4_locuser_formals], +[b4_locations_if([, YYLTYPE *m4_default([$1], [yylocp])])[]b4_user_formals]) + + +# b4_locuser_args(LOC = yylocp) +# ----------------------------- +m4_define([b4_locuser_args], +[b4_locations_if([, m4_default([$1], [yylocp])])[]b4_user_args]) + + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[((*yyvalp)[]m4_ifval([$1], [.$1]))]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))]) + + + +## ----------- ## +## Locations. ## +## ----------- ## + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[(*yylocp)]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)]) + + +## -------------- ## +## Declarations. ## +## -------------- ## + +# b4_shared_declarations +# ---------------------- +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. +m4_define([b4_shared_declarations], +[b4_declare_yydebug[ +]b4_percent_code_get([[requires]])[ +]b4_token_enums(b4_tokens)[ +]b4_declare_yylstype[ +]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[ +]b4_percent_code_get([[provides]])[]dnl +]) + + +## -------------- ## +## Output files. ## +## -------------- ## + +b4_output_begin([b4_parser_file_name]) +b4_copyright([Skeleton implementation for Bison GLR parsers in C], + [2002-2012])[ + +/* C GLR parser skeleton written by Paul Hilfinger. */ + +]b4_identification + +b4_percent_code_get([[top]])[ +]m4_if(b4_api_prefix, [yy], [], +[[/* Substitute the type names. */ +#define YYSTYPE ]b4_api_PREFIX[STYPE]b4_locations_if([[ +#define YYLTYPE ]b4_api_PREFIX[LTYPE]])])[ +]m4_if(b4_prefix, [yy], [], +[[/* Substitute the variable and function names. */ +#define yyparse ]b4_prefix[parse +#define yylex ]b4_prefix[lex +#define yyerror ]b4_prefix[error +#define yylval ]b4_prefix[lval +#define yychar ]b4_prefix[char +#define yydebug ]b4_prefix[debug +#define yynerrs ]b4_prefix[nerrs]b4_locations_if([[ +#define yylloc ]b4_prefix[lloc]])])[ + +/* Copy the first part of user declarations. */ +]b4_user_pre_prologue[ + +]b4_null_define[ + +]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]], + [b4_shared_declarations])[ + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE ]b4_error_verbose_flag[ +#endif + +/* Default (constant) value used for initialization for null + right-hand sides. Unlike the standard yacc.c template, here we set + the default value of $$ to a zeroed-out value. Since the default + value is undefined, this behavior is technically correct. */ +static YYSTYPE yyval_default;]b4_locations_if([[ +static YYLTYPE yyloc_default][]b4_yyloc_default;])[ + +/* Copy the second part of user declarations. */ +]b4_user_post_prologue +b4_percent_code_get[]dnl + +[#include +#include +#include + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(N) (N) +#else +]b4_c_function_def([YYID], [static int], [[int i], [i]])[ +{ + return i; +} +#endif + +#ifndef YYFREE +# define YYFREE free +#endif +#ifndef YYMALLOC +# define YYMALLOC malloc +#endif +#ifndef YYREALLOC +# define YYREALLOC realloc +#endif + +#define YYSIZEMAX ((size_t) -1) + +#ifdef __cplusplus + typedef bool yybool; +#else + typedef unsigned char yybool; +#endif +#define yytrue 1 +#define yyfalse 0 + +#ifndef YYSETJMP +# include +# define YYJMP_BUF jmp_buf +# define YYSETJMP(Env) setjmp (Env) +/* Pacify clang. */ +# define YYLONGJMP(Env, Val) (longjmp (Env, Val), YYASSERT (0)) +#endif + +/*-----------------. +| GCC extensions. | +`-----------------*/ + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if (! defined __GNUC__ || __GNUC__ < 2 \ + || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) +# define __attribute__(Spec) /* empty */ +# endif +#endif + +#ifndef YYASSERT +# define YYASSERT(Condition) ((void) ((Condition) || (abort (), 0))) +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL ]b4_final_state_number[ +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST ]b4_last[ + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS ]b4_tokens_number[ +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS ]b4_nterms_number[ +/* YYNRULES -- Number of rules. */ +#define YYNRULES ]b4_rules_number[ +/* YYNRULES -- Number of states. */ +#define YYNSTATES ]b4_states_number[ +/* YYMAXRHS -- Maximum number of symbols on right-hand side of rule. */ +#define YYMAXRHS ]b4_r2_max[ +/* YYMAXLEFT -- Maximum number of symbols to the left of a handle + accessed by $0, $-1, etc., in any rule. */ +#define YYMAXLEFT ]b4_max_left_semantic_context[ + +/* YYTRANSLATE(X) -- Bison symbol number corresponding to X. */ +#define YYUNDEFTOK ]b4_undef_token_number[ +#define YYMAXUTOK ]b4_user_token_number_max[ + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const ]b4_int_type_for([b4_translate])[ yytranslate[] = +{ + ]b4_translate[ +}; + +#if ]b4_api_PREFIX[DEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = +{ + ]b4_prhs[ +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = +{ + ]b4_rhs[ +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const ]b4_int_type_for([b4_rline])[ yyrline[] = +{ + ]b4_rline[ +}; +#endif + +#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[ +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + ]b4_tname[ +}; +#endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const ]b4_int_type_for([b4_r1])[ yyr1[] = +{ + ]b4_r1[ +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const ]b4_int_type_for([b4_r2])[ yyr2[] = +{ + ]b4_r2[ +}; + +/* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ +static const ]b4_int_type_for([b4_dprec])[ yydprec[] = +{ + ]b4_dprec[ +}; + +/* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM. */ +static const ]b4_int_type_for([b4_merger])[ yymerger[] = +{ + ]b4_merger[ +}; + +/* YYDEFACT[S] -- default reduction number in state S. Performed when + YYTABLE doesn't specify something else to do. Zero means the default + is an error. */ +static const ]b4_int_type_for([b4_defact])[ yydefact[] = +{ + ]b4_defact[ +}; + +/* YYPDEFGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] = +{ + ]b4_defgoto[ +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF ]b4_pact_ninf[ +static const ]b4_int_type_for([b4_pact])[ yypact[] = +{ + ]b4_pact[ +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] = +{ + ]b4_pgoto[ +}; + +/* 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 YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF ]b4_table_ninf[ +static const ]b4_int_type_for([b4_table])[ yytable[] = +{ + ]b4_table[ +}; + +/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of + list of conflicting reductions corresponding to action entry for + state STATE-NUM in yytable. 0 means no conflicts. The list in + yyconfl is terminated by a rule number of 0. */ +static const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] = +{ + ]b4_conflict_list_heads[ +}; + +/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by + 0, pointed into by YYCONFLP. */ +]dnl Do not use b4_int_type_for here, since there are places where +dnl pointers onto yyconfl are taken, which type is "short int *". +dnl We probably ought to introduce a type for confl. +[static const short int yyconfl[] = +{ + ]b4_conflicting_rules[ +}; + +static const ]b4_int_type_for([b4_check])[ yycheck[] = +{ + ]b4_check[ +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const ]b4_int_type_for([b4_stos])[ yystos[] = +{ + ]b4_stos[ +}; + +/* Error token number */ +#define YYTERROR 1 + +]b4_locations_if([[ +]b4_yylloc_default_define[ +# define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc) +]])[ +]b4_yy_location_print_define[ + +/* YYLEX -- calling `yylex' with the right arguments. */ +#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ + +]b4_pure_if( +[ +#undef yynerrs +#define yynerrs (yystackp->yyerrcnt) +#undef yychar +#define yychar (yystackp->yyrawchar) +#undef yylval +#define yylval (yystackp->yyval) +#undef yylloc +#define yylloc (yystackp->yyloc) +m4_if(b4_prefix[], [yy], [], +[#define b4_prefix[]nerrs yynerrs +#define b4_prefix[]char yychar +#define b4_prefix[]lval yylval +#define b4_prefix[]lloc yylloc])], +[YYSTYPE yylval;]b4_locations_if([[ +YYLTYPE yylloc;]])[ + +int yynerrs; +int yychar;])[ + +static const int YYEOF = 0; +static const int YYEMPTY = -2; + +typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; + +#define YYCHK(YYE) \ + do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ + while (YYID (0)) + +#if ]b4_api_PREFIX[DEBUG + +# ifndef YYFPRINTF +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[ + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; + +#else /* !]b4_api_PREFIX[DEBUG */ + +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) + +#endif /* !]b4_api_PREFIX[DEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH ]b4_stack_depth_init[ +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH ]b4_stack_depth_max[ +#endif + +/* Minimum number of free items on the stack allowed after an + allocation. This is to allow allocation and initialization + to be completed by functions that call yyexpandGLRStack before the + stack is expanded, thus insuring that all necessary pointers get + properly redirected to new data. */ +#define YYHEADROOM 2 + +#ifndef YYSTACKEXPANDABLE +# if (! defined __cplusplus \ + || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \ + && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)) +# define YYSTACKEXPANDABLE 1 +# else +# define YYSTACKEXPANDABLE 0 +# endif +#endif + +#if YYSTACKEXPANDABLE +# define YY_RESERVE_GLRSTACK(Yystack) \ + do { \ + if (Yystack->yyspaceLeft < YYHEADROOM) \ + yyexpandGLRStack (Yystack); \ + } while (YYID (0)) +#else +# define YY_RESERVE_GLRSTACK(Yystack) \ + do { \ + if (Yystack->yyspaceLeft < YYHEADROOM) \ + yyMemoryExhausted (Yystack); \ + } while (YYID (0)) +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static size_t +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return strlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* !YYERROR_VERBOSE */ + +/** State numbers, as in LALR(1) machine */ +typedef int yyStateNum; + +/** Rule numbers, as in LALR(1) machine */ +typedef int yyRuleNum; + +/** Grammar symbol */ +typedef short int yySymbol; + +/** Item references, as in LALR(1) machine */ +typedef short int yyItemNum; + +typedef struct yyGLRState yyGLRState; +typedef struct yyGLRStateSet yyGLRStateSet; +typedef struct yySemanticOption yySemanticOption; +typedef union yyGLRStackItem yyGLRStackItem; +typedef struct yyGLRStack yyGLRStack; + +struct yyGLRState { + /** Type tag: always true. */ + yybool yyisState; + /** Type tag for yysemantics. If true, yysval applies, otherwise + * yyfirstVal applies. */ + yybool yyresolved; + /** Number of corresponding LALR(1) machine state. */ + yyStateNum yylrState; + /** Preceding state in this stack */ + yyGLRState* yypred; + /** Source position of the first token produced by my symbol */ + size_t yyposn; + union { + /** First in a chain of alternative reductions producing the + * non-terminal corresponding to this state, threaded through + * yynext. */ + yySemanticOption* yyfirstVal; + /** Semantic value for this state. */ + YYSTYPE yysval; + } yysemantics;]b4_locations_if([[ + /** Source location for this state. */ + YYLTYPE yyloc;]])[ +}; + +struct yyGLRStateSet { + yyGLRState** yystates; + /** During nondeterministic operation, yylookaheadNeeds tracks which + * stacks have actually needed the current lookahead. During deterministic + * operation, yylookaheadNeeds[0] is not maintained since it would merely + * duplicate yychar != YYEMPTY. */ + yybool* yylookaheadNeeds; + size_t yysize, yycapacity; +}; + +struct yySemanticOption { + /** Type tag: always false. */ + yybool yyisState; + /** Rule number for this reduction */ + yyRuleNum yyrule; + /** The last RHS state in the list of states to be reduced. */ + yyGLRState* yystate; + /** The lookahead for this reduction. */ + int yyrawchar; + YYSTYPE yyval;]b4_locations_if([[ + YYLTYPE yyloc;]])[ + /** Next sibling in chain of options. To facilitate merging, + * options are chained in decreasing order by address. */ + yySemanticOption* yynext; +}; + +/** Type of the items in the GLR stack. The yyisState field + * indicates which item of the union is valid. */ +union yyGLRStackItem { + yyGLRState yystate; + yySemanticOption yyoption; +}; + +struct yyGLRStack { + int yyerrState; +]b4_locations_if([[ /* To compute the location of the error token. */ + yyGLRStackItem yyerror_range[3];]])[ +]b4_pure_if( +[ + int yyerrcnt; + int yyrawchar; + YYSTYPE yyval;]b4_locations_if([[ + YYLTYPE yyloc;]])[ +])[ + YYJMP_BUF yyexception_buffer; + yyGLRStackItem* yyitems; + yyGLRStackItem* yynextFree; + size_t yyspaceLeft; + yyGLRState* yysplitPoint; + yyGLRState* yylastDeleted; + yyGLRStateSet yytops; +}; + +#if YYSTACKEXPANDABLE +static void yyexpandGLRStack (yyGLRStack* yystackp); +#endif + +static void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) + __attribute__ ((__noreturn__)); +static void +yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) +{ + if (yymsg != YY_NULL) + yyerror (]b4_yyerror_args[yymsg); + YYLONGJMP (yystackp->yyexception_buffer, 1); +} + +static void yyMemoryExhausted (yyGLRStack* yystackp) + __attribute__ ((__noreturn__)); +static void +yyMemoryExhausted (yyGLRStack* yystackp) +{ + YYLONGJMP (yystackp->yyexception_buffer, 2); +} + +#if ]b4_api_PREFIX[DEBUG || YYERROR_VERBOSE +/** A printable representation of TOKEN. */ +static inline const char* +yytokenName (yySymbol yytoken) +{ + if (yytoken == YYEMPTY) + return ""; + + return yytname[yytoken]; +} +#endif + +/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting + * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred + * containing the pointer to the next state in the chain. */ +static void yyfillin (yyGLRStackItem *, int, int) __attribute__ ((__unused__)); +static void +yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) +{ + int i; + yyGLRState *s = yyvsp[yylow0].yystate.yypred; + for (i = yylow0-1; i >= yylow1; i -= 1) + { + YYASSERT (s->yyresolved); + yyvsp[i].yystate.yyresolved = yytrue; + yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;]b4_locations_if([[ + yyvsp[i].yystate.yyloc = s->yyloc;]])[ + s = yyvsp[i].yystate.yypred = s->yypred; + } +} + +/* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1. Otherwise, fill in + * YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. + * For convenience, always return YYLOW1. */ +static inline int yyfill (yyGLRStackItem *, int *, int, yybool) + __attribute__ ((__unused__)); +static inline int +yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) +{ + if (!yynormal && yylow1 < *yylow) + { + yyfillin (yyvsp, *yylow, yylow1); + *yylow = yylow1; + } + return yylow1; +} + +/** Perform user action for rule number YYN, with RHS length YYRHSLEN, + * and top stack item YYVSP. YYLVALP points to place to put semantic + * value ($$), and yylocp points to place for location information + * (@@$). Returns yyok for normal return, yyaccept for YYACCEPT, + * yyerr for YYERROR, yyabort for YYABORT. */ +/*ARGSUSED*/ static YYRESULTTAG +yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, + yyGLRStack* yystackp, + YYSTYPE* yyvalp]b4_locuser_formals[) +{ + yybool yynormal __attribute__ ((__unused__)) = + (yystackp->yysplitPoint == YY_NULL); + int yylow; +]b4_parse_param_use[]dnl +[# undef yyerrok +# define yyerrok (yystackp->yyerrState = 0) +# undef YYACCEPT +# define YYACCEPT return yyaccept +# undef YYABORT +# define YYABORT return yyabort +# undef YYERROR +# define YYERROR return yyerrok, yyerr +# undef YYRECOVERING +# define YYRECOVERING() (yystackp->yyerrState != 0) +# undef yyclearin +# define yyclearin (yychar = YYEMPTY) +# undef YYFILL +# define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal) +# undef YYBACKUP +# define YYBACKUP(Token, Value) \ + return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")), \ + yyerrok, yyerr + + yylow = 1; + if (yyrhslen == 0) + *yyvalp = yyval_default; + else + *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;]b4_locations_if([[ + YYLLOC_DEFAULT ((*yylocp), (yyvsp - yyrhslen), yyrhslen); + yystackp->yyerror_range[1].yystate.yyloc = *yylocp; +]])[ + switch (yyn) + { + ]b4_user_actions[ + default: break; + } + + return yyok; +# undef yyerrok +# undef YYABORT +# undef YYACCEPT +# undef YYERROR +# undef YYBACKUP +# undef yyclearin +# undef YYRECOVERING +} + + +/*ARGSUSED*/ static void +yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) +{ + YYUSE (yy0); + YYUSE (yy1); + + switch (yyn) + { + ]b4_mergers[ + default: break; + } +} + + /* Bison grammar-table manipulation. */ + +]b4_yydestruct_generate([b4_c_ansi_function_def])[ + +/** Number of symbols composing the right hand side of rule #RULE. */ +static inline int +yyrhsLength (yyRuleNum yyrule) +{ + return yyr2[yyrule]; +} + +static void +yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[) +{ + if (yys->yyresolved) + yydestruct (yymsg, yystos[yys->yylrState], + &yys->yysemantics.yysval]b4_locuser_args([&yys->yyloc])[); + else + { +#if ]b4_api_PREFIX[DEBUG + if (yydebug) + { + if (yys->yysemantics.yyfirstVal) + YYFPRINTF (stderr, "%s unresolved ", yymsg); + else + YYFPRINTF (stderr, "%s incomplete ", yymsg); + yy_symbol_print (stderr, yystos[yys->yylrState], + YY_NULL]b4_locuser_args([&yys->yyloc])[); + YYFPRINTF (stderr, "\n"); + } +#endif + + if (yys->yysemantics.yyfirstVal) + { + yySemanticOption *yyoption = yys->yysemantics.yyfirstVal; + yyGLRState *yyrh; + int yyn; + for (yyrh = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule); + yyn > 0; + yyrh = yyrh->yypred, yyn -= 1) + yydestroyGLRState (yymsg, yyrh]b4_user_args[); + } + } +} + +/** Left-hand-side symbol for rule #RULE. */ +static inline yySymbol +yylhsNonterm (yyRuleNum yyrule) +{ + return yyr1[yyrule]; +} + +#define yypact_value_is_default(Yystate) \ + ]b4_table_value_equals([[pact]], [[Yystate]], [b4_pact_ninf])[ + +/** True iff LR state STATE has only a default reduction (regardless + * of token). */ +static inline yybool +yyisDefaultedState (yyStateNum yystate) +{ + return yypact_value_is_default (yypact[yystate]); +} + +/** The default reduction for STATE, assuming it has one. */ +static inline yyRuleNum +yydefaultAction (yyStateNum yystate) +{ + return yydefact[yystate]; +} + +#define yytable_value_is_error(Yytable_value) \ + ]b4_table_value_equals([[table]], [[Yytable_value]], [b4_table_ninf])[ + +/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN. + * Result R means + * R < 0: Reduce on rule -R. + * R = 0: Error. + * R > 0: Shift to state R. + * Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of + * conflicting reductions. + */ +static inline void +yygetLRActions (yyStateNum yystate, int yytoken, + int* yyaction, const short int** yyconflicts) +{ + int yyindex = yypact[yystate] + yytoken; + if (yypact_value_is_default (yypact[yystate]) + || yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken) + { + *yyaction = -yydefact[yystate]; + *yyconflicts = yyconfl; + } + else if (! yytable_value_is_error (yytable[yyindex])) + { + *yyaction = yytable[yyindex]; + *yyconflicts = yyconfl + yyconflp[yyindex]; + } + else + { + *yyaction = 0; + *yyconflicts = yyconfl + yyconflp[yyindex]; + } +} + +static inline yyStateNum +yyLRgotoState (yyStateNum yystate, yySymbol yylhs) +{ + int yyr; + yyr = yypgoto[yylhs - YYNTOKENS] + yystate; + if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) + return yytable[yyr]; + else + return yydefgoto[yylhs - YYNTOKENS]; +} + +static inline yybool +yyisShiftAction (int yyaction) +{ + return 0 < yyaction; +} + +static inline yybool +yyisErrorAction (int yyaction) +{ + return yyaction == 0; +} + + /* GLRStates */ + +/** Return a fresh GLRStackItem. Callers should call + * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient + * headroom. */ + +static inline yyGLRStackItem* +yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState) +{ + yyGLRStackItem* yynewItem = yystackp->yynextFree; + yystackp->yyspaceLeft -= 1; + yystackp->yynextFree += 1; + yynewItem->yystate.yyisState = yyisState; + return yynewItem; +} + +/** Add a new semantic action that will execute the action for rule + * RULENUM on the semantic values in RHS to the list of + * alternative actions for STATE. Assumes that RHS comes from + * stack #K of *STACKP. */ +static void +yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate, + yyGLRState* rhs, yyRuleNum yyrule) +{ + yySemanticOption* yynewOption = + &yynewGLRStackItem (yystackp, yyfalse)->yyoption; + yynewOption->yystate = rhs; + yynewOption->yyrule = yyrule; + if (yystackp->yytops.yylookaheadNeeds[yyk]) + { + yynewOption->yyrawchar = yychar; + yynewOption->yyval = yylval;]b4_locations_if([ + yynewOption->yyloc = yylloc;])[ + } + else + yynewOption->yyrawchar = YYEMPTY; + yynewOption->yynext = yystate->yysemantics.yyfirstVal; + yystate->yysemantics.yyfirstVal = yynewOption; + + YY_RESERVE_GLRSTACK (yystackp); +} + + /* GLRStacks */ + +/** Initialize SET to a singleton set containing an empty stack. */ +static yybool +yyinitStateSet (yyGLRStateSet* yyset) +{ + yyset->yysize = 1; + yyset->yycapacity = 16; + yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]); + if (! yyset->yystates) + return yyfalse; + yyset->yystates[0] = YY_NULL; + yyset->yylookaheadNeeds = + (yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]); + if (! yyset->yylookaheadNeeds) + { + YYFREE (yyset->yystates); + return yyfalse; + } + return yytrue; +} + +static void yyfreeStateSet (yyGLRStateSet* yyset) +{ + YYFREE (yyset->yystates); + YYFREE (yyset->yylookaheadNeeds); +} + +/** Initialize STACK to a single empty stack, with total maximum + * capacity for all stacks of SIZE. */ +static yybool +yyinitGLRStack (yyGLRStack* yystackp, size_t yysize) +{ + yystackp->yyerrState = 0; + yynerrs = 0; + yystackp->yyspaceLeft = yysize; + yystackp->yyitems = + (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystackp->yynextFree[0]); + if (!yystackp->yyitems) + return yyfalse; + yystackp->yynextFree = yystackp->yyitems; + yystackp->yysplitPoint = YY_NULL; + yystackp->yylastDeleted = YY_NULL; + return yyinitStateSet (&yystackp->yytops); +} + + +#if YYSTACKEXPANDABLE +# define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \ + &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE + +/** If STACK is expandable, extend it. WARNING: Pointers into the + stack from outside should be considered invalid after this call. + We always expand when there are 1 or fewer items left AFTER an + allocation, so that we can avoid having external pointers exist + across an allocation. */ +static void +yyexpandGLRStack (yyGLRStack* yystackp) +{ + yyGLRStackItem* yynewItems; + yyGLRStackItem* yyp0, *yyp1; + size_t yynewSize; + size_t yyn; + size_t yysize = yystackp->yynextFree - yystackp->yyitems; + if (YYMAXDEPTH - YYHEADROOM < yysize) + yyMemoryExhausted (yystackp); + yynewSize = 2*yysize; + if (YYMAXDEPTH < yynewSize) + yynewSize = YYMAXDEPTH; + yynewItems = (yyGLRStackItem*) YYMALLOC (yynewSize * sizeof yynewItems[0]); + if (! yynewItems) + yyMemoryExhausted (yystackp); + for (yyp0 = yystackp->yyitems, yyp1 = yynewItems, yyn = yysize; + 0 < yyn; + yyn -= 1, yyp0 += 1, yyp1 += 1) + { + *yyp1 = *yyp0; + if (*(yybool *) yyp0) + { + yyGLRState* yys0 = &yyp0->yystate; + yyGLRState* yys1 = &yyp1->yystate; + if (yys0->yypred != YY_NULL) + yys1->yypred = + YYRELOC (yyp0, yyp1, yys0->yypred, yystate); + if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULL) + yys1->yysemantics.yyfirstVal = + YYRELOC (yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption); + } + else + { + yySemanticOption* yyv0 = &yyp0->yyoption; + yySemanticOption* yyv1 = &yyp1->yyoption; + if (yyv0->yystate != YY_NULL) + yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate); + if (yyv0->yynext != YY_NULL) + yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption); + } + } + if (yystackp->yysplitPoint != YY_NULL) + yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems, + yystackp->yysplitPoint, yystate); + + for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1) + if (yystackp->yytops.yystates[yyn] != YY_NULL) + yystackp->yytops.yystates[yyn] = + YYRELOC (yystackp->yyitems, yynewItems, + yystackp->yytops.yystates[yyn], yystate); + YYFREE (yystackp->yyitems); + yystackp->yyitems = yynewItems; + yystackp->yynextFree = yynewItems + yysize; + yystackp->yyspaceLeft = yynewSize - yysize; +} +#endif + +static void +yyfreeGLRStack (yyGLRStack* yystackp) +{ + YYFREE (yystackp->yyitems); + yyfreeStateSet (&yystackp->yytops); +} + +/** Assuming that S is a GLRState somewhere on STACK, update the + * splitpoint of STACK, if needed, so that it is at least as deep as + * S. */ +static inline void +yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) +{ + if (yystackp->yysplitPoint != YY_NULL && yystackp->yysplitPoint > yys) + yystackp->yysplitPoint = yys; +} + +/** Invalidate stack #K in STACK. */ +static inline void +yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) +{ + if (yystackp->yytops.yystates[yyk] != YY_NULL) + yystackp->yylastDeleted = yystackp->yytops.yystates[yyk]; + yystackp->yytops.yystates[yyk] = YY_NULL; +} + +/** Undelete the last stack that was marked as deleted. Can only be + done once after a deletion, and only when all other stacks have + been deleted. */ +static void +yyundeleteLastStack (yyGLRStack* yystackp) +{ + if (yystackp->yylastDeleted == YY_NULL || yystackp->yytops.yysize != 0) + return; + yystackp->yytops.yystates[0] = yystackp->yylastDeleted; + yystackp->yytops.yysize = 1; + YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n")); + yystackp->yylastDeleted = YY_NULL; +} + +static inline void +yyremoveDeletes (yyGLRStack* yystackp) +{ + size_t yyi, yyj; + yyi = yyj = 0; + while (yyj < yystackp->yytops.yysize) + { + if (yystackp->yytops.yystates[yyi] == YY_NULL) + { + if (yyi == yyj) + { + YYDPRINTF ((stderr, "Removing dead stacks.\n")); + } + yystackp->yytops.yysize -= 1; + } + else + { + yystackp->yytops.yystates[yyj] = yystackp->yytops.yystates[yyi]; + /* In the current implementation, it's unnecessary to copy + yystackp->yytops.yylookaheadNeeds[yyi] since, after + yyremoveDeletes returns, the parser immediately either enters + deterministic operation or shifts a token. However, it doesn't + hurt, and the code might evolve to need it. */ + yystackp->yytops.yylookaheadNeeds[yyj] = + yystackp->yytops.yylookaheadNeeds[yyi]; + if (yyj != yyi) + { + YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n", + (unsigned long int) yyi, (unsigned long int) yyj)); + } + yyj += 1; + } + yyi += 1; + } +} + +/** Shift to a new state on stack #K of STACK, corresponding to LR state + * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ +static inline void +yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, + size_t yyposn, + YYSTYPE* yyvalp]b4_locations_if([, YYLTYPE* yylocp])[) +{ + yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate; + + yynewState->yylrState = yylrState; + yynewState->yyposn = yyposn; + yynewState->yyresolved = yytrue; + yynewState->yypred = yystackp->yytops.yystates[yyk]; + yynewState->yysemantics.yysval = *yyvalp;]b4_locations_if([ + yynewState->yyloc = *yylocp;])[ + yystackp->yytops.yystates[yyk] = yynewState; + + YY_RESERVE_GLRSTACK (yystackp); +} + +/** Shift stack #K of YYSTACK, to a new state corresponding to LR + * state YYLRSTATE, at input position YYPOSN, with the (unresolved) + * semantic value of YYRHS under the action for YYRULE. */ +static inline void +yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, + size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule) +{ + yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate; + + yynewState->yylrState = yylrState; + yynewState->yyposn = yyposn; + yynewState->yyresolved = yyfalse; + yynewState->yypred = yystackp->yytops.yystates[yyk]; + yynewState->yysemantics.yyfirstVal = YY_NULL; + yystackp->yytops.yystates[yyk] = yynewState; + + /* Invokes YY_RESERVE_GLRSTACK. */ + yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule); +} + +/** Pop the symbols consumed by reduction #RULE from the top of stack + * #K of STACK, and perform the appropriate semantic action on their + * semantic values. Assumes that all ambiguities in semantic values + * have been previously resolved. Set *VALP to the resulting value, + * and *LOCP to the computed location (if any). Return value is as + * for userAction. */ +static inline YYRESULTTAG +yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, + YYSTYPE* yyvalp]b4_locuser_formals[) +{ + int yynrhs = yyrhsLength (yyrule); + + if (yystackp->yysplitPoint == YY_NULL) + { + /* Standard special case: single stack. */ + yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; + YYASSERT (yyk == 0); + yystackp->yynextFree -= yynrhs; + yystackp->yyspaceLeft += yynrhs; + yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate; + return yyuserAction (yyrule, yynrhs, rhs, yystackp, + yyvalp]b4_locuser_args[); + } + else + { + /* At present, doAction is never called in nondeterministic + * mode, so this branch is never taken. It is here in + * anticipation of a future feature that will allow immediate + * evaluation of selected actions in nondeterministic mode. */ + int yyi; + yyGLRState* yys; + yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; + yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred + = yystackp->yytops.yystates[yyk];]b4_locations_if([[ + if (yynrhs == 0) + /* Set default location. */ + yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yys->yyloc;]])[ + for (yyi = 0; yyi < yynrhs; yyi += 1) + { + yys = yys->yypred; + YYASSERT (yys); + } + yyupdateSplit (yystackp, yys); + yystackp->yytops.yystates[yyk] = yys; + return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, + yystackp, yyvalp]b4_locuser_args[); + } +} + +#if !]b4_api_PREFIX[DEBUG +# define YY_REDUCE_PRINT(Args) +#else +# define YY_REDUCE_PRINT(Args) \ +do { \ + if (yydebug) \ + yy_reduce_print Args; \ +} while (YYID (0)) + +/*----------------------------------------------------------. +| Report that the RULE is going to be reduced on stack #K. | +`----------------------------------------------------------*/ + +/*ARGSUSED*/ static inline void +yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, + YYSTYPE* yyvalp]b4_locuser_formals[) +{ + int yynrhs = yyrhsLength (yyrule); + yybool yynormal __attribute__ ((__unused__)) = + (yystackp->yysplitPoint == YY_NULL); + yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; + int yylow = 1; + int yyi; + YYUSE (yyvalp);]b4_locations_if([ + YYUSE (yylocp);])[ +]b4_parse_param_use[]dnl +[ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", + (unsigned long int) yyk, yyrule - 1, + (unsigned long int) yyrline[yyrule]); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &]b4_rhs_value(yynrhs, yyi + 1)[ + ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl + b4_user_args[); + YYFPRINTF (stderr, "\n"); + } +} +#endif + +/** Pop items off stack #K of STACK according to grammar rule RULE, + * and push back on the resulting nonterminal symbol. Perform the + * semantic action associated with RULE and store its value with the + * newly pushed state, if FORCEEVAL or if STACK is currently + * unambiguous. Otherwise, store the deferred semantic action with + * the new state. If the new state would have an identical input + * position, LR state, and predecessor to an existing state on the stack, + * it is identified with that existing state, eliminating stack #K from + * the STACK. In this case, the (necessarily deferred) semantic value is + * added to the options for the existing state's semantic value. + */ +static inline YYRESULTTAG +yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, + yybool yyforceEval]b4_user_formals[) +{ + size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn; + + if (yyforceEval || yystackp->yysplitPoint == YY_NULL) + { + YYSTYPE yysval;]b4_locations_if([ + YYLTYPE yyloc;])[ + + YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[)); + YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[)); + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc); + yyglrShift (yystackp, yyk, + yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState, + yylhsNonterm (yyrule)), + yyposn, &yysval]b4_locations_if([, &yyloc])[); + } + else + { + size_t yyi; + int yyn; + yyGLRState* yys, *yys0 = yystackp->yytops.yystates[yyk]; + yyStateNum yynewLRState; + + for (yys = yystackp->yytops.yystates[yyk], yyn = yyrhsLength (yyrule); + 0 < yyn; yyn -= 1) + { + yys = yys->yypred; + YYASSERT (yys); + } + yyupdateSplit (yystackp, yys); + yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); + YYDPRINTF ((stderr, + "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n", + (unsigned long int) yyk, yyrule - 1, yynewLRState)); + for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1) + if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL) + { + yyGLRState *yysplit = yystackp->yysplitPoint; + yyGLRState *yyp = yystackp->yytops.yystates[yyi]; + while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn) + { + if (yyp->yylrState == yynewLRState && yyp->yypred == yys) + { + yyaddDeferredAction (yystackp, yyk, yyp, yys0, yyrule); + yymarkStackDeleted (yystackp, yyk); + YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n", + (unsigned long int) yyk, + (unsigned long int) yyi)); + return yyok; + } + yyp = yyp->yypred; + } + } + yystackp->yytops.yystates[yyk] = yys; + yyglrShiftDefer (yystackp, yyk, yynewLRState, yyposn, yys0, yyrule); + } + return yyok; +} + +static size_t +yysplitStack (yyGLRStack* yystackp, size_t yyk) +{ + if (yystackp->yysplitPoint == YY_NULL) + { + YYASSERT (yyk == 0); + yystackp->yysplitPoint = yystackp->yytops.yystates[yyk]; + } + if (yystackp->yytops.yysize >= yystackp->yytops.yycapacity) + { + yyGLRState** yynewStates; + yybool* yynewLookaheadNeeds; + + yynewStates = YY_NULL; + + if (yystackp->yytops.yycapacity + > (YYSIZEMAX / (2 * sizeof yynewStates[0]))) + yyMemoryExhausted (yystackp); + yystackp->yytops.yycapacity *= 2; + + yynewStates = + (yyGLRState**) YYREALLOC (yystackp->yytops.yystates, + (yystackp->yytops.yycapacity + * sizeof yynewStates[0])); + if (yynewStates == YY_NULL) + yyMemoryExhausted (yystackp); + yystackp->yytops.yystates = yynewStates; + + yynewLookaheadNeeds = + (yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds, + (yystackp->yytops.yycapacity + * sizeof yynewLookaheadNeeds[0])); + if (yynewLookaheadNeeds == YY_NULL) + yyMemoryExhausted (yystackp); + yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds; + } + yystackp->yytops.yystates[yystackp->yytops.yysize] + = yystackp->yytops.yystates[yyk]; + yystackp->yytops.yylookaheadNeeds[yystackp->yytops.yysize] + = yystackp->yytops.yylookaheadNeeds[yyk]; + yystackp->yytops.yysize += 1; + return yystackp->yytops.yysize-1; +} + +/** True iff Y0 and Y1 represent identical options at the top level. + * That is, they represent the same rule applied to RHS symbols + * that produce the same terminal symbols. */ +static yybool +yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1) +{ + if (yyy0->yyrule == yyy1->yyrule) + { + yyGLRState *yys0, *yys1; + int yyn; + for (yys0 = yyy0->yystate, yys1 = yyy1->yystate, + yyn = yyrhsLength (yyy0->yyrule); + yyn > 0; + yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) + if (yys0->yyposn != yys1->yyposn) + return yyfalse; + return yytrue; + } + else + return yyfalse; +} + +/** Assuming identicalOptions (Y0,Y1), destructively merge the + * alternative semantic values for the RHS-symbols of Y1 and Y0. */ +static void +yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) +{ + yyGLRState *yys0, *yys1; + int yyn; + for (yys0 = yyy0->yystate, yys1 = yyy1->yystate, + yyn = yyrhsLength (yyy0->yyrule); + yyn > 0; + yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) + { + if (yys0 == yys1) + break; + else if (yys0->yyresolved) + { + yys1->yyresolved = yytrue; + yys1->yysemantics.yysval = yys0->yysemantics.yysval; + } + else if (yys1->yyresolved) + { + yys0->yyresolved = yytrue; + yys0->yysemantics.yysval = yys1->yysemantics.yysval; + } + else + { + yySemanticOption** yyz0p = &yys0->yysemantics.yyfirstVal; + yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal; + while (YYID (yytrue)) + { + if (yyz1 == *yyz0p || yyz1 == YY_NULL) + break; + else if (*yyz0p == YY_NULL) + { + *yyz0p = yyz1; + break; + } + else if (*yyz0p < yyz1) + { + yySemanticOption* yyz = *yyz0p; + *yyz0p = yyz1; + yyz1 = yyz1->yynext; + (*yyz0p)->yynext = yyz; + } + yyz0p = &(*yyz0p)->yynext; + } + yys1->yysemantics.yyfirstVal = yys0->yysemantics.yyfirstVal; + } + } +} + +/** Y0 and Y1 represent two possible actions to take in a given + * parsing state; return 0 if no combination is possible, + * 1 if user-mergeable, 2 if Y0 is preferred, 3 if Y1 is preferred. */ +static int +yypreference (yySemanticOption* y0, yySemanticOption* y1) +{ + yyRuleNum r0 = y0->yyrule, r1 = y1->yyrule; + int p0 = yydprec[r0], p1 = yydprec[r1]; + + if (p0 == p1) + { + if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1]) + return 0; + else + return 1; + } + if (p0 == 0 || p1 == 0) + return 0; + if (p0 < p1) + return 3; + if (p1 < p0) + return 2; + return 0; +} + +static YYRESULTTAG yyresolveValue (yyGLRState* yys, + yyGLRStack* yystackp]b4_user_formals[); + + +/** Resolve the previous N states starting at and including state S. If result + * != yyok, some states may have been left unresolved possibly with empty + * semantic option chains. Regardless of whether result = yyok, each state + * has been left with consistent data so that yydestroyGLRState can be invoked + * if necessary. */ +static YYRESULTTAG +yyresolveStates (yyGLRState* yys, int yyn, + yyGLRStack* yystackp]b4_user_formals[) +{ + if (0 < yyn) + { + YYASSERT (yys->yypred); + YYCHK (yyresolveStates (yys->yypred, yyn-1, yystackp]b4_user_args[)); + if (! yys->yyresolved) + YYCHK (yyresolveValue (yys, yystackp]b4_user_args[)); + } + return yyok; +} + +/** Resolve the states for the RHS of OPT, perform its user action, and return + * the semantic value and location. Regardless of whether result = yyok, all + * RHS states have been destroyed (assuming the user action destroys all RHS + * semantic values if invoked). */ +static YYRESULTTAG +yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp, + YYSTYPE* yyvalp]b4_locuser_formals[) +{ + yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; + int yynrhs = yyrhsLength (yyopt->yyrule); + YYRESULTTAG yyflag = + yyresolveStates (yyopt->yystate, yynrhs, yystackp]b4_user_args[); + if (yyflag != yyok) + { + yyGLRState *yys; + for (yys = yyopt->yystate; yynrhs > 0; yys = yys->yypred, yynrhs -= 1) + yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[); + return yyflag; + } + + yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate;]b4_locations_if([[ + if (yynrhs == 0) + /* Set default location. */ + yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yyopt->yystate->yyloc;]])[ + { + int yychar_current = yychar; + YYSTYPE yylval_current = yylval;]b4_locations_if([ + YYLTYPE yylloc_current = yylloc;])[ + yychar = yyopt->yyrawchar; + yylval = yyopt->yyval;]b4_locations_if([ + yylloc = yyopt->yyloc;])[ + yyflag = yyuserAction (yyopt->yyrule, yynrhs, + yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, + yystackp, yyvalp]b4_locuser_args[); + yychar = yychar_current; + yylval = yylval_current;]b4_locations_if([ + yylloc = yylloc_current;])[ + } + return yyflag; +} + +#if ]b4_api_PREFIX[DEBUG +static void +yyreportTree (yySemanticOption* yyx, int yyindent) +{ + int yynrhs = yyrhsLength (yyx->yyrule); + int yyi; + yyGLRState* yys; + yyGLRState* yystates[1 + YYMAXRHS]; + yyGLRState yyleftmost_state; + + for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred) + yystates[yyi] = yys; + if (yys == YY_NULL) + { + yyleftmost_state.yyposn = 0; + yystates[0] = &yyleftmost_state; + } + else + yystates[0] = yys; + + if (yyx->yystate->yyposn < yys->yyposn + 1) + YYFPRINTF (stderr, "%*s%s -> \n", + yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), + yyx->yyrule - 1); + else + YYFPRINTF (stderr, "%*s%s -> \n", + yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), + yyx->yyrule - 1, (unsigned long int) (yys->yyposn + 1), + (unsigned long int) yyx->yystate->yyposn); + for (yyi = 1; yyi <= yynrhs; yyi += 1) + { + if (yystates[yyi]->yyresolved) + { + if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) + YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", + yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1])); + else + YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", + yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]), + (unsigned long int) (yystates[yyi - 1]->yyposn + 1), + (unsigned long int) yystates[yyi]->yyposn); + } + else + yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2); + } +} +#endif + +/*ARGSUSED*/ static YYRESULTTAG +yyreportAmbiguity (yySemanticOption* yyx0, + yySemanticOption* yyx1]b4_pure_formals[) +{ + YYUSE (yyx0); + YYUSE (yyx1); + +#if ]b4_api_PREFIX[DEBUG + YYFPRINTF (stderr, "Ambiguity detected.\n"); + YYFPRINTF (stderr, "Option 1,\n"); + yyreportTree (yyx0, 2); + YYFPRINTF (stderr, "\nOption 2,\n"); + yyreportTree (yyx1, 2); + YYFPRINTF (stderr, "\n"); +#endif + + yyerror (]b4_yyerror_args[YY_("syntax is ambiguous")); + return yyabort; +}]b4_locations_if([[ + +/** Starting at and including state S1, resolve the location for each of the + * previous N1 states that is unresolved. The first semantic option of a state + * is always chosen. */ +static void +yyresolveLocations (yyGLRState* yys1, int yyn1, + yyGLRStack *yystackp]b4_user_formals[) +{ + if (0 < yyn1) + { + yyresolveLocations (yys1->yypred, yyn1 - 1, yystackp]b4_user_args[); + if (!yys1->yyresolved) + { + yyGLRStackItem yyrhsloc[1 + YYMAXRHS]; + int yynrhs; + yySemanticOption *yyoption = yys1->yysemantics.yyfirstVal; + YYASSERT (yyoption != YY_NULL); + yynrhs = yyrhsLength (yyoption->yyrule); + if (yynrhs > 0) + { + yyGLRState *yys; + int yyn; + yyresolveLocations (yyoption->yystate, yynrhs, + yystackp]b4_user_args[); + for (yys = yyoption->yystate, yyn = yynrhs; + yyn > 0; + yys = yys->yypred, yyn -= 1) + yyrhsloc[yyn].yystate.yyloc = yys->yyloc; + } + else + { + /* Both yyresolveAction and yyresolveLocations traverse the GSS + in reverse rightmost order. It is only necessary to invoke + yyresolveLocations on a subforest for which yyresolveAction + would have been invoked next had an ambiguity not been + detected. Thus the location of the previous state (but not + necessarily the previous state itself) is guaranteed to be + resolved already. */ + yyGLRState *yyprevious = yyoption->yystate; + yyrhsloc[0].yystate.yyloc = yyprevious->yyloc; + } + { + int yychar_current = yychar; + YYSTYPE yylval_current = yylval; + YYLTYPE yylloc_current = yylloc; + yychar = yyoption->yyrawchar; + yylval = yyoption->yyval; + yylloc = yyoption->yyloc; + YYLLOC_DEFAULT ((yys1->yyloc), yyrhsloc, yynrhs); + yychar = yychar_current; + yylval = yylval_current; + yylloc = yylloc_current; + } + } + } +}]])[ + +/** Resolve the ambiguity represented in state S, perform the indicated + * actions, and set the semantic value of S. If result != yyok, the chain of + * semantic options in S has been cleared instead or it has been left + * unmodified except that redundant options may have been removed. Regardless + * of whether result = yyok, S has been left with consistent data so that + * yydestroyGLRState can be invoked if necessary. */ +static YYRESULTTAG +yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[) +{ + yySemanticOption* yyoptionList = yys->yysemantics.yyfirstVal; + yySemanticOption* yybest = yyoptionList; + yySemanticOption** yypp; + yybool yymerge = yyfalse; + YYSTYPE yysval; + YYRESULTTAG yyflag;]b4_locations_if([ + YYLTYPE *yylocp = &yys->yyloc;])[ + + for (yypp = &yyoptionList->yynext; *yypp != YY_NULL; ) + { + yySemanticOption* yyp = *yypp; + + if (yyidenticalOptions (yybest, yyp)) + { + yymergeOptionSets (yybest, yyp); + *yypp = yyp->yynext; + } + else + { + switch (yypreference (yybest, yyp)) + { + case 0:]b4_locations_if([[ + yyresolveLocations (yys, 1, yystackp]b4_user_args[);]])[ + return yyreportAmbiguity (yybest, yyp]b4_pure_args[); + break; + case 1: + yymerge = yytrue; + break; + case 2: + break; + case 3: + yybest = yyp; + yymerge = yyfalse; + break; + default: + /* This cannot happen so it is not worth a YYASSERT (yyfalse), + but some compilers complain if the default case is + omitted. */ + break; + } + yypp = &yyp->yynext; + } + } + + if (yymerge) + { + yySemanticOption* yyp; + int yyprec = yydprec[yybest->yyrule]; + yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args[); + if (yyflag == yyok) + for (yyp = yybest->yynext; yyp != YY_NULL; yyp = yyp->yynext) + { + if (yyprec == yydprec[yyp->yyrule]) + { + YYSTYPE yysval_other;]b4_locations_if([ + YYLTYPE yydummy;])[ + yyflag = yyresolveAction (yyp, yystackp, &yysval_other]b4_locuser_args([&yydummy])[); + if (yyflag != yyok) + { + yydestruct ("Cleanup: discarding incompletely merged value for", + yystos[yys->yylrState], + &yysval]b4_locuser_args[); + break; + } + yyuserMerge (yymerger[yyp->yyrule], &yysval, &yysval_other); + } + } + } + else + yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args([yylocp])[); + + if (yyflag == yyok) + { + yys->yyresolved = yytrue; + yys->yysemantics.yysval = yysval; + } + else + yys->yysemantics.yyfirstVal = YY_NULL; + return yyflag; +} + +static YYRESULTTAG +yyresolveStack (yyGLRStack* yystackp]b4_user_formals[) +{ + if (yystackp->yysplitPoint != YY_NULL) + { + yyGLRState* yys; + int yyn; + + for (yyn = 0, yys = yystackp->yytops.yystates[0]; + yys != yystackp->yysplitPoint; + yys = yys->yypred, yyn += 1) + continue; + YYCHK (yyresolveStates (yystackp->yytops.yystates[0], yyn, yystackp + ]b4_user_args[)); + } + return yyok; +} + +static void +yycompressStack (yyGLRStack* yystackp) +{ + yyGLRState* yyp, *yyq, *yyr; + + if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULL) + return; + + for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULL; + yyp != yystackp->yysplitPoint; + yyr = yyp, yyp = yyq, yyq = yyp->yypred) + yyp->yypred = yyr; + + yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems; + yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1; + yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems; + yystackp->yysplitPoint = YY_NULL; + yystackp->yylastDeleted = YY_NULL; + + while (yyr != YY_NULL) + { + yystackp->yynextFree->yystate = *yyr; + yyr = yyr->yypred; + yystackp->yynextFree->yystate.yypred = &yystackp->yynextFree[-1].yystate; + yystackp->yytops.yystates[0] = &yystackp->yynextFree->yystate; + yystackp->yynextFree += 1; + yystackp->yyspaceLeft -= 1; + } +} + +static YYRESULTTAG +yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, + size_t yyposn]b4_pure_formals[) +{ + int yyaction; + const short int* yyconflicts; + yyRuleNum yyrule; + + while (yystackp->yytops.yystates[yyk] != YY_NULL) + { + yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState; + YYDPRINTF ((stderr, "Stack %lu Entering state %d\n", + (unsigned long int) yyk, yystate)); + + YYASSERT (yystate != YYFINAL); + + if (yyisDefaultedState (yystate)) + { + yyrule = yydefaultAction (yystate); + if (yyrule == 0) + { + YYDPRINTF ((stderr, "Stack %lu dies.\n", + (unsigned long int) yyk)); + yymarkStackDeleted (yystackp, yyk); + return yyok; + } + YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[)); + } + else + { + yySymbol yytoken; + yystackp->yytops.yylookaheadNeeds[yyk] = yytrue; + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts); + + while (*yyconflicts != 0) + { + size_t yynewStack = yysplitStack (yystackp, yyk); + YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n", + (unsigned long int) yynewStack, + (unsigned long int) yyk)); + YYCHK (yyglrReduce (yystackp, yynewStack, + *yyconflicts, yyfalse]b4_user_args[)); + YYCHK (yyprocessOneStack (yystackp, yynewStack, + yyposn]b4_pure_args[)); + yyconflicts += 1; + } + + if (yyisShiftAction (yyaction)) + break; + else if (yyisErrorAction (yyaction)) + { + YYDPRINTF ((stderr, "Stack %lu dies.\n", + (unsigned long int) yyk)); + yymarkStackDeleted (yystackp, yyk); + break; + } + else + YYCHK (yyglrReduce (yystackp, yyk, -yyaction, + yyfalse]b4_user_args[)); + } + } + return yyok; +} + +/*ARGSUSED*/ static void +yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[) +{ + if (yystackp->yyerrState != 0) + return; +#if ! YYERROR_VERBOSE + yyerror (]b4_lyyerror_args[YY_("syntax error")); +#else + { + yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + size_t yysize0 = yytnamerr (YY_NULL, yytokenName (yytoken)); + size_t yysize = yysize0; + yybool yysize_overflow = yyfalse; + char* yymsg = YY_NULL; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULL; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[yystackp->yytops.yystates[0]->yylrState]; + yyarg[yycount++] = yytokenName (yytoken); + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for this + state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytokenName (yyx); + { + size_t yysz = yysize + yytnamerr (YY_NULL, yytokenName (yyx)); + yysize_overflow |= yysz < yysize; + yysize = yysz; + } + } + } + } + + switch (yycount) + { +#define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +#undef YYCASE_ + } + + { + size_t yysz = yysize + strlen (yyformat); + yysize_overflow |= yysz < yysize; + yysize = yysz; + } + + if (!yysize_overflow) + yymsg = (char *) YYMALLOC (yysize); + + if (yymsg) + { + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyformat)) + { + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + yyerror (]b4_lyyerror_args[yymsg); + YYFREE (yymsg); + } + else + { + yyerror (]b4_lyyerror_args[YY_("syntax error")); + yyMemoryExhausted (yystackp); + } + } +#endif /* YYERROR_VERBOSE */ + yynerrs += 1; +} + +/* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP, + yylval, and yylloc are the syntactic category, semantic value, and location + of the lookahead. */ +/*ARGSUSED*/ static void +yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) +{ + size_t yyk; + int yyj; + + if (yystackp->yyerrState == 3) + /* We just shifted the error token and (perhaps) took some + reductions. Skip tokens until we can proceed. */ + while (YYID (yytrue)) + { + yySymbol yytoken; + if (yychar == YYEOF) + yyFail (yystackp][]b4_lpure_args[, YY_NULL); + if (yychar != YYEMPTY) + {]b4_locations_if([[ + /* We throw away the lookahead, but the error range + of the shifted error token must take it into account. */ + yyGLRState *yys = yystackp->yytops.yystates[0]; + yyGLRStackItem yyerror_range[3]; + yyerror_range[1].yystate.yyloc = yys->yyloc; + yyerror_range[2].yystate.yyloc = yylloc; + YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Error: discarding", + yytoken, &yylval]b4_locuser_args([&yylloc])[); + } + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + yyj = yypact[yystackp->yytops.yystates[0]->yylrState]; + if (yypact_value_is_default (yyj)) + return; + yyj += yytoken; + if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken) + { + if (yydefact[yystackp->yytops.yystates[0]->yylrState] != 0) + return; + } + else if (! yytable_value_is_error (yytable[yyj])) + return; + } + + /* Reduce to one stack. */ + for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1) + if (yystackp->yytops.yystates[yyk] != YY_NULL) + break; + if (yyk >= yystackp->yytops.yysize) + yyFail (yystackp][]b4_lpure_args[, YY_NULL); + for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1) + yymarkStackDeleted (yystackp, yyk); + yyremoveDeletes (yystackp); + yycompressStack (yystackp); + + /* Now pop stack until we find a state that shifts the error token. */ + yystackp->yyerrState = 3; + while (yystackp->yytops.yystates[0] != YY_NULL) + { + yyGLRState *yys = yystackp->yytops.yystates[0]; + yyj = yypact[yys->yylrState]; + if (! yypact_value_is_default (yyj)) + { + yyj += YYTERROR; + if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR + && yyisShiftAction (yytable[yyj])) + { + /* Shift the error token. */]b4_locations_if([[ + /* First adjust its location.*/ + YYLTYPE yyerrloc; + yystackp->yyerror_range[2].yystate.yyloc = yylloc; + YYLLOC_DEFAULT (yyerrloc, (yystackp->yyerror_range), 2);]])[ + YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]], + &yylval, &yyerrloc); + yyglrShift (yystackp, 0, yytable[yyj], + yys->yyposn, &yylval]b4_locations_if([, &yyerrloc])[); + yys = yystackp->yytops.yystates[0]; + break; + } + }]b4_locations_if([[ + yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ + if (yys->yypred != YY_NULL) + yydestroyGLRState ("Error: popping", yys]b4_user_args[); + yystackp->yytops.yystates[0] = yys->yypred; + yystackp->yynextFree -= 1; + yystackp->yyspaceLeft += 1; + } + if (yystackp->yytops.yystates[0] == YY_NULL) + yyFail (yystackp][]b4_lpure_args[, YY_NULL); +} + +#define YYCHK1(YYE) \ + do { \ + switch (YYE) { \ + case yyok: \ + break; \ + case yyabort: \ + goto yyabortlab; \ + case yyaccept: \ + goto yyacceptlab; \ + case yyerr: \ + goto yyuser_error; \ + default: \ + goto yybuglab; \ + } \ + } while (YYID (0)) + + +/*----------. +| yyparse. | +`----------*/ + +]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[ +{ + int yyresult; + yyGLRStack yystack; + yyGLRStack* const yystackp = &yystack; + size_t yyposn; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; + yylval = yyval_default;]b4_locations_if([ + yylloc = yyloc_default;])[ +]m4_ifdef([b4_initial_action], [ +b4_dollar_pushdef([yylval], [], [yylloc])dnl +/* User initialization code. */ +b4_user_initial_action +b4_dollar_popdef])[]dnl +[ + if (! yyinitGLRStack (yystackp, YYINITDEPTH)) + goto yyexhaustedlab; + switch (YYSETJMP (yystack.yyexception_buffer)) + { + case 0: break; + case 1: goto yyabortlab; + case 2: goto yyexhaustedlab; + default: goto yybuglab; + } + yyglrShift (&yystack, 0, 0, 0, &yylval]b4_locations_if([, &yylloc])[); + yyposn = 0; + + while (YYID (yytrue)) + { + /* For efficiency, we have two loops, the first of which is + specialized to deterministic operation (single stack, no + potential ambiguity). */ + /* Standard mode */ + while (YYID (yytrue)) + { + yyRuleNum yyrule; + int yyaction; + const short int* yyconflicts; + + yyStateNum yystate = yystack.yytops.yystates[0]->yylrState; + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + if (yystate == YYFINAL) + goto yyacceptlab; + if (yyisDefaultedState (yystate)) + { + yyrule = yydefaultAction (yystate); + if (yyrule == 0) + { +]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[ + yyreportSyntaxError (&yystack]b4_user_args[); + goto yyuser_error; + } + YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_user_args[)); + } + else + { + yySymbol yytoken; + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts); + if (*yyconflicts != 0) + break; + if (yyisShiftAction (yyaction)) + { + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yychar = YYEMPTY; + yyposn += 1; + yyglrShift (&yystack, 0, yyaction, yyposn, &yylval]b4_locations_if([, &yylloc])[); + if (0 < yystack.yyerrState) + yystack.yyerrState -= 1; + } + else if (yyisErrorAction (yyaction)) + { +]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[ + yyreportSyntaxError (&yystack]b4_user_args[); + goto yyuser_error; + } + else + YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_user_args[)); + } + } + + while (YYID (yytrue)) + { + yySymbol yytoken_to_shift; + size_t yys; + + for (yys = 0; yys < yystack.yytops.yysize; yys += 1) + yystackp->yytops.yylookaheadNeeds[yys] = yychar != YYEMPTY; + + /* yyprocessOneStack returns one of three things: + + - An error flag. If the caller is yyprocessOneStack, it + immediately returns as well. When the caller is finally + yyparse, it jumps to an error label via YYCHK1. + + - yyok, but yyprocessOneStack has invoked yymarkStackDeleted + (&yystack, yys), which sets the top state of yys to NULL. Thus, + yyparse's following invocation of yyremoveDeletes will remove + the stack. + + - yyok, when ready to shift a token. + + Except in the first case, yyparse will invoke yyremoveDeletes and + then shift the next token onto all remaining stacks. This + synchronization of the shift (that is, after all preceding + reductions on all stacks) helps prevent double destructor calls + on yylval in the event of memory exhaustion. */ + + for (yys = 0; yys < yystack.yytops.yysize; yys += 1) + YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn]b4_lpure_args[)); + yyremoveDeletes (&yystack); + if (yystack.yytops.yysize == 0) + { + yyundeleteLastStack (&yystack); + if (yystack.yytops.yysize == 0) + yyFail (&yystack][]b4_lpure_args[, YY_("syntax error")); + YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); + YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); +]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[ + yyreportSyntaxError (&yystack]b4_user_args[); + goto yyuser_error; + } + + /* If any yyglrShift call fails, it will fail after shifting. Thus, + a copy of yylval will already be on stack 0 in the event of a + failure in the following loop. Thus, yychar is set to YYEMPTY + before the loop to make sure the user destructor for yylval isn't + called twice. */ + yytoken_to_shift = YYTRANSLATE (yychar); + yychar = YYEMPTY; + yyposn += 1; + for (yys = 0; yys < yystack.yytops.yysize; yys += 1) + { + int yyaction; + const short int* yyconflicts; + yyStateNum yystate = yystack.yytops.yystates[yys]->yylrState; + yygetLRActions (yystate, yytoken_to_shift, &yyaction, + &yyconflicts); + /* Note that yyconflicts were handled by yyprocessOneStack. */ + YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yys)); + YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc); + yyglrShift (&yystack, yys, yyaction, yyposn, + &yylval]b4_locations_if([, &yylloc])[); + YYDPRINTF ((stderr, "Stack %lu now in state #%d\n", + (unsigned long int) yys, + yystack.yytops.yystates[yys]->yylrState)); + } + + if (yystack.yytops.yysize == 1) + { + YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); + YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); + yycompressStack (&yystack); + break; + } + } + continue; + yyuser_error: + yyrecoverSyntaxError (&yystack]b4_user_args[); + yyposn = yystack.yytops.yystates[0]->yyposn; + } + + yyacceptlab: + yyresult = 0; + goto yyreturn; + + yybuglab: + YYASSERT (yyfalse); + goto yyabortlab; + + yyabortlab: + yyresult = 1; + goto yyreturn; + + yyexhaustedlab: + yyerror (]b4_lyyerror_args[YY_("memory exhausted")); + yyresult = 2; + goto yyreturn; + + yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + YYTRANSLATE (yychar), &yylval]b4_locuser_args([&yylloc])[); + + /* If the stack is well-formed, pop the stack until it is empty, + destroying its entries as we go. But free the stack regardless + of whether it is well-formed. */ + if (yystack.yyitems) + { + yyGLRState** yystates = yystack.yytops.yystates; + if (yystates) + { + size_t yysize = yystack.yytops.yysize; + size_t yyk; + for (yyk = 0; yyk < yysize; yyk += 1) + if (yystates[yyk]) + { + while (yystates[yyk]) + { + yyGLRState *yys = yystates[yyk]; +]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]] +)[ if (yys->yypred != YY_NULL) + yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[); + yystates[yyk] = yys->yypred; + yystack.yynextFree -= 1; + yystack.yyspaceLeft += 1; + } + break; + } + } + yyfreeGLRStack (&yystack); + } + + /* Make sure YYID is used. */ + return YYID (yyresult); +} + +/* DEBUGGING ONLY */ +#if ]b4_api_PREFIX[DEBUG +static void yypstack (yyGLRStack* yystackp, size_t yyk) + __attribute__ ((__unused__)); +static void yypdumpstack (yyGLRStack* yystackp) __attribute__ ((__unused__)); + +static void +yy_yypstack (yyGLRState* yys) +{ + if (yys->yypred) + { + yy_yypstack (yys->yypred); + YYFPRINTF (stderr, " -> "); + } + YYFPRINTF (stderr, "%d@@%lu", yys->yylrState, + (unsigned long int) yys->yyposn); +} + +static void +yypstates (yyGLRState* yyst) +{ + if (yyst == YY_NULL) + YYFPRINTF (stderr, ""); + else + yy_yypstack (yyst); + YYFPRINTF (stderr, "\n"); +} + +static void +yypstack (yyGLRStack* yystackp, size_t yyk) +{ + yypstates (yystackp->yytops.yystates[yyk]); +} + +#define YYINDEX(YYX) \ + ((YYX) == YY_NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems) + + +static void +yypdumpstack (yyGLRStack* yystackp) +{ + yyGLRStackItem* yyp; + size_t yyi; + for (yyp = yystackp->yyitems; yyp < yystackp->yynextFree; yyp += 1) + { + YYFPRINTF (stderr, "%3lu. ", + (unsigned long int) (yyp - yystackp->yyitems)); + if (*(yybool *) yyp) + { + YYFPRINTF (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld", + yyp->yystate.yyresolved, yyp->yystate.yylrState, + (unsigned long int) yyp->yystate.yyposn, + (long int) YYINDEX (yyp->yystate.yypred)); + if (! yyp->yystate.yyresolved) + YYFPRINTF (stderr, ", firstVal: %ld", + (long int) YYINDEX (yyp->yystate + .yysemantics.yyfirstVal)); + } + else + { + YYFPRINTF (stderr, "Option. rule: %d, state: %ld, next: %ld", + yyp->yyoption.yyrule - 1, + (long int) YYINDEX (yyp->yyoption.yystate), + (long int) YYINDEX (yyp->yyoption.yynext)); + } + YYFPRINTF (stderr, "\n"); + } + YYFPRINTF (stderr, "Tops:"); + for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1) + YYFPRINTF (stderr, "%lu: %ld; ", (unsigned long int) yyi, + (long int) YYINDEX (yystackp->yytops.yystates[yyi])); + YYFPRINTF (stderr, "\n"); +} +#endif +]b4_epilogue[]dnl +b4_output_end() + +# glr.cc produces its own header. +m4_if(b4_skeleton, ["glr.c"], +[b4_defines_if( +[b4_output_begin([b4_spec_defines_file]) +b4_copyright([Skeleton interface for Bison GLR parsers in C], + [2002-2012])[ + +]b4_cpp_guard_open([b4_spec_defines_file])[ +]b4_shared_declarations[ +]b4_cpp_guard_close([b4_spec_defines_file])[ +]b4_output_end() +])]) diff --git a/tools/data/glr.cc b/tools/data/glr.cc new file mode 100644 index 00000000..378abb39 --- /dev/null +++ b/tools/data/glr.cc @@ -0,0 +1,346 @@ + -*- C -*- + +# C++ GLR skeleton for Bison + +# Copyright (C) 2002-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# This skeleton produces a C++ class that encapsulates a C glr parser. +# This is in order to reduce the maintenance burden. The glr.c +# skeleton is clean and pure enough so that there are no real +# problems. The C++ interface is the same as that of lalr1.cc. In +# fact, glr.c can replace yacc.c without the user noticing any +# difference, and similarly for glr.cc replacing lalr1.cc. +# +# The passing of parse-params +# +# The additional arguments are stored as members of the parser +# object, yyparser. The C routines need to carry yyparser +# throughout the C parser; that easy: just let yyparser become an +# additional parse-param. But because the C++ skeleton needs to +# know the "real" original parse-param, we save them +# (b4_parse_param_orig). Note that b4_parse_param is overquoted +# (and c.m4 strips one level of quotes). This is a PITA, and +# explains why there are so many levels of quotes. +# +# The locations +# +# We use location.cc just like lalr1.cc, but because glr.c stores +# the locations in a (C++) union, the position and location classes +# must not have a constructor. Therefore, contrary to lalr1.cc, we +# must not define "b4_location_constructors". As a consequence the +# user must initialize the first positions (in particular the +# filename member). + +# We require a pure interface using locations. +m4_define([b4_locations_flag], [1]) +m4_define([b4_pure_flag], [1]) + +# The header is mandatory. +b4_defines_if([], + [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) + +m4_include(b4_pkgdatadir/[c++.m4]) +b4_percent_define_ifdef([[api.location.type]], [], + [m4_include(b4_pkgdatadir/[location.cc])]) + +m4_define([b4_parser_class_name], + [b4_percent_define_get([[parser_class_name]])]) + +# Save the parse parameters. +m4_define([b4_parse_param_orig], m4_defn([b4_parse_param])) + + +# b4_yy_symbol_print_generate +# --------------------------- +# Bypass the default implementation to generate the "yy_symbol_print" +# and "yy_symbol_value_print" functions. +m4_define([b4_yy_symbol_print_generate], +[[ +/*--------------------. +| Print this symbol. | +`--------------------*/ + +]b4_c_ansi_function_def([yy_symbol_print], + [static void], + [[FILE *], []], + [[int yytype], [yytype]], + [[const ]b4_namespace_ref::b4_parser_class_name[::semantic_type *yyvaluep], + [yyvaluep]], + [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], + [yylocationp]], + b4_parse_param)[ +{ +]b4_parse_param_use[]dnl +[ yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[); +} +]])[ + +# Hijack the initial action to initialize the locations. +]b4_locations_if([b4_percent_define_ifdef([[api.location.type]], [], +[m4_define([b4_initial_action], +[yylloc.initialize ();]m4_ifdef([b4_initial_action], [ +m4_defn([b4_initial_action])]))])])[ + +# Hijack the post prologue to insert early definition of YYLLOC_DEFAULT +# and declaration of yyerror. +]m4_append([b4_post_prologue], +[b4_syncline([@oline@], [@ofile@])[ +]b4_yylloc_default_define[ +#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc) +]b4_c_ansi_function_decl([yyerror], + [static void], + [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], + [yylocationp]], + b4_parse_param, + [[const char* msg], [msg]])]) + + +# Hijack the epilogue to define implementations (yyerror, parser member +# functions etc.). +m4_append([b4_epilogue], +[b4_syncline([@oline@], [@ofile@])[ +/*------------------. +| Report an error. | +`------------------*/ + +]b4_c_ansi_function_def([yyerror], + [static void], + [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], + [yylocationp]], + b4_parse_param, + [[const char* msg], [msg]])[ +{ +]b4_parse_param_use[]dnl +[ yyparser.error (*yylocationp, msg); +} + + +]b4_namespace_open[ +]dnl In this section, the parse param are the original parse_params. +m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl +[ /// Build a parser object. + ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [ + :])[ +#if ]b4_api_PREFIX[DEBUG + ]m4_ifset([b4_parse_param], [ ], [ :])[ + yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ +#endif]b4_parse_param_cons[ + { + } + + ]b4_parser_class_name::~b4_parser_class_name[ () + { + } + + int + ]b4_parser_class_name[::parse () + { + return ::yyparse (*this]b4_user_args[); + } + +#if ]b4_api_PREFIX[DEBUG + /*--------------------. + | Print this symbol. | + `--------------------*/ + + inline void + ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp) + { + YYUSE (yylocationp); + YYUSE (yyvaluep); + std::ostream& yyoutput = debug_stream (); + std::ostream& yyo = yyoutput; + YYUSE (yyo); + switch (yytype) + { + ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl +[ default: + break; + } + } + + + void + ]b4_parser_class_name[::yy_symbol_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp) + { + *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm") + << ' ' << yytname[yytype] << " (" + << *yylocationp << ": "; + yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); + *yycdebug_ << ')'; + } + + std::ostream& + ]b4_parser_class_name[::debug_stream () const + { + return *yycdebug_; + } + + void + ]b4_parser_class_name[::set_debug_stream (std::ostream& o) + { + yycdebug_ = &o; + } + + + ]b4_parser_class_name[::debug_level_type + ]b4_parser_class_name[::debug_level () const + { + return yydebug; + } + + void + ]b4_parser_class_name[::set_debug_level (debug_level_type l) + { + // Actually, it is yydebug which is really used. + yydebug = l; + } + +#endif +]m4_popdef([b4_parse_param])dnl +b4_namespace_close]) + + +# Let glr.c believe that the user arguments include the parser itself. +m4_ifset([b4_parse_param], +[m4_pushdef([b4_parse_param], + [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]],] +m4_defn([b4_parse_param]))], +[m4_pushdef([b4_parse_param], + [[b4_namespace_ref::b4_parser_class_name[& yyparser], [[yyparser]]]]) +]) +m4_include(b4_pkgdatadir/[glr.c]) +m4_popdef([b4_parse_param]) + +b4_output_begin([b4_spec_defines_file]) +b4_copyright([Skeleton interface for Bison GLR parsers in C++], + [2002-2006, 2009-2012])[ + +/* C++ GLR parser skeleton written by Akim Demaille. */ + +]b4_cpp_guard_open([b4_spec_defines_file])[ + +]b4_percent_code_get([[requires]])[ + +# include +# include +]b4_percent_define_ifdef([[api.location.type]], [], + [[# include "location.hh"]])[ + +]b4_YYDEBUG_define[ + +]b4_namespace_open[ + /// A Bison parser. + class ]b4_parser_class_name[ + { + public: + /// Symbol semantic values. +# ifndef ]b4_api_PREFIX[STYPE +]m4_ifdef([b4_stype], +[ union semantic_type + { +b4_user_stype + };], +[m4_if(b4_tag_seen_flag, 0, +[[ typedef int semantic_type;]], +[[ typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[ +# else + typedef ]b4_api_PREFIX[STYPE semantic_type; +# endif + /// Symbol locations. + typedef ]b4_percent_define_get([[api.location.type]], + [[location]])[ location_type; + /// Tokens. + struct token + { + ]b4_token_enums(b4_tokens)[ + }; + /// Token type. + typedef token::yytokentype token_type; + + /// Build a parser object. + ]b4_parser_class_name[ (]b4_parse_param_decl[); + virtual ~]b4_parser_class_name[ (); + + /// Parse. + /// \returns 0 iff parsing succeeded. + virtual int parse (); + + /// The current debugging stream. + std::ostream& debug_stream () const; + /// Set the current debugging stream. + void set_debug_stream (std::ostream &); + + /// Type for debugging levels. + typedef int debug_level_type; + /// The current debugging level. + debug_level_type debug_level () const; + /// Set the current debugging level. + void set_debug_level (debug_level_type l); + + private: + + public: + /// Report a syntax error. + /// \param loc where the syntax error is found. + /// \param msg a description of the syntax error. + virtual void error (const location_type& loc, const std::string& msg); + private: + +# if ]b4_api_PREFIX[DEBUG + public: + /// \brief Report a symbol value on the debug stream. + /// \param yytype The token type. + /// \param yyvaluep Its semantic value. + /// \param yylocationp Its location. + virtual void yy_symbol_value_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp); + /// \brief Report a symbol on the debug stream. + /// \param yytype The token type. + /// \param yyvaluep Its semantic value. + /// \param yylocationp Its location. + virtual void yy_symbol_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp); + private: + /* Debugging. */ + std::ostream* yycdebug_; +# endif + +]b4_parse_param_vars[ + }; + +]dnl Redirections for glr.c. +b4_percent_define_flag_if([[global_tokens_and_yystype]], +[b4_token_defines(b4_tokens)]) +[ +#ifndef ]b4_api_PREFIX[STYPE +# define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type +#endif +#ifndef ]b4_api_PREFIX[LTYPE +# define ]b4_api_PREFIX[LTYPE ]b4_namespace_ref[::]b4_parser_class_name[::location_type +#endif + +]b4_namespace_close[ +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file])[ +]b4_output_end() diff --git a/tools/data/java-skel.m4 b/tools/data/java-skel.m4 new file mode 100644 index 00000000..171a233b --- /dev/null +++ b/tools/data/java-skel.m4 @@ -0,0 +1,26 @@ + -*- Autoconf -*- + +# Java skeleton dispatching for Bison. + +# Copyright (C) 2007, 2009-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +b4_glr_if( [b4_complain([%%glr-parser not supported for Java])]) +b4_nondeterministic_if([b4_complain([%%nondeterministic-parser not supported for Java])]) + +m4_define_default([b4_used_skeleton], [b4_pkgdatadir/[lalr1.java]]) +m4_define_default([b4_skeleton], ["b4_basename(b4_used_skeleton)"]) + +m4_include(b4_used_skeleton) diff --git a/tools/data/java.m4 b/tools/data/java.m4 new file mode 100644 index 00000000..fe6dd528 --- /dev/null +++ b/tools/data/java.m4 @@ -0,0 +1,304 @@ + -*- Autoconf -*- + +# Java language support for Bison + +# Copyright (C) 2007-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_include(b4_pkgdatadir/[c-like.m4]) + +# b4_comment(TEXT) +# ---------------- +m4_define([b4_comment], [/* m4_bpatsubst([$1], [ +], [ + ]) */]) + + +# b4_list2(LIST1, LIST2) +# -------------------------- +# Join two lists with a comma if necessary. +m4_define([b4_list2], + [$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2]) + + +# b4_percent_define_get3(DEF, PRE, POST, NOT) +# ------------------------------------------- +# Expand to the value of DEF surrounded by PRE and POST if it's %define'ed, +# otherwise NOT. +m4_define([b4_percent_define_get3], + [m4_ifval(m4_quote(b4_percent_define_get([$1])), + [$2[]b4_percent_define_get([$1])[]$3], [$4])]) + + + +# b4_flag_value(BOOLEAN-FLAG) +# --------------------------- +m4_define([b4_flag_value], [b4_flag_if([$1], [true], [false])]) + + +# b4_public_if(TRUE, FALSE) +# ------------------------- +b4_percent_define_default([[public]], [[false]]) +m4_define([b4_public_if], +[b4_percent_define_flag_if([public], [$1], [$2])]) + + +# b4_abstract_if(TRUE, FALSE) +# --------------------------- +b4_percent_define_default([[abstract]], [[false]]) +m4_define([b4_abstract_if], +[b4_percent_define_flag_if([abstract], [$1], [$2])]) + + +# b4_final_if(TRUE, FALSE) +# --------------------------- +b4_percent_define_default([[final]], [[false]]) +m4_define([b4_final_if], +[b4_percent_define_flag_if([final], [$1], [$2])]) + + +# b4_strictfp_if(TRUE, FALSE) +# --------------------------- +b4_percent_define_default([[strictfp]], [[false]]) +m4_define([b4_strictfp_if], +[b4_percent_define_flag_if([strictfp], [$1], [$2])]) + + +# b4_lexer_if(TRUE, FALSE) +# ------------------------ +m4_define([b4_lexer_if], +[b4_percent_code_ifdef([[lexer]], [$1], [$2])]) + + +# b4_identification +# ----------------- +m4_define([b4_identification], +[ /** Version number for the Bison executable that generated this parser. */ + public static final String bisonVersion = "b4_version"; + + /** Name of the skeleton that generated this parser. */ + public static final String bisonSkeleton = b4_skeleton; +]) + + +## ------------ ## +## Data types. ## +## ------------ ## + +# b4_int_type(MIN, MAX) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# MIN to MAX (included). +m4_define([b4_int_type], +[m4_if(b4_ints_in($@, [-128], [127]), [1], [byte], + b4_ints_in($@, [-32768], [32767]), [1], [short], + [int])]) + +# b4_int_type_for(NAME) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# `NAME_min' to `NAME_max' (included). +m4_define([b4_int_type_for], +[b4_int_type($1_min, $1_max)]) + +# b4_null +# ------- +m4_define([b4_null], [null]) + + +## ------------------------- ## +## Assigning token numbers. ## +## ------------------------- ## + +# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) +# --------------------------------------- +# Output the definition of this token as an enum. +m4_define([b4_token_enum], +[ /** Token number, to be returned by the scanner. */ + public static final int $1 = $2; +]) + + +# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ----------------------------------------------------- +# Output the definition of the tokens (if there are) as enums. +m4_define([b4_token_enums], +[m4_if([$#$1], [1], [], +[/* Tokens. */ +m4_map([b4_token_enum], [$@])]) +]) + +# b4-case(ID, CODE) +# ----------------- +# We need to fool Java's stupid unreachable code detection. +m4_define([b4_case], [ case $1: + if (yyn == $1) + $2; + break; + ]) + + +## ---------------- ## +## Default values. ## +## ---------------- ## + +m4_define([b4_yystype], [b4_percent_define_get([[stype]])]) +b4_percent_define_default([[stype]], [[Object]]) + +# %name-prefix +m4_define_default([b4_prefix], [[YY]]) + +b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser]) +m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) + +b4_percent_define_default([[lex_throws]], [[java.io.IOException]]) +m4_define([b4_lex_throws], [b4_percent_define_get([[lex_throws]])]) + +b4_percent_define_default([[throws]], []) +m4_define([b4_throws], [b4_percent_define_get([[throws]])]) + +b4_percent_define_default([[api.location.type]], [Location]) +m4_define([b4_location_type], [b4_percent_define_get([[api.location.type]])]) + +b4_percent_define_default([[api.position.type]], [Position]) +m4_define([b4_position_type], [b4_percent_define_get([[api.position.type]])]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], [yyval]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +# +# In this simple implementation, %token and %type have class names +# between the angle brackets. +m4_define([b4_rhs_value], +[(m4_ifval($3, [($3)])[](yystack.valueAt ($1-($2))))]) + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[(yyloc)]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[yystack.locationAt ($1-($2))]) + + +# b4_lex_param +# b4_parse_param +# -------------- +# If defined, b4_lex_param arrives double quoted, but below we prefer +# it to be single quoted. Same for b4_parse_param. + +# TODO: should be in bison.m4 +m4_define_default([b4_lex_param], [[]]) +m4_define([b4_lex_param], b4_lex_param) +m4_define([b4_parse_param], b4_parse_param) + +# b4_lex_param_decl +# ------------------- +# Extra formal arguments of the constructor. +m4_define([b4_lex_param_decl], +[m4_ifset([b4_lex_param], + [b4_remove_comma([$1], + b4_param_decls(b4_lex_param))], + [$1])]) + +m4_define([b4_param_decls], + [m4_map([b4_param_decl], [$@])]) +m4_define([b4_param_decl], [, $1]) + +m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)]) + + + +# b4_parse_param_decl +# ------------------- +# Extra formal arguments of the constructor. +m4_define([b4_parse_param_decl], +[m4_ifset([b4_parse_param], + [b4_remove_comma([$1], + b4_param_decls(b4_parse_param))], + [$1])]) + + + +# b4_lex_param_call +# ------------------- +# Delegating the lexer parameters to the lexer constructor. +m4_define([b4_lex_param_call], + [m4_ifset([b4_lex_param], + [b4_remove_comma([$1], + b4_param_calls(b4_lex_param))], + [$1])]) +m4_define([b4_param_calls], + [m4_map([b4_param_call], [$@])]) +m4_define([b4_param_call], [, $2]) + + + +# b4_parse_param_cons +# ------------------- +# Extra initialisations of the constructor. +m4_define([b4_parse_param_cons], + [m4_ifset([b4_parse_param], + [b4_constructor_calls(b4_parse_param)])]) + +m4_define([b4_constructor_calls], + [m4_map([b4_constructor_call], [$@])]) +m4_define([b4_constructor_call], + [this.$2 = $2; + ]) + + + +# b4_parse_param_vars +# ------------------- +# Extra instance variables. +m4_define([b4_parse_param_vars], + [m4_ifset([b4_parse_param], + [ + /* User arguments. */ +b4_var_decls(b4_parse_param)])]) + +m4_define([b4_var_decls], + [m4_map_sep([b4_var_decl], [ +], [$@])]) +m4_define([b4_var_decl], + [ protected final $1;]) + + + +# b4_maybe_throws(THROWS) +# ----------------------- +# Expand to either an empty string or "throws THROWS". +m4_define([b4_maybe_throws], + [m4_ifval($1, [throws $1])]) diff --git a/tools/data/lalr1.cc b/tools/data/lalr1.cc new file mode 100644 index 00000000..13170154 --- /dev/null +++ b/tools/data/lalr1.cc @@ -0,0 +1,1143 @@ +# C++ skeleton for Bison + +# Copyright (C) 2002-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_include(b4_pkgdatadir/[c++.m4]) + +m4_define([b4_parser_class_name], + [b4_percent_define_get([[parser_class_name]])]) + +# The header is mandatory. +b4_defines_if([], + [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) + +b4_percent_define_ifdef([[api.location.type]], [], + [# Backward compatibility. + m4_define([b4_location_constructors]) + m4_include(b4_pkgdatadir/[location.cc])]) +m4_include(b4_pkgdatadir/[stack.hh]) + +b4_defines_if( +[b4_output_begin([b4_spec_defines_file]) +b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++], + [2002-2012]) +[ +/** + ** \file ]b4_spec_defines_file[ + ** Define the ]b4_namespace_ref[::parser class. + */ + +/* C++ LALR(1) parser skeleton written by Akim Demaille. */ + +]b4_cpp_guard_open([b4_spec_defines_file])[ + +]b4_percent_code_get([[requires]])[ + +#include +#include +#include "stack.hh" +]b4_percent_define_ifdef([[api.location.type]], [], + [[#include "location.hh"]])[ + +]b4_YYDEBUG_define[ + +]b4_namespace_open[ + + /// A Bison parser. + class ]b4_parser_class_name[ + { + public: + /// Symbol semantic values. +#ifndef ]b4_api_PREFIX[STYPE +]m4_ifdef([b4_stype], +[ union semantic_type + { +b4_user_stype + };], +[m4_if(b4_tag_seen_flag, 0, +[[ typedef int semantic_type;]], +[[ typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[ +#else + typedef ]b4_api_PREFIX[STYPE semantic_type; +#endif + /// Symbol locations. + typedef ]b4_percent_define_get([[api.location.type]], + [[location]])[ location_type; + /// Tokens. + struct token + { + ]b4_token_enums(b4_tokens)[ + }; + /// Token type. + typedef token::yytokentype token_type; + + /// Build a parser object. + ]b4_parser_class_name[ (]b4_parse_param_decl[); + virtual ~]b4_parser_class_name[ (); + + /// Parse. + /// \returns 0 iff parsing succeeded. + virtual int parse (); + +#if ]b4_api_PREFIX[DEBUG + /// The current debugging stream. + std::ostream& debug_stream () const; + /// Set the current debugging stream. + void set_debug_stream (std::ostream &); + + /// Type for debugging levels. + typedef int debug_level_type; + /// The current debugging level. + debug_level_type debug_level () const; + /// Set the current debugging level. + void set_debug_level (debug_level_type l); +#endif + + private: + /// Report a syntax error. + /// \param loc where the syntax error is found. + /// \param msg a description of the syntax error. + virtual void error (const location_type& loc, const std::string& msg); + + /// Generate an error message. + /// \param state the state where the error occurred. + /// \param tok the lookahead token. + virtual std::string yysyntax_error_ (int yystate, int tok); + +#if ]b4_api_PREFIX[DEBUG + /// \brief Report a symbol value on the debug stream. + /// \param yytype The token type. + /// \param yyvaluep Its semantic value. + /// \param yylocationp Its location. + virtual void yy_symbol_value_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp); + /// \brief Report a symbol on the debug stream. + /// \param yytype The token type. + /// \param yyvaluep Its semantic value. + /// \param yylocationp Its location. + virtual void yy_symbol_print_ (int yytype, + const semantic_type* yyvaluep, + const location_type* yylocationp); +#endif + + + /// State numbers. + typedef int state_type; + /// State stack type. + typedef stack state_stack_type; + /// Semantic value stack type. + typedef stack semantic_stack_type; + /// location stack type. + typedef stack location_stack_type; + + /// The state stack. + state_stack_type yystate_stack_; + /// The semantic value stack. + semantic_stack_type yysemantic_stack_; + /// The location stack. + location_stack_type yylocation_stack_; + + /// Whether the given \c yypact_ value indicates a defaulted state. + /// \param yyvalue the value to check + static bool yy_pact_value_is_default_ (int yyvalue); + + /// Whether the given \c yytable_ value indicates a syntax error. + /// \param yyvalue the value to check + static bool yy_table_value_is_error_ (int yyvalue); + + /// Internal symbol numbers. + typedef ]b4_int_type_for([b4_translate])[ token_number_type; + /* Tables. */ + /// For a state, the index in \a yytable_ of its portion. + static const ]b4_int_type_for([b4_pact])[ yypact_[]; + static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_; + + /// For a state, default reduction number. + /// Unless\a yytable_ specifies something else to do. + /// Zero means the default is an error. + static const ]b4_int_type_for([b4_defact])[ yydefact_[]; + + static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[]; + static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[]; + + /// What to do in a state. + /// \a yytable_[yypact_[s]]: what to do in state \a s. + /// - if positive, shift that token. + /// - if negative, reduce the rule which number is the opposite. + /// - if zero, do what YYDEFACT says. + static const ]b4_int_type_for([b4_table])[ yytable_[]; + static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_; + + static const ]b4_int_type_for([b4_check])[ yycheck_[]; + + /// For a state, its accessing symbol. + static const ]b4_int_type_for([b4_stos])[ yystos_[]; + + /// For a rule, its LHS. + static const ]b4_int_type_for([b4_r1])[ yyr1_[]; + /// For a rule, its RHS length. + static const ]b4_int_type_for([b4_r2])[ yyr2_[]; ]b4_error_verbose_if([ + + /// Convert the symbol name \a n to a form suitable for a diagnostic. + static std::string yytnamerr_ (const char *n);])[ + +]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[ + /// For a symbol, its name in clear. + static const char* const yytname_[]; +]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[ + /// A type to store symbol numbers and -1. + typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type; + /// A `-1'-separated list of the rules' RHS. + static const rhs_number_type yyrhs_[]; + /// For each rule, the index of the first RHS symbol in \a yyrhs_. + static const ]b4_int_type_for([b4_prhs])[ yyprhs_[]; + /// For each rule, its source line number. + static const ]b4_int_type_for([b4_rline])[ yyrline_[]; + /// For each scanner token number, its symbol number. + static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[]; + /// Report on the debug stream that the rule \a r is going to be reduced. + virtual void yy_reduce_print_ (int r); + /// Print the state stack on the debug stream. + virtual void yystack_print_ (); + + /* Debugging. */ + int yydebug_; + std::ostream* yycdebug_; +#endif + + /// Convert a scanner token number \a t to a symbol number. + token_number_type yytranslate_ (int t); + + /// \brief Reclaim the memory associated to a symbol. + /// \param yymsg Why this token is reclaimed. + /// If null, do not display the symbol, just free it. + /// \param yytype The symbol type. + /// \param yyvaluep Its semantic value. + /// \param yylocationp Its location. + inline void yydestruct_ (const char* yymsg, + int yytype, + semantic_type* yyvaluep, + location_type* yylocationp); + + /// Pop \a n symbols the three stacks. + inline void yypop_ (unsigned int n = 1); + + /* Constants. */ + static const int yyeof_; + /* LAST_ -- Last index in TABLE_. */ + static const int yylast_; + static const int yynnts_; + static const int yyempty_; + static const int yyfinal_; + static const int yyterror_; + static const int yyerrcode_; + static const int yyntokens_; + static const unsigned int yyuser_token_number_max_; + static const token_number_type yyundef_token_; +]b4_parse_param_vars[ + }; +]b4_namespace_close[ + +]b4_percent_define_flag_if([[global_tokens_and_yystype]], +[b4_token_defines(b4_tokens) + +#ifndef ]b4_api_PREFIX[STYPE + /* Redirection for backward compatibility. */ +# define ]b4_api_PREFIX[STYPE b4_namespace_ref::b4_parser_class_name::semantic_type +#endif +])[ +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file]) +b4_output_end() +]) + + +b4_output_begin([b4_parser_file_name]) +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++], + [2002-2012]) +b4_percent_code_get([[top]])[]dnl +m4_if(b4_prefix, [yy], [], +[ +// Take the name prefix into account. +#define yylex b4_prefix[]lex])[ + +/* First part of user declarations. */ +]b4_user_pre_prologue[ + +]b4_defines_if([[ +#include "@basename(]b4_spec_defines_file[@)"]])[ + +/* User implementation prologue. */ +]b4_user_post_prologue[ +]b4_percent_code_get[ + +]b4_null_define[ + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* FIXME: INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +]b4_yylloc_default_define[ + +/* Suppress unused-variable warnings by "using" E. */ +#define YYUSE(e) ((void) (e)) + +/* Enable debugging if requested. */ +#if ]b4_api_PREFIX[DEBUG + +/* A pseudo ostream that takes yydebug_ into account. */ +# define YYCDEBUG if (yydebug_) (*yycdebug_) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug_) \ + { \ + *yycdebug_ << Title << ' '; \ + yy_symbol_print_ ((Type), (Value), (Location)); \ + *yycdebug_ << std::endl; \ + } \ +} while (false) + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug_) \ + yy_reduce_print_ (Rule); \ +} while (false) + +# define YY_STACK_PRINT() \ +do { \ + if (yydebug_) \ + yystack_print_ (); \ +} while (false) + +#else /* !]b4_api_PREFIX[DEBUG */ + +# define YYCDEBUG if (false) std::cerr +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type) +# define YY_REDUCE_PRINT(Rule) static_cast(0) +# define YY_STACK_PRINT() static_cast(0) + +#endif /* !]b4_api_PREFIX[DEBUG */ + +#define yyerrok (yyerrstatus_ = 0) +#define yyclearin (yychar = yyempty_) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYRECOVERING() (!!yyerrstatus_) + +]b4_namespace_open[]b4_error_verbose_if([[ + + /* Return YYSTR after stripping away unnecessary quotes and + backslashes, so that it's suitable for yyerror. The heuristic is + that double-quoting is unnecessary unless the string contains an + apostrophe, a comma, or backslash (other than backslash-backslash). + YYSTR is taken from yytname. */ + std::string + ]b4_parser_class_name[::yytnamerr_ (const char *yystr) + { + if (*yystr == '"') + { + std::string yyr = ""; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + yyr += *yyp; + break; + + case '"': + return yyr; + } + do_not_strip_quotes: ; + } + + return yystr; + } +]])[ + + /// Build a parser object. + ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [ + :])[ +#if ]b4_api_PREFIX[DEBUG + ]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false), + yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ +#endif]b4_parse_param_cons[ + { + } + + ]b4_parser_class_name::~b4_parser_class_name[ () + { + } + +#if ]b4_api_PREFIX[DEBUG + /*--------------------------------. + | Print this symbol on YYOUTPUT. | + `--------------------------------*/ + + inline void + ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, + const semantic_type* yyvaluep, const location_type* yylocationp) + { + YYUSE (yylocationp); + YYUSE (yyvaluep); + std::ostream& yyo = debug_stream (); + std::ostream& yyoutput = yyo; + YYUSE (yyoutput); + switch (yytype) + { + ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl +[ default: + break; + } + } + + + void + ]b4_parser_class_name[::yy_symbol_print_ (int yytype, + const semantic_type* yyvaluep, const location_type* yylocationp) + { + *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") + << ' ' << yytname_[yytype] << " (" + << *yylocationp << ": "; + yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); + *yycdebug_ << ')'; + } +#endif + + void + ]b4_parser_class_name[::yydestruct_ (const char* yymsg, + int yytype, semantic_type* yyvaluep, location_type* yylocationp) + { + YYUSE (yylocationp); + YYUSE (yymsg); + YYUSE (yyvaluep); + + if (yymsg) + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ + default: + break; + } + } + + void + ]b4_parser_class_name[::yypop_ (unsigned int n) + { + yystate_stack_.pop (n); + yysemantic_stack_.pop (n); + yylocation_stack_.pop (n); + } + +#if ]b4_api_PREFIX[DEBUG + std::ostream& + ]b4_parser_class_name[::debug_stream () const + { + return *yycdebug_; + } + + void + ]b4_parser_class_name[::set_debug_stream (std::ostream& o) + { + yycdebug_ = &o; + } + + + ]b4_parser_class_name[::debug_level_type + ]b4_parser_class_name[::debug_level () const + { + return yydebug_; + } + + void + ]b4_parser_class_name[::set_debug_level (debug_level_type l) + { + yydebug_ = l; + } +#endif + + inline bool + ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue) + { + return yyvalue == yypact_ninf_; + } + + inline bool + ]b4_parser_class_name[::yy_table_value_is_error_ (int yyvalue) + { + return yyvalue == yytable_ninf_; + } + + int + ]b4_parser_class_name[::parse () + { + /// Lookahead and lookahead in internal form. + int yychar = yyempty_; + int yytoken = 0; + + // State. + int yyn; + int yylen = 0; + int yystate = 0; + + // Error handling. + int yynerrs_ = 0; + int yyerrstatus_ = 0; + + /// Semantic value of the lookahead. + static semantic_type yyval_default; + semantic_type yylval = yyval_default; + /// Location of the lookahead. + location_type yylloc; + /// The locations where the error started and ended. + location_type yyerror_range[3]; + + /// $$. + semantic_type yyval; + /// @@$. + location_type yyloc; + + int yyresult; + + // FIXME: This shoud be completely indented. It is not yet to + // avoid gratuitous conflicts when merging into the master branch. + try + { + YYCDEBUG << "Starting parse" << std::endl; + +]m4_ifdef([b4_initial_action], [ +b4_dollar_pushdef([yylval], [], [yylloc])dnl +/* User initialization code. */ +b4_user_initial_action +b4_dollar_popdef])[]dnl + + [ /* Initialize the stacks. The initial state will be pushed in + yynewstate, since the latter expects the semantical and the + location values to have been already stored, initialize these + stacks with a primary value. */ + yystate_stack_ = state_stack_type (0); + yysemantic_stack_ = semantic_stack_type (0); + yylocation_stack_ = location_stack_type (0); + yysemantic_stack_.push (yylval); + yylocation_stack_.push (yylloc); + + /* New state. */ + yynewstate: + yystate_stack_.push (yystate); + YYCDEBUG << "Entering state " << yystate << std::endl; + + /* Accept? */ + if (yystate == yyfinal_) + goto yyacceptlab; + + goto yybackup; + + /* Backup. */ + yybackup: + + /* Try to take a decision without lookahead. */ + yyn = yypact_[yystate]; + if (yy_pact_value_is_default_ (yyn)) + goto yydefault; + + /* Read a lookahead token. */ + if (yychar == yyempty_) + { + YYCDEBUG << "Reading a token: "; + yychar = ]b4_c_function_call([yylex], [int], + [b4_api_PREFIX[STYPE*], [&yylval]][]dnl +b4_locations_if([, [[location*], [&yylloc]]])dnl +m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; + } + + /* Convert token to internal form. */ + if (yychar <= yyeof_) + { + yychar = yytoken = yyeof_; + YYCDEBUG << "Now at end of input." << std::endl; + } + else + { + yytoken = yytranslate_ (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) + goto yydefault; + + /* Reduce or error. */ + yyn = yytable_[yyn]; + if (yyn <= 0) + { + if (yy_table_value_is_error_ (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the token being shifted. */ + yychar = yyempty_; + + yysemantic_stack_.push (yylval); + yylocation_stack_.push (yylloc); + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus_) + --yyerrstatus_; + + yystate = yyn; + goto yynewstate; + + /*-----------------------------------------------------------. + | yydefault -- do the default action for the current state. | + `-----------------------------------------------------------*/ + yydefault: + yyn = yydefact_[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + /*-----------------------------. + | yyreduce -- Do a reduction. | + `-----------------------------*/ + yyreduce: + yylen = yyr2_[yyn]; + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. Otherwise, use the top of the stack. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. */ + if (yylen) + yyval = yysemantic_stack_[yylen - 1]; + else + yyval = yysemantic_stack_[0]; + + // Compute the default @@$. + { + slice slice (yylocation_stack_, yylen); + YYLLOC_DEFAULT (yyloc, slice, yylen); + } + + // Perform the reduction. + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + ]b4_user_actions[ + default: + break; + } + + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action + invokes YYABORT, YYACCEPT, or YYERROR immediately after altering + yychar. In the case of YYABORT or YYACCEPT, an incorrect + destructor might then be invoked immediately. In the case of + YYERROR, subsequent parser actions might lead to an incorrect + destructor call or verbose syntax error message before the + lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc); + + yypop_ (yylen); + yylen = 0; + YY_STACK_PRINT (); + + yysemantic_stack_.push (yyval); + yylocation_stack_.push (yyloc); + + /* Shift the result of the reduction. */ + yyn = yyr1_[yyn]; + yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0]; + if (0 <= yystate && yystate <= yylast_ + && yycheck_[yystate] == yystate_stack_[0]) + yystate = yytable_[yystate]; + else + yystate = yydefgoto_[yyn - yyntokens_]; + goto yynewstate; + + /*------------------------------------. + | yyerrlab -- here on detecting error | + `------------------------------------*/ + yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yytranslate_ (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus_) + { + ++yynerrs_; + if (yychar == yyempty_) + yytoken = yyempty_; + error (yylloc, yysyntax_error_ (yystate, yytoken)); + } + + yyerror_range[1] = yylloc; + if (yyerrstatus_ == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + if (yychar <= yyeof_) + { + /* Return failure if at end of input. */ + if (yychar == yyeof_) + YYABORT; + } + else + { + yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc); + yychar = yyempty_; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + + /*---------------------------------------------------. + | yyerrorlab -- error raised explicitly by YYERROR. | + `---------------------------------------------------*/ + yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (false) + goto yyerrorlab; + + yyerror_range[1] = yylocation_stack_[yylen - 1]; + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + yypop_ (yylen); + yylen = 0; + yystate = yystate_stack_[0]; + goto yyerrlab1; + + /*-------------------------------------------------------------. + | yyerrlab1 -- common code for both syntax error and YYERROR. | + `-------------------------------------------------------------*/ + yyerrlab1: + yyerrstatus_ = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact_[yystate]; + if (!yy_pact_value_is_default_ (yyn)) + { + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yystate_stack_.height () == 1) + YYABORT; + + yyerror_range[1] = yylocation_stack_[0]; + yydestruct_ ("Error: popping", + yystos_[yystate], + &yysemantic_stack_[0], &yylocation_stack_[0]); + yypop_ (); + yystate = yystate_stack_[0]; + YY_STACK_PRINT (); + } + + yyerror_range[2] = yylloc; + // Using YYLLOC is tempting, but would change the location of + // the lookahead. YYLOC is available though. + YYLLOC_DEFAULT (yyloc, yyerror_range, 2); + yysemantic_stack_.push (yylval); + yylocation_stack_.push (yyloc); + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos_[yyn], + &yysemantic_stack_[0], &yylocation_stack_[0]); + + yystate = yyn; + goto yynewstate; + + /* Accept. */ + yyacceptlab: + yyresult = 0; + goto yyreturn; + + /* Abort. */ + yyabortlab: + yyresult = 1; + goto yyreturn; + + yyreturn: + if (yychar != yyempty_) + { + /* Make sure we have latest lookahead translation. See comments + at user semantic actions for why this is necessary. */ + yytoken = yytranslate_ (yychar); + yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, + &yylloc); + } + + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + yypop_ (yylen); + while (1 < yystate_stack_.height ()) + { + yydestruct_ ("Cleanup: popping", + yystos_[yystate_stack_[0]], + &yysemantic_stack_[0], + &yylocation_stack_[0]); + yypop_ (); + } + + return yyresult; + } + catch (...) + { + YYCDEBUG << "Exception caught: cleaning lookahead and stack" + << std::endl; + // Do not try to display the values of the reclaimed symbols, + // as their printer might throw an exception. + if (yychar != yyempty_) + { + /* Make sure we have latest lookahead translation. See + comments at user semantic actions for why this is + necessary. */ + yytoken = yytranslate_ (yychar); + yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc); + } + + while (1 < yystate_stack_.height ()) + { + yydestruct_ (YY_NULL, + yystos_[yystate_stack_[0]], + &yysemantic_stack_[0], + &yylocation_stack_[0]); + yypop_ (); + } + throw; + } + } + + // Generate an error message. + std::string + ]b4_parser_class_name[::yysyntax_error_ (]dnl +b4_error_verbose_if([int yystate, int yytoken], + [int, int])[) + {]b4_error_verbose_if([[ + std::string yyres; + // Number of reported tokens (one for the "unexpected", one per + // "expected"). + size_t yycount = 0; + // Its maximum. + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + // Arguments of yyformat. + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yytoken) is + if this state is a consistent state with a default action. + Thus, detecting the absence of a lookahead is sufficient to + determine that there is no unexpected or expected token to + report. In that case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is + a consistent state with a default action. There might have + been a previous inconsistent state, consistent state with a + non-default action, or user semantic action that manipulated + yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state + merging (from LALR or IELR) and default reductions corrupt the + expected token list. However, the list is correct for + canonical LR with one exception: it will still contain any + token that will not be accepted due to an error action in a + later state. + */ + if (yytoken != yyempty_) + { + yyarg[yycount++] = yytname_[yytoken]; + int yyn = yypact_[yystate]; + if (!yy_pact_value_is_default_ (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = yylast_ - yyn + 1; + int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; + for (int yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_ + && !yy_table_value_is_error_ (yytable_[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + break; + } + else + yyarg[yycount++] = yytname_[yyx]; + } + } + } + + char const* yyformat = YY_NULL; + switch (yycount) + { +#define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +#undef YYCASE_ + } + + // Argument number. + size_t yyi = 0; + for (char const* yyp = yyformat; *yyp; ++yyp) + if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount) + { + yyres += yytnamerr_ (yyarg[yyi++]); + ++yyp; + } + else + yyres += *yyp; + return yyres;]], [[ + return YY_("syntax error");]])[ + } + + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ + const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[; + const ]b4_int_type_for([b4_pact])[ + ]b4_parser_class_name[::yypact_[] = + { + ]b4_pact[ + }; + + /* YYDEFACT[S] -- default reduction number in state S. Performed when + YYTABLE doesn't specify something else to do. Zero means the + default is an error. */ + const ]b4_int_type_for([b4_defact])[ + ]b4_parser_class_name[::yydefact_[] = + { + ]b4_defact[ + }; + + /* YYPGOTO[NTERM-NUM]. */ + const ]b4_int_type_for([b4_pgoto])[ + ]b4_parser_class_name[::yypgoto_[] = + { + ]b4_pgoto[ + }; + + /* YYDEFGOTO[NTERM-NUM]. */ + const ]b4_int_type_for([b4_defgoto])[ + ]b4_parser_class_name[::yydefgoto_[] = + { + ]b4_defgoto[ + }; + + /* 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 YYTABLE_NINF_, syntax error. */ + const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[; + const ]b4_int_type_for([b4_table])[ + ]b4_parser_class_name[::yytable_[] = + { + ]b4_table[ + }; + + /* YYCHECK. */ + const ]b4_int_type_for([b4_check])[ + ]b4_parser_class_name[::yycheck_[] = + { + ]b4_check[ + }; + + /* STOS_[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ + const ]b4_int_type_for([b4_stos])[ + ]b4_parser_class_name[::yystos_[] = + { + ]b4_stos[ + }; + +#if ]b4_api_PREFIX[DEBUG + /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding + to YYLEX-NUM. */ + const ]b4_int_type_for([b4_toknum])[ + ]b4_parser_class_name[::yytoken_number_[] = + { + ]b4_toknum[ + }; +#endif + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ + const ]b4_int_type_for([b4_r1])[ + ]b4_parser_class_name[::yyr1_[] = + { + ]b4_r1[ + }; + + /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ + const ]b4_int_type_for([b4_r2])[ + ]b4_parser_class_name[::yyr2_[] = + { + ]b4_r2[ + }; + +]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[ + /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at \a yyntokens_, nonterminals. */ + const char* + const ]b4_parser_class_name[::yytname_[] = + { + ]b4_tname[ + }; + +]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[ + /* YYRHS -- A `-1'-separated list of the rules' RHS. */ + const ]b4_parser_class_name[::rhs_number_type + ]b4_parser_class_name[::yyrhs_[] = + { + ]b4_rhs[ + }; + + /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ + const ]b4_int_type_for([b4_prhs])[ + ]b4_parser_class_name[::yyprhs_[] = + { + ]b4_prhs[ + }; + + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ + const ]b4_int_type_for([b4_rline])[ + ]b4_parser_class_name[::yyrline_[] = + { + ]b4_rline[ + }; + + // Print the state stack on the debug stream. + void + ]b4_parser_class_name[::yystack_print_ () + { + *yycdebug_ << "Stack now"; + for (state_stack_type::const_iterator i = yystate_stack_.begin (); + i != yystate_stack_.end (); ++i) + *yycdebug_ << ' ' << *i; + *yycdebug_ << std::endl; + } + + // Report on the debug stream that the rule \a yyrule is going to be reduced. + void + ]b4_parser_class_name[::yy_reduce_print_ (int yyrule) + { + unsigned int yylno = yyrline_[yyrule]; + int yynrhs = yyr2_[yyrule]; + /* Print the symbols being reduced, and their result. */ + *yycdebug_ << "Reducing stack by rule " << yyrule - 1 + << " (line " << yylno << "):" << std::endl; + /* The symbols being reduced. */ + for (int yyi = 0; yyi < yynrhs; yyi++) + YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", + yyrhs_[yyprhs_[yyrule] + yyi], + &]b4_rhs_value(yynrhs, yyi + 1)[, + &]b4_rhs_location(yynrhs, yyi + 1)[); + } +#endif // ]b4_api_PREFIX[DEBUG + + /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ + ]b4_parser_class_name[::token_number_type + ]b4_parser_class_name[::yytranslate_ (int t) + { + static + const token_number_type + translate_table[] = + { + ]b4_translate[ + }; + if ((unsigned int) t <= yyuser_token_number_max_) + return translate_table[t]; + else + return yyundef_token_; + } + + const int ]b4_parser_class_name[::yyeof_ = 0; + const int ]b4_parser_class_name[::yylast_ = ]b4_last[; + const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[; + const int ]b4_parser_class_name[::yyempty_ = -2; + const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[; + const int ]b4_parser_class_name[::yyterror_ = 1; + const int ]b4_parser_class_name[::yyerrcode_ = 256; + const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[; + + const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[; + const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[; + +]b4_namespace_close[ +]b4_epilogue[]dnl +b4_output_end() diff --git a/tools/data/lalr1.java b/tools/data/lalr1.java new file mode 100644 index 00000000..f8c5c721 --- /dev/null +++ b/tools/data/lalr1.java @@ -0,0 +1,927 @@ +# Java skeleton for Bison -*- autoconf -*- + +# Copyright (C) 2007-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_include(b4_pkgdatadir/[java.m4]) + +b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], [b4_skeleton])]) +m4_ifval(m4_defn([b4_symbol_destructors]), + [b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])], + []) + +b4_output_begin([b4_parser_file_name]) +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java], + [2007-2012]) + +b4_percent_define_ifdef([package], [package b4_percent_define_get([package]); +])[/* First part of user declarations. */ +]b4_pre_prologue +b4_percent_code_get([[imports]]) +[/** + * A Bison parser, automatically generated from ]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[. + * + * @@author LALR (1) parser skeleton written by Paolo Bonzini. + */ +]b4_public_if([public ])dnl +b4_abstract_if([abstract ])dnl +b4_final_if([final ])dnl +b4_strictfp_if([strictfp ])dnl +[class ]b4_parser_class_name[]dnl +b4_percent_define_get3([extends], [ extends ])dnl +b4_percent_define_get3([implements], [ implements ])[ +{ + ]b4_identification[ + + /** True if verbose error messages are enabled. */ + public boolean errorVerbose = ]b4_flag_value([error_verbose]); + +b4_locations_if([[ + /** + * A class defining a pair of positions. Positions, defined by the + * ]b4_position_type[ class, denote a point in the input. + * Locations represent a part of the input through the beginning + * and ending positions. */ + public class ]b4_location_type[ { + /** The first, inclusive, position in the range. */ + public ]b4_position_type[ begin; + + /** The first position beyond the range. */ + public ]b4_position_type[ end; + + /** + * Create a ]b4_location_type[ denoting an empty range located at + * a given point. + * @@param loc The position at which the range is anchored. */ + public ]b4_location_type[ (]b4_position_type[ loc) { + this.begin = this.end = loc; + } + + /** + * Create a ]b4_location_type[ from the endpoints of the range. + * @@param begin The first position included in the range. + * @@param end The first position beyond the range. */ + public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) { + this.begin = begin; + this.end = end; + } + + /** + * Print a representation of the location. For this to be correct, + * ]b4_position_type[ should override the equals + * method. */ + public String toString () { + if (begin.equals (end)) + return begin.toString (); + else + return begin.toString () + "-" + end.toString (); + } + } + +]]) + +[ /** Token returned by the scanner to signal the end of its input. */ + public static final int EOF = 0;] + +b4_token_enums(b4_tokens) + + b4_locations_if([[ + private ]b4_location_type[ yylloc (YYStack rhs, int n) + { + if (n > 0) + return new ]b4_location_type[ (rhs.locationAt (n-1).begin, rhs.locationAt (0).end); + else + return new ]b4_location_type[ (rhs.locationAt (0).end); + }]])[ + + /** + * Communication interface between the scanner and the Bison-generated + * parser ]b4_parser_class_name[. + */ + public interface Lexer { + ]b4_locations_if([[/** + * Method to retrieve the beginning position of the last scanned token. + * @@return the position at which the last scanned token starts. */ + ]b4_position_type[ getStartPos (); + + /** + * Method to retrieve the ending position of the last scanned token. + * @@return the first position beyond the last scanned token. */ + ]b4_position_type[ getEndPos ();]])[ + + /** + * Method to retrieve the semantic value of the last scanned token. + * @@return the semantic value of the last scanned token. */ + ]b4_yystype[ getLVal (); + + /** + * Entry point for the scanner. Returns the token identifier corresponding + * to the next token and prepares to return the semantic value + * ]b4_locations_if([and beginning/ending positions ])[of the token. + * @@return the token identifier corresponding to the next token. */ + int yylex () ]b4_maybe_throws([b4_lex_throws])[; + + /** + * Entry point for error reporting. Emits an error + * ]b4_locations_if([referring to the given location ])[in a user-defined way. + * + * ]b4_locations_if([[@@param loc The location of the element to which the + * error message is related]])[ + * @@param s The string for the error message. */ + void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s);] + } + + b4_lexer_if([[private class YYLexer implements Lexer { +]b4_percent_code_get([[lexer]])[ + } + + ]])[/** The object doing lexical analysis for us. */ + private Lexer yylexer; + ] + b4_parse_param_vars + +b4_lexer_if([[ + /** + * Instantiates the Bison-generated parser. + */ + public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) { + this.yylexer = new YYLexer(]b4_lex_param_call[); + ]b4_parse_param_cons[ + } +]]) + + /** + * Instantiates the Bison-generated parser. + * @@param yylexer The scanner that will supply tokens to the parser. + */ + b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) { + this.yylexer = yylexer; + ]b4_parse_param_cons[ + } + + private java.io.PrintStream yyDebugStream = System.err; + + /** + * Return the PrintStream on which the debugging output is + * printed. + */ + public final java.io.PrintStream getDebugStream () { return yyDebugStream; } + + /** + * Set the PrintStream on which the debug output is printed. + * @@param s The stream that is used for debugging output. + */ + public final void setDebugStream(java.io.PrintStream s) { yyDebugStream = s; } + + private int yydebug = 0; + + /** + * Answer the verbosity of the debugging output; 0 means that all kinds of + * output from the parser are suppressed. + */ + public final int getDebugLevel() { return yydebug; } + + /** + * Set the verbosity of the debugging output; 0 means that all kinds of + * output from the parser are suppressed. + * @@param level The verbosity level for debugging output. + */ + public final void setDebugLevel(int level) { yydebug = level; } + + private final int yylex () ]b4_maybe_throws([b4_lex_throws]) [{ + return yylexer.yylex (); + } + protected final void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s) { + yylexer.yyerror (]b4_locations_if([loc, ])[s); + } + + ]b4_locations_if([ + protected final void yyerror (String s) { + yylexer.yyerror ((]b4_location_type[)null, s); + } + protected final void yyerror (]b4_position_type[ loc, String s) { + yylexer.yyerror (new ]b4_location_type[ (loc), s); + }]) + + [protected final void yycdebug (String s) { + if (yydebug > 0) + yyDebugStream.println (s); + } + + private final class YYStack { + private int[] stateStack = new int[16]; + ]b4_locations_if([[private ]b4_location_type[[] locStack = new ]b4_location_type[[16];]])[ + private ]b4_yystype[[] valueStack = new ]b4_yystype[[16]; + + public int size = 16; + public int height = -1; + + public final void push (int state, ]b4_yystype[ value]dnl + b4_locations_if([, ]b4_location_type[ loc])[) { + height++; + if (size == height) + { + int[] newStateStack = new int[size * 2]; + System.arraycopy (stateStack, 0, newStateStack, 0, height); + stateStack = newStateStack; + ]b4_locations_if([[ + ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2]; + System.arraycopy (locStack, 0, newLocStack, 0, height); + locStack = newLocStack;]]) + + b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2]; + System.arraycopy (valueStack, 0, newValueStack, 0, height); + valueStack = newValueStack; + + size *= 2; + } + + stateStack[height] = state; + ]b4_locations_if([[locStack[height] = loc;]])[ + valueStack[height] = value; + } + + public final void pop () { + pop (1); + } + + public final void pop (int num) { + // Avoid memory leaks... garbage collection is a white lie! + if (num > 0) { + java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null); + ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[ + } + height -= num; + } + + public final int stateAt (int i) { + return stateStack[height - i]; + } + + ]b4_locations_if([[public final ]b4_location_type[ locationAt (int i) { + return locStack[height - i]; + } + + ]])[public final ]b4_yystype[ valueAt (int i) { + return valueStack[height - i]; + } + + // Print the state stack on the debug stream. + public void print (java.io.PrintStream out) + { + out.print ("Stack now"); + + for (int i = 0; i <= height; i++) + { + out.print (' '); + out.print (stateStack[i]); + } + out.println (); + } + } + + /** + * Returned by a Bison action in order to stop the parsing process and + * return success (true). */ + public static final int YYACCEPT = 0; + + /** + * Returned by a Bison action in order to stop the parsing process and + * return failure (false). */ + public static final int YYABORT = 1; + + /** + * Returned by a Bison action in order to start error recovery without + * printing an error message. */ + public static final int YYERROR = 2; + + // Internal return codes that are not supported for user semantic + // actions. + private static final int YYERRLAB = 3; + private static final int YYNEWSTATE = 4; + private static final int YYDEFAULT = 5; + private static final int YYREDUCE = 6; + private static final int YYERRLAB1 = 7; + private static final int YYRETURN = 8; + + private int yyerrstatus_ = 0; + + /** + * Return whether error recovery is being done. In this state, the parser + * reads token until it reaches a known state, and then restarts normal + * operation. */ + public final boolean recovering () + { + return yyerrstatus_ == 0; + } + + private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[ + { + ]b4_yystype[ yyval; + ]b4_locations_if([b4_location_type[ yyloc = yylloc (yystack, yylen);]])[ + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. Otherwise, use the top of the stack. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. */ + if (yylen > 0) + yyval = yystack.valueAt (yylen - 1); + else + yyval = yystack.valueAt (0); + + yy_reduce_print (yyn, yystack); + + switch (yyn) + { + ]b4_user_actions[ + default: break; + } + + yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[); + + yystack.pop (yylen); + yylen = 0; + + /* Shift the result of the reduction. */ + yyn = yyr1_[yyn]; + int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0); + if (0 <= yystate && yystate <= yylast_ + && yycheck_[yystate] == yystack.stateAt (0)) + yystate = yytable_[yystate]; + else + yystate = yydefgoto_[yyn - yyntokens_]; + + yystack.push (yystate, yyval]b4_locations_if([, yyloc])[); + return YYNEWSTATE; + } + + /* Return YYSTR after stripping away unnecessary quotes and + backslashes, so that it's suitable for yyerror. The heuristic is + that double-quoting is unnecessary unless the string contains an + apostrophe, a comma, or backslash (other than backslash-backslash). + YYSTR is taken from yytname. */ + private final String yytnamerr_ (String yystr) + { + if (yystr.charAt (0) == '"') + { + StringBuffer yyr = new StringBuffer (); + strip_quotes: for (int i = 1; i < yystr.length (); i++) + switch (yystr.charAt (i)) + { + case '\'': + case ',': + break strip_quotes; + + case '\\': + if (yystr.charAt(++i) != '\\') + break strip_quotes; + /* Fall through. */ + default: + yyr.append (yystr.charAt (i)); + break; + + case '"': + return yyr.toString (); + } + } + else if (yystr.equals ("$end")) + return "end of input"; + + return yystr; + } + + /*--------------------------------. + | Print this symbol on YYOUTPUT. | + `--------------------------------*/ + + private void yy_symbol_print (String s, int yytype, + ]b4_yystype[ yyvaluep]dnl + b4_locations_if([, Object yylocationp])[) + { + if (yydebug > 0) + yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ") + + yytname_[yytype] + " ("]b4_locations_if([ + + yylocationp + ": "])[ + + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")"); + } + + /** + * Parse input from the scanner that was specified at object construction + * time. Return whether the end of the input was reached successfully. + * + * @@return true if the parsing succeeds. Note that this does not + * imply that there were no syntax errors. + */ + public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[ + { + /// Lookahead and lookahead in internal form. + int yychar = yyempty_; + int yytoken = 0; + + /* State. */ + int yyn = 0; + int yylen = 0; + int yystate = 0; + + YYStack yystack = new YYStack (); + + /* Error handling. */ + int yynerrs_ = 0; + ]b4_locations_if([/// The location where the error started. + ]b4_location_type[ yyerrloc = null; + + /// ]b4_location_type[ of the lookahead. + ]b4_location_type[ yylloc = new ]b4_location_type[ (null, null); + + /// @@$. + ]b4_location_type[ yyloc;]) + + /// Semantic value of the lookahead. + b4_yystype[ yylval = null; + + yycdebug ("Starting parse\n"); + yyerrstatus_ = 0; + +]m4_ifdef([b4_initial_action], [ +b4_dollar_pushdef([yylval], [], [yylloc])dnl +/* User initialization code. */ +b4_user_initial_action +b4_dollar_popdef])[]dnl + + [ /* Initialize the stack. */ + yystack.push (yystate, yylval]b4_locations_if([, yylloc])[); + + int label = YYNEWSTATE; + for (;;) + switch (label) + { + /* New state. Unlike in the C/C++ skeletons, the state is already + pushed when we come here. */ + case YYNEWSTATE: + yycdebug ("Entering state " + yystate + "\n"); + if (yydebug > 0) + yystack.print (yyDebugStream); + + /* Accept? */ + if (yystate == yyfinal_) + return true; + + /* Take a decision. First try without lookahead. */ + yyn = yypact_[yystate]; + if (yy_pact_value_is_default_ (yyn)) + { + label = YYDEFAULT; + break; + } + + /* Read a lookahead token. */ + if (yychar == yyempty_) + { + yycdebug ("Reading a token: "); + yychar = yylex ();] + b4_locations_if([[ + yylloc = new ]b4_location_type[(yylexer.getStartPos (), + yylexer.getEndPos ());]]) + yylval = yylexer.getLVal ();[ + } + + /* Convert token to internal form. */ + if (yychar <= EOF) + { + yychar = yytoken = EOF; + yycdebug ("Now at end of input.\n"); + } + else + { + yytoken = yytranslate_ (yychar); + yy_symbol_print ("Next token is", yytoken, + yylval]b4_locations_if([, yylloc])[); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) + label = YYDEFAULT; + + /* <= 0 means reduce or error. */ + else if ((yyn = yytable_[yyn]) <= 0) + { + if (yy_table_value_is_error_ (yyn)) + label = YYERRLAB; + else + { + yyn = -yyn; + label = YYREDUCE; + } + } + + else + { + /* Shift the lookahead token. */ + yy_symbol_print ("Shifting", yytoken, + yylval]b4_locations_if([, yylloc])[); + + /* Discard the token being shifted. */ + yychar = yyempty_; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus_ > 0) + --yyerrstatus_; + + yystate = yyn; + yystack.push (yystate, yylval]b4_locations_if([, yylloc])[); + label = YYNEWSTATE; + } + break; + + /*-----------------------------------------------------------. + | yydefault -- do the default action for the current state. | + `-----------------------------------------------------------*/ + case YYDEFAULT: + yyn = yydefact_[yystate]; + if (yyn == 0) + label = YYERRLAB; + else + label = YYREDUCE; + break; + + /*-----------------------------. + | yyreduce -- Do a reduction. | + `-----------------------------*/ + case YYREDUCE: + yylen = yyr2_[yyn]; + label = yyaction (yyn, yystack, yylen); + yystate = yystack.stateAt (0); + break; + + /*------------------------------------. + | yyerrlab -- here on detecting error | + `------------------------------------*/ + case YYERRLAB: + /* If not already recovering from an error, report this error. */ + if (yyerrstatus_ == 0) + { + ++yynerrs_; + if (yychar == yyempty_) + yytoken = yyempty_; + yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken)); + } + + ]b4_locations_if([yyerrloc = yylloc;])[ + if (yyerrstatus_ == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= EOF) + { + /* Return failure if at end of input. */ + if (yychar == EOF) + return false; + } + else + yychar = yyempty_; + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + label = YYERRLAB1; + break; + + /*---------------------------------------------------. + | errorlab -- error raised explicitly by YYERROR. | + `---------------------------------------------------*/ + case YYERROR: + + ]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[ + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + yystack.pop (yylen); + yylen = 0; + yystate = yystack.stateAt (0); + label = YYERRLAB1; + break; + + /*-------------------------------------------------------------. + | yyerrlab1 -- common code for both syntax error and YYERROR. | + `-------------------------------------------------------------*/ + case YYERRLAB1: + yyerrstatus_ = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact_[yystate]; + if (!yy_pact_value_is_default_ (yyn)) + { + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yystack.height == 0) + return false; + + ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[ + yystack.pop (); + yystate = yystack.stateAt (0); + if (yydebug > 0) + yystack.print (yyDebugStream); + } + + ]b4_locations_if([ + /* Muck with the stack to setup for yylloc. */ + yystack.push (0, null, yylloc); + yystack.push (0, null, yyerrloc); + yyloc = yylloc (yystack, 2); + yystack.pop (2);])[ + + /* Shift the error token. */ + yy_symbol_print ("Shifting", yystos_[yyn], + yylval]b4_locations_if([, yyloc])[); + + yystate = yyn; + yystack.push (yyn, yylval]b4_locations_if([, yyloc])[); + label = YYNEWSTATE; + break; + + /* Accept. */ + case YYACCEPT: + return true; + + /* Abort. */ + case YYABORT: + return false; + } + } + + // Generate an error message. + private String yysyntax_error (int yystate, int tok) + { + if (errorVerbose) + { + /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. + See + + for details. YYERROR is fine as it does not invoke this + function. + - If this state is a consistent state with a default action, + then the only way this function was invoked is if the + default action is an error action. In that case, don't + check for expected tokens because there are none. + - The only way there can be no lookahead present (in tok) is + if this state is a consistent state with a default action. + Thus, detecting the absence of a lookahead is sufficient to + determine that there is no unexpected or expected token to + report. In that case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this + state is a consistent state with a default action. There + might have been a previous inconsistent state, consistent + state with a non-default action, or user semantic action + that manipulated yychar. (However, yychar is currently out + of scope during semantic actions.) + - Of course, the expected token list depends on states to + have correct lookahead information, and it depends on the + parser not to perform extra reductions after fetching a + lookahead from the scanner and before detecting a syntax + error. Thus, state merging (from LALR or IELR) and default + reductions corrupt the expected token list. However, the + list is correct for canonical LR with one exception: it + will still contain any token that will not be accepted due + to an error action in a later state. + */ + if (tok != yyempty_) + { + // FIXME: This method of building the message is not compatible + // with internationalization. + StringBuffer res = + new StringBuffer ("syntax error, unexpected "); + res.append (yytnamerr_ (yytname_[tok])); + int yyn = yypact_[yystate]; + if (!yy_pact_value_is_default_ (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative + indexes in YYCHECK. In other words, skip the first + -YYN actions for this state because they are default + actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = yylast_ - yyn + 1; + int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; + int count = 0; + for (int x = yyxbegin; x < yyxend; ++x) + if (yycheck_[x + yyn] == x && x != yyterror_ + && !yy_table_value_is_error_ (yytable_[x + yyn])) + ++count; + if (count < 5) + { + count = 0; + for (int x = yyxbegin; x < yyxend; ++x) + if (yycheck_[x + yyn] == x && x != yyterror_ + && !yy_table_value_is_error_ (yytable_[x + yyn])) + { + res.append (count++ == 0 ? ", expecting " : " or "); + res.append (yytnamerr_ (yytname_[x])); + } + } + } + return res.toString (); + } + } + + return "syntax error"; + } + + /** + * Whether the given yypact_ value indicates a defaulted state. + * @@param yyvalue the value to check + */ + private static boolean yy_pact_value_is_default_ (int yyvalue) + { + return yyvalue == yypact_ninf_; + } + + /** + * Whether the given yytable_ value indicates a syntax error. + * @@param yyvalue the value to check + */ + private static boolean yy_table_value_is_error_ (int yyvalue) + { + return yyvalue == yytable_ninf_; + } + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ + private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[; + private static final ]b4_int_type_for([b4_pact])[ yypact_[] = + { + ]b4_pact[ + }; + + /* YYDEFACT[S] -- default reduction number in state S. Performed when + YYTABLE doesn't specify something else to do. Zero means the + default is an error. */ + private static final ]b4_int_type_for([b4_defact])[ yydefact_[] = + { + ]b4_defact[ + }; + + /* YYPGOTO[NTERM-NUM]. */ + private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] = + { + ]b4_pgoto[ + }; + + /* YYDEFGOTO[NTERM-NUM]. */ + private static final ]b4_int_type_for([b4_defgoto])[ + yydefgoto_[] = + { + ]b4_defgoto[ + }; + + /* 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 YYTABLE_NINF_, syntax error. */ + private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[; + private static final ]b4_int_type_for([b4_table])[ + yytable_[] = + { + ]b4_table[ + }; + + /* YYCHECK. */ + private static final ]b4_int_type_for([b4_check])[ + yycheck_[] = + { + ]b4_check[ + }; + + /* STOS_[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ + private static final ]b4_int_type_for([b4_stos])[ + yystos_[] = + { + ]b4_stos[ + }; + + /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding + to YYLEX-NUM. */ + private static final ]b4_int_type_for([b4_toknum])[ + yytoken_number_[] = + { + ]b4_toknum[ + }; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ + private static final ]b4_int_type_for([b4_r1])[ + yyr1_[] = + { + ]b4_r1[ + }; + + /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ + private static final ]b4_int_type_for([b4_r2])[ + yyr2_[] = + { + ]b4_r2[ + }; + + /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at \a yyntokens_, nonterminals. */ + private static final String yytname_[] = + { + ]b4_tname[ + }; + + /* YYRHS -- A `-1'-separated list of the rules' RHS. */ + private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] = + { + ]b4_rhs[ + }; + + /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ + private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] = + { + ]b4_prhs[ + }; + + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ + private static final ]b4_int_type_for([b4_rline])[ yyrline_[] = + { + ]b4_rline[ + }; + + // Report on the debug stream that the rule yyrule is going to be reduced. + private void yy_reduce_print (int yyrule, YYStack yystack) + { + if (yydebug == 0) + return; + + int yylno = yyrline_[yyrule]; + int yynrhs = yyr2_[yyrule]; + /* Print the symbols being reduced, and their result. */ + yycdebug ("Reducing stack by rule " + (yyrule - 1) + + " (line " + yylno + "), "); + + /* The symbols being reduced. */ + for (int yyi = 0; yyi < yynrhs; yyi++) + yy_symbol_print (" $" + (yyi + 1) + " =", + yyrhs_[yyprhs_[yyrule] + yyi], + ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([, + b4_rhs_location(yynrhs, yyi + 1)])[); + } + + /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ + private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] = + { + ]b4_translate[ + }; + + private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t) + { + if (t >= 0 && t <= yyuser_token_number_max_) + return yytranslate_table_[t]; + else + return yyundef_token_; + } + + private static final int yylast_ = ]b4_last[; + private static final int yynnts_ = ]b4_nterms_number[; + private static final int yyempty_ = -2; + private static final int yyfinal_ = ]b4_final_state_number[; + private static final int yyterror_ = 1; + private static final int yyerrcode_ = 256; + private static final int yyntokens_ = ]b4_tokens_number[; + + private static final int yyuser_token_number_max_ = ]b4_user_token_number_max[; + private static final int yyundef_token_ = ]b4_undef_token_number[; + +]/* User implementation code. */ +b4_percent_code_get[]dnl + +} + +b4_epilogue +b4_output_end() diff --git a/tools/data/location.cc b/tools/data/location.cc new file mode 100644 index 00000000..8e831241 --- /dev/null +++ b/tools/data/location.cc @@ -0,0 +1,299 @@ +# C++ skeleton for Bison + +# Copyright (C) 2002-2007, 2009-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +b4_output_begin([b4_dir_prefix[]position.hh]) +b4_copyright([Positions for Bison parsers in C++], + [2002-2007, 2009-2012])[ + +/** + ** \file ]b4_dir_prefix[position.hh + ** Define the ]b4_namespace_ref[::position class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[ + +# include // std::max +# include +# include + +]b4_null_define[ + +]b4_namespace_open[ + /// Abstract a position. + class position + { + public: +]m4_ifdef([b4_location_constructors], [[ + /// Construct a position. + explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULL, + unsigned int l = ]b4_location_initial_line[u, + unsigned int c = ]b4_location_initial_column[u) + : filename (f) + , line (l) + , column (c) + { + } + +]])[ + /// Initialization. + void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULL, + unsigned int l = ]b4_location_initial_line[u, + unsigned int c = ]b4_location_initial_column[u) + { + filename = fn; + line = l; + column = c; + } + + /** \name Line and Column related manipulators + ** \{ */ + /// (line related) Advance to the COUNT next lines. + void lines (int count = 1) + { + column = ]b4_location_initial_column[u; + line += count; + } + + /// (column related) Advance to the COUNT next columns. + void columns (int count = 1) + { + column = std::max (]b4_location_initial_column[u, column + count); + } + /** \} */ + + /// File name to which this position refers. + ]b4_percent_define_get([[filename_type]])[* filename; + /// Current line number. + unsigned int line; + /// Current column number. + unsigned int column; + }; + + /// Add and assign a position. + inline position& + operator+= (position& res, const int width) + { + res.columns (width); + return res; + } + + /// Add two position objects. + inline const position + operator+ (const position& begin, const int width) + { + position res = begin; + return res += width; + } + + /// Add and assign a position. + inline position& + operator-= (position& res, const int width) + { + return res += -width; + } + + /// Add two position objects. + inline const position + operator- (const position& begin, const int width) + { + return begin + -width; + } +]b4_percent_define_flag_if([[define_location_comparison]], [[ + /// Compare two position objects. + inline bool + operator== (const position& pos1, const position& pos2) + { + return (pos1.line == pos2.line + && pos1.column == pos2.column + && (pos1.filename == pos2.filename + || (pos1.filename && pos2.filename + && *pos1.filename == *pos2.filename))); + } + + /// Compare two position objects. + inline bool + operator!= (const position& pos1, const position& pos2) + { + return !(pos1 == pos2); + } +]])[ + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param pos a reference to the position to redirect + */ + template + inline std::basic_ostream& + operator<< (std::basic_ostream& ostr, const position& pos) + { + if (pos.filename) + ostr << *pos.filename << ':'; + return ostr << pos.line << '.' << pos.column; + } + +]b4_namespace_close[ +]b4_cpp_guard_close([b4_dir_prefix[]position.hh]) +b4_output_end() + + +b4_output_begin([b4_dir_prefix[]location.hh]) +b4_copyright([Locations for Bison parsers in C++], + [2002-2007, 2009-2012])[ + +/** + ** \file ]b4_dir_prefix[location.hh + ** Define the ]b4_namespace_ref[::location class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[ + +# include "position.hh" + +]b4_namespace_open[ + + /// Abstract a location. + class location + { + public: +]m4_ifdef([b4_location_constructors], [ + /// Construct a location from \a b to \a e. + location (const position& b, const position& e) + : begin (b) + , end (e) + { + } + + /// Construct a 0-width location in \a p. + explicit location (const position& p = position ()) + : begin (p) + , end (p) + { + } + + /// Construct a 0-width location in \a f, \a l, \a c. + explicit location (]b4_percent_define_get([[filename_type]])[* f, + unsigned int l = ]b4_location_initial_line[u, + unsigned int c = ]b4_location_initial_column[u) + : begin (f, l, c) + , end (f, l, c) + { + } + +])[ + /// Initialization. + void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULL, + unsigned int l = ]b4_location_initial_line[u, + unsigned int c = ]b4_location_initial_column[u) + { + begin.initialize (f, l, c); + end = begin; + } + + /** \name Line and Column related manipulators + ** \{ */ + public: + /// Reset initial location to final location. + void step () + { + begin = end; + } + + /// Extend the current location to the COUNT next columns. + void columns (unsigned int count = 1) + { + end += count; + } + + /// Extend the current location to the COUNT next lines. + void lines (unsigned int count = 1) + { + end.lines (count); + } + /** \} */ + + + public: + /// Beginning of the located region. + position begin; + /// End of the located region. + position end; + }; + + /// Join two location objects to create a location. + inline const location operator+ (const location& begin, const location& end) + { + location res = begin; + res.end = end.end; + return res; + } + + /// Add two location objects. + inline const location operator+ (const location& begin, unsigned int width) + { + location res = begin; + res.columns (width); + return res; + } + + /// Add and assign a location. + inline location& operator+= (location& res, unsigned int width) + { + res.columns (width); + return res; + } +]b4_percent_define_flag_if([[define_location_comparison]], [[ + /// Compare two location objects. + inline bool + operator== (const location& loc1, const location& loc2) + { + return loc1.begin == loc2.begin && loc1.end == loc2.end; + } + + /// Compare two location objects. + inline bool + operator!= (const location& loc1, const location& loc2) + { + return !(loc1 == loc2); + } +]])[ + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param loc a reference to the location to redirect + ** + ** Avoid duplicate information. + */ + template + inline std::basic_ostream& + operator<< (std::basic_ostream& ostr, const location& loc) + { + position last = loc.end - 1; + ostr << loc.begin; + if (last.filename + && (!loc.begin.filename + || *loc.begin.filename != *last.filename)) + ostr << '-' << last; + else if (loc.begin.line != last.line) + ostr << '-' << last.line << '.' << last.column; + else if (loc.begin.column != last.column) + ostr << '-' << last.column; + return ostr; + } + +]b4_namespace_close[ + +]b4_cpp_guard_close([b4_dir_prefix[]location.hh]) +b4_output_end() diff --git a/tools/data/m4sugar/foreach.m4 b/tools/data/m4sugar/foreach.m4 new file mode 100644 index 00000000..c20c00ae --- /dev/null +++ b/tools/data/m4sugar/foreach.m4 @@ -0,0 +1,362 @@ +# -*- Autoconf -*- +# This file is part of Autoconf. +# foreach-based replacements for recursive functions. +# Speeds up GNU M4 1.4.x by avoiding quadratic $@ recursion, but penalizes +# GNU M4 1.6 by requiring more memory and macro expansions. +# +# Copyright (C) 2008-2012 Free Software Foundation, Inc. + +# This file is part of Autoconf. 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# Under Section 7 of GPL version 3, you are granted additional +# permissions described in the Autoconf Configure Script Exception, +# version 3.0, as published by the Free Software Foundation. +# +# You should have received a copy of the GNU General Public License +# and a copy of the Autoconf Configure Script Exception along with +# this program; see the files COPYINGv3 and COPYING.EXCEPTION +# respectively. If not, see . + +# Written by Eric Blake. + +# In M4 1.4.x, every byte of $@ is rescanned. This means that an +# algorithm on n arguments that recurses with one less argument each +# iteration will scan n * (n + 1) / 2 arguments, for O(n^2) time. In +# M4 1.6, this was fixed so that $@ is only scanned once, then +# back-references are made to information stored about the scan. +# Thus, n iterations need only scan n arguments, for O(n) time. +# Additionally, in M4 1.4.x, recursive algorithms did not clean up +# memory very well, requiring O(n^2) memory rather than O(n) for n +# iterations. +# +# This file is designed to overcome the quadratic nature of $@ +# recursion by writing a variant of m4_foreach that uses m4_for rather +# than $@ recursion to operate on the list. This involves more macro +# expansions, but avoids the need to rescan a quadratic number of +# arguments, making these replacements very attractive for M4 1.4.x. +# On the other hand, in any version of M4, expanding additional macros +# costs additional time; therefore, in M4 1.6, where $@ recursion uses +# fewer macros, these replacements actually pessimize performance. +# Additionally, the use of $10 to mean the tenth argument violates +# POSIX; although all versions of m4 1.4.x support this meaning, a +# future m4 version may switch to take it as the first argument +# concatenated with a literal 0, so the implementations in this file +# are not future-proof. Thus, this file is conditionally included as +# part of m4_init(), only when it is detected that M4 probably has +# quadratic behavior (ie. it lacks the macro __m4_version__). +# +# Please keep this file in sync with m4sugar.m4. + +# _m4_foreach(PRE, POST, IGNORED, ARG...) +# --------------------------------------- +# Form the common basis of the m4_foreach and m4_map macros. For each +# ARG, expand PRE[ARG]POST[]. The IGNORED argument makes recursion +# easier, and must be supplied rather than implicit. +# +# This version minimizes the number of times that $@ is evaluated by +# using m4_for to generate a boilerplate into _m4_f then passing $@ to +# that temporary macro. Thus, the recursion is done in m4_for without +# reparsing any user input, and is not quadratic. For an idea of how +# this works, note that m4_foreach(i,[1,2],[i]) calls +# _m4_foreach([m4_define([i],],[)i],[],[1],[2]) +# which defines _m4_f: +# $1[$4]$2[]$1[$5]$2[]_m4_popdef([_m4_f]) +# then calls _m4_f([m4_define([i],],[)i],[],[1],[2]) for a net result: +# m4_define([i],[1])i[]m4_define([i],[2])i[]_m4_popdef([_m4_f]). +m4_define([_m4_foreach], +[m4_if([$#], [3], [], + [m4_pushdef([_m4_f], _m4_for([4], [$#], [1], + [$0_([1], [2],], [)])[_m4_popdef([_m4_f])])_m4_f($@)])]) + +m4_define([_m4_foreach_], +[[$$1[$$3]$$2[]]]) + +# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT) +# ----------------------------------------------------------- +# Find the first VAL that SWITCH matches, and expand the corresponding +# IF-VAL. If there are no matches, expand DEFAULT. +# +# Use m4_for to create a temporary macro in terms of a boilerplate +# m4_if with final cleanup. If $# is even, we have DEFAULT; if it is +# odd, then rounding the last $# up in the temporary macro is +# harmless. For example, both m4_case(1,2,3,4,5) and +# m4_case(1,2,3,4,5,6) result in the intermediate _m4_case being +# m4_if([$1],[$2],[$3],[$1],[$4],[$5],_m4_popdef([_m4_case])[$6]) +m4_define([m4_case], +[m4_if(m4_eval([$# <= 2]), [1], [$2], +[m4_pushdef([_$0], [m4_if(]_m4_for([2], m4_eval([($# - 1) / 2 * 2]), [2], + [_$0_(], [)])[_m4_popdef( + [_$0])]m4_dquote($m4_eval([($# + 1) & ~1]))[)])_$0($@)])]) + +m4_define([_m4_case_], +[$0_([1], [$1], m4_incr([$1]))]) + +m4_define([_m4_case__], +[[[$$1],[$$2],[$$3],]]) + +# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT) +# ----------------------------------------------------- +# m4 equivalent of +# +# if (SWITCH =~ RE1) +# VAL1; +# elif (SWITCH =~ RE2) +# VAL2; +# elif ... +# ... +# else +# DEFAULT +# +# We build the temporary macro _m4_b: +# m4_define([_m4_b], _m4_defn([_m4_bmatch]))_m4_b([$1], [$2], [$3])... +# _m4_b([$1], [$m-1], [$m])_m4_b([], [], [$m+1]_m4_popdef([_m4_b])) +# then invoke m4_unquote(_m4_b($@)), for concatenation with later text. +m4_define([m4_bmatch], +[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], + [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])], + [$#], 2, [$2], + [m4_pushdef([_m4_b], [m4_define([_m4_b], + _m4_defn([_$0]))]_m4_for([3], m4_eval([($# + 1) / 2 * 2 - 1]), + [2], [_$0_(], [)])[_m4_b([], [],]m4_dquote([$]m4_eval( + [($# + 1) / 2 * 2]))[_m4_popdef([_m4_b]))])m4_unquote(_m4_b($@))])]) + +m4_define([_m4_bmatch], +[m4_if(m4_bregexp([$1], [$2]), [-1], [], [[$3]m4_define([$0])])]) + +m4_define([_m4_bmatch_], +[$0_([1], m4_decr([$1]), [$1])]) + +m4_define([_m4_bmatch__], +[[_m4_b([$$1], [$$2], [$$3])]]) + + +# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT]) +# ------------------------------------------------------------------- +# Similar to m4_if, except that each TEST is expanded when encountered. +# If the expansion of TESTn matches the string VALn, the result is IF-VALn. +# The result is DEFAULT if no tests passed. This macro allows +# short-circuiting of expensive tests, where it pays to arrange quick +# filter tests to run first. +# +# m4_cond already guarantees either 3*n or 3*n + 1 arguments, 1 <= n. +# We only have to speed up _m4_cond, by building the temporary _m4_c: +# m4_define([_m4_c], _m4_defn([m4_unquote]))_m4_c([m4_if(($1), [($2)], +# [[$3]m4_define([_m4_c])])])_m4_c([m4_if(($4), [($5)], +# [[$6]m4_define([_m4_c])])])..._m4_c([m4_if(($m-2), [($m-1)], +# [[$m]m4_define([_m4_c])])])_m4_c([[$m+1]]_m4_popdef([_m4_c])) +# We invoke m4_unquote(_m4_c($@)), for concatenation with later text. +m4_define([_m4_cond], +[m4_pushdef([_m4_c], [m4_define([_m4_c], + _m4_defn([m4_unquote]))]_m4_for([2], m4_eval([$# / 3 * 3 - 1]), [3], + [$0_(], [)])[_m4_c(]m4_dquote(m4_dquote( + [$]m4_eval([$# / 3 * 3 + 1])))[_m4_popdef([_m4_c]))])m4_unquote(_m4_c($@))]) + +m4_define([_m4_cond_], +[$0_(m4_decr([$1]), [$1], m4_incr([$1]))]) + +m4_define([_m4_cond__], +[[_m4_c([m4_if(($$1), [($$2)], [[$$3]m4_define([_m4_c])])])]]) + +# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...) +# ---------------------------------------------------- +# m4 equivalent of +# +# $_ = STRING; +# s/RE1/SUBST1/g; +# s/RE2/SUBST2/g; +# ... +# +# m4_bpatsubsts already validated an odd number of arguments; we only +# need to speed up _m4_bpatsubsts. To avoid nesting, we build the +# temporary _m4_p: +# m4_define([_m4_p], [$1])m4_define([_m4_p], +# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$2], [$3]))m4_define([_m4_p], +# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$4], [$5]))m4_define([_m4_p],... +# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$m-1], [$m]))m4_unquote( +# _m4_defn([_m4_p])_m4_popdef([_m4_p])) +m4_define([_m4_bpatsubsts], +[m4_pushdef([_m4_p], [m4_define([_m4_p], + ]m4_dquote([$]1)[)]_m4_for([3], [$#], [2], [$0_(], + [)])[m4_unquote(_m4_defn([_m4_p])_m4_popdef([_m4_p]))])_m4_p($@)]) + +m4_define([_m4_bpatsubsts_], +[$0_(m4_decr([$1]), [$1])]) + +m4_define([_m4_bpatsubsts__], +[[m4_define([_m4_p], +m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$$1], [$$2]))]]) + +# m4_shiftn(N, ...) +# ----------------- +# Returns ... shifted N times. Useful for recursive "varargs" constructs. +# +# m4_shiftn already validated arguments; we only need to speed up +# _m4_shiftn. If N is 3, then we build the temporary _m4_s, defined as +# ,[$5],[$6],...,[$m]_m4_popdef([_m4_s]) +# before calling m4_shift(_m4_s($@)). +m4_define([_m4_shiftn], +[m4_if(m4_incr([$1]), [$#], [], [m4_pushdef([_m4_s], + _m4_for(m4_eval([$1 + 2]), [$#], [1], + [[,]m4_dquote($], [)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])]) + +# m4_do(STRING, ...) +# ------------------ +# This macro invokes all its arguments (in sequence, of course). It is +# useful for making your macros more structured and readable by dropping +# unnecessary dnl's and have the macros indented properly. +# +# Here, we use the temporary macro _m4_do, defined as +# $1[]$2[]...[]$n[]_m4_popdef([_m4_do]) +m4_define([m4_do], +[m4_if([$#], [0], [], + [m4_pushdef([_$0], _m4_for([1], [$#], [1], + [$], [[[]]])[_m4_popdef([_$0])])_$0($@)])]) + +# m4_dquote_elt(ARGS) +# ------------------- +# Return ARGS as an unquoted list of double-quoted arguments. +# +# _m4_foreach to the rescue. +m4_define([m4_dquote_elt], +[m4_if([$#], [0], [], [[[$1]]_m4_foreach([,m4_dquote(], [)], $@)])]) + +# m4_reverse(ARGS) +# ---------------- +# Output ARGS in reverse order. +# +# Invoke _m4_r($@) with the temporary _m4_r built as +# [$m], [$m-1], ..., [$2], [$1]_m4_popdef([_m4_r]) +m4_define([m4_reverse], +[m4_if([$#], [0], [], [$#], [1], [[$1]], +[m4_pushdef([_m4_r], [[$$#]]_m4_for(m4_decr([$#]), [1], [-1], + [[, ]m4_dquote($], [)])[_m4_popdef([_m4_r])])_m4_r($@)])]) + + +# m4_map_args_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...) +# ------------------------------------------------------------- +# Perform a pairwise grouping of consecutive ARGs, by expanding +# EXPRESSION([ARG1], [ARG2]). If there are an odd number of ARGs, the +# final argument is expanded with END-EXPR([ARGn]). +# +# Build the temporary macro _m4_map_args_pair, with the $2([$m+1]) +# only output if $# is odd: +# $1([$3], [$4])[]$1([$5], [$6])[]...$1([$m-1], +# [$m])[]m4_default([$2], [$1])([$m+1])[]_m4_popdef([_m4_map_args_pair]) +m4_define([m4_map_args_pair], +[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], + [$#], [1], [m4_fatal([$0: too few arguments: $#: $1])], + [$#], [2], [], + [$#], [3], [m4_default([$2], [$1])([$3])[]], + [m4_pushdef([_$0], _m4_for([3], + m4_eval([$# / 2 * 2 - 1]), [2], [_$0_(], [)])_$0_end( + [1], [2], [$#])[_m4_popdef([_$0])])_$0($@)])]) + +m4_define([_m4_map_args_pair_], +[$0_([1], [$1], m4_incr([$1]))]) + +m4_define([_m4_map_args_pair__], +[[$$1([$$2], [$$3])[]]]) + +m4_define([_m4_map_args_pair_end], +[m4_if(m4_eval([$3 & 1]), [1], [[m4_default([$$2], [$$1])([$$3])[]]])]) + +# m4_join(SEP, ARG1, ARG2...) +# --------------------------- +# Produce ARG1SEPARG2...SEPARGn. Avoid back-to-back SEP when a given ARG +# is the empty string. No expansion is performed on SEP or ARGs. +# +# Use a self-modifying separator, since we don't know how many +# arguments might be skipped before a separator is first printed, but +# be careful if the separator contains $. _m4_foreach to the rescue. +m4_define([m4_join], +[m4_pushdef([_m4_sep], [m4_define([_m4_sep], _m4_defn([m4_echo]))])]dnl +[_m4_foreach([_$0([$1],], [)], $@)_m4_popdef([_m4_sep])]) + +m4_define([_m4_join], +[m4_if([$2], [], [], [_m4_sep([$1])[$2]])]) + +# m4_joinall(SEP, ARG1, ARG2...) +# ------------------------------ +# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP. +# No expansion is performed on SEP or ARGs. +# +# A bit easier than m4_join. _m4_foreach to the rescue. +m4_define([m4_joinall], +[[$2]m4_if(m4_eval([$# <= 2]), [1], [], + [_m4_foreach([$1], [], m4_shift($@))])]) + +# m4_list_cmp(A, B) +# ----------------- +# Compare the two lists of integer expressions A and B. +# +# m4_list_cmp takes care of any side effects; we only override +# _m4_list_cmp_raw, where we can safely expand lists multiple times. +# First, insert padding so that both lists are the same length; the +# trailing +0 is necessary to handle a missing list. Next, create a +# temporary macro to perform pairwise comparisons until an inequality +# is found. For example, m4_list_cmp([1], [1,2]) creates _m4_cmp as +# m4_if(m4_eval([($1) != ($3)]), [1], [m4_cmp([$1], [$3])], +# m4_eval([($2) != ($4)]), [1], [m4_cmp([$2], [$4])], +# [0]_m4_popdef([_m4_cmp])) +# then calls _m4_cmp([1+0], [0*2], [1], [2+0]) +m4_define([_m4_list_cmp_raw], +[m4_if([$1], [$2], 0, + [_m4_list_cmp($1+0_m4_list_pad(m4_count($1), m4_count($2)), + $2+0_m4_list_pad(m4_count($2), m4_count($1)))])]) + +m4_define([_m4_list_pad], +[m4_if(m4_eval($1 < $2), [1], + [_m4_for(m4_incr([$1]), [$2], [1], [,0*])])]) + +m4_define([_m4_list_cmp], +[m4_pushdef([_m4_cmp], [m4_if(]_m4_for( + [1], m4_eval([$# >> 1]), [1], [$0_(], [,]m4_eval([$# >> 1])[)])[ + [0]_m4_popdef([_m4_cmp]))])_m4_cmp($@)]) + +m4_define([_m4_list_cmp_], +[$0_([$1], m4_eval([$1 + $2]))]) + +m4_define([_m4_list_cmp__], +[[m4_eval([($$1) != ($$2)]), [1], [m4_cmp([$$1], [$$2])], +]]) + +# m4_max(EXPR, ...) +# m4_min(EXPR, ...) +# ----------------- +# Return the decimal value of the maximum (or minimum) in a series of +# integer expressions. +# +# _m4_foreach to the rescue; we only need to replace _m4_minmax. Here, +# we need a temporary macro to track the best answer so far, so that +# the foreach expression is tractable. +m4_define([_m4_minmax], +[m4_pushdef([_m4_best], m4_eval([$2]))_m4_foreach( + [m4_define([_m4_best], $1(_m4_best,], [))], m4_shift($@))]dnl +[_m4_best[]_m4_popdef([_m4_best])]) + +# m4_set_add_all(SET, VALUE...) +# ----------------------------- +# Add each VALUE into SET. This is O(n) in the number of VALUEs, and +# can be faster than calling m4_set_add for each VALUE. +# +# _m4_foreach to the rescue. If no deletions have occurred, then +# avoid the speed penalty of m4_set_add. +m4_define([m4_set_add_all], +[m4_if([$#], [0], [], [$#], [1], [], + [m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1]) + + m4_len(_m4_foreach(m4_ifdef([_m4_set_cleanup($1)], + [[m4_set_add]], [[_$0]])[([$1],], [)], $@))))])]) + +m4_define([_m4_set_add_all], +[m4_ifdef([_m4_set([$1],$2)], [], + [m4_define([_m4_set([$1],$2)], + [1])m4_pushdef([_m4_set([$1])], [$2])-])]) diff --git a/tools/data/m4sugar/m4sugar.m4 b/tools/data/m4sugar/m4sugar.m4 new file mode 100644 index 00000000..3573537d --- /dev/null +++ b/tools/data/m4sugar/m4sugar.m4 @@ -0,0 +1,3301 @@ +divert(-1)# -*- Autoconf -*- +# This file is part of Autoconf. +# Base M4 layer. +# Requires GNU M4. +# +# Copyright (C) 1999-2012 Free Software Foundation, Inc. + +# This file is part of Autoconf. 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# Under Section 7 of GPL version 3, you are granted additional +# permissions described in the Autoconf Configure Script Exception, +# version 3.0, as published by the Free Software Foundation. +# +# You should have received a copy of the GNU General Public License +# and a copy of the Autoconf Configure Script Exception along with +# this program; see the files COPYINGv3 and COPYING.EXCEPTION +# respectively. If not, see . + +# Written by Akim Demaille. + +# Set the quotes, whatever the current quoting system. +changequote() +changequote([, ]) + +# Some old m4's don't support m4exit. But they provide +# equivalent functionality by core dumping because of the +# long macros we define. +ifdef([__gnu__], , +[errprint(M4sugar requires GNU M4. Install it before installing M4sugar or +set the M4 environment variable to its absolute file name.) +m4exit(2)]) + + +## ------------------------------- ## +## 1. Simulate --prefix-builtins. ## +## ------------------------------- ## + +# m4_define +# m4_defn +# m4_undefine +define([m4_define], defn([define])) +define([m4_defn], defn([defn])) +define([m4_undefine], defn([undefine])) + +m4_undefine([define]) +m4_undefine([defn]) +m4_undefine([undefine]) + + +# m4_copy(SRC, DST) +# ----------------- +# Define DST as the definition of SRC. +# What's the difference between: +# 1. m4_copy([from], [to]) +# 2. m4_define([to], [from($@)]) +# Well, obviously 1 is more expensive in space. Maybe 2 is more expensive +# in time, but because of the space cost of 1, it's not that obvious. +# Nevertheless, one huge difference is the handling of `$0'. If `from' +# uses `$0', then with 1, `to''s `$0' is `to', while it is `from' in 2. +# The user would certainly prefer to see `to'. +# +# This definition is in effect during m4sugar initialization, when +# there are no pushdef stacks; later on, we redefine it to something +# more powerful for all other clients to use. +m4_define([m4_copy], +[m4_define([$2], m4_defn([$1]))]) + + +# m4_rename(SRC, DST) +# ------------------- +# Rename the macro SRC to DST. +m4_define([m4_rename], +[m4_copy([$1], [$2])m4_undefine([$1])]) + + +# m4_rename_m4(MACRO-NAME) +# ------------------------ +# Rename MACRO-NAME to m4_MACRO-NAME. +m4_define([m4_rename_m4], +[m4_rename([$1], [m4_$1])]) + + +# m4_copy_unm4(m4_MACRO-NAME) +# --------------------------- +# Copy m4_MACRO-NAME to MACRO-NAME. +m4_define([m4_copy_unm4], +[m4_copy([$1], m4_bpatsubst([$1], [^m4_\(.*\)], [[\1]]))]) + + +# Some m4 internals have names colliding with tokens we might use. +# Rename them a` la `m4 --prefix-builtins'. Conditionals first, since +# some subsequent renames are conditional. +m4_rename_m4([ifdef]) +m4_rename([ifelse], [m4_if]) + +m4_rename_m4([builtin]) +m4_rename_m4([changecom]) +m4_rename_m4([changequote]) +m4_ifdef([changeword],dnl conditionally available in 1.4.x +[m4_undefine([changeword])]) +m4_rename_m4([debugfile]) +m4_rename_m4([debugmode]) +m4_rename_m4([decr]) +m4_rename_m4([divnum]) +m4_rename_m4([dumpdef]) +m4_rename_m4([errprint]) +m4_rename_m4([esyscmd]) +m4_rename_m4([eval]) +m4_rename_m4([format]) +m4_undefine([include]) +m4_rename_m4([incr]) +m4_rename_m4([index]) +m4_rename_m4([indir]) +m4_rename_m4([len]) +m4_rename([m4exit], [m4_exit]) +m4_undefine([m4wrap]) +m4_ifdef([mkstemp],dnl added in M4 1.4.8 +[m4_rename_m4([mkstemp]) +m4_copy([m4_mkstemp], [m4_maketemp]) +m4_undefine([maketemp])], +[m4_rename_m4([maketemp]) +m4_copy([m4_maketemp], [m4_mkstemp])]) +m4_rename([patsubst], [m4_bpatsubst]) +m4_rename_m4([popdef]) +m4_rename_m4([pushdef]) +m4_rename([regexp], [m4_bregexp]) +m4_rename_m4([shift]) +m4_undefine([sinclude]) +m4_rename_m4([substr]) +m4_ifdef([symbols],dnl present only in alpha-quality 1.4o +[m4_rename_m4([symbols])]) +m4_rename_m4([syscmd]) +m4_rename_m4([sysval]) +m4_rename_m4([traceoff]) +m4_rename_m4([traceon]) +m4_rename_m4([translit]) + +# _m4_defn(ARG) +# ------------- +# _m4_defn is for internal use only - it bypasses the wrapper, so it +# must only be used on one argument at a time, and only on macros +# known to be defined. Make sure this still works if the user renames +# m4_defn but not _m4_defn. +m4_copy([m4_defn], [_m4_defn]) + +# _m4_divert_raw(NUM) +# ------------------- +# _m4_divert_raw is for internal use only. Use this instead of +# m4_builtin([divert], NUM), so that tracing diversion flow is easier. +m4_rename([divert], [_m4_divert_raw]) + +# _m4_popdef(ARG...) +# ------------------ +# _m4_popdef is for internal use only - it bypasses the wrapper, so it +# must only be used on macros known to be defined. Make sure this +# still works if the user renames m4_popdef but not _m4_popdef. +m4_copy([m4_popdef], [_m4_popdef]) + +# _m4_undefine(ARG...) +# -------------------- +# _m4_undefine is for internal use only - it bypasses the wrapper, so +# it must only be used on macros known to be defined. Make sure this +# still works if the user renames m4_undefine but not _m4_undefine. +m4_copy([m4_undefine], [_m4_undefine]) + +# _m4_undivert(NUM...) +# -------------------- +# _m4_undivert is for internal use only, and should always be given +# arguments. Use this instead of m4_builtin([undivert], NUM...), so +# that tracing diversion flow is easier. +m4_rename([undivert], [_m4_undivert]) + + +## ------------------- ## +## 2. Error messages. ## +## ------------------- ## + + +# m4_location +# ----------- +# Output the current file, colon, and the current line number. +m4_define([m4_location], +[__file__:__line__]) + + +# m4_errprintn(MSG) +# ----------------- +# Same as `errprint', but with the missing end of line. +m4_define([m4_errprintn], +[m4_errprint([$1 +])]) + + +# m4_warning(MSG) +# --------------- +# Warn the user. +m4_define([m4_warning], +[m4_errprintn(m4_location[: warning: $1])]) + + +# m4_fatal(MSG, [EXIT-STATUS]) +# ---------------------------- +# Fatal the user. :) +m4_define([m4_fatal], +[m4_errprintn(m4_location[: error: $1] +m4_expansion_stack)m4_exit(m4_if([$2],, 1, [$2]))]) + + +# m4_assert(EXPRESSION, [EXIT-STATUS = 1]) +# ---------------------------------------- +# This macro ensures that EXPRESSION evaluates to true, and exits if +# EXPRESSION evaluates to false. +m4_define([m4_assert], +[m4_if(m4_eval([$1]), 0, + [m4_fatal([assert failed: $1], [$2])])]) + + + +## ------------- ## +## 3. Warnings. ## +## ------------- ## + + +# _m4_warn(CATEGORY, MESSAGE, [STACK-TRACE]) +# ------------------------------------------ +# Report a MESSAGE to the user if the CATEGORY of warnings is enabled. +# This is for traces only. +# If present, STACK-TRACE is a \n-separated list of "LOCATION: MESSAGE", +# where the last line (and no other) ends with "the top level". +# +# Within m4, the macro is a no-op. This macro really matters +# when autom4te post-processes the trace output. +m4_define([_m4_warn], []) + + +# m4_warn(CATEGORY, MESSAGE) +# -------------------------- +# Report a MESSAGE to the user if the CATEGORY of warnings is enabled. +m4_define([m4_warn], +[_m4_warn([$1], [$2], +m4_ifdef([_m4_expansion_stack], [m4_expansion_stack]))]) + + + +## ------------------- ## +## 4. File inclusion. ## +## ------------------- ## + + +# We also want to neutralize include (and sinclude for symmetry), +# but we want to extend them slightly: warn when a file is included +# several times. This is, in general, a dangerous operation, because +# too many people forget to quote the first argument of m4_define. +# +# For instance in the following case: +# m4_define(foo, [bar]) +# then a second reading will turn into +# m4_define(bar, [bar]) +# which is certainly not what was meant. + +# m4_include_unique(FILE) +# ----------------------- +# Declare that the FILE was loading; and warn if it has already +# been included. +m4_define([m4_include_unique], +[m4_ifdef([m4_include($1)], + [m4_warn([syntax], [file `$1' included several times])])dnl +m4_define([m4_include($1)])]) + + +# m4_include(FILE) +# ---------------- +# Like the builtin include, but warns against multiple inclusions. +m4_define([m4_include], +[m4_include_unique([$1])dnl +m4_builtin([include], [$1])]) + + +# m4_sinclude(FILE) +# ----------------- +# Like the builtin sinclude, but warns against multiple inclusions. +m4_define([m4_sinclude], +[m4_include_unique([$1])dnl +m4_builtin([sinclude], [$1])]) + + + +## ------------------------------------ ## +## 5. Additional branching constructs. ## +## ------------------------------------ ## + +# Both `m4_ifval' and `m4_ifset' tests against the empty string. The +# difference is that `m4_ifset' is specialized on macros. +# +# In case of arguments of macros, eg. $1, it makes little difference. +# In the case of a macro `FOO', you don't want to check `m4_ifval(FOO, +# TRUE)', because if `FOO' expands with commas, there is a shifting of +# the arguments. So you want to run `m4_ifval([FOO])', but then you just +# compare the *string* `FOO' against `', which, of course fails. +# +# So you want the variation `m4_ifset' that expects a macro name as $1. +# If this macro is both defined and defined to a non empty value, then +# it runs TRUE, etc. + + +# m4_ifblank(COND, [IF-BLANK], [IF-TEXT]) +# m4_ifnblank(COND, [IF-TEXT], [IF-BLANK]) +# ---------------------------------------- +# If COND is empty, or consists only of blanks (space, tab, newline), +# then expand IF-BLANK, otherwise expand IF-TEXT. This differs from +# m4_ifval only if COND has just whitespace, but it helps optimize in +# spite of users who mistakenly leave trailing space after what they +# thought was an empty argument: +# macro( +# [] +# ) +# +# Writing one macro in terms of the other causes extra overhead, so +# we inline both definitions. +m4_define([m4_ifblank], +[m4_if(m4_translit([[$1]], [ ][ ][ +]), [], [$2], [$3])]) + +m4_define([m4_ifnblank], +[m4_if(m4_translit([[$1]], [ ][ ][ +]), [], [$3], [$2])]) + + +# m4_ifval(COND, [IF-TRUE], [IF-FALSE]) +# ------------------------------------- +# If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE. +# Comparable to m4_ifdef. +m4_define([m4_ifval], +[m4_if([$1], [], [$3], [$2])]) + + +# m4_n(TEXT) +# ---------- +# If TEXT is not empty, return TEXT and a new line, otherwise nothing. +m4_define([m4_n], +[m4_if([$1], + [], [], + [$1 +])]) + + +# m4_ifvaln(COND, [IF-TRUE], [IF-FALSE]) +# -------------------------------------- +# Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE +# unless that argument is empty. +m4_define([m4_ifvaln], +[m4_if([$1], + [], [m4_n([$3])], + [m4_n([$2])])]) + + +# m4_ifset(MACRO, [IF-TRUE], [IF-FALSE]) +# -------------------------------------- +# If MACRO has no definition, or of its definition is the empty string, +# expand IF-FALSE, otherwise IF-TRUE. +m4_define([m4_ifset], +[m4_ifdef([$1], + [m4_ifval(_m4_defn([$1]), [$2], [$3])], + [$3])]) + + +# m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED]) +# ----------------------------------------------- +m4_define([m4_ifndef], +[m4_ifdef([$1], [$3], [$2])]) + + +# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT) +# ----------------------------------------------------------- +# m4 equivalent of +# switch (SWITCH) +# { +# case VAL1: +# IF-VAL1; +# break; +# case VAL2: +# IF-VAL2; +# break; +# ... +# default: +# DEFAULT; +# break; +# }. +# All the values are optional, and the macro is robust to active +# symbols properly quoted. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_case], +[m4_if([$#], 0, [], + [$#], 1, [], + [$#], 2, [$2], + [$1], [$2], [$3], + [$0([$1], m4_shift3($@))])]) + + +# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT) +# ----------------------------------------------------- +# m4 equivalent of +# +# if (SWITCH =~ RE1) +# VAL1; +# elif (SWITCH =~ RE2) +# VAL2; +# elif ... +# ... +# else +# DEFAULT +# +# All the values are optional, and the macro is robust to active symbols +# properly quoted. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_bmatch], +[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], + [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])], + [$#], 2, [$2], + [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shift3($@))], + [$3])])]) + +# m4_argn(N, ARGS...) +# ------------------- +# Extract argument N (greater than 0) from ARGS. Example: +# m4_define([b], [B]) +# m4_argn([2], [a], [b], [c]) => b +# +# Rather than using m4_car(m4_shiftn([$1], $@)), we exploit the fact that +# GNU m4 can directly reference any argument, through an indirect macro. +m4_define([m4_argn], +[m4_assert([0 < $1])]dnl +[m4_pushdef([_$0], [_m4_popdef([_$0])]m4_dquote([$]m4_incr([$1])))_$0($@)]) + + +# m4_car(ARGS...) +# m4_cdr(ARGS...) +# --------------- +# Manipulate m4 lists. m4_car returns the first argument. m4_cdr +# bundles all but the first argument into a quoted list. These two +# macros are generally used with list arguments, with quoting removed +# to break the list into multiple m4 ARGS. +m4_define([m4_car], [[$1]]) +m4_define([m4_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) + +# _m4_cdr(ARGS...) +# ---------------- +# Like m4_cdr, except include a leading comma unless only one argument +# remains. Why? Because comparing a large list against [] is more +# expensive in expansion time than comparing the number of arguments; so +# _m4_cdr can be used to reduce the number of arguments when it is time +# to end recursion. +m4_define([_m4_cdr], +[m4_if([$#], 1, [], + [, m4_dquote(m4_shift($@))])]) + + + +# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT]) +# ------------------------------------------------------------------- +# Similar to m4_if, except that each TEST is expanded when encountered. +# If the expansion of TESTn matches the string VALn, the result is IF-VALn. +# The result is DEFAULT if no tests passed. This macro allows +# short-circuiting of expensive tests, where it pays to arrange quick +# filter tests to run first. +# +# For an example, consider a previous implementation of _AS_QUOTE_IFELSE: +# +# m4_if(m4_index([$1], [\]), [-1], [$2], +# m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2], +# m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2], +# m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3], +# m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3], +# [$2]) +# +# Here, m4_index is computed 5 times, and m4_eval 4, even if $1 contains +# no backslash. It is more efficient to do: +# +# m4_cond([m4_index([$1], [\])], [-1], [$2], +# [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2], +# [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2], +# [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3], +# [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3], +# [$2]) +# +# In the common case of $1 with no backslash, only one m4_index expansion +# occurs, and m4_eval is avoided altogether. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_cond], +[m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])], + [$#], [1], [$1], + m4_eval([$# % 3]), [2], [m4_fatal([$0: missing an argument])], + [_$0($@)])]) + +m4_define([_m4_cond], +[m4_if(($1), [($2)], [$3], + [$#], [3], [], + [$#], [4], [$4], + [$0(m4_shift3($@))])]) + + +## ---------------------------------------- ## +## 6. Enhanced version of some primitives. ## +## ---------------------------------------- ## + +# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...) +# ---------------------------------------------------- +# m4 equivalent of +# +# $_ = STRING; +# s/RE1/SUBST1/g; +# s/RE2/SUBST2/g; +# ... +# +# All the values are optional, and the macro is robust to active symbols +# properly quoted. +# +# I would have liked to name this macro `m4_bpatsubst', unfortunately, +# due to quotation problems, I need to double quote $1 below, therefore +# the anchors are broken :( I can't let users be trapped by that. +# +# Recall that m4_shift3 always results in an argument. Hence, we need +# to distinguish between a final deletion vs. ending recursion. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_bpatsubsts], +[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], + [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])], + [$#], 2, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2]))], + [$#], 3, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2], [$3]))], + [_$0($@m4_if(m4_eval($# & 1), 0, [,]))])]) +m4_define([_m4_bpatsubsts], +[m4_if([$#], 2, [$1], + [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]), + m4_shift3($@))])]) + + +# m4_copy(SRC, DST) +# ----------------- +# Define the pushdef stack DST as a copy of the pushdef stack SRC; +# give an error if DST is already defined. This is particularly nice +# for copying self-modifying pushdef stacks, where the top definition +# includes one-shot initialization that is later popped to the normal +# definition. This version intentionally does nothing if SRC is +# undefined. +# +# Some macros simply can't be renamed with this method: namely, anything +# involved in the implementation of m4_stack_foreach_sep. +m4_define([m4_copy], +[m4_ifdef([$2], [m4_fatal([$0: won't overwrite defined macro: $2])], + [m4_stack_foreach_sep([$1], [m4_pushdef([$2],], [)])])]dnl +[m4_ifdef([m4_location($1)], [m4_define([m4_location($2)], m4_location)])]) + + +# m4_copy_force(SRC, DST) +# m4_rename_force(SRC, DST) +# ------------------------- +# Like m4_copy/m4_rename, except blindly overwrite any existing DST. +# Note that m4_copy_force tolerates undefined SRC, while m4_rename_force +# does not. +m4_define([m4_copy_force], +[m4_ifdef([$2], [_m4_undefine([$2])])m4_copy($@)]) + +m4_define([m4_rename_force], +[m4_ifdef([$2], [_m4_undefine([$2])])m4_rename($@)]) + + +# m4_define_default(MACRO, VALUE) +# ------------------------------- +# If MACRO is undefined, set it to VALUE. +m4_define([m4_define_default], +[m4_ifndef([$1], [m4_define($@)])]) + + +# m4_default(EXP1, EXP2) +# m4_default_nblank(EXP1, EXP2) +# ----------------------------- +# Returns EXP1 if not empty/blank, otherwise EXP2. Expand the result. +# +# m4_default is called on hot paths, so inline the contents of m4_ifval, +# for one less round of expansion. +m4_define([m4_default], +[m4_if([$1], [], [$2], [$1])]) + +m4_define([m4_default_nblank], +[m4_ifblank([$1], [$2], [$1])]) + + +# m4_default_quoted(EXP1, EXP2) +# m4_default_nblank_quoted(EXP1, EXP2) +# ------------------------------------ +# Returns EXP1 if non empty/blank, otherwise EXP2. Leave the result quoted. +# +# For comparison: +# m4_define([active], [ACTIVE]) +# m4_default([active], [default]) => ACTIVE +# m4_default([], [active]) => ACTIVE +# -m4_default([ ], [active])- => - - +# -m4_default_nblank([ ], [active])- => -ACTIVE- +# m4_default_quoted([active], [default]) => active +# m4_default_quoted([], [active]) => active +# -m4_default_quoted([ ], [active])- => - - +# -m4_default_nblank_quoted([ ], [active])- => -active- +# +# m4_default macro is called on hot paths, so inline the contents of m4_ifval, +# for one less round of expansion. +m4_define([m4_default_quoted], +[m4_if([$1], [], [[$2]], [[$1]])]) + +m4_define([m4_default_nblank_quoted], +[m4_ifblank([$1], [[$2]], [[$1]])]) + + +# m4_defn(NAME) +# ------------- +# Like the original, except guarantee a warning when using something which is +# undefined (unlike M4 1.4.x). This replacement is not a full-featured +# replacement: if any of the defined macros contain unbalanced quoting, but +# when pasted together result in a well-quoted string, then only native m4 +# support is able to get it correct. But that's where quadrigraphs come in +# handy, if you really need unbalanced quotes inside your macros. +# +# This macro is called frequently, so minimize the amount of additional +# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, +# (added in M4 1.6), then let m4 do the job for us (see m4_init). +m4_define([m4_defn], +[m4_if([$#], [0], [[$0]], + [$#], [1], [m4_ifdef([$1], [_m4_defn([$1])], + [m4_fatal([$0: undefined macro: $1])])], + [m4_map_args([$0], $@)])]) + + +# m4_dumpdef(NAME...) +# ------------------- +# In m4 1.4.x, dumpdef writes to the current debugfile, rather than +# stderr. This in turn royally confuses autom4te; so we follow the +# lead of newer m4 and always dump to stderr. Unlike the original, +# this version requires an argument, since there is no convenient way +# in m4 1.4.x to grab the names of all defined macros. Newer m4 +# always dumps to stderr, regardless of the current debugfile; it also +# provides m4symbols as a way to grab all current macro names. But +# dumpdefs is not frequently called, so we don't need to worry about +# conditionally using these newer features. Also, this version +# doesn't sort multiple arguments. +# +# If we detect m4 1.6 or newer, then provide an alternate definition, +# installed during m4_init, that allows builtins through. +# Unfortunately, there is no nice way in m4 1.4.x to dump builtins. +m4_define([m4_dumpdef], +[m4_if([$#], [0], [m4_fatal([$0: missing argument])], + [$#], [1], [m4_ifdef([$1], [m4_errprintn( + [$1: ]m4_dquote(_m4_defn([$1])))], [m4_fatal([$0: undefined macro: $1])])], + [m4_map_args([$0], $@)])]) + +m4_define([_m4_dumpdef], +[m4_if([$#], [0], [m4_fatal([$0: missing argument])], + [$#], [1], [m4_builtin([dumpdef], [$1])], + [m4_map_args_sep([m4_builtin([dumpdef],], [)], [], $@)])]) + + +# m4_dumpdefs(NAME...) +# -------------------- +# Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its +# value stack (most recent displayed first). Also, this version silently +# ignores undefined macros, rather than erroring out. +# +# This macro cheats, because it relies on the current definition of NAME +# while the second argument of m4_stack_foreach_lifo is evaluated (which +# would be undefined according to the API). +m4_define([m4_dumpdefs], +[m4_if([$#], [0], [m4_fatal([$0: missing argument])], + [$#], [1], [m4_stack_foreach_lifo([$1], [m4_dumpdef([$1])m4_ignore])], + [m4_map_args([$0], $@)])]) + +# m4_esyscmd_s(COMMAND) +# --------------------- +# Like m4_esyscmd, except strip any trailing newlines, thus behaving +# more like shell command substitution. +m4_define([m4_esyscmd_s], +[m4_chomp_all(m4_esyscmd([$1]))]) + + +# m4_popdef(NAME) +# --------------- +# Like the original, except guarantee a warning when using something which is +# undefined (unlike M4 1.4.x). +# +# This macro is called frequently, so minimize the amount of additional +# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, +# (added in M4 1.6), then let m4 do the job for us (see m4_init). +m4_define([m4_popdef], +[m4_if([$#], [0], [[$0]], + [$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])], + [m4_fatal([$0: undefined macro: $1])])], + [m4_map_args([$0], $@)])]) + + +# m4_shiftn(N, ...) +# ----------------- +# Returns ... shifted N times. Useful for recursive "varargs" constructs. +# +# Autoconf does not use this macro, because it is inherently slower than +# calling the common cases of m4_shift2 or m4_shift3 directly. But it +# might as well be fast for other clients, such as Libtool. One way to +# do this is to expand $@ only once in _m4_shiftn (otherwise, for long +# lists, the expansion of m4_if takes twice as much memory as what the +# list itself occupies, only to throw away the unused branch). The end +# result is strictly equivalent to +# m4_if([$1], 1, [m4_shift(,m4_shift(m4_shift($@)))], +# [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))]) +# but with the final `m4_shift(m4_shift($@)))' shared between the two +# paths. The first leg uses a no-op m4_shift(,$@) to balance out the (). +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_shiftn], +[m4_assert(0 < $1 && $1 < $#)_$0($@)]) + +m4_define([_m4_shiftn], +[m4_if([$1], 1, [m4_shift(], + [$0(m4_decr([$1])]), m4_shift(m4_shift($@)))]) + +# m4_shift2(...) +# m4_shift3(...) +# -------------- +# Returns ... shifted twice, and three times. Faster than m4_shiftn. +m4_define([m4_shift2], [m4_shift(m4_shift($@))]) +m4_define([m4_shift3], [m4_shift(m4_shift(m4_shift($@)))]) + +# _m4_shift2(...) +# _m4_shift3(...) +# --------------- +# Like m4_shift2 or m4_shift3, except include a leading comma unless shifting +# consumes all arguments. Why? Because in recursion, it is nice to +# distinguish between 1 element left and 0 elements left, based on how many +# arguments this shift expands to. +m4_define([_m4_shift2], +[m4_if([$#], [2], [], + [, m4_shift(m4_shift($@))])]) +m4_define([_m4_shift3], +[m4_if([$#], [3], [], + [, m4_shift(m4_shift(m4_shift($@)))])]) + + +# m4_undefine(NAME) +# ----------------- +# Like the original, except guarantee a warning when using something which is +# undefined (unlike M4 1.4.x). +# +# This macro is called frequently, so minimize the amount of additional +# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, +# (added in M4 1.6), then let m4 do the job for us (see m4_init). +m4_define([m4_undefine], +[m4_if([$#], [0], [[$0]], + [$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])], + [m4_fatal([$0: undefined macro: $1])])], + [m4_map_args([$0], $@)])]) + +# _m4_wrap(PRE, POST) +# ------------------- +# Helper macro for m4_wrap and m4_wrap_lifo. Allows nested calls to +# m4_wrap within wrapped text. Use _m4_defn and _m4_popdef for speed. +m4_define([_m4_wrap], +[m4_ifdef([$0_text], + [m4_define([$0_text], [$1]_m4_defn([$0_text])[$2])], + [m4_builtin([m4wrap], [m4_unquote( + _m4_defn([$0_text])_m4_popdef([$0_text]))])m4_define([$0_text], [$1$2])])]) + +# m4_wrap(TEXT) +# ------------- +# Append TEXT to the list of hooks to be executed at the end of input. +# Whereas the order of the original may be LIFO in the underlying m4, +# this version is always FIFO. +m4_define([m4_wrap], +[_m4_wrap([], [$1[]])]) + +# m4_wrap_lifo(TEXT) +# ------------------ +# Prepend TEXT to the list of hooks to be executed at the end of input. +# Whereas the order of m4_wrap may be FIFO in the underlying m4, this +# version is always LIFO. +m4_define([m4_wrap_lifo], +[_m4_wrap([$1[]])]) + +## ------------------------- ## +## 7. Quoting manipulation. ## +## ------------------------- ## + + +# m4_apply(MACRO, LIST) +# --------------------- +# Invoke MACRO, with arguments provided from the quoted list of +# comma-separated quoted arguments. If LIST is empty, invoke MACRO +# without arguments. The expansion will not be concatenated with +# subsequent text. +m4_define([m4_apply], +[m4_if([$2], [], [$1], [$1($2)])[]]) + +# _m4_apply(MACRO, LIST) +# ---------------------- +# Like m4_apply, except do nothing if LIST is empty. +m4_define([_m4_apply], +[m4_if([$2], [], [], [$1($2)[]])]) + + +# m4_count(ARGS) +# -------------- +# Return a count of how many ARGS are present. +m4_define([m4_count], [$#]) + + +# m4_curry(MACRO, ARG...) +# ----------------------- +# Perform argument currying. The expansion of this macro is another +# macro that takes exactly one argument, appends it to the end of the +# original ARG list, then invokes MACRO. For example: +# m4_curry([m4_curry], [m4_reverse], [1])([2])([3]) => 3, 2, 1 +# Not quite as practical as m4_incr, but you could also do: +# m4_define([add], [m4_eval(([$1]) + ([$2]))]) +# m4_define([add_one], [m4_curry([add], [1])]) +# add_one()([2]) => 3 +m4_define([m4_curry], [$1(m4_shift($@,)_$0]) +m4_define([_m4_curry], [[$1])]) + + +# m4_do(STRING, ...) +# ------------------ +# This macro invokes all its arguments (in sequence, of course). It is +# useful for making your macros more structured and readable by dropping +# unnecessary dnl's and have the macros indented properly. No concatenation +# occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_do], +[m4_if([$#], 0, [], + [$#], 1, [$1[]], + [$1[]$0(m4_shift($@))])]) + + +# m4_dquote(ARGS) +# --------------- +# Return ARGS as a quoted list of quoted arguments. +m4_define([m4_dquote], [[$@]]) + + +# m4_dquote_elt(ARGS) +# ------------------- +# Return ARGS as an unquoted list of double-quoted arguments. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_dquote_elt], +[m4_if([$#], [0], [], + [$#], [1], [[[$1]]], + [[[$1]],$0(m4_shift($@))])]) + + +# m4_echo(ARGS) +# ------------- +# Return the ARGS, with the same level of quoting. Whitespace after +# unquoted commas are consumed. +m4_define([m4_echo], [$@]) + + +# m4_expand(ARG) +# _m4_expand(ARG) +# --------------- +# Return the expansion of ARG as a single string. Unlike +# m4_quote($1), this preserves whitespace following single-quoted +# commas that appear within ARG. It also deals with shell case +# statements. +# +# m4_define([active], [ACT, IVE]) +# m4_define([active2], [[ACT, IVE]]) +# m4_quote(active, active2) +# => ACT,IVE,ACT, IVE +# m4_expand([active, active2]) +# => ACT, IVE, ACT, IVE +# +# Unfortunately, due to limitations in m4, ARG must expand to +# something with balanced quotes (use quadrigraphs to get around +# this), and should not contain the unlikely delimiters -=<{( or +# )}>=-. It is possible to have unbalanced quoted `(' or `)', as well +# as unbalanced unquoted `)'. m4_expand can handle unterminated +# comments or dnl on the final line, at the expense of speed; it also +# aids in detecting attempts to incorrectly change the current +# diversion inside ARG. Meanwhile, _m4_expand is faster but must be +# given a terminated expansion, and has no safety checks for +# mis-diverted text. +# +# Exploit that extra unquoted () will group unquoted commas and the +# following whitespace. m4_bpatsubst can't handle newlines inside $1, +# and m4_substr strips quoting. So we (ab)use m4_changequote, using +# temporary quotes to remove the delimiters that conveniently included +# the unquoted () that were added prior to the changequote. +# +# Thanks to shell case statements, too many people are prone to pass +# underquoted `)', so we try to detect that by passing a marker as a +# fourth argument; if the marker is not present, then we assume that +# we encountered an early `)', and re-expand the first argument, but +# this time with one more `(' in the second argument and in the +# open-quote delimiter. We must also ignore the slop from the +# previous try. The final macro is thus half line-noise, half art. +m4_define([m4_expand], +[m4_pushdef([m4_divert], _m4_defn([_m4_divert_unsafe]))]dnl +[m4_pushdef([m4_divert_push], _m4_defn([_m4_divert_unsafe]))]dnl +[m4_chomp(_$0([$1 +]))_m4_popdef([m4_divert], [m4_divert_push])]) + +m4_define([_m4_expand], [$0_([$1], [(], -=<{($1)}>=-, [}>=-])]) + +m4_define([_m4_expand_], +[m4_if([$4], [}>=-], + [m4_changequote([-=<{$2], [)}>=-])$3m4_changequote([, ])], + [$0([$1], [($2], -=<{($2$1)}>=-, [}>=-])m4_ignore$2])]) + + +# m4_ignore(ARGS) +# --------------- +# Expands to nothing. Useful for conditionally ignoring an arbitrary +# number of arguments (see _m4_list_cmp for an example). +m4_define([m4_ignore]) + + +# m4_make_list(ARGS) +# ------------------ +# Similar to m4_dquote, this creates a quoted list of quoted ARGS. This +# version is less efficient than m4_dquote, but separates each argument +# with a comma and newline, rather than just comma, for readability. +# When developing an m4sugar algorithm, you could temporarily use +# m4_pushdef([m4_dquote],m4_defn([m4_make_list])) +# around your code to make debugging easier. +m4_define([m4_make_list], [m4_join([, +], m4_dquote_elt($@))]) + + +# m4_noquote(STRING) +# ------------------ +# Return the result of ignoring all quotes in STRING and invoking the +# macros it contains. Among other things, this is useful for enabling +# macro invocations inside strings with [] blocks (for instance regexps +# and help-strings). On the other hand, since all quotes are disabled, +# any macro expanded during this time that relies on nested [] quoting +# will likely crash and burn. This macro is seldom useful; consider +# m4_unquote or m4_expand instead. +m4_define([m4_noquote], +[m4_changequote([-=<{(],[)}>=-])$1-=<{()}>=-m4_changequote([,])]) + + +# m4_quote(ARGS) +# -------------- +# Return ARGS as a single argument. Any whitespace after unquoted commas +# is stripped. There is always output, even when there were no arguments. +# +# It is important to realize the difference between `m4_quote(exp)' and +# `[exp]': in the first case you obtain the quoted *result* of the +# expansion of EXP, while in the latter you just obtain the string +# `exp'. +m4_define([m4_quote], [[$*]]) + + +# _m4_quote(ARGS) +# --------------- +# Like m4_quote, except that when there are no arguments, there is no +# output. For conditional scenarios (such as passing _m4_quote as the +# macro name in m4_mapall), this feature can be used to distinguish between +# one argument of the empty string vs. no arguments. However, in the +# normal case with arguments present, this is less efficient than m4_quote. +m4_define([_m4_quote], +[m4_if([$#], [0], [], [[$*]])]) + + +# m4_reverse(ARGS) +# ---------------- +# Output ARGS in reverse order. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_reverse], +[m4_if([$#], [0], [], [$#], [1], [[$1]], + [$0(m4_shift($@)), [$1]])]) + + +# m4_unquote(ARGS) +# ---------------- +# Remove one layer of quotes from each ARG, performing one level of +# expansion. For one argument, m4_unquote([arg]) is more efficient than +# m4_do([arg]), but for multiple arguments, the difference is that +# m4_unquote separates arguments with commas while m4_do concatenates. +# Follow this macro with [] if concatenation with subsequent text is +# undesired. +m4_define([m4_unquote], [$*]) + + +## -------------------------- ## +## 8. Implementing m4 loops. ## +## -------------------------- ## + + +# m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION) +# -------------------------------------------------------- +# Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO with +# increments of STEP. Both limits are included, and bounds are +# checked for consistency. The algorithm is robust to indirect +# VARIABLE names. Changing VARIABLE inside EXPRESSION will not impact +# the number of iterations. +# +# Uses _m4_defn for speed, and avoid dnl in the macro body. Factor +# the _m4_for call so that EXPRESSION is only parsed once. +m4_define([m4_for], +[m4_pushdef([$1], m4_eval([$2]))]dnl +[m4_cond([m4_eval(([$3]) > ([$2]))], 1, + [m4_pushdef([_m4_step], m4_eval(m4_default_quoted([$4], + 1)))m4_assert(_m4_step > 0)_$0(_m4_defn([$1]), + m4_eval((([$3]) - ([$2])) / _m4_step * _m4_step + ([$2])), _m4_step,], + [m4_eval(([$3]) < ([$2]))], 1, + [m4_pushdef([_m4_step], m4_eval(m4_default_quoted([$4], + -1)))m4_assert(_m4_step < 0)_$0(_m4_defn([$1]), + m4_eval((([$2]) - ([$3])) / -(_m4_step) * _m4_step + ([$2])), _m4_step,], + [m4_pushdef([_m4_step])_$0(_m4_defn([$1]), _m4_defn([$1]), 0,])]dnl +[[m4_define([$1],], [)$5])m4_popdef([_m4_step], [$1])]) + +# _m4_for(COUNT, LAST, STEP, PRE, POST) +# ------------------------------------- +# Core of the loop, no consistency checks, all arguments are plain +# numbers. Expand PRE[COUNT]POST, then alter COUNT by STEP and +# iterate if COUNT is not LAST. +m4_define([_m4_for], +[$4[$1]$5[]m4_if([$1], [$2], [], + [$0(m4_eval([$1 + $3]), [$2], [$3], [$4], [$5])])]) + + +# Implementing `foreach' loops in m4 is much more tricky than it may +# seem. For example, the old M4 1.4.4 manual had an incorrect example, +# which looked like this (when translated to m4sugar): +# +# | # foreach(VAR, (LIST), STMT) +# | m4_define([foreach], +# | [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])]) +# | m4_define([_arg1], [$1]) +# | m4_define([_foreach], +# | [m4_if([$2], [()], , +# | [m4_define([$1], _arg1$2)$3[]_foreach([$1], (m4_shift$2), [$3])])]) +# +# But then if you run +# +# | m4_define(a, 1) +# | m4_define(b, 2) +# | m4_define(c, 3) +# | foreach([f], [([a], [(b], [c)])], [echo f +# | ]) +# +# it gives +# +# => echo 1 +# => echo (2,3) +# +# which is not what is expected. +# +# Of course the problem is that many quotes are missing. So you add +# plenty of quotes at random places, until you reach the expected +# result. Alternatively, if you are a quoting wizard, you directly +# reach the following implementation (but if you really did, then +# apply to the maintenance of m4sugar!). +# +# | # foreach(VAR, (LIST), STMT) +# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])]) +# | m4_define([_arg1], [[$1]]) +# | m4_define([_foreach], +# | [m4_if($2, [()], , +# | [m4_define([$1], [_arg1$2])$3[]_foreach([$1], [(m4_shift$2)], [$3])])]) +# +# which this time answers +# +# => echo a +# => echo (b +# => echo c) +# +# Bingo! +# +# Well, not quite. +# +# With a better look, you realize that the parens are more a pain than +# a help: since anyway you need to quote properly the list, you end up +# with always using an outermost pair of parens and an outermost pair +# of quotes. Rejecting the parens both eases the implementation, and +# simplifies the use: +# +# | # foreach(VAR, (LIST), STMT) +# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])]) +# | m4_define([_arg1], [$1]) +# | m4_define([_foreach], +# | [m4_if($2, [], , +# | [m4_define([$1], [_arg1($2)])$3[]_foreach([$1], [m4_shift($2)], [$3])])]) +# +# +# Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if' +# to improve robustness, and you come up with a nice implementation +# that doesn't require extra parentheses in the user's LIST. +# +# But wait - now the algorithm is quadratic, because every recursion of +# the algorithm keeps the entire LIST and merely adds another m4_shift to +# the quoted text. If the user has a lot of elements in LIST, you can +# bring the system to its knees with the memory m4 then requires, or trip +# the m4 --nesting-limit recursion factor. The only way to avoid +# quadratic growth is ensure m4_shift is expanded prior to the recursion. +# Hence the design below. +# +# The M4 manual now includes a chapter devoted to this issue, with +# the lessons learned from m4sugar. And still, this design is only +# optimal for M4 1.6; see foreach.m4 for yet more comments on why +# M4 1.4.x uses yet another implementation. + + +# m4_foreach(VARIABLE, LIST, EXPRESSION) +# -------------------------------------- +# +# Expand EXPRESSION assigning each value of the LIST to VARIABLE. +# LIST should have the form `item_1, item_2, ..., item_n', i.e. the +# whole list must *quoted*. Quote members too if you don't want them +# to be expanded. +# +# This macro is robust to active symbols: +# | m4_define(active, [ACT, IVE]) +# | m4_foreach(Var, [active, active], [-Var-]) +# => -ACT--IVE--ACT--IVE- +# +# | m4_foreach(Var, [[active], [active]], [-Var-]) +# => -ACT, IVE--ACT, IVE- +# +# | m4_foreach(Var, [[[active]], [[active]]], [-Var-]) +# => -active--active- +# +# This macro is called frequently, so avoid extra expansions such as +# m4_ifval and dnl. Also, since $2 might be quite large, try to use it +# as little as possible in _m4_foreach; each extra use requires that much +# more memory for expansion. So, rather than directly compare $2 against +# [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which +# requires swapping the argument order in the helper), insert an ignored +# third argument, and use m4_shift3 to detect when recursion is complete, +# at which point this looks very much like m4_map_args. +m4_define([m4_foreach], +[m4_if([$2], [], [], + [m4_pushdef([$1])_$0([m4_define([$1],], [)$3], [], + $2)m4_popdef([$1])])]) + +# _m4_foreach(PRE, POST, IGNORED, ARG...) +# --------------------------------------- +# Form the common basis of the m4_foreach and m4_map macros. For each +# ARG, expand PRE[ARG]POST[]. The IGNORED argument makes recursion +# easier, and must be supplied rather than implicit. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([_m4_foreach], +[m4_if([$#], [3], [], + [$1[$4]$2[]$0([$1], [$2], m4_shift3($@))])]) + + +# m4_foreach_w(VARIABLE, LIST, EXPRESSION) +# ---------------------------------------- +# Like m4_foreach, but the list is whitespace separated. Depending on +# EXPRESSION, it may be more efficient to use m4_map_args_w. +# +# This macro is robust to active symbols: +# m4_foreach_w([Var], [ active +# b act\ +# ive ], [-Var-])end +# => -active--b--active-end +# +# This used to use a slower implementation based on m4_foreach: +# m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3]) +m4_define([m4_foreach_w], +[m4_pushdef([$1])m4_map_args_w([$2], + [m4_define([$1],], [)$3])m4_popdef([$1])]) + + +# m4_map(MACRO, LIST) +# m4_mapall(MACRO, LIST) +# ---------------------- +# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements of +# LIST. $1, $2... must in turn be lists, appropriate for m4_apply. +# If LIST contains an empty sublist, m4_map skips the expansion of +# MACRO, while m4_mapall expands MACRO with no arguments. +# +# Since LIST may be quite large, we want to minimize how often it +# appears in the expansion. Rather than use m4_car/m4_cdr iteration, +# we unbox the list, and use _m4_foreach for iteration. For m4_map, +# an empty list behaves like an empty sublist and gets ignored; for +# m4_mapall, we must special-case the empty list. +m4_define([m4_map], +[_m4_foreach([_m4_apply([$1],], [)], [], $2)]) + +m4_define([m4_mapall], +[m4_if([$2], [], [], + [_m4_foreach([m4_apply([$1],], [)], [], $2)])]) + + +# m4_map_sep(MACRO, [SEPARATOR], LIST) +# m4_mapall_sep(MACRO, [SEPARATOR], LIST) +# --------------------------------------- +# Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1, +# $2... $N are the elements of LIST, and are in turn lists appropriate +# for m4_apply. SEPARATOR is expanded, in order to allow the creation +# of a list of arguments by using a single-quoted comma as the +# separator. For each empty sublist, m4_map_sep skips the expansion +# of MACRO and SEPARATOR, while m4_mapall_sep expands MACRO with no +# arguments. +# +# For m4_mapall_sep, merely expand the first iteration without the +# separator, then include separator as part of subsequent recursion; +# but avoid extra expansion of LIST's side-effects via a helper macro. +# For m4_map_sep, things are trickier - we don't know if the first +# list element is an empty sublist, so we must define a self-modifying +# helper macro and use that as the separator instead. +m4_define([m4_map_sep], +[m4_pushdef([m4_Sep], [m4_define([m4_Sep], _m4_defn([m4_unquote]))])]dnl +[_m4_foreach([_m4_apply([m4_Sep([$2])[]$1],], [)], [], $3)m4_popdef([m4_Sep])]) + +m4_define([m4_mapall_sep], +[m4_if([$3], [], [], [_$0([$1], [$2], $3)])]) + +m4_define([_m4_mapall_sep], +[m4_apply([$1], [$3])_m4_foreach([m4_apply([$2[]$1],], [)], m4_shift2($@))]) + +# m4_map_args(EXPRESSION, ARG...) +# ------------------------------- +# Expand EXPRESSION([ARG]) for each argument. More efficient than +# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))]) +# Shorthand for m4_map_args_sep([EXPRESSION(], [)], [], ARG...). +m4_define([m4_map_args], +[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], + [$#], [1], [], + [$#], [2], [$1([$2])[]], + [_m4_foreach([$1(], [)], $@)])]) + + +# m4_map_args_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...) +# ------------------------------------------------------------- +# Perform a pairwise grouping of consecutive ARGs, by expanding +# EXPRESSION([ARG1], [ARG2]). If there are an odd number of ARGs, the +# final argument is expanded with END-EXPR([ARGn]). +# +# For example: +# m4_define([show], [($*)m4_newline])dnl +# m4_map_args_pair([show], [], [a], [b], [c], [d], [e])dnl +# => (a,b) +# => (c,d) +# => (e) +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_map_args_pair], +[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], + [$#], [1], [m4_fatal([$0: too few arguments: $#: $1])], + [$#], [2], [], + [$#], [3], [m4_default([$2], [$1])([$3])[]], + [$#], [4], [$1([$3], [$4])[]], + [$1([$3], [$4])[]$0([$1], [$2], m4_shift(m4_shift3($@)))])]) + + +# m4_map_args_sep([PRE], [POST], [SEP], ARG...) +# --------------------------------------------- +# Expand PRE[ARG]POST for each argument, with SEP between arguments. +m4_define([m4_map_args_sep], +[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])], + [$#], [1], [], + [$#], [2], [], + [$#], [3], [], + [$#], [4], [$1[$4]$2[]], + [$1[$4]$2[]_m4_foreach([$3[]$1], [$2], m4_shift3($@))])]) + + +# m4_map_args_w(STRING, [PRE], [POST], [SEP]) +# ------------------------------------------- +# Perform the expansion of PRE[word]POST[] for each word in STRING +# separated by whitespace. More efficient than: +# m4_foreach_w([var], [STRING], [PRE[]m4_defn([var])POST]) +# Additionally, expand SEP between words. +# +# As long as we have to use m4_bpatsubst to split the string, we might +# as well make it also apply PRE and POST; this avoids iteration +# altogether. But we must be careful of any \ in PRE or POST. +# _m4_strip returns a quoted string, but that's okay, since it also +# supplies an empty leading and trailing argument due to our +# intentional whitespace around STRING. We use m4_substr to strip the +# empty elements and remove the extra layer of quoting. +m4_define([m4_map_args_w], +[_$0(_m4_split([ ]m4_flatten([$1])[ ], [[ ]+], + m4_if(m4_index([$2$3$4], [\]), [-1], [[$3[]$4[]$2]], + [m4_bpatsubst([[$3[]$4[]$2]], [\\], [\\\\])])), + m4_len([[]$3[]$4]), m4_len([$4[]$2[]]))]) + +m4_define([_m4_map_args_w], +[m4_substr([$1], [$2], m4_eval(m4_len([$1]) - [$2] - [$3]))]) + + +# m4_stack_foreach(MACRO, FUNC) +# m4_stack_foreach_lifo(MACRO, FUNC) +# ---------------------------------- +# Pass each stacked definition of MACRO to the one-argument macro FUNC. +# m4_stack_foreach proceeds in FIFO order, while m4_stack_foreach_lifo +# processes the topmost definitions first. In addition, FUNC should +# not push or pop definitions of MACRO, and should not expect anything about +# the active definition of MACRO (it will not be the topmost, and may not +# be the one passed to FUNC either). +# +# Some macros simply can't be examined with this method: namely, +# anything involved in the implementation of _m4_stack_reverse. +m4_define([m4_stack_foreach], +[_m4_stack_reverse([$1], [m4_tmp-$1])]dnl +[_m4_stack_reverse([m4_tmp-$1], [$1], [$2(_m4_defn([m4_tmp-$1]))])]) + +m4_define([m4_stack_foreach_lifo], +[_m4_stack_reverse([$1], [m4_tmp-$1], [$2(_m4_defn([m4_tmp-$1]))])]dnl +[_m4_stack_reverse([m4_tmp-$1], [$1])]) + +# m4_stack_foreach_sep(MACRO, [PRE], [POST], [SEP]) +# m4_stack_foreach_sep_lifo(MACRO, [PRE], [POST], [SEP]) +# ------------------------------------------------------ +# Similar to m4_stack_foreach and m4_stack_foreach_lifo, in that every +# definition of a pushdef stack will be visited. But rather than +# passing the definition as a single argument to a macro, this variant +# expands the concatenation of PRE[]definition[]POST, and expands SEP +# between consecutive expansions. Note that m4_stack_foreach([a], [b]) +# is equivalent to m4_stack_foreach_sep([a], [b(], [)]). +m4_define([m4_stack_foreach_sep], +[_m4_stack_reverse([$1], [m4_tmp-$1])]dnl +[_m4_stack_reverse([m4_tmp-$1], [$1], [$2[]_m4_defn([m4_tmp-$1])$3], [$4[]])]) + +m4_define([m4_stack_foreach_sep_lifo], +[_m4_stack_reverse([$1], [m4_tmp-$1], [$2[]_m4_defn([m4_tmp-$1])$3], [$4[]])]dnl +[_m4_stack_reverse([m4_tmp-$1], [$1])]) + + +# _m4_stack_reverse(OLD, NEW, [ACTION], [SEP]) +# -------------------------------------------- +# A recursive worker for pushdef stack manipulation. Destructively +# copy the OLD stack into the NEW, and expanding ACTION for each +# iteration. After the first iteration, SEP is promoted to the front +# of ACTION (note that SEP should include a trailing [] if it is to +# avoid interfering with ACTION). The current definition is examined +# after the NEW has been pushed but before OLD has been popped; this +# order is important, as ACTION is permitted to operate on either +# _m4_defn([OLD]) or _m4_defn([NEW]). Since the operation is +# destructive, this macro is generally used twice, with a temporary +# macro name holding the swapped copy. +m4_define([_m4_stack_reverse], +[m4_ifdef([$1], [m4_pushdef([$2], + _m4_defn([$1]))$3[]_m4_popdef([$1])$0([$1], [$2], [$4$3])])]) + + + +## --------------------------- ## +## 9. More diversion support. ## +## --------------------------- ## + + +# m4_cleardivert(DIVERSION-NAME...) +# --------------------------------- +# Discard any text in DIVERSION-NAME. +# +# This works even inside m4_expand. +m4_define([m4_cleardivert], +[m4_if([$#], [0], [m4_fatal([$0: missing argument])], + [_m4_divert_raw([-1])m4_undivert($@)_m4_divert_raw( + _m4_divert(_m4_defn([_m4_divert_diversion]), [-]))])]) + + +# _m4_divert(DIVERSION-NAME or NUMBER, [NOWARN]) +# ---------------------------------------------- +# If DIVERSION-NAME is the name of a diversion, return its number, +# otherwise if it is a NUMBER return it. Issue a warning about +# the use of a number instead of a name, unless NOWARN is provided. +m4_define([_m4_divert], +[m4_ifdef([_m4_divert($1)], + [m4_indir([_m4_divert($1)])], + [m4_if([$2], [], [m4_warn([syntax], + [prefer named diversions])])$1])]) + +# KILL is only used to suppress output. +m4_define([_m4_divert(KILL)], -1) + +# The empty diversion name is a synonym for 0. +m4_define([_m4_divert()], 0) + + +# m4_divert_stack +# --------------- +# Print the diversion stack, if it's nonempty. The caller is +# responsible for any leading or trailing newline. +m4_define([m4_divert_stack], +[m4_stack_foreach_sep_lifo([_m4_divert_stack], [], [], [ +])]) + + +# m4_divert_stack_push(MACRO-NAME, DIVERSION-NAME) +# ------------------------------------------------ +# Form an entry of the diversion stack from caller MACRO-NAME and +# entering DIVERSION-NAME and push it. +m4_define([m4_divert_stack_push], +[m4_pushdef([_m4_divert_stack], m4_location[: $1: $2])]) + + +# m4_divert(DIVERSION-NAME) +# ------------------------- +# Change the diversion stream to DIVERSION-NAME. +m4_define([m4_divert], +[m4_popdef([_m4_divert_stack])]dnl +[m4_define([_m4_divert_diversion], [$1])]dnl +[m4_divert_stack_push([$0], [$1])]dnl +[_m4_divert_raw(_m4_divert([$1]))]) + + +# m4_divert_push(DIVERSION-NAME, [NOWARN]) +# ---------------------------------------- +# Change the diversion stream to DIVERSION-NAME, while stacking old values. +# For internal use only: if NOWARN is not empty, DIVERSION-NAME can be a +# number instead of a name. +m4_define([m4_divert_push], +[m4_divert_stack_push([$0], [$1])]dnl +[m4_pushdef([_m4_divert_diversion], [$1])]dnl +[_m4_divert_raw(_m4_divert([$1], [$2]))]) + + +# m4_divert_pop([DIVERSION-NAME]) +# ------------------------------- +# Change the diversion stream to its previous value, unstacking it. +# If specified, verify we left DIVERSION-NAME. +# When we pop the last value from the stack, we divert to -1. +m4_define([m4_divert_pop], +[m4_if([$1], [], [], + [$1], _m4_defn([_m4_divert_diversion]), [], + [m4_fatal([$0($1): diversion mismatch: +]m4_divert_stack)])]dnl +[_m4_popdef([_m4_divert_stack], [_m4_divert_diversion])]dnl +[m4_ifdef([_m4_divert_diversion], [], + [m4_fatal([too many m4_divert_pop])])]dnl +[_m4_divert_raw(_m4_divert(_m4_defn([_m4_divert_diversion]), [-]))]) + + +# m4_divert_text(DIVERSION-NAME, CONTENT) +# --------------------------------------- +# Output CONTENT into DIVERSION-NAME (which may be a number actually). +# An end of line is appended for free to CONTENT. +m4_define([m4_divert_text], +[m4_divert_push([$1])$2 +m4_divert_pop([$1])]) + + +# m4_divert_once(DIVERSION-NAME, CONTENT) +# --------------------------------------- +# Output CONTENT into DIVERSION-NAME once, if not already there. +# An end of line is appended for free to CONTENT. +m4_define([m4_divert_once], +[m4_expand_once([m4_divert_text([$1], [$2])])]) + + +# _m4_divert_unsafe(DIVERSION-NAME) +# --------------------------------- +# Issue a warning that the attempt to change the current diversion to +# DIVERSION-NAME is unsafe, because this macro is being expanded +# during argument collection of m4_expand. +m4_define([_m4_divert_unsafe], +[m4_fatal([$0: cannot change diversion to `$1' inside m4_expand])]) + + +# m4_undivert(DIVERSION-NAME...) +# ------------------------------ +# Undivert DIVERSION-NAME. Unlike the M4 version, this requires at +# least one DIVERSION-NAME; also, due to support for named diversions, +# this should not be used to undivert files. +m4_define([m4_undivert], +[m4_if([$#], [0], [m4_fatal([$0: missing argument])], + [$#], [1], [_m4_undivert(_m4_divert([$1]))], + [m4_map_args([$0], $@)])]) + + +## --------------------------------------------- ## +## 10. Defining macros with bells and whistles. ## +## --------------------------------------------- ## + +# `m4_defun' is basically `m4_define' but it equips the macro with the +# needed machinery for `m4_require'. A macro must be m4_defun'd if +# either it is m4_require'd, or it m4_require's. +# +# Two things deserve attention and are detailed below: +# 1. Implementation of m4_require +# 2. Keeping track of the expansion stack +# +# 1. Implementation of m4_require +# =============================== +# +# Of course m4_defun calls m4_provide, so that a macro which has +# been expanded is not expanded again when m4_require'd, but the +# difficult part is the proper expansion of macros when they are +# m4_require'd. +# +# The implementation is based on three ideas, (i) using diversions to +# prepare the expansion of the macro and its dependencies (by Franc,ois +# Pinard), (ii) expand the most recently m4_require'd macros _after_ +# the previous macros (by Axel Thimm), and (iii) track instances of +# provide before require (by Eric Blake). +# +# +# The first idea: why use diversions? +# ----------------------------------- +# +# When a macro requires another, the other macro is expanded in new +# diversion, GROW. When the outer macro is fully expanded, we first +# undivert the most nested diversions (GROW - 1...), and finally +# undivert GROW. To understand why we need several diversions, +# consider the following example: +# +# | m4_defun([TEST1], [Test...m4_require([TEST2])1]) +# | m4_defun([TEST2], [Test...m4_require([TEST3])2]) +# | m4_defun([TEST3], [Test...3]) +# +# Because m4_require is not required to be first in the outer macros, we +# must keep the expansions of the various levels of m4_require separated. +# Right before executing the epilogue of TEST1, we have: +# +# GROW - 2: Test...3 +# GROW - 1: Test...2 +# GROW: Test...1 +# BODY: +# +# Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and +# GROW into the regular flow, BODY. +# +# GROW - 2: +# GROW - 1: +# GROW: +# BODY: Test...3; Test...2; Test...1 +# +# (The semicolons are here for clarification, but of course are not +# emitted.) This is what Autoconf 2.0 (I think) to 2.13 (I'm sure) +# implement. +# +# +# The second idea: first required first out +# ----------------------------------------- +# +# The natural implementation of the idea above is buggy and produces +# very surprising results in some situations. Let's consider the +# following example to explain the bug: +# +# | m4_defun([TEST1], [m4_require([TEST2a])m4_require([TEST2b])]) +# | m4_defun([TEST2a], []) +# | m4_defun([TEST2b], [m4_require([TEST3])]) +# | m4_defun([TEST3], [m4_require([TEST2a])]) +# | +# | AC_INIT +# | TEST1 +# +# The dependencies between the macros are: +# +# 3 --- 2b +# / \ is m4_require'd by +# / \ left -------------------- right +# 2a ------------ 1 +# +# If you strictly apply the rules given in the previous section you get: +# +# GROW - 2: TEST3 +# GROW - 1: TEST2a; TEST2b +# GROW: TEST1 +# BODY: +# +# (TEST2a, although required by TEST3 is not expanded in GROW - 3 +# because is has already been expanded before in GROW - 1, so it has +# been AC_PROVIDE'd, so it is not expanded again) so when you undivert +# the stack of diversions, you get: +# +# GROW - 2: +# GROW - 1: +# GROW: +# BODY: TEST3; TEST2a; TEST2b; TEST1 +# +# i.e., TEST2a is expanded after TEST3 although the latter required the +# former. +# +# Starting from 2.50, we use an implementation provided by Axel Thimm. +# The idea is simple: the order in which macros are emitted must be the +# same as the one in which macros are expanded. (The bug above can +# indeed be described as: a macro has been m4_provide'd before its +# dependent, but it is emitted after: the lack of correlation between +# emission and expansion order is guilty). +# +# How to do that? You keep the stack of diversions to elaborate the +# macros, but each time a macro is fully expanded, emit it immediately. +# +# In the example above, when TEST2a is expanded, but it's epilogue is +# not run yet, you have: +# +# GROW - 2: +# GROW - 1: TEST2a +# GROW: Elaboration of TEST1 +# BODY: +# +# The epilogue of TEST2a emits it immediately: +# +# GROW - 2: +# GROW - 1: +# GROW: Elaboration of TEST1 +# BODY: TEST2a +# +# TEST2b then requires TEST3, so right before the epilogue of TEST3, you +# have: +# +# GROW - 2: TEST3 +# GROW - 1: Elaboration of TEST2b +# GROW: Elaboration of TEST1 +# BODY: TEST2a +# +# The epilogue of TEST3 emits it: +# +# GROW - 2: +# GROW - 1: Elaboration of TEST2b +# GROW: Elaboration of TEST1 +# BODY: TEST2a; TEST3 +# +# TEST2b is now completely expanded, and emitted: +# +# GROW - 2: +# GROW - 1: +# GROW: Elaboration of TEST1 +# BODY: TEST2a; TEST3; TEST2b +# +# and finally, TEST1 is finished and emitted: +# +# GROW - 2: +# GROW - 1: +# GROW: +# BODY: TEST2a; TEST3; TEST2b: TEST1 +# +# The idea is simple, but the implementation is a bit involved. If +# you are like me, you will want to see the actual functioning of this +# implementation to be convinced. The next section gives the full +# details. +# +# +# The Axel Thimm implementation at work +# ------------------------------------- +# +# We consider the macros above, and this configure.ac: +# +# AC_INIT +# TEST1 +# +# You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and +# m4_require at hand to follow the steps. +# +# This implementation tries not to assume that the current diversion is +# BODY, so as soon as a macro (m4_defun'd) is expanded, we first +# record the current diversion under the name _m4_divert_dump (denoted +# DUMP below for short). This introduces an important difference with +# the previous versions of Autoconf: you cannot use m4_require if you +# are not inside an m4_defun'd macro, and especially, you cannot +# m4_require directly from the top level. +# +# We have not tried to simulate the old behavior (better yet, we +# diagnose it), because it is too dangerous: a macro m4_require'd from +# the top level is expanded before the body of `configure', i.e., before +# any other test was run. I let you imagine the result of requiring +# AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run.... +# +# After AC_INIT was run, the current diversion is BODY. +# * AC_INIT was run +# DUMP: undefined +# diversion stack: BODY |- +# +# * TEST1 is expanded +# The prologue of TEST1 sets _m4_divert_dump, which is the diversion +# where the current elaboration will be dumped, to the current +# diversion. It also m4_divert_push to GROW, where the full +# expansion of TEST1 and its dependencies will be elaborated. +# DUMP: BODY +# BODY: empty +# diversions: GROW, BODY |- +# +# * TEST1 requires TEST2a +# _m4_require_call m4_divert_pushes another temporary diversion, +# GROW - 1, and expands TEST2a in there. +# DUMP: BODY +# BODY: empty +# GROW - 1: TEST2a +# diversions: GROW - 1, GROW, BODY |- +# Then the content of the temporary diversion is moved to DUMP and the +# temporary diversion is popped. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW, BODY |- +# +# * TEST1 requires TEST2b +# Again, _m4_require_call pushes GROW - 1 and heads to expand TEST2b. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW - 1, GROW, BODY |- +# +# * TEST2b requires TEST3 +# _m4_require_call pushes GROW - 2 and expands TEST3 here. +# (TEST3 requires TEST2a, but TEST2a has already been m4_provide'd, so +# nothing happens.) +# DUMP: BODY +# BODY: TEST2a +# GROW - 2: TEST3 +# diversions: GROW - 2, GROW - 1, GROW, BODY |- +# Then the diversion is appended to DUMP, and popped. +# DUMP: BODY +# BODY: TEST2a; TEST3 +# diversions: GROW - 1, GROW, BODY |- +# +# * TEST1 requires TEST2b (contd.) +# The content of TEST2b is expanded... +# DUMP: BODY +# BODY: TEST2a; TEST3 +# GROW - 1: TEST2b, +# diversions: GROW - 1, GROW, BODY |- +# ... and moved to DUMP. +# DUMP: BODY +# BODY: TEST2a; TEST3; TEST2b +# diversions: GROW, BODY |- +# +# * TEST1 is expanded: epilogue +# TEST1's own content is in GROW... +# DUMP: BODY +# BODY: TEST2a; TEST3; TEST2b +# GROW: TEST1 +# diversions: BODY |- +# ... and it's epilogue moves it to DUMP and then undefines DUMP. +# DUMP: undefined +# BODY: TEST2a; TEST3; TEST2b; TEST1 +# diversions: BODY |- +# +# +# The third idea: track macros provided before they were required +# --------------------------------------------------------------- +# +# Using just the first two ideas, Autoconf 2.50 through 2.63 still had +# a subtle bug for more than seven years. Let's consider the +# following example to explain the bug: +# +# | m4_defun([TEST1], [1]) +# | m4_defun([TEST2], [2[]m4_require([TEST1])]) +# | m4_defun([TEST3], [3 TEST1 m4_require([TEST2])]) +# | TEST3 +# +# After the prologue of TEST3, we are collecting text in GROW with the +# intent of dumping it in BODY during the epilogue. Next, we +# encounter the direct invocation of TEST1, which provides the macro +# in place in GROW. From there, we encounter a requirement for TEST2, +# which must be collected in a new diversion. While expanding TEST2, +# we encounter a requirement for TEST1, but since it has already been +# expanded, the Axel Thimm algorithm states that we can treat it as a +# no-op. But that would lead to an end result of `2 3 1', meaning +# that we have once again output a macro (TEST2) prior to its +# requirements (TEST1). +# +# The problem can only occur if a single defun'd macro first provides, +# then later indirectly requires, the same macro. Note that directly +# expanding then requiring a macro is okay: because the dependency was +# met, the require phase can be a no-op. For that matter, the outer +# macro can even require two helpers, where the first helper expands +# the macro, and the second helper indirectly requires the macro. +# Out-of-order expansion is only present if the inner macro is +# required by something that will be hoisted in front of where the +# direct expansion occurred. In other words, we must be careful not +# to warn on: +# +# | m4_defun([TEST4], [4]) +# | m4_defun([TEST5], [5 TEST4 m4_require([TEST4])]) +# | TEST5 => 5 4 +# +# or even the more complex: +# +# | m4_defun([TEST6], [6]) +# | m4_defun([TEST7], [7 TEST6]) +# | m4_defun([TEST8], [8 m4_require([TEST6])]) +# | m4_defun([TEST9], [9 m4_require([TEST8])]) +# | m4_defun([TEST10], [10 m4_require([TEST7]) m4_require([TEST9])]) +# | TEST10 => 7 6 8 9 10 +# +# So, to detect whether a require was direct or indirect, m4_defun and +# m4_require track the name of the macro that caused a diversion to be +# created (using the stack _m4_diverting, coupled with an O(1) lookup +# _m4_diverting([NAME])), and m4_provide stores the name associated +# with the diversion at which a macro was provided. A require call is +# direct if it occurs within the same diversion where the macro was +# provided, or if the diversion associated with the providing context +# has been collected. +# +# The implementation of the warning involves tracking the set of +# macros which have been provided since the start of the outermost +# defun'd macro (the set is named _m4_provide). When starting an +# outermost macro, the set is emptied; when a macro is provided, it is +# added to the set; when require expands the body of a macro, it is +# removed from the set; and when a macro is indirectly required, the +# set is checked. If a macro is in the set, then it has been provided +# before it was required, and we satisfy dependencies by expanding the +# macro as if it had never been provided; in the example given above, +# this means we now output `1 2 3 1'. Meanwhile, a warning is issued +# to inform the user that her macros trigger the bug in older autoconf +# versions, and that her output file now contains redundant contents +# (and possibly new problems, if the repeated macro was not +# idempotent). Meanwhile, macros defined by m4_defun_once instead of +# m4_defun are idempotent, avoiding any warning or duplicate output. +# +# +# 2. Keeping track of the expansion stack +# ======================================= +# +# When M4 expansion goes wrong it is often extremely hard to find the +# path amongst macros that drove to the failure. What is needed is +# the stack of macro `calls'. One could imagine that GNU M4 would +# maintain a stack of macro expansions, unfortunately it doesn't, so +# we do it by hand. This is of course extremely costly, but the help +# this stack provides is worth it. Nevertheless to limit the +# performance penalty this is implemented only for m4_defun'd macros, +# not for define'd macros. +# +# Each time we enter an m4_defun'd macros, we add a definition in +# _m4_expansion_stack, and when we exit the macro, we remove it (thanks +# to pushdef/popdef). m4_stack_foreach is used to print the expansion +# stack in the rare cases when it's needed. +# +# In addition, we want to detect circular m4_require dependencies. +# Each time we expand a macro FOO we define _m4_expanding(FOO); and +# m4_require(BAR) simply checks whether _m4_expanding(BAR) is defined. + + +# m4_expansion_stack +# ------------------ +# Expands to the entire contents of the expansion stack. The caller +# must supply a trailing newline. This macro always prints a +# location; check whether _m4_expansion_stack is defined to filter out +# the case when no defun'd macro is in force. +m4_define([m4_expansion_stack], +[m4_stack_foreach_sep_lifo([_$0], [_$0_entry(], [) +])m4_location[: the top level]]) + +# _m4_expansion_stack_entry(MACRO) +# -------------------------------- +# Format an entry for MACRO found on the expansion stack. +m4_define([_m4_expansion_stack_entry], +[_m4_defn([m4_location($1)])[: $1 is expanded from...]]) + +# m4_expansion_stack_push(MACRO) +# ------------------------------ +# Form an entry of the expansion stack on entry to MACRO and push it. +m4_define([m4_expansion_stack_push], +[m4_pushdef([_m4_expansion_stack], [$1])]) + + +# _m4_divert(GROW) +# ---------------- +# This diversion is used by the m4_defun/m4_require machinery. It is +# important to keep room before GROW because for each nested +# AC_REQUIRE we use an additional diversion (i.e., two m4_require's +# will use GROW - 2. More than 3 levels has never seemed to be +# needed.) +# +# ... +# - GROW - 2 +# m4_require'd code, 2 level deep +# - GROW - 1 +# m4_require'd code, 1 level deep +# - GROW +# m4_defun'd macros are elaborated here. + +m4_define([_m4_divert(GROW)], 10000) + + +# _m4_defun_pro(MACRO-NAME) +# ------------------------- +# The prologue for Autoconf macros. +# +# This is called frequently, so minimize the number of macro invocations +# by avoiding dnl and m4_defn overhead. +m4_define([_m4_defun_pro], +[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_pro_outer([$1])])]dnl +[m4_expansion_stack_push([$1])m4_pushdef([_m4_expanding($1)])]) + +m4_define([_m4_defun_pro_outer], +[m4_set_delete([_m4_provide])]dnl +[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl +[m4_pushdef([_m4_divert_dump], m4_divnum)m4_divert_push([GROW])]) + +# _m4_defun_epi(MACRO-NAME) +# ------------------------- +# The Epilogue for Autoconf macros. MACRO-NAME only helps tracing +# the PRO/EPI pairs. +# +# This is called frequently, so minimize the number of macro invocations +# by avoiding dnl and m4_popdef overhead. +m4_define([_m4_defun_epi], +[_m4_popdef([_m4_expanding($1)], [_m4_expansion_stack])]dnl +[m4_ifdef([_m4_expansion_stack], [], [_m4_defun_epi_outer([$1])])]dnl +[m4_provide([$1])]) + +m4_define([_m4_defun_epi_outer], +[_m4_popdef([_m4_divert_dump], [_m4_diverting([$1])], [_m4_diverting])]dnl +[m4_divert_pop([GROW])m4_undivert([GROW])]) + + +# _m4_divert_dump +# --------------- +# If blank, we are outside of any defun'd macro. Otherwise, expands +# to the diversion number (not name) where require'd macros should be +# moved once completed. +m4_define([_m4_divert_dump]) + + +# m4_divert_require(DIVERSION, NAME-TO-CHECK, [BODY-TO-EXPAND]) +# ------------------------------------------------------------- +# Same as m4_require, but BODY-TO-EXPAND goes into the named DIVERSION; +# requirements still go in the current diversion though. +# +m4_define([m4_divert_require], +[m4_ifdef([_m4_expanding($2)], + [m4_fatal([$0: circular dependency of $2])])]dnl +[m4_if(_m4_divert_dump, [], + [m4_fatal([$0($2): cannot be used outside of an m4_defun'd macro])])]dnl +[m4_provide_if([$2], [], + [_m4_require_call([$2], [$3], _m4_divert([$1], [-]))])]) + + +# m4_defun(NAME, EXPANSION, [MACRO = m4_define]) +# ---------------------------------------------- +# Define a macro NAME which automatically provides itself. Add +# machinery so the macro automatically switches expansion to the +# diversion stack if it is not already using it, prior to EXPANSION. +# In this case, once finished, it will bring back all the code +# accumulated in the diversion stack. This, combined with m4_require, +# achieves the topological ordering of macros. We don't use this +# macro to define some frequently called macros that are not involved +# in ordering constraints, to save m4 processing. +# +# MACRO is an undocumented argument; when set to m4_pushdef, and NAME +# is already defined, the new definition is added to the pushdef +# stack, rather than overwriting the current definition. It can thus +# be used to write self-modifying macros, which pop themselves to a +# previously m4_define'd definition so that subsequent use of the +# macro is faster. +m4_define([m4_defun], +[m4_define([m4_location($1)], m4_location)]dnl +[m4_default([$3], [m4_define])([$1], + [_m4_defun_pro(]m4_dquote($[0])[)$2[]_m4_defun_epi(]m4_dquote($[0])[)])]) + + +# m4_defun_init(NAME, INIT, COMMON) +# --------------------------------- +# Like m4_defun, but split EXPANSION into two portions: INIT which is +# done only the first time NAME is invoked, and COMMON which is +# expanded every time. +# +# For now, the COMMON definition is always m4_define'd, giving an even +# lighter-weight definition. m4_defun allows self-providing, but once +# a macro is provided, m4_require no longer cares if it is m4_define'd +# or m4_defun'd. m4_defun also provides location tracking to identify +# dependency bugs, but once the INIT has been expanded, we know there +# are no dependency bugs. However, if a future use needs COMMON to be +# m4_defun'd, we can add a parameter, similar to the third parameter +# to m4_defun. +m4_define([m4_defun_init], +[m4_define([$1], [$3[]])m4_defun([$1], + [$2[]_m4_popdef(]m4_dquote($[0])[)m4_indir(]m4_dquote($[0])dnl +[m4_if(]m4_dquote($[#])[, [0], [], ]m4_dquote([,$]@)[))], [m4_pushdef])]) + + +# m4_defun_once(NAME, EXPANSION) +# ------------------------------ +# Like m4_defun, but guarantee that EXPANSION only happens once +# (thereafter, using NAME is a no-op). +# +# If _m4_divert_dump is empty, we are called at the top level; +# otherwise, we must ensure that we are required in front of the +# current defun'd macro. Use a helper macro so that EXPANSION need +# only occur once in the definition of NAME, since it might be large. +m4_define([m4_defun_once], +[m4_define([m4_location($1)], m4_location)]dnl +[m4_define([$1], [_m4_defun_once([$1], [$2], m4_if(_m4_divert_dump, [], + [[_m4_defun_pro([$1])m4_unquote(], [)_m4_defun_epi([$1])]], +m4_ifdef([_m4_diverting([$1])], [-]), [-], [[m4_unquote(], [)]], + [[_m4_require_call([$1],], [, _m4_divert_dump)]]))])]) + +m4_define([_m4_defun_once], +[m4_pushdef([$1])$3[$2[]m4_provide([$1])]$4]) + + +# m4_pattern_forbid(ERE, [WHY]) +# ----------------------------- +# Declare that no token matching the forbidden extended regular +# expression ERE should be seen in the output unless... +m4_define([m4_pattern_forbid], []) + + +# m4_pattern_allow(ERE) +# --------------------- +# ... that token also matches the allowed extended regular expression ERE. +# Both used via traces. +m4_define([m4_pattern_allow], []) + + +## --------------------------------- ## +## 11. Dependencies between macros. ## +## --------------------------------- ## + + +# m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME) +# --------------------------------------------- +# Issue a warning if CALLED-MACRO-NAME was called before THIS-MACRO-NAME. +m4_define([m4_before], +[m4_provide_if([$2], + [m4_warn([syntax], [$2 was called before $1])])]) + + +# m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK]) +# ----------------------------------------------------------- +# If NAME-TO-CHECK has never been expanded (actually, if it is not +# m4_provide'd), expand BODY-TO-EXPAND *before* the current macro +# expansion; follow the expansion with a newline. Once expanded, emit +# it in _m4_divert_dump. Keep track of the m4_require chain in +# _m4_expansion_stack. +# +# The normal cases are: +# +# - NAME-TO-CHECK == BODY-TO-EXPAND +# Which you can use for regular macros with or without arguments, e.g., +# m4_require([AC_PROG_CC], [AC_PROG_CC]) +# m4_require([AC_CHECK_HEADERS(threads.h)], [AC_CHECK_HEADERS(threads.h)]) +# which is just the same as +# m4_require([AC_PROG_CC]) +# m4_require([AC_CHECK_HEADERS(threads.h)]) +# +# - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK]) +# In the case of macros with irregular names. For instance: +# m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])]) +# which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are +# part of the name, it is not an argument) has not been run, then +# call it.' +# Had you used +# m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)]) +# then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e., +# call the macro `AC_LANG_COMPILER' with `C' as argument. +# +# You could argue that `AC_LANG_COMPILER', when it receives an argument +# such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'. But this +# `extension' prevents `AC_LANG_COMPILER' from having actual arguments that +# it passes to `AC_LANG_COMPILER(C)'. +# +# This is called frequently, so minimize the number of macro invocations +# by avoiding dnl and other overhead on the common path. +m4_define([m4_require], +[m4_ifdef([_m4_expanding($1)], + [m4_fatal([$0: circular dependency of $1])])]dnl +[m4_if(_m4_divert_dump, [], + [m4_fatal([$0($1): cannot be used outside of an ]dnl +m4_if([$0], [m4_require], [[m4_defun]], [[AC_DEFUN]])['d macro])])]dnl +[m4_provide_if([$1], [m4_set_contains([_m4_provide], [$1], + [_m4_require_check([$1], _m4_defn([m4_provide($1)]), [$0])], [m4_ignore])], + [_m4_require_call])([$1], [$2], _m4_divert_dump)]) + + +# _m4_require_call(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK], +# DIVERSION-NUMBER) +# ----------------------------------------------------------------- +# If m4_require decides to expand the body, it calls this macro. The +# expansion is placed in DIVERSION-NUMBER. +# +# This is called frequently, so minimize the number of macro invocations +# by avoiding dnl and other overhead on the common path. +m4_define([_m4_require_call], +[m4_pushdef([_m4_divert_grow], m4_decr(_m4_divert_grow))]dnl +[m4_pushdef([_m4_diverting([$1])])m4_pushdef([_m4_diverting], [$1])]dnl +[m4_divert_push(_m4_divert_grow, [-])]dnl +[m4_if([$2], [], [$1], [$2]) +m4_provide_if([$1], [m4_set_remove([_m4_provide], [$1])], + [m4_warn([syntax], [$1 is m4_require'd but not m4_defun'd])])]dnl +[_m4_divert_raw($3)_m4_undivert(_m4_divert_grow)]dnl +[m4_divert_pop(_m4_divert_grow)_m4_popdef([_m4_divert_grow], +[_m4_diverting([$1])], [_m4_diverting])]) + + +# _m4_require_check(NAME-TO-CHECK, OWNER, CALLER) +# ----------------------------------------------- +# NAME-TO-CHECK has been identified as previously expanded in the +# diversion owned by OWNER. If this is a problem, warn on behalf of +# CALLER and return _m4_require_call; otherwise return m4_ignore. +m4_define([_m4_require_check], +[m4_if(_m4_defn([_m4_diverting]), [$2], [m4_ignore], + m4_ifdef([_m4_diverting([$2])], [-]), [-], [m4_warn([syntax], + [$3: `$1' was expanded before it was required +http://www.gnu.org/software/autoconf/manual/autoconf.html#Expanded-Before-Required])_m4_require_call], + [m4_ignore])]) + + +# _m4_divert_grow +# --------------- +# The counter for _m4_require_call. +m4_define([_m4_divert_grow], _m4_divert([GROW])) + + +# m4_expand_once(TEXT, [WITNESS = TEXT]) +# -------------------------------------- +# If TEXT has never been expanded, expand it *here*. Use WITNESS as +# as a memory that TEXT has already been expanded. +m4_define([m4_expand_once], +[m4_provide_if(m4_default_quoted([$2], [$1]), + [], + [m4_provide(m4_default_quoted([$2], [$1]))[]$1])]) + + +# m4_provide(MACRO-NAME) +# ---------------------- +m4_define([m4_provide], +[m4_ifdef([m4_provide($1)], [], +[m4_set_add([_m4_provide], [$1], [m4_define([m4_provide($1)], + m4_ifdef([_m4_diverting], [_m4_defn([_m4_diverting])]))])])]) + + +# m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ------------------------------------------------------- +# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. +# The purpose of this macro is to provide the user with a means to +# check macros which are provided without letting her know how the +# information is coded. +m4_define([m4_provide_if], +[m4_ifdef([m4_provide($1)], + [$2], [$3])]) + + +## --------------------- ## +## 12. Text processing. ## +## --------------------- ## + + +# m4_cr_letters +# m4_cr_LETTERS +# m4_cr_Letters +# ------------- +m4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz]) +m4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ]) +m4_define([m4_cr_Letters], +m4_defn([m4_cr_letters])dnl +m4_defn([m4_cr_LETTERS])dnl +) + + +# m4_cr_digits +# ------------ +m4_define([m4_cr_digits], [0123456789]) + + +# m4_cr_alnum +# ----------- +m4_define([m4_cr_alnum], +m4_defn([m4_cr_Letters])dnl +m4_defn([m4_cr_digits])dnl +) + + +# m4_cr_symbols1 +# m4_cr_symbols2 +# -------------- +m4_define([m4_cr_symbols1], +m4_defn([m4_cr_Letters])dnl +_) + +m4_define([m4_cr_symbols2], +m4_defn([m4_cr_symbols1])dnl +m4_defn([m4_cr_digits])dnl +) + +# m4_cr_all +# --------- +# The character range representing everything, with `-' as the last +# character, since it is special to m4_translit. Use with care, because +# it contains characters special to M4 (fortunately, both ASCII and EBCDIC +# have [] in order, so m4_defn([m4_cr_all]) remains a valid string). It +# also contains characters special to terminals, so it should never be +# displayed in an error message. Also, attempts to map [ and ] to other +# characters via m4_translit must deal with the fact that m4_translit does +# not add quotes to the output. +# +# In EBCDIC, $ is immediately followed by *, which leads to problems +# if m4_cr_all is inlined into a macro definition; so swap them. +# +# It is mainly useful in generating inverted character range maps, for use +# in places where m4_translit is faster than an equivalent m4_bpatsubst; +# the regex `[^a-z]' is equivalent to: +# m4_translit(m4_dquote(m4_defn([m4_cr_all])), [a-z]) +m4_define([m4_cr_all], +m4_translit(m4_dquote(m4_format(m4_dquote(m4_for( + ,1,255,,[[%c]]))m4_for([i],1,255,,[,i]))), [$*-], [*$])-) + + +# _m4_define_cr_not(CATEGORY) +# --------------------------- +# Define m4_cr_not_CATEGORY as the inverse of m4_cr_CATEGORY. +m4_define([_m4_define_cr_not], +[m4_define([m4_cr_not_$1], + m4_translit(m4_dquote(m4_defn([m4_cr_all])), + m4_defn([m4_cr_$1])))]) + + +# m4_cr_not_letters +# m4_cr_not_LETTERS +# m4_cr_not_Letters +# m4_cr_not_digits +# m4_cr_not_alnum +# m4_cr_not_symbols1 +# m4_cr_not_symbols2 +# ------------------ +# Inverse character sets +_m4_define_cr_not([letters]) +_m4_define_cr_not([LETTERS]) +_m4_define_cr_not([Letters]) +_m4_define_cr_not([digits]) +_m4_define_cr_not([alnum]) +_m4_define_cr_not([symbols1]) +_m4_define_cr_not([symbols2]) + + +# m4_newline([STRING]) +# -------------------- +# Expands to a newline, possibly followed by STRING. Exists mostly for +# formatting reasons. +m4_define([m4_newline], [ +$1]) + + +# m4_re_escape(STRING) +# -------------------- +# Escape RE active characters in STRING. +m4_define([m4_re_escape], +[m4_bpatsubst([$1], + [[][*+.?\^$]], [\\\&])]) + + +# m4_re_string +# ------------ +# Regexp for `[a-zA-Z_0-9]*' +# m4_dquote provides literal [] for the character class. +m4_define([m4_re_string], +m4_dquote(m4_defn([m4_cr_symbols2]))dnl +[*]dnl +) + + +# m4_re_word +# ---------- +# Regexp for `[a-zA-Z_][a-zA-Z_0-9]*' +m4_define([m4_re_word], +m4_dquote(m4_defn([m4_cr_symbols1]))dnl +m4_defn([m4_re_string])dnl +) + + +# m4_tolower(STRING) +# m4_toupper(STRING) +# ------------------ +# These macros convert STRING to lowercase or uppercase. +# +# Rather than expand the m4_defn each time, we inline them up front. +m4_define([m4_tolower], +[m4_translit([[$1]], ]m4_dquote(m4_defn([m4_cr_LETTERS]))[, + ]m4_dquote(m4_defn([m4_cr_letters]))[)]) +m4_define([m4_toupper], +[m4_translit([[$1]], ]m4_dquote(m4_defn([m4_cr_letters]))[, + ]m4_dquote(m4_defn([m4_cr_LETTERS]))[)]) + + +# m4_split(STRING, [REGEXP]) +# -------------------------- +# Split STRING into an m4 list of quoted elements. The elements are +# quoted with [ and ]. Beginning spaces and end spaces *are kept*. +# Use m4_strip to remove them. +# +# REGEXP specifies where to split. Default is [\t ]+. +# +# If STRING is empty, the result is an empty list. +# +# Pay attention to the m4_changequotes. When m4 reads the definition of +# m4_split, it still has quotes set to [ and ]. Luckily, these are matched +# in the macro body, so the definition is stored correctly. Use the same +# alternate quotes as m4_noquote; it must be unlikely to appear in $1. +# +# Also, notice that $1 is quoted twice, since we want the result to +# be quoted. Then you should understand that the argument of +# patsubst is -=<{(STRING)}>=- (i.e., with additional -=<{( and )}>=-). +# +# This macro is safe on active symbols, i.e.: +# m4_define(active, ACTIVE) +# m4_split([active active ])end +# => [active], [active], []end +# +# Optimize on regex of ` ' (space), since m4_foreach_w already guarantees +# that the list contains single space separators, and a common case is +# splitting a single-element list. This macro is called frequently, +# so avoid unnecessary dnl inside the definition. +m4_define([m4_split], +[m4_if([$1], [], [], + [$2], [ ], [m4_if(m4_index([$1], [ ]), [-1], [[[$1]]], + [_$0([$1], [$2], [, ])])], + [$2], [], [_$0([$1], [[ ]+], [, ])], + [_$0([$1], [$2], [, ])])]) + +m4_define([_m4_split], +[m4_changequote([-=<{(],[)}>=-])]dnl +[[m4_bpatsubst(-=<{(-=<{($1)}>=-)}>=-, -=<{($2)}>=-, + -=<{(]$3[)}>=-)]m4_changequote([, ])]) + + +# m4_chomp(STRING) +# m4_chomp_all(STRING) +# -------------------- +# Return STRING quoted, but without a trailing newline. m4_chomp +# removes at most one newline, while m4_chomp_all removes all +# consecutive trailing newlines. Embedded newlines are not touched, +# and a trailing backslash-newline leaves just a trailing backslash. +# +# m4_bregexp is slower than m4_index, and we don't always want to +# remove all newlines; hence the two variants. We massage characters +# to give a nicer pattern to match, particularly since m4_bregexp is +# line-oriented. Both versions must guarantee a match, to avoid bugs +# with precision -1 in m4_format in older m4. +m4_define([m4_chomp], +[m4_format([[%.*s]], m4_index(m4_translit([[$1]], [ +/.], [/ ])[./.], [/.]), [$1])]) + +m4_define([m4_chomp_all], +[m4_format([[%.*s]], m4_bregexp(m4_translit([[$1]], [ +/], [/ ]), [/*$]), [$1])]) + + +# m4_flatten(STRING) +# ------------------ +# If STRING contains end of lines, replace them with spaces. If there +# are backslashed end of lines, remove them. This macro is safe with +# active symbols. +# m4_define(active, ACTIVE) +# m4_flatten([active +# act\ +# ive])end +# => active activeend +# +# In m4, m4_bpatsubst is expensive, so first check for a newline. +m4_define([m4_flatten], +[m4_if(m4_index([$1], [ +]), [-1], [[$1]], + [m4_translit(m4_bpatsubst([[[$1]]], [\\ +]), [ +], [ ])])]) + + +# m4_strip(STRING) +# ---------------- +# Expands into STRING with tabs and spaces singled out into a single +# space, and removing leading and trailing spaces. +# +# This macro is robust to active symbols. +# m4_define(active, ACTIVE) +# m4_strip([ active active ])end +# => active activeend +# +# First, notice that we guarantee trailing space. Why? Because regular +# expressions are greedy, and `.* ?' would always group the space into the +# .* portion. The algorithm is simpler by avoiding `?' at the end. The +# algorithm correctly strips everything if STRING is just ` '. +# +# Then notice the second pattern: it is in charge of removing the +# leading/trailing spaces. Why not just `[^ ]'? Because they are +# applied to over-quoted strings, i.e. more or less [STRING], due +# to the limitations of m4_bpatsubsts. So the leading space in STRING +# is the *second* character; equally for the trailing space. +m4_define([m4_strip], +[m4_bpatsubsts([$1 ], + [[ ]+], [ ], + [^. ?\(.*\) .$], [[[\1]]])]) + + +# m4_normalize(STRING) +# -------------------- +# Apply m4_flatten and m4_strip to STRING. +# +# The argument is quoted, so that the macro is robust to active symbols: +# +# m4_define(active, ACTIVE) +# m4_normalize([ act\ +# ive +# active ])end +# => active activeend + +m4_define([m4_normalize], +[m4_strip(m4_flatten([$1]))]) + + + +# m4_join(SEP, ARG1, ARG2...) +# --------------------------- +# Produce ARG1SEPARG2...SEPARGn. Avoid back-to-back SEP when a given ARG +# is the empty string. No expansion is performed on SEP or ARGs. +# +# Since the number of arguments to join can be arbitrarily long, we +# want to avoid having more than one $@ in the macro definition; +# otherwise, the expansion would require twice the memory of the already +# long list. Hence, m4_join merely looks for the first non-empty element, +# and outputs just that element; while _m4_join looks for all non-empty +# elements, and outputs them following a separator. The final trick to +# note is that we decide between recursing with $0 or _$0 based on the +# nested m4_if ending with `_'. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift2($@))])]) +m4_define([_m4_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift2($@))])]) + +# m4_joinall(SEP, ARG1, ARG2...) +# ------------------------------ +# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP. +# No expansion is performed on SEP or ARGs. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))]) +m4_define([_m4_joinall], +[m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])]) + +# m4_combine([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX...) +# -------------------------------------------------------- +# Produce the pairwise combination of every element in the quoted, +# comma-separated PREFIX-LIST with every element from the SUFFIX arguments. +# Each pair is joined with INFIX, and pairs are separated by SEPARATOR. +# No expansion occurs on SEPARATOR, INFIX, or elements of either list. +# +# For example: +# m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3]) +# => a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3 +# +# This definition is a bit hairy; the thing to realize is that we want +# to construct m4_map_args_sep([[prefix$3]], [], [[$1]], m4_shift3($@)) +# as the inner loop, using each prefix generated by the outer loop, +# and without recalculating m4_shift3 every outer iteration. +m4_define([m4_combine], +[m4_if([$2], [], [], m4_eval([$# > 3]), [1], +[m4_map_args_sep([m4_map_args_sep(m4_dquote(], [)[[$3]], [], [[$1]],]]]dnl +[m4_dquote(m4_dquote(m4_shift3($@)))[[)], [[$1]], $2)])]) + + +# m4_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING' +# at the end. It is valid to use this macro with MACRO-NAME undefined, +# in which case no SEPARATOR is added. Be aware that the criterion is +# `not being defined', and not `not being empty'. +# +# Note that neither STRING nor SEPARATOR are expanded here; rather, when +# you expand MACRO-NAME, they will be expanded at that point in time. +# +# This macro is robust to active symbols. It can be used to grow +# strings. +# +# | m4_define(active, ACTIVE)dnl +# | m4_append([sentence], [This is an])dnl +# | m4_append([sentence], [ active ])dnl +# | m4_append([sentence], [symbol.])dnl +# | sentence +# | m4_undefine([active])dnl +# | sentence +# => This is an ACTIVE symbol. +# => This is an active symbol. +# +# It can be used to define hooks. +# +# | m4_define(active, ACTIVE)dnl +# | m4_append([hooks], [m4_define([act1], [act2])])dnl +# | m4_append([hooks], [m4_define([act2], [active])])dnl +# | m4_undefine([active])dnl +# | act1 +# | hooks +# | act1 +# => act1 +# => +# => active +# +# It can also be used to create lists, although this particular usage was +# broken prior to autoconf 2.62. +# | m4_append([list], [one], [, ])dnl +# | m4_append([list], [two], [, ])dnl +# | m4_append([list], [three], [, ])dnl +# | list +# | m4_dquote(list) +# => one, two, three +# => [one],[two],[three] +# +# Note that m4_append can benefit from amortized O(n) m4 behavior, if +# the underlying m4 implementation is smart enough to avoid copying existing +# contents when enlarging a macro's definition into any pre-allocated storage +# (m4 1.4.x unfortunately does not implement this optimization). We do +# not implement m4_prepend, since it is inherently O(n^2) (pre-allocated +# storage only occurs at the end of a macro, so the existing contents must +# always be moved). +# +# Use _m4_defn for speed. +m4_define([m4_append], +[m4_define([$1], m4_ifdef([$1], [_m4_defn([$1])[$3]])[$2])]) + + +# m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR], [IF-UNIQ], [IF-DUP]) +# -------------------------------------------------------------------- +# Like `m4_append', but append only if not yet present. Additionally, +# expand IF-UNIQ if STRING was appended, or IF-DUP if STRING was already +# present. Also, warn if SEPARATOR is not empty and occurs within STRING, +# as the algorithm no longer guarantees uniqueness. +# +# Note that while m4_append can be O(n) (depending on the quality of the +# underlying M4 implementation), m4_append_uniq is inherently O(n^2) +# because each append operation searches the entire string. +m4_define([m4_append_uniq], +[m4_ifval([$3], [m4_if(m4_index([$2], [$3]), [-1], [], + [m4_warn([syntax], + [$0: `$2' contains `$3'])])])_$0($@)]) +m4_define([_m4_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]_m4_defn([$1])[$3], [$3$2$3]), [-1], + [m4_append([$1], [$2], [$3])$4], [$5])], + [m4_define([$1], [$2])$4])]) + +# m4_append_uniq_w(MACRO-NAME, STRINGS) +# ------------------------------------- +# For each of the words in the whitespace separated list STRINGS, append +# only the unique strings to the definition of MACRO-NAME. +# +# Use _m4_defn for speed. +m4_define([m4_append_uniq_w], +[m4_map_args_w([$2], [_m4_append_uniq([$1],], [, [ ])])]) + + +# m4_escape(STRING) +# ----------------- +# Output quoted STRING, but with embedded #, $, [ and ] turned into +# quadrigraphs. +# +# It is faster to check if STRING is already good using m4_translit +# than to blindly perform four m4_bpatsubst. +# +# Because the translit is stripping quotes, it must also neutralize +# anything that might be in a macro name, as well as comments, commas, +# and parentheses. All the problem characters are unified so that a +# single m4_index can scan the result. +# +# Rather than expand m4_defn every time m4_escape is expanded, we +# inline its expansion up front. +m4_define([m4_escape], +[m4_if(m4_index(m4_translit([$1], + [[]#,()]]m4_dquote(m4_defn([m4_cr_symbols2]))[, [$$$]), [$]), + [-1], [m4_echo], [_$0])([$1])]) + +m4_define([_m4_escape], +[m4_changequote([-=<{(],[)}>=-])]dnl +[m4_bpatsubst(m4_bpatsubst(m4_bpatsubst(m4_bpatsubst( + -=<{(-=<{(-=<{(-=<{(-=<{($1)}>=-)}>=-)}>=-)}>=-)}>=-, + -=<{(#)}>=-, -=<{(@%:@)}>=-), + -=<{(\[)}>=-, -=<{(@<:@)}>=-), + -=<{(\])}>=-, -=<{(@:>@)}>=-), + -=<{(\$)}>=-, -=<{(@S|@)}>=-)m4_changequote([,])]) + + +# m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH]) +# ------------------------------------------------------- +# Expands into STRING wrapped to hold in WIDTH columns (default = 79). +# If PREFIX is given, each line is prefixed with it. If FIRST-PREFIX is +# specified, then the first line is prefixed with it. As a special case, +# if the length of FIRST-PREFIX is greater than that of PREFIX, then +# FIRST-PREFIX will be left alone on the first line. +# +# No expansion occurs on the contents STRING, PREFIX, or FIRST-PREFIX, +# although quadrigraphs are correctly recognized. More precisely, +# you may redefine m4_qlen to recognize whatever escape sequences that +# you will post-process. +# +# Typical outputs are: +# +# m4_text_wrap([Short string */], [ ], [/* ], 20) +# => /* Short string */ +# +# m4_text_wrap([Much longer string */], [ ], [/* ], 20) +# => /* Much longer +# => string */ +# +# m4_text_wrap([Short doc.], [ ], [ --short ], 30) +# => --short Short doc. +# +# m4_text_wrap([Short doc.], [ ], [ --too-wide ], 30) +# => --too-wide +# => Short doc. +# +# m4_text_wrap([Super long documentation.], [ ], [ --too-wide ], 30) +# => --too-wide +# => Super long +# => documentation. +# +# FIXME: there is no checking of a longer PREFIX than WIDTH, but do +# we really want to bother with people trying each single corner +# of a software? +# +# This macro does not leave a trailing space behind the last word of a line, +# which complicates it a bit. The algorithm is otherwise stupid and simple: +# all the words are preceded by m4_Separator which is defined to empty for +# the first word, and then ` ' (single space) for all the others. +# +# The algorithm uses a helper that uses $2 through $4 directly, rather than +# using local variables, to avoid m4_defn overhead, or expansion swallowing +# any $. It also bypasses m4_popdef overhead with _m4_popdef since no user +# macro expansion occurs in the meantime. Also, the definition is written +# with m4_do, to avoid time wasted on dnl during expansion (since this is +# already a time-consuming macro). +m4_define([m4_text_wrap], +[_$0(m4_escape([$1]), [$2], m4_default_quoted([$3], [$2]), + m4_default_quoted([$4], [79]))]) + +m4_define([_m4_text_wrap], +m4_do(dnl set up local variables, to avoid repeated calculations +[[m4_pushdef([m4_Indent], m4_qlen([$2]))]], +[[m4_pushdef([m4_Cursor], m4_qlen([$3]))]], +[[m4_pushdef([m4_Separator], [m4_define([m4_Separator], [ ])])]], +dnl expand the first prefix, then check its length vs. regular prefix +dnl same length: nothing special +dnl prefix1 longer: output on line by itself, and reset cursor +dnl prefix1 shorter: pad to length of prefix, and reset cursor +[[[$3]m4_cond([m4_Cursor], m4_Indent, [], + [m4_eval(m4_Cursor > m4_Indent)], [1], [ +[$2]m4_define([m4_Cursor], m4_Indent)], + [m4_format([%*s], m4_max([0], + m4_eval(m4_Indent - m4_Cursor)), [])m4_define([m4_Cursor], m4_Indent)])]], +dnl now, for each word, compute the cursor after the word is output, then +dnl check if the cursor would exceed the wrap column +dnl if so, reset cursor, and insert newline and prefix +dnl if not, insert the separator (usually a space) +dnl either way, insert the word +[[m4_map_args_w([$1], [$0_word(], [, [$2], [$4])])]], +dnl finally, clean up the local variables +[[_m4_popdef([m4_Separator], [m4_Cursor], [m4_Indent])]])) + +m4_define([_m4_text_wrap_word], +[m4_define([m4_Cursor], m4_eval(m4_Cursor + m4_qlen([$1]) + 1))]dnl +[m4_if(m4_eval(m4_Cursor > ([$3])), + [1], [m4_define([m4_Cursor], m4_eval(m4_Indent + m4_qlen([$1]) + 1)) +[$2]], + [m4_Separator[]])[$1]]) + +# m4_text_box(MESSAGE, [FRAME-CHARACTER = `-']) +# --------------------------------------------- +# Turn MESSAGE into: +# ## ------- ## +# ## MESSAGE ## +# ## ------- ## +# using FRAME-CHARACTER in the border. +# +# Quadrigraphs are correctly recognized. More precisely, you may +# redefine m4_qlen to recognize whatever escape sequences that you +# will post-process. +m4_define([m4_text_box], +[m4_pushdef([m4_Border], + m4_translit(m4_format([[[%*s]]], m4_decr(m4_qlen(_m4_expand([$1 +]))), []), [ ], m4_default_quoted([$2], [-])))]dnl +[[##] _m4_defn([m4_Border]) [##] +[##] $1 [##] +[##] _m4_defn([m4_Border]) [##]_m4_popdef([m4_Border])]) + + +# m4_qlen(STRING) +# --------------- +# Expands to the length of STRING after autom4te converts all quadrigraphs. +# +# If you use some other means of post-processing m4 output rather than +# autom4te, then you may redefine this macro to recognize whatever +# escape sequences your post-processor will handle. For that matter, +# m4_define([m4_qlen], m4_defn([m4_len])) is sufficient if you don't +# do any post-processing. +# +# Avoid bpatsubsts for the common case of no quadrigraphs. Cache +# results, as configure scripts tend to ask about lengths of common +# strings like `/*' and `*/' rather frequently. Minimize the number +# of times that $1 occurs in m4_qlen, so there is less text to parse +# on a cache hit. +m4_define([m4_qlen], +[m4_ifdef([$0-$1], [_m4_defn([$0-]], [_$0(])[$1])]) +m4_define([_m4_qlen], +[m4_define([m4_qlen-$1], +m4_if(m4_index([$1], [@]), [-1], [m4_len([$1])], + [m4_len(m4_bpatsubst([[$1]], + [@\(\(<:\|:>\|S|\|%:\|\{:\|:\}\)\(@\)\|&t@\)], + [\3]))]))_m4_defn([m4_qlen-$1])]) + +# m4_copyright_condense(TEXT) +# --------------------------- +# Condense the copyright notice in TEXT to only display the final +# year, wrapping the results to fit in 80 columns. +m4_define([m4_copyright_condense], +[m4_text_wrap(m4_bpatsubst(m4_flatten([[$1]]), +[(C)[- ,0-9]*\([1-9][0-9][0-9][0-9]\)], [(C) \1]))]) + +## ----------------------- ## +## 13. Number processing. ## +## ----------------------- ## + +# m4_cmp(A, B) +# ------------ +# Compare two integer expressions. +# A < B -> -1 +# A = B -> 0 +# A > B -> 1 +m4_define([m4_cmp], +[m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))]) + + +# m4_list_cmp(A, B) +# ----------------- +# +# Compare the two lists of integer expressions A and B. For instance: +# m4_list_cmp([1, 0], [1]) -> 0 +# m4_list_cmp([1, 0], [1, 0]) -> 0 +# m4_list_cmp([1, 2], [1, 0]) -> 1 +# m4_list_cmp([1, 2, 3], [1, 2]) -> 1 +# m4_list_cmp([1, 2, -3], [1, 2]) -> -1 +# m4_list_cmp([1, 0], [1, 2]) -> -1 +# m4_list_cmp([1], [1, 2]) -> -1 +# m4_define([xa], [oops])dnl +# m4_list_cmp([[0xa]], [5+5]) -> 0 +# +# Rather than face the overhead of m4_case, we use a helper function whose +# expansion includes the name of the macro to invoke on the tail, either +# m4_ignore or m4_unquote. This is particularly useful when comparing +# long lists, since less text is being expanded for deciding when to end +# recursion. The recursion is between a pair of macros that alternate +# which list is trimmed by one element; this is more efficient than +# calling m4_cdr on both lists from a single macro. Guarantee exactly +# one expansion of both lists' side effects. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_list_cmp], +[_$0_raw(m4_dquote($1), m4_dquote($2))]) + +m4_define([_m4_list_cmp_raw], +[m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])]) + +m4_define([_m4_list_cmp], +[m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])]) + +m4_define([_m4_list_cmp_1], +[_m4_list_cmp_2([$2], [m4_shift2($@)], $1)]) + +m4_define([_m4_list_cmp_2], +[_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))( + [_m4_list_cmp_1(m4_dquote(m4_shift3($@)), $2)])]) + +# m4_max(EXPR, ...) +# m4_min(EXPR, ...) +# ----------------- +# Return the decimal value of the maximum (or minimum) in a series of +# integer expressions. +# +# M4 1.4.x doesn't provide ?:. Hence this huge m4_eval. Avoid m4_eval +# if both arguments are identical, but be aware of m4_max(0xa, 10) (hence +# the use of <=, not just <, in the second multiply). +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_max], +[m4_if([$#], [0], [m4_fatal([too few arguments to $0])], + [$#], [1], [m4_eval([$1])], + [$#$1], [2$2], [m4_eval([$1])], + [$#], [2], [_$0($@)], + [_m4_minmax([_$0], $@)])]) + +m4_define([_m4_max], +[m4_eval((([$1]) > ([$2])) * ([$1]) + (([$1]) <= ([$2])) * ([$2]))]) + +m4_define([m4_min], +[m4_if([$#], [0], [m4_fatal([too few arguments to $0])], + [$#], [1], [m4_eval([$1])], + [$#$1], [2$2], [m4_eval([$1])], + [$#], [2], [_$0($@)], + [_m4_minmax([_$0], $@)])]) + +m4_define([_m4_min], +[m4_eval((([$1]) < ([$2])) * ([$1]) + (([$1]) >= ([$2])) * ([$2]))]) + +# _m4_minmax(METHOD, ARG1, ARG2...) +# --------------------------------- +# Common recursion code for m4_max and m4_min. METHOD must be _m4_max +# or _m4_min, and there must be at least two arguments to combine. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([_m4_minmax], +[m4_if([$#], [3], [$1([$2], [$3])], + [$0([$1], $1([$2], [$3]), m4_shift3($@))])]) + + +# m4_sign(A) +# ---------- +# The sign of the integer expression A. +m4_define([m4_sign], +[m4_eval((([$1]) > 0) - (([$1]) < 0))]) + + + +## ------------------------ ## +## 14. Version processing. ## +## ------------------------ ## + + +# m4_version_unletter(VERSION) +# ---------------------------- +# Normalize beta version numbers with letters to numeric expressions, which +# can then be handed to m4_eval for the purpose of comparison. +# +# Nl -> (N+1).-1.(l#) +# +# for example: +# [2.14a] -> [0,2,14+1,-1,[0r36:a]] -> 2.15.-1.10 +# [2.14b] -> [0,2,15+1,-1,[0r36:b]] -> 2.15.-1.11 +# [2.61aa.b] -> [0,2.61,1,-1,[0r36:aa],+1,-1,[0r36:b]] -> 2.62.-1.370.1.-1.11 +# [08] -> [0,[0r10:0]8] -> 8 +# +# This macro expects reasonable version numbers, but can handle double +# letters and does not expand any macros. Original version strings can +# use both `.' and `-' separators. +# +# Inline constant expansions, to avoid m4_defn overhead. +# _m4_version_unletter is the real workhorse used by m4_version_compare, +# but since [0r36:a] and commas are less readable than 10 and dots, we +# provide a wrapper for human use. +m4_define([m4_version_unletter], +[m4_substr(m4_map_args([.m4_eval], m4_unquote(_$0([$1]))), [3])]) +m4_define([_m4_version_unletter], +[m4_bpatsubst(m4_bpatsubst(m4_translit([[[[0,$1]]]], [.-], [,,]),]dnl +m4_dquote(m4_dquote(m4_defn([m4_cr_Letters])))[[+], + [+1,-1,[0r36:\&]]), [,0], [,[0r10:0]])]) + + +# m4_version_compare(VERSION-1, VERSION-2) +# ---------------------------------------- +# Compare the two version numbers and expand into +# -1 if VERSION-1 < VERSION-2 +# 0 if = +# 1 if > +# +# Since _m4_version_unletter does not output side effects, we can +# safely bypass the overhead of m4_version_cmp. +m4_define([m4_version_compare], +[_m4_list_cmp_raw(_m4_version_unletter([$1]), _m4_version_unletter([$2]))]) + + +# m4_PACKAGE_NAME +# m4_PACKAGE_TARNAME +# m4_PACKAGE_VERSION +# m4_PACKAGE_STRING +# m4_PACKAGE_BUGREPORT +# -------------------- +# If m4sugar/version.m4 is present, then define version strings. This +# file is optional, provided by Autoconf but absent in Bison. +m4_sinclude([m4sugar/version.m4]) + + +# m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL]) +# ---------------------------------------------------- +# Check this Autoconf version against VERSION. +m4_define([m4_version_prereq], +m4_ifdef([m4_PACKAGE_VERSION], +[[m4_if(m4_version_compare(]m4_dquote(m4_defn([m4_PACKAGE_VERSION]))[, [$1]), + [-1], + [m4_default([$3], + [m4_fatal([Autoconf version $1 or higher is required], + [63])])], + [$2])]], +[[m4_fatal([m4sugar/version.m4 not found])]])) + + +## ------------------ ## +## 15. Set handling. ## +## ------------------ ## + +# Autoconf likes to create arbitrarily large sets; for example, as of +# this writing, the configure.ac for coreutils tracks a set of more +# than 400 AC_SUBST. How do we track all of these set members, +# without introducing duplicates? We could use m4_append_uniq, with +# the set NAME residing in the contents of the macro NAME. +# Unfortunately, m4_append_uniq is quadratic for set creation, because +# it costs O(n) to search the string for each of O(n) insertions; not +# to mention that with m4 1.4.x, even using m4_append is slow, costing +# O(n) rather than O(1) per insertion. Other set operations, not used +# by Autoconf but still possible by manipulation of the definition +# tracked in macro NAME, include O(n) deletion of one element and O(n) +# computation of set size. Because the set is exposed to the user via +# the definition of a single macro, we cannot cache any data about the +# set without risking the cache being invalidated by the user +# redefining NAME. +# +# Can we do better? Yes, because m4 gives us an O(1) search function +# for free: ifdef. Additionally, even m4 1.4.x gives us an O(1) +# insert operation for free: pushdef. But to use these, we must +# represent the set via a group of macros; to keep the set consistent, +# we must hide the set so that the user can only manipulate it through +# accessor macros. The contents of the set are maintained through two +# access points; _m4_set([name]) is a pushdef stack of values in the +# set, useful for O(n) traversal of the set contents; while the +# existence of _m4_set([name],value) with no particular value is +# useful for O(1) querying of set membership. And since the user +# cannot externally manipulate the set, we are free to add additional +# caching macros for other performance improvements. Deletion can be +# O(1) per element rather than O(n), by reworking the definition of +# _m4_set([name],value) to be 0 or 1 based on current membership, and +# adding _m4_set_cleanup(name) to defer the O(n) cleanup of +# _m4_set([name]) until we have another reason to do an O(n) +# traversal. The existence of _m4_set_cleanup(name) can then be used +# elsewhere to determine if we must dereference _m4_set([name],value), +# or assume that definition implies set membership. Finally, size can +# be tracked in an O(1) fashion with _m4_set_size(name). +# +# The quoting in _m4_set([name],value) is chosen so that there is no +# ambiguity with a set whose name contains a comma, and so that we can +# supply the value via _m4_defn([_m4_set([name])]) without needing any +# quote manipulation. + +# m4_set_add(SET, VALUE, [IF-UNIQ], [IF-DUP]) +# ------------------------------------------- +# Add VALUE as an element of SET. Expand IF-UNIQ on the first +# addition, and IF-DUP if it is already in the set. Addition of one +# element is O(1), such that overall set creation is O(n). +# +# We do not want to add a duplicate for a previously deleted but +# unpruned element, but it is just as easy to check existence directly +# as it is to query _m4_set_cleanup($1). +m4_define([m4_set_add], +[m4_ifdef([_m4_set([$1],$2)], + [m4_if(m4_indir([_m4_set([$1],$2)]), [0], + [m4_define([_m4_set([$1],$2)], + [1])_m4_set_size([$1], [m4_incr])$3], [$4])], + [m4_define([_m4_set([$1],$2)], + [1])m4_pushdef([_m4_set([$1])], + [$2])_m4_set_size([$1], [m4_incr])$3])]) + +# m4_set_add_all(SET, VALUE...) +# ----------------------------- +# Add each VALUE into SET. This is O(n) in the number of VALUEs, and +# can be faster than calling m4_set_add for each VALUE. +# +# Implement two recursion helpers; the check variant is slower but +# handles the case where an element has previously been removed but +# not pruned. The recursion helpers ignore their second argument, so +# that we can use the faster m4_shift2 and 2 arguments, rather than +# _m4_shift2 and one argument, as the signal to end recursion. +# +# Please keep foreach.m4 in sync with any adjustments made here. +m4_define([m4_set_add_all], +[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1]) + + m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))]) + +m4_define([_m4_set_add_all], +[m4_if([$#], [2], [], + [m4_ifdef([_m4_set([$1],$3)], [], + [m4_define([_m4_set([$1],$3)], [1])m4_pushdef([_m4_set([$1])], + [$3])-])$0([$1], m4_shift2($@))])]) + +m4_define([_m4_set_add_all_check], +[m4_if([$#], [2], [], + [m4_set_add([$1], [$3])$0([$1], m4_shift2($@))])]) + +# m4_set_contains(SET, VALUE, [IF-PRESENT], [IF-ABSENT]) +# ------------------------------------------------------ +# Expand IF-PRESENT if SET contains VALUE, otherwise expand IF-ABSENT. +# This is always O(1). +m4_define([m4_set_contains], +[m4_ifdef([_m4_set_cleanup($1)], + [m4_if(m4_ifdef([_m4_set([$1],$2)], + [m4_indir([_m4_set([$1],$2)])], [0]), [1], [$3], [$4])], + [m4_ifdef([_m4_set([$1],$2)], [$3], [$4])])]) + +# m4_set_contents(SET, [SEP]) +# --------------------------- +# Expand to a single string containing all the elements in SET, +# separated by SEP, without modifying SET. No provision is made for +# disambiguating set elements that contain non-empty SEP as a +# sub-string, or for recognizing a set that contains only the empty +# string. Order of the output is not guaranteed. If any elements +# have been previously removed from the set, this action will prune +# the unused memory. This is O(n) in the size of the set before +# pruning. +# +# Use _m4_popdef for speed. The existence of _m4_set_cleanup($1) +# determines which version of _1 helper we use. +m4_define([m4_set_contents], +[m4_set_map_sep([$1], [], [], [[$2]])]) + +# _m4_set_contents_1(SET) +# _m4_set_contents_1c(SET) +# _m4_set_contents_2(SET, [PRE], [POST], [SEP]) +# --------------------------------------------- +# Expand to a list of quoted elements currently in the set, each +# surrounded by PRE and POST, and moving SEP in front of PRE on +# recursion. To avoid nesting limit restrictions, the algorithm must +# be broken into two parts; _1 destructively copies the stack in +# reverse into _m4_set_($1), producing no output; then _2 +# destructively copies _m4_set_($1) back into the stack in reverse. +# If no elements were deleted, then this visits the set in the order +# that elements were inserted. Behavior is undefined if PRE/POST/SEP +# tries to recursively list or modify SET in any way other than +# calling m4_set_remove on the current element. Use _1 if all entries +# in the stack are guaranteed to be in the set, and _1c to prune +# removed entries. Uses _m4_defn and _m4_popdef for speed. +m4_define([_m4_set_contents_1], +[_m4_stack_reverse([_m4_set([$1])], [_m4_set_($1)])]) + +m4_define([_m4_set_contents_1c], +[m4_ifdef([_m4_set([$1])], + [m4_set_contains([$1], _m4_defn([_m4_set([$1])]), + [m4_pushdef([_m4_set_($1)], _m4_defn([_m4_set([$1])]))], + [_m4_popdef([_m4_set([$1],]_m4_defn( + [_m4_set([$1])])[)])])_m4_popdef([_m4_set([$1])])$0([$1])], + [_m4_popdef([_m4_set_cleanup($1)])])]) + +m4_define([_m4_set_contents_2], +[_m4_stack_reverse([_m4_set_($1)], [_m4_set([$1])], + [$2[]_m4_defn([_m4_set_($1)])$3], [$4[]])]) + +# m4_set_delete(SET) +# ------------------ +# Delete all elements in SET, and reclaim any memory occupied by the +# set. This is O(n) in the set size. +# +# Use _m4_defn and _m4_popdef for speed. +m4_define([m4_set_delete], +[m4_ifdef([_m4_set([$1])], + [_m4_popdef([_m4_set([$1],]_m4_defn([_m4_set([$1])])[)], + [_m4_set([$1])])$0([$1])], + [m4_ifdef([_m4_set_cleanup($1)], + [_m4_popdef([_m4_set_cleanup($1)])])m4_ifdef( + [_m4_set_size($1)], + [_m4_popdef([_m4_set_size($1)])])])]) + +# m4_set_difference(SET1, SET2) +# ----------------------------- +# Produce a LIST of quoted elements that occur in SET1 but not SET2. +# Output a comma prior to any elements, to distinguish the empty +# string from no elements. This can be directly used as a series of +# arguments, such as for m4_join, or wrapped inside quotes for use in +# m4_foreach. Order of the output is not guaranteed. +# +# Short-circuit the idempotence relation. +m4_define([m4_set_difference], +[m4_if([$1], [$2], [], [m4_set_map_sep([$1], [_$0([$2],], [)])])]) + +m4_define([_m4_set_difference], +[m4_set_contains([$1], [$2], [], [,[$2]])]) + +# m4_set_dump(SET, [SEP]) +# ----------------------- +# Expand to a single string containing all the elements in SET, +# separated by SEP, then delete SET. In general, if you only need to +# list the contents once, this is faster than m4_set_contents. No +# provision is made for disambiguating set elements that contain +# non-empty SEP as a sub-string. Order of the output is not +# guaranteed. This is O(n) in the size of the set before pruning. +# +# Use _m4_popdef for speed. Use existence of _m4_set_cleanup($1) to +# decide if more expensive recursion is needed. +m4_define([m4_set_dump], +[m4_ifdef([_m4_set_size($1)], + [_m4_popdef([_m4_set_size($1)])])m4_ifdef([_m4_set_cleanup($1)], + [_$0_check], [_$0])([$1], [], [$2])]) + +# _m4_set_dump(SET, [SEP], [PREP]) +# _m4_set_dump_check(SET, [SEP], [PREP]) +# -------------------------------------- +# Print SEP and the current element, then delete the element and +# recurse with empty SEP changed to PREP. The check variant checks +# whether the element has been previously removed. Use _m4_defn and +# _m4_popdef for speed. +m4_define([_m4_set_dump], +[m4_ifdef([_m4_set([$1])], + [[$2]_m4_defn([_m4_set([$1])])_m4_popdef([_m4_set([$1],]_m4_defn( + [_m4_set([$1])])[)], [_m4_set([$1])])$0([$1], [$2$3])])]) + +m4_define([_m4_set_dump_check], +[m4_ifdef([_m4_set([$1])], + [m4_set_contains([$1], _m4_defn([_m4_set([$1])]), + [[$2]_m4_defn([_m4_set([$1])])])_m4_popdef( + [_m4_set([$1],]_m4_defn([_m4_set([$1])])[)], + [_m4_set([$1])])$0([$1], [$2$3])], + [_m4_popdef([_m4_set_cleanup($1)])])]) + +# m4_set_empty(SET, [IF-EMPTY], [IF-ELEMENTS]) +# -------------------------------------------- +# Expand IF-EMPTY if SET has no elements, otherwise IF-ELEMENTS. +m4_define([m4_set_empty], +[m4_ifdef([_m4_set_size($1)], + [m4_if(m4_indir([_m4_set_size($1)]), [0], [$2], [$3])], [$2])]) + +# m4_set_foreach(SET, VAR, ACTION) +# -------------------------------- +# For each element of SET, define VAR to the element and expand +# ACTION. ACTION should not recursively list SET's contents, add +# elements to SET, nor delete any element from SET except the one +# currently in VAR. The order that the elements are visited in is not +# guaranteed. This is faster than the corresponding m4_foreach([VAR], +# m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION]) +m4_define([m4_set_foreach], +[m4_pushdef([$2])m4_set_map_sep([$1], [m4_define([$2],], [)$3])]) + +# m4_set_intersection(SET1, SET2) +# ------------------------------- +# Produce a LIST of quoted elements that occur in both SET1 or SET2. +# Output a comma prior to any elements, to distinguish the empty +# string from no elements. This can be directly used as a series of +# arguments, such as for m4_join, or wrapped inside quotes for use in +# m4_foreach. Order of the output is not guaranteed. +# +# Iterate over the smaller set, and short-circuit the idempotence +# relation. +m4_define([m4_set_intersection], +[m4_if([$1], [$2], [m4_set_listc([$1])], + m4_eval(m4_set_size([$2]) < m4_set_size([$1])), [1], [$0([$2], [$1])], + [m4_set_map_sep([$1], [_$0([$2],], [)])])]) + +m4_define([_m4_set_intersection], +[m4_set_contains([$1], [$2], [,[$2]])]) + +# m4_set_list(SET) +# m4_set_listc(SET) +# ----------------- +# Produce a LIST of quoted elements of SET. This can be directly used +# as a series of arguments, such as for m4_join or m4_set_add_all, or +# wrapped inside quotes for use in m4_foreach or m4_map. With +# m4_set_list, there is no way to distinguish an empty set from a set +# containing only the empty string; with m4_set_listc, a leading comma +# is output if there are any elements. +m4_define([m4_set_list], +[m4_set_map_sep([$1], [], [], [,])]) + +m4_define([m4_set_listc], +[m4_set_map_sep([$1], [,])]) + +# m4_set_map(SET, ACTION) +# ----------------------- +# For each element of SET, expand ACTION with a single argument of the +# current element. ACTION should not recursively list SET's contents, +# add elements to SET, nor delete any element from SET except the one +# passed as an argument. The order that the elements are visited in +# is not guaranteed. This is faster than either of the corresponding +# m4_map_args([ACTION]m4_set_listc([SET])) +# m4_set_foreach([SET], [VAR], [ACTION(m4_defn([VAR]))]) +m4_define([m4_set_map], +[m4_set_map_sep([$1], [$2(], [)])]) + +# m4_set_map_sep(SET, [PRE], [POST], [SEP]) +# ----------------------------------------- +# For each element of SET, expand PRE[value]POST[], and expand SEP +# between elements. +m4_define([m4_set_map_sep], +[m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c], + [_m4_set_contents_1])([$1])_m4_set_contents_2($@)]) + +# m4_set_remove(SET, VALUE, [IF-PRESENT], [IF-ABSENT]) +# ---------------------------------------------------- +# If VALUE is an element of SET, delete it and expand IF-PRESENT. +# Otherwise expand IF-ABSENT. Deleting a single value is O(1), +# although it leaves memory occupied until the next O(n) traversal of +# the set which will compact the set. +# +# Optimize if the element being removed is the most recently added, +# since defining _m4_set_cleanup($1) slows down so many other macros. +# In particular, this plays well with m4_set_foreach and m4_set_map. +m4_define([m4_set_remove], +[m4_set_contains([$1], [$2], [_m4_set_size([$1], + [m4_decr])m4_if(_m4_defn([_m4_set([$1])]), [$2], + [_m4_popdef([_m4_set([$1],$2)], [_m4_set([$1])])], + [m4_define([_m4_set_cleanup($1)])m4_define( + [_m4_set([$1],$2)], [0])])$3], [$4])]) + +# m4_set_size(SET) +# ---------------- +# Expand to the number of elements currently in SET. This operation +# is O(1), and thus more efficient than m4_count(m4_set_list([SET])). +m4_define([m4_set_size], +[m4_ifdef([_m4_set_size($1)], [m4_indir([_m4_set_size($1)])], [0])]) + +# _m4_set_size(SET, ACTION) +# ------------------------- +# ACTION must be either m4_incr or m4_decr, and the size of SET is +# changed accordingly. If the set is empty, ACTION must not be +# m4_decr. +m4_define([_m4_set_size], +[m4_define([_m4_set_size($1)], + m4_ifdef([_m4_set_size($1)], [$2(m4_indir([_m4_set_size($1)]))], + [1]))]) + +# m4_set_union(SET1, SET2) +# ------------------------ +# Produce a LIST of double quoted elements that occur in either SET1 +# or SET2, without duplicates. Output a comma prior to any elements, +# to distinguish the empty string from no elements. This can be +# directly used as a series of arguments, such as for m4_join, or +# wrapped inside quotes for use in m4_foreach. Order of the output is +# not guaranteed. +# +# We can rely on the fact that m4_set_listc prunes SET1, so we don't +# need to check _m4_set([$1],element) for 0. Short-circuit the +# idempotence relation. +m4_define([m4_set_union], +[m4_set_listc([$1])m4_if([$1], [$2], [], + [m4_set_map_sep([$2], [_$0([$1],], [)])])]) + +m4_define([_m4_set_union], +[m4_ifdef([_m4_set([$1],$2)], [], [,[$2]])]) + + +## ------------------- ## +## 16. File handling. ## +## ------------------- ## + + +# It is a real pity that M4 comes with no macros to bind a diversion +# to a file. So we have to deal without, which makes us a lot more +# fragile than we should. + + +# m4_file_append(FILE-NAME, CONTENT) +# ---------------------------------- +m4_define([m4_file_append], +[m4_syscmd([cat >>$1 <<_m4eof +$2 +_m4eof +]) +m4_if(m4_sysval, [0], [], + [m4_fatal([$0: cannot write: $1])])]) + + + +## ------------------------ ## +## 17. Setting M4sugar up. ## +## ------------------------ ## + +# _m4_divert_diversion should be defined. +m4_divert_push([KILL]) + +# m4_init +# ------- +# Initialize the m4sugar language. +m4_define([m4_init], +[# All the M4sugar macros start with `m4_', except `dnl' kept as is +# for sake of simplicity. +m4_pattern_forbid([^_?m4_]) +m4_pattern_forbid([^dnl$]) + +# If __m4_version__ is defined, we assume that we are being run by M4 +# 1.6 or newer, thus $@ recursion is linear, and debugmode(+do) +# is available for faster checks of dereferencing undefined macros +# and forcing dumpdef to print to stderr regardless of debugfile. +# But if it is missing, we assume we are being run by M4 1.4.x, that +# $@ recursion is quadratic, and that we need foreach-based +# replacement macros. Also, m4 prior to 1.4.8 loses track of location +# during m4wrap text; __line__ should never be 0. +# +# Use the raw builtin to avoid tripping up include tracing. +# Meanwhile, avoid m4_copy, since it temporarily undefines m4_defn. +m4_ifdef([__m4_version__], +[m4_debugmode([+do]) +m4_define([m4_defn], _m4_defn([_m4_defn])) +m4_define([m4_dumpdef], _m4_defn([_m4_dumpdef])) +m4_define([m4_popdef], _m4_defn([_m4_popdef])) +m4_define([m4_undefine], _m4_defn([_m4_undefine]))], +[m4_builtin([include], [m4sugar/foreach.m4]) +m4_wrap_lifo([m4_if(__line__, [0], [m4_pushdef([m4_location], +]]m4_dquote(m4_dquote(m4_dquote(__file__:__line__)))[[)])])]) + +# Rewrite the first entry of the diversion stack. +m4_divert([KILL]) + +# Check the divert push/pop perfect balance. +# Some users are prone to also use m4_wrap to register last-minute +# m4_divert_text; so after our diversion cleanups, we restore +# KILL as the bottom of the diversion stack. +m4_wrap([m4_popdef([_m4_divert_diversion])m4_ifdef( + [_m4_divert_diversion], [m4_fatal([$0: unbalanced m4_divert_push: +]m4_divert_stack)])_m4_popdef([_m4_divert_stack])m4_divert_push([KILL])]) +]) diff --git a/tools/data/stack.hh b/tools/data/stack.hh new file mode 100644 index 00000000..e4e8df0a --- /dev/null +++ b/tools/data/stack.hh @@ -0,0 +1,121 @@ +# C++ skeleton for Bison + +# Copyright (C) 2002-2012 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +m4_pushdef([b4_copyright_years], + [2002-2012]) + +b4_output_begin([b4_dir_prefix[]stack.hh]) +b4_copyright([Stack handling for Bison parsers in C++], + [2002-2012])[ + +/** + ** \file ]b4_dir_prefix[stack.hh + ** Define the ]b4_namespace_ref[::stack class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[ + +# include + +]b4_namespace_open[ + template > + class stack + { + public: + // Hide our reversed order. + typedef typename S::reverse_iterator iterator; + typedef typename S::const_reverse_iterator const_iterator; + + stack () : seq_ () + { + } + + stack (unsigned int n) : seq_ (n) + { + } + + inline + T& + operator [] (unsigned int i) + { + return seq_[i]; + } + + inline + const T& + operator [] (unsigned int i) const + { + return seq_[i]; + } + + inline + void + push (const T& t) + { + seq_.push_front (t); + } + + inline + void + pop (unsigned int n = 1) + { + for (; n; --n) + seq_.pop_front (); + } + + inline + unsigned int + height () const + { + return seq_.size (); + } + + inline const_iterator begin () const { return seq_.rbegin (); } + inline const_iterator end () const { return seq_.rend (); } + + private: + S seq_; + }; + + /// Present a slice of the top of a stack. + template > + class slice + { + public: + slice (const S& stack, unsigned int range) + : stack_ (stack) + , range_ (range) + { + } + + inline + const T& + operator [] (unsigned int i) const + { + return stack_[range_ - i]; + } + + private: + const S& stack_; + unsigned int range_; + }; +]b4_namespace_close[ + +]b4_cpp_guard_close([b4_dir_prefix[]stack.hh]) +b4_output_end() + +m4_popdef([b4_copyright_years]) diff --git a/tools/data/xslt/bison.xsl b/tools/data/xslt/bison.xsl new file mode 100644 index 00000000..e661b3f5 --- /dev/null +++ b/tools/data/xslt/bison.xsl @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + s + + + r + + + + + + , + + + + + 0 + + + + + + + + + + + diff --git a/tools/data/xslt/xml2dot.xsl b/tools/data/xslt/xml2dot.xsl new file mode 100644 index 00000000..87d4e07c --- /dev/null +++ b/tools/data/xslt/xml2dot.xsl @@ -0,0 +1,397 @@ + + + + + + + + + + + + + + + // Generated by GNU Bison + + . + // Report bugs to < + + >. + // Home page: < + + >. + + + + + + + + digraph " + + + + " { + node [fontname = courier, shape = box, colorscheme = paired6] + edge [fontname = courier] + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + label="[ + + + + + + , + + + ]", + + + + style=solid] + + + + + + + + + 3 + + + 5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + . + + + + + . + + + + + + + + + + + + + [ + + ] + + + + + + , + + + + + + + + + + + -> " + + R + + + d + + " [ + + + + + + + + " + + R + + + d + + " [label=" + + + Acc", fillcolor=1 + + + R + + ", fillcolor= + + + + , shape=diamond, style=filled] + + + + + + + + + + dotted + + + solid + + + dashed + + + + + + + + + + + + + + + + + [label=" + State + + \n + + + + \l"] + + + + + + + + + + -> + + [style= + + + label=" + + + + " + + ] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/data/xslt/xml2text.xsl b/tools/data/xslt/xml2text.xsl new file mode 100644 index 00000000..5af94613 --- /dev/null +++ b/tools/data/xslt/xml2text.xsl @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Nonterminals useless in grammar + + + + + + + + + + + + Terminals unused in grammar + + + + + + + + + + + + + + Rules useless in grammar + + + + + + + + + + + Rules useless in parser due to conflicts + + + + + + + + + Grammar + + + + + + + + + + + + + + + + + + + + + + + + + Terminals, with rules where they appear + + + + + + Nonterminals, with rules where they appear + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + on@left: + + + + + + + , + + on@right: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + State + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + + + + . + + + + + + + + + . + + + + + + + + + + + + + + + + /* empty */ + + + + [ + + ] + + + + + + , + + + + + + + + + + + + + shift, and go to state + + + + go to state + + + + + + + + + + + + + + error + ( + + ) + + + + + + + + + + + + [ + + + + accept + + + reduce using rule + + ( + + ) + + + + ] + + + + + + + + + + + + + Conflict between rule + + and token + + resolved as + + an + + + ( + + ). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/data/xslt/xml2xhtml.xsl b/tools/data/xslt/xml2xhtml.xsl new file mode 100644 index 00000000..22033c61 --- /dev/null +++ b/tools/data/xslt/xml2xhtml.xsl @@ -0,0 +1,745 @@ + + + + + + + + + + + + + + + <xsl:value-of select="bison-xml-report/filename"/> + <xsl:text> - GNU Bison XML Automaton Report</xsl:text> + + + + + + +