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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

m0}_q170Mj)^_bN+92aGX^@N3Ed8v8)rXPS69X( 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 literal 196096 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

Y%&V;-)+npYsq0 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 YcfY#-V)nRSdX^UC{nvVu+I#bV0CDn^H~;_u 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> + + + + + + +

+ + + + + +

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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