diff --git a/externals/simplecpp/LICENSE b/externals/simplecpp/LICENSE
index 341c30bda44..b1f013e92fa 100644
--- a/externals/simplecpp/LICENSE
+++ b/externals/simplecpp/LICENSE
@@ -1,166 +1,14 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
+BSD Zero Clause License
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
+Copyright (c) 2023 simplecpp team
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
-
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/externals/simplecpp/simplecpp.cpp b/externals/simplecpp/simplecpp.cpp
index 881b7c7f6fc..e8636aaafe1 100644
--- a/externals/simplecpp/simplecpp.cpp
+++ b/externals/simplecpp/simplecpp.cpp
@@ -1,19 +1,6 @@
/*
* simplecpp - A simple and high-fidelity C/C++ preprocessor library
- * Copyright (C) 2016-2022 Daniel Marjamäki.
- *
- * This library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation, either
- * version 3 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see .
+ * Copyright (C) 2016-2023 simplecpp team
*/
#if defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
@@ -699,17 +686,20 @@ void simplecpp::TokenList::readfile(Stream &stream, const std::string &filename,
TokenString currentToken;
- if (cback() && cback()->location.line == location.line && cback()->previous && cback()->previous->op == '#' && isLastLinePreprocessor() && (lastLine() == "# error" || lastLine() == "# warning")) {
- char prev = ' ';
- while (stream.good() && (prev == '\\' || (ch != '\r' && ch != '\n'))) {
- currentToken += ch;
- prev = ch;
- ch = stream.readChar();
+ if (cback() && cback()->location.line == location.line && cback()->previous && cback()->previous->op == '#') {
+ const Token* const llTok = lastLineTok();
+ if (llTok && llTok->op == '#' && llTok->next && (llTok->next->str() == "error" || llTok->next->str() == "warning")) {
+ char prev = ' ';
+ while (stream.good() && (prev == '\\' || (ch != '\r' && ch != '\n'))) {
+ currentToken += ch;
+ prev = ch;
+ ch = stream.readChar();
+ }
+ stream.ungetChar();
+ push_back(new Token(currentToken, location));
+ location.adjust(currentToken);
+ continue;
}
- stream.ungetChar();
- push_back(new Token(currentToken, location));
- location.adjust(currentToken);
- continue;
}
// number or name
@@ -841,12 +831,16 @@ void simplecpp::TokenList::readfile(Stream &stream, const std::string &filename,
else
back()->setstr(prefix + s);
- if (newlines > 0 && isLastLinePreprocessor() && lastLine().compare(0,9,"# define ") == 0) {
- multiline += newlines;
- location.adjust(s);
- } else {
- location.adjust(currentToken);
+ if (newlines > 0 ) {
+ const Token * const llTok = lastLineTok();
+ if (llTok && llTok->op == '#' && llTok->next && llTok->next->str() == "define" && llTok->next->next) {
+ multiline += newlines;
+ location.adjust(s);
+ continue;
+ }
}
+
+ location.adjust(currentToken);
continue;
}
@@ -854,10 +848,13 @@ void simplecpp::TokenList::readfile(Stream &stream, const std::string &filename,
currentToken += ch;
}
- if (*currentToken.begin() == '<' && isLastLinePreprocessor() && lastLine() == "# include") {
- currentToken = readUntil(stream, location, '<', '>', outputList);
- if (currentToken.size() < 2U)
- return;
+ if (*currentToken.begin() == '<') {
+ const Token * const llTok = lastLineTok();
+ if (llTok && llTok->op == '#' && llTok->next && llTok->next->str() == "include") {
+ currentToken = readUntil(stream, location, '<', '>', outputList);
+ if (currentToken.size() < 2U)
+ return;
+ }
}
push_back(new Token(currentToken, location));
@@ -1377,7 +1374,7 @@ std::string simplecpp::TokenList::lastLine(int maxsize) const
return ret;
}
-bool simplecpp::TokenList::isLastLinePreprocessor(int maxsize) const
+const simplecpp::Token* simplecpp::TokenList::lastLineTok(int maxsize) const
{
const Token* prevTok = nullptr;
int count = 0;
@@ -1387,10 +1384,16 @@ bool simplecpp::TokenList::isLastLinePreprocessor(int maxsize) const
if (tok->comment)
continue;
if (++count > maxsize)
- return false;
+ return nullptr;
prevTok = tok;
}
- return prevTok && prevTok->str()[0] == '#';
+ return prevTok;
+}
+
+bool simplecpp::TokenList::isLastLinePreprocessor(int maxsize) const
+{
+ const Token * const prevTok = lastLineTok(maxsize);
+ return prevTok && prevTok->op == '#';
}
unsigned int simplecpp::TokenList::fileIndex(const std::string &filename)
@@ -1959,6 +1962,24 @@ namespace simplecpp {
// Macro parameter..
{
TokenList temp(files);
+ if (tok->str() == "__VA_OPT__") {
+ if (sameline(tok, tok->next) && tok->next->str() == "(") {
+ tok = tok->next;
+ int paren = 1;
+ while (sameline(tok, tok->next)) {
+ if (tok->next->str() == "(")
+ ++paren;
+ else if (tok->next->str() == ")")
+ --paren;
+ if (paren == 0)
+ return tok->next->next;
+ tok = tok->next;
+ if (parametertokens.front()->next->str() != ")" && parametertokens.size() > args.size())
+ tok = expandToken(output, loc, tok, macros, expandedmacros, parametertokens)->previous;
+ }
+ }
+ throw Error(tok->location, "Missing parenthesis for __VA_OPT__(content)");
+ }
if (expandArg(&temp, tok, loc, macros, expandedmacros, parametertokens)) {
if (tok->str() == "__VA_ARGS__" && temp.empty() && output->cback() && output->cback()->str() == "," &&
tok->nextSkipComments() && tok->nextSkipComments()->str() == ")")
diff --git a/externals/simplecpp/simplecpp.h b/externals/simplecpp/simplecpp.h
index 55a78b451c9..e5745a1aa51 100644
--- a/externals/simplecpp/simplecpp.h
+++ b/externals/simplecpp/simplecpp.h
@@ -1,19 +1,6 @@
/*
* simplecpp - A simple and high-fidelity C/C++ preprocessor library
- * Copyright (C) 2016-2022 Daniel Marjamäki.
- *
- * This library is free software: you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation, either
- * version 3 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see .
+ * Copyright (C) 2016-2023 simplecpp team
*/
#ifndef simplecppH
@@ -299,7 +286,8 @@ namespace simplecpp {
void lineDirective(unsigned int fileIndex, unsigned int line, Location *location);
std::string lastLine(int maxsize=1000) const;
- bool isLastLinePreprocessor(int maxsize=100000) const;
+ const Token* lastLineTok(int maxsize=1000) const;
+ bool isLastLinePreprocessor(int maxsize=1000) const;
unsigned int fileIndex(const std::string &filename);