mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 12:53:13 +00:00
Check-in MuParser source
First step in fixing issue #3157 is to check-in the source code and hook it into our build system. The inclusion of the MuParser source adds the MIT License to those that apply to fish. Update our documentation to reflect that fact. The MuParser documentation is at http://beltoforion.de/article.php?a=muparser. The source was downloaded from https://github.com/beltoforion/muparser/releases. It is also hosted on Github, https://github.com/beltoforion/muparser/. I did not download it from Github because that source contained just a couple of cleanup changes which don't affect its behavior.
This commit is contained in:
parent
04bd4c4b4e
commit
d247c121a2
66 changed files with 30182 additions and 27 deletions
44
Makefile.in
44
Makefile.in
|
@ -66,6 +66,15 @@ extra_completionsdir = @extra_completionsdir@
|
|||
extra_functionsdir = @extra_functionsdir@
|
||||
extra_confdir = @extra_confdir@
|
||||
|
||||
#
|
||||
# muparser
|
||||
#
|
||||
MUPARSER_DIR = muparser
|
||||
MUPARSER_LIBDIR = $(MUPARSER_DIR)/lib
|
||||
MUPARSER_LIB = $(MUPARSER_LIBDIR)/libmuparser.a
|
||||
MUPARSER_H = $(MUPARSER_DIR)/include/muParser.h
|
||||
EXTRA_MUPARSER = @EXTRA_MUPARSER@
|
||||
|
||||
#
|
||||
# pcre2
|
||||
#
|
||||
|
@ -80,7 +89,7 @@ EXTRA_PCRE2 = @EXTRA_PCRE2@
|
|||
# Various flags
|
||||
#
|
||||
CXXFLAGS = @CXXFLAGS@ $(EXTRA_CXXFLAGS)
|
||||
CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" -DPREFIX=L\"$(prefix)\" -DDATADIR=L\"$(datadir)\" -DSYSCONFDIR=L\"$(sysconfdir)\" -DBINDIR=L\"$(bindir)\" -DDOCDIR=L\"$(docdir)\" -iquote. -iquote./src/
|
||||
CPPFLAGS = -D_UNICODE=1 -DLOCALEDIR=\"$(localedir)\" -DPREFIX=L\"$(prefix)\" -DDATADIR=L\"$(datadir)\" -DSYSCONFDIR=L\"$(sysconfdir)\" -DBINDIR=L\"$(bindir)\" -DDOCDIR=L\"$(docdir)\" -iquote. -iquote./src/
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBS = @LIBS@
|
||||
LDFLAGS_FISH = ${LDFLAGS} @LDFLAGS_FISH@
|
||||
|
@ -104,7 +113,7 @@ FISH_OBJS := obj/autoload.o obj/builtin.o obj/builtin_bg.o obj/builtin_bind.o ob
|
|||
obj/builtin_disown.o obj/builtin_echo.o obj/builtin_emit.o \
|
||||
obj/builtin_exit.o obj/builtin_fg.o obj/builtin_function.o \
|
||||
obj/builtin_functions.o obj/builtin_argparse.o obj/builtin_history.o \
|
||||
obj/builtin_jobs.o obj/builtin_printf.o obj/builtin_pwd.o \
|
||||
obj/builtin_jobs.o obj/builtin_math.o obj/builtin_printf.o obj/builtin_pwd.o \
|
||||
obj/builtin_random.o obj/builtin_read.o obj/builtin_realpath.o \
|
||||
obj/builtin_return.o obj/builtin_set.o obj/builtin_set_color.o \
|
||||
obj/builtin_source.o obj/builtin_status.o obj/builtin_string.o \
|
||||
|
@ -559,6 +568,10 @@ ifdef EXTRA_PCRE2
|
|||
src/builtin_string.cpp: $(PCRE2_H)
|
||||
endif
|
||||
|
||||
#ifdef EXTRA_MUPARSER
|
||||
#src/env.cpp: $(MUPARSER_H)
|
||||
#endif
|
||||
|
||||
#
|
||||
# Generate the internal help functions by making doxygen create
|
||||
# man-pages. The convertion path looks like this:
|
||||
|
@ -817,7 +830,7 @@ obj: | show-MKDIR_P
|
|||
#
|
||||
# Build the fish program.
|
||||
#
|
||||
fish: obj/fish.o $(FISH_OBJS) $(EXTRA_PCRE2)
|
||||
fish: obj/fish.o $(FISH_OBJS) $(EXTRA_PCRE2) ${EXTRA_MUPARSER}
|
||||
@echo " CXX LD $(em)$@$(sgr0)"
|
||||
$v $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS_FISH) $(FISH_OBJS) obj/fish.o $(LIBS) -o $@
|
||||
|
||||
|
@ -829,24 +842,32 @@ $(PCRE2_H):
|
|||
@echo " autoconf $(em)$@$(sgr0)"
|
||||
$v (cd $(PCRE2_DIR) && ./config.status)
|
||||
|
||||
$(MUPARSER_LIB): $(MUPARSER_H)
|
||||
@echo " MAKE $(em)$@$(sgr0)"
|
||||
$v $(MAKE) V=$(V) -C $(MUPARSER_DIR) CPPFLAGS=-D_UNICODE=1 lib/libmuparser.a
|
||||
|
||||
$(MUPARSER_H):
|
||||
@echo " autoconf $(em)$@$(sgr0)"
|
||||
$v (cd $(MUPARSER_DIR) && ./config.status)
|
||||
|
||||
#
|
||||
# Build the fish_tests program.
|
||||
#
|
||||
fish_tests: $(FISH_TESTS_OBJS) $(EXTRA_PCRE2)
|
||||
fish_tests: $(FISH_TESTS_OBJS) $(EXTRA_PCRE2) ${EXTRA_MUPARSER}
|
||||
@echo " CXX LD $(em)$@$(sgr0)"
|
||||
$v $(CXX) $(CXXFLAGS) $(LDFLAGS_FISH) $(FISH_TESTS_OBJS) $(LIBS) -o $@
|
||||
|
||||
#
|
||||
# Build the fish_indent program.
|
||||
#
|
||||
fish_indent: $(FISH_INDENT_OBJS) $(EXTRA_PCRE2)
|
||||
fish_indent: $(FISH_INDENT_OBJS) $(EXTRA_PCRE2) ${EXTRA_MUPARSER}
|
||||
@echo " CXX LD $(em)$@$(sgr0)"
|
||||
$v $(CXX) $(CXXFLAGS) $(LDFLAGS) $(FISH_INDENT_OBJS) $(LIBS) -o $@
|
||||
|
||||
#
|
||||
# Build the fish_key_reader program to show input from the terminal.
|
||||
#
|
||||
fish_key_reader: $(FISH_KEYREAD_OBJS) $(EXTRA_PCRE2)
|
||||
fish_key_reader: $(FISH_KEYREAD_OBJS) $(EXTRA_PCRE2) ${EXTRA_MUPARSER}
|
||||
@echo " CXX LD $(em)$@$(sgr0)"
|
||||
$v $(CXX) $(CXXFLAGS) $(LDFLAGS_FISH) $^ $(LIBS) -o $@
|
||||
|
||||
|
@ -899,6 +920,8 @@ style-all:
|
|||
distclean: clean
|
||||
-$v test ! -f $(PCRE2_DIR)/Makefile || \
|
||||
$(MAKE) V=$(V) -C $(PCRE2_DIR) distclean
|
||||
-$v test ! -f $(MUPARSER_DIR)/Makefile || \
|
||||
$(MAKE) V=$(V) -C $(MUPARSER_DIR) distclean
|
||||
$v rm -rf config.status config.log config.h Makefile autom4te.cache aclocal.m4
|
||||
.PHONY: distclean
|
||||
|
||||
|
@ -917,10 +940,15 @@ clean:
|
|||
ifeq ($(V), 0 )
|
||||
-@test ! -f $(PCRE2_DIR)/Makefile || \
|
||||
$(MAKE) -C $(PCRE2_DIR) clean
|
||||
-@test ! -f $(MUPARSER_DIR)/Makefile || \
|
||||
$(MAKE) -C $(MUPARSER_DIR) clean
|
||||
else
|
||||
-@test ! -f $(PCRE2_DIR)/Makefile || \
|
||||
$(MAKE) -s -C $(PCRE2_DIR) clean > /dev/null || \
|
||||
$(MAKE) -s -C $(PCRE2_DIR) clean
|
||||
-@test ! -f $(MUPARSER_DIR)/Makefile || \
|
||||
$(MAKE) -s -C $(MUPARSER_DIR) clean > /dev/null || \
|
||||
$(MAKE) -s -C $(MUPARSER_DIR) clean
|
||||
endif
|
||||
$v rm -f obj/*.o *.o doc.h doc.tmp
|
||||
$v rm -f doc_src/*.doxygen doc_src/*.cpp doc_src/*.o doc_src/commands.hdr
|
||||
|
@ -960,7 +988,7 @@ obj/builtin.o: src/builtin_complete.h src/builtin_contains.h
|
|||
obj/builtin.o: src/builtin_disown.h src/builtin_echo.h src/builtin_emit.h
|
||||
obj/builtin.o: src/builtin_exit.h src/builtin_fg.h src/builtin_functions.h
|
||||
obj/builtin.o: src/builtin_argparse.h src/builtin_history.h src/builtin_jobs.h
|
||||
obj/builtin.o: src/builtin_printf.h src/builtin_pwd.h src/builtin_random.h
|
||||
obj/builtin.o: src/builtin_math.h src/builtin_printf.h src/builtin_pwd.h src/builtin_random.h
|
||||
obj/builtin.o: src/builtin_read.h src/builtin_realpath.h src/builtin_return.h
|
||||
obj/builtin.o: src/builtin_set.h src/builtin_set_color.h src/builtin_source.h
|
||||
obj/builtin.o: src/builtin_status.h src/builtin_string.h src/builtin_test.h
|
||||
|
@ -1054,6 +1082,8 @@ obj/builtin_jobs.o: config.h src/builtin.h src/common.h src/fallback.h
|
|||
obj/builtin_jobs.o: src/signal.h src/io.h src/proc.h src/parse_tree.h
|
||||
obj/builtin_jobs.o: src/parse_constants.h src/tokenizer.h src/wgetopt.h
|
||||
obj/builtin_jobs.o: src/wutil.h
|
||||
obj/builtin_math.o: config.h src/builtin.h src/common.h
|
||||
obj/builtin_math.o: src/builtin_math.h src/io.h src/wutil.h
|
||||
obj/builtin_printf.o: config.h src/builtin.h src/common.h src/fallback.h
|
||||
obj/builtin_printf.o: src/signal.h src/io.h src/wutil.h
|
||||
obj/builtin_pwd.o: config.h src/builtin.h src/common.h src/fallback.h
|
||||
|
|
|
@ -27,6 +27,7 @@ At runtime, fish requires:
|
|||
* a curses implementation such as ncurses (which should provide the `tput` command).
|
||||
* gettext, if you need the localizations.
|
||||
* PCRE2, due to the regular expression support contained in the `string` builtin. A copy is included with the source code, and will be used automatically if it does not already exist on your system.
|
||||
* MuParser for the `math` builtin. A copy is included with the source code.
|
||||
* a number of common UNIX utilities:
|
||||
* an awk implementation, such as gawk, mawk, etc
|
||||
* coreutils --- at least basename, cat, cut, date, dircolors, dirname, ls, mkdir, mkfifo, mktemp, rm, seq, sort, stat, stty, tail, tr, tty, uname, uniq, wc, whoami
|
||||
|
|
3
README_muparser.md
Normal file
3
README_muparser.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
## Math expression evaluation
|
||||
|
||||
Fish 1.x and 2.x releases relied on the `bc` command for handling math expressions via the `math` command. Starting with fish 3.0.0 fish uses the MuParser library. It's documentation is [here](http://beltoforion.de/article.php?a=muparser) and the source was downloaded from [here](https://github.com/beltoforion/muparser/releases). It is also hosted on [Github](https://github.com/beltoforion/muparser/). I did not download it from Github because that source contained just a couple of cleanup changes which don't affect its behavior. See issue #3157 where making `math` a builtin was discussed.
|
33
configure.ac
33
configure.ac
|
@ -25,6 +25,7 @@ AC_SUBST(HAVE_DOXYGEN)
|
|||
AC_SUBST(LDFLAGS_FISH)
|
||||
AC_SUBST(WCHAR_T_BITS)
|
||||
AC_SUBST(EXTRA_PCRE2)
|
||||
AC_SUBST(EXTRA_MUPARSER)
|
||||
|
||||
#
|
||||
# If needed, run autoconf to regenerate the configure file
|
||||
|
@ -211,17 +212,17 @@ AS_IF([test "$use_doxygen" != "no"],
|
|||
AC_SYS_LARGEFILE
|
||||
|
||||
|
||||
# fish does not use exceptions
|
||||
# Disabling exceptions saves about 20% (!) of the compiled code size
|
||||
CXXFLAGS="$CXXFLAGS -fno-exceptions"
|
||||
|
||||
# Fish does not use exceptions itself. However the MuParser library does so we
|
||||
# need to enable support for them and pay the cost of larger code. Note:
|
||||
# Enabling exceptions increases the compiled code size but to avoid that we
|
||||
# would have to maintain our own patches to the MuParser code.
|
||||
#CXXFLAGS="$CXXFLAGS -fno-exceptions"
|
||||
|
||||
#
|
||||
# Set some warning flags
|
||||
# Don't warn about missing field initializers, it has too many
|
||||
# false positives for code like `struct termios tmodes = {};`
|
||||
#
|
||||
|
||||
CXXFLAGS="$CXXFLAGS -Wextra -Wno-missing-field-initializers"
|
||||
|
||||
#
|
||||
|
@ -579,6 +580,8 @@ else
|
|||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
# ========
|
||||
# PCRE2 library configuration.
|
||||
pcre2_min_version=10.21
|
||||
EXTRA_PCRE2=
|
||||
AC_ARG_WITH(
|
||||
|
@ -673,6 +676,26 @@ if test "x$included_pcre2" = "xyes"; then
|
|||
LIBS="$LIBS $PCRE2_LIBS"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# ========
|
||||
# MuParser math expression library configuration.
|
||||
EXTRA_MUPARSER=
|
||||
|
||||
# Build configure/Makefile for muparser
|
||||
AC_MSG_NOTICE([using included MuParser library])
|
||||
# unfortunately these get added to the global configuration
|
||||
ac_configure_args="$ac_configure_args --enable-shared=no --enable-samples=no --enable-debug=no"
|
||||
AC_CONFIG_SUBDIRS([muparser])
|
||||
|
||||
MUPARSER_CXXFLAGS='-I$(MUPARSER_DIR)/include'
|
||||
MUPARSER_LIBS='-L$(MUPARSER_LIBDIR) -lmuparser'
|
||||
|
||||
# Make the binary depend on the MuParser libraries so they get built
|
||||
EXTRA_MUPARSER='$(MUPARSER_LIB)'
|
||||
CXXFLAGS="$CXXFLAGS $MUPARSER_CXXFLAGS"
|
||||
LIBS="$LIBS $MUPARSER_LIBS"
|
||||
|
||||
# Allow configurable extra directories.
|
||||
AC_SUBST(extra_completionsdir)
|
||||
AC_ARG_WITH([extra-completionsdir],
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
`fish` Copyright © 2005-2009 Axel Liljencrantz. `fish` is released under the GNU General Public License, version 2.
|
||||
|
||||
`fish` includes other code licensed under the GNU General Public License, version 2, including GNU `printf`:
|
||||
`fish` includes other code licensed under the GNU General Public License, version 2, including GNU `printf`.
|
||||
|
||||
Copyright © 1990-2007 Free Software Foundation, Inc. Printf (from GNU Coreutils 6.9) is released under the GNU General Public License, version 2.
|
||||
|
||||
|
@ -19,7 +19,6 @@ The GNU General Public License agreement follows.
|
|||
|
||||
Version 2, June 1991
|
||||
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
|
@ -29,7 +28,6 @@ Version 2, June 1991
|
|||
|
||||
## <a name="GPL2_SEC2"> Preamble
|
||||
|
||||
|
||||
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software - to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
|
||||
|
@ -111,10 +109,8 @@ The precise terms and conditions for copying, distribution and modification foll
|
|||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
## License for PCRE2
|
||||
|
||||
`fish` contains code from the [PCRE2](http://www.pcre.org) library to support regular expressions. This code, created by Philip Hazel, is distributed under the terms of the BSD license. Copyright © 1997-2015 University of Cambridge.
|
||||
|
@ -133,7 +129,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|||
|
||||
----
|
||||
|
||||
|
||||
## License for wcslcpy and code derived from tmux
|
||||
|
||||
`fish` also contains small amounts of code under the OpenBSD license, namely a version of the function strlcpy, modified for use with wide character strings. This code is copyrighted by Todd C. Miller (1998). It also contains code from [tmux](http://tmux.sourceforge.net), copyrighted by Nicholas Marriott <nicm@users.sourceforge.net> (2007), and made available under an identical license.
|
||||
|
@ -144,15 +139,12 @@ Permission to use, copy, modify, and distribute this software for any purpose wi
|
|||
|
||||
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.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
## License for glibc
|
||||
|
||||
Fish contains code from the glibc library, namely the wcstok function. This code is licensed under the LGPL, version 2 or later. Version 2 of the LPGL license agreement is included below.
|
||||
|
||||
|
||||
## <a name="LGPL2_SEC1"> GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2.1, February 1999
|
||||
|
@ -198,7 +190,6 @@ Although the Lesser General Public License is Less protective of the users'freed
|
|||
|
||||
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
|
||||
|
||||
|
||||
## <a name="LGPL2_SEC3"> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
- This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
|
||||
|
@ -305,10 +296,8 @@ The precise terms and conditions for copying, distribution and modification foll
|
|||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
## License for UTF8
|
||||
|
||||
`fish` also contains small amounts of code under the ISC license, namely the UTF-8 conversion functions. This code is copyright © 2007 Alexey Vatchenko \<av@bsdua.org>.
|
||||
|
@ -319,11 +308,8 @@ Permission to use, copy, modify, and/or distribute this software for any purpose
|
|||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
----
|
||||
|
||||
|
||||
## License for flock
|
||||
|
||||
`fish` also contains small amounts of code from NetBSD, namely the `flock` fallback function. This code is copyright 2001 The NetBSD Foundation, Inc., and derived from software contributed to The NetBSD Foundation by Todd Vierling.
|
||||
|
@ -352,6 +338,20 @@ 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.
|
||||
|
||||
----
|
||||
|
||||
## MIT License
|
||||
|
||||
`fish` includes code licensed under the MIT License, including the MuParser math expression evaluation library used by the `math` builtin.
|
||||
|
||||
Copyright <YEAR> <COPYRIGHT HOLDER>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
\htmlonly[block]
|
||||
</div>
|
||||
</div>
|
||||
|
|
557
muparser/Changes.txt
Normal file
557
muparser/Changes.txt
Normal file
|
@ -0,0 +1,557 @@
|
|||
#######################################################################
|
||||
# #
|
||||
# #
|
||||
# __________ #
|
||||
# _____ __ __\______ \_____ _______ ______ ____ _______ #
|
||||
# / \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \ #
|
||||
# | Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/ #
|
||||
# |__|_| /|____/ |____| (____ /|__| /____ > \___ >|__| #
|
||||
# \/ \/ \/ \/ #
|
||||
# Fast math parser Library #
|
||||
# #
|
||||
# Copyright (C) 2015 Ingo Berg #
|
||||
# #
|
||||
# Web: muparser.beltoforion.de #
|
||||
# e-mail: muparser@beltoforion.de #
|
||||
# #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
|
||||
History:
|
||||
--------
|
||||
|
||||
Rev 2.2.5: 27.04.2015
|
||||
---------------------
|
||||
Changes:
|
||||
* example2 extended to work with UNICODE character set
|
||||
* Applied patch from Issue 9
|
||||
|
||||
Bugfixes:
|
||||
* muChar_t in muParserDLL.h was not set properly when UNICODE was used
|
||||
* muparser.dll did not build on UNICODE systems
|
||||
|
||||
Rev 2.2.4: 02.10.2014
|
||||
---------------------
|
||||
Changes:
|
||||
* explicit positive sign allowed
|
||||
|
||||
Bugfixes:
|
||||
* Fix for Issue 6 (https://code.google.com/p/muparser/issues/detail?id=6)
|
||||
* String constants did not work properly. Using more than a single one
|
||||
was impossible.
|
||||
* Project Files for VS2008 and VS2010 removed from the repository
|
||||
* Fix for Issue 4 (https://code.google.com/p/muparser/issues/detail?id=4)
|
||||
* Fix for VS2013 64 bit build option
|
||||
* return type of ParserError::GetPos changed to int
|
||||
* OpenMP support enabled in the VS2013 project files and precompiled windows DLL's
|
||||
* Bulkmode did not evaluate properly if "=" and "," operator was used in the expression
|
||||
|
||||
Rev 2.2.3: 22.12.2012
|
||||
---------------------
|
||||
|
||||
Removed features:
|
||||
* build files for msvc2005, borland and watcom compiler were removed
|
||||
|
||||
Bugfixes:
|
||||
* Bugfix for Intel Compilers added: The power operator did not work properly
|
||||
with Intel C++ composer XE 2011.
|
||||
(see https://sourceforge.net/projects/muparser/forums/forum/462843/topic/5117983/index/page/1)
|
||||
* Issue 3509860: Callbacks of functions with string parameters called twice
|
||||
(see http://sourceforge.net/tracker/?func=detail&aid=3509860&group_id=137191&atid=737979)
|
||||
* Issue 3570423: example1 shows slot number in hexadecimal
|
||||
(see https://sourceforge.net/tracker/?func=detail&aid=3570423&group_id=137191&atid=737979)
|
||||
* Fixes for compiling with the "MUP_MATH_EXCEPTIONS" macro definition:
|
||||
- division by zero in constant expressions was reported with the code "ec_GENERIC"
|
||||
instead of "ecDIV_BY_ZERO"
|
||||
- added throwing of "ecDOMAIN_ERROR" to sqrt and log functions
|
||||
|
||||
|
||||
Rev 2.2.2: 18.02.2012
|
||||
---------------------
|
||||
Bugfixes:
|
||||
* Optimizer did'nt work properly for division:
|
||||
(see https://sourceforge.net/projects/muparser/forums/forum/462843/topic/5037825)
|
||||
|
||||
Rev 2.2.1: 22.01.2012
|
||||
---------------------
|
||||
Bugfixes:
|
||||
* Optimizer bug in 64 bit systems fixed
|
||||
(see https://sourceforge.net/projects/muparser/forums/forum/462843/topic/4977977/index/page/1)
|
||||
|
||||
Rev 2.2.0: 22.01.2012
|
||||
---------------------
|
||||
Improvements:
|
||||
* Optimizer rewritten and improved. In general: more optimizations are
|
||||
now applied to the bytecode. The downside is that callback Functions
|
||||
can no longer be flagged as non-optimizable. (The flag is still present
|
||||
but ignored) This is necessary since the optimizer had to call the
|
||||
functions in order to precalculate the result (see Bugfixes). These calls
|
||||
posed a problems for callback functions with side effects and if-then-else
|
||||
clauses in general since they undermined the shortcut evaluation prinziple.
|
||||
|
||||
Bugfixes:
|
||||
* Infix operators where not properly detected in the presence of a constant
|
||||
name starting with an underscore which is a valid character for infix
|
||||
operators too (i.e. "-_pi").
|
||||
* Issue 3463353: Callback functions are called twice during the first call to eval.
|
||||
* Issue 3447007: GetUsedVar unnecessaryly executes callback functions.
|
||||
|
||||
|
||||
Rev 2.1.0: 19.11.2011
|
||||
---------------------
|
||||
New feature:
|
||||
* Function atan2 added
|
||||
|
||||
Bugfixes:
|
||||
* Issue 3438380: Changed behaviour of tellg with GCC >4.6 led to failures
|
||||
in value detection callbacks.
|
||||
* Issue 3438715: only "double" is a valid MUP_BASETYPE
|
||||
MUP_BASETYPE can now be any of:
|
||||
float,
|
||||
double,
|
||||
long double,
|
||||
short,
|
||||
unsigned short,
|
||||
unsigned int,
|
||||
long,
|
||||
unsigned long.
|
||||
Previousely only floating point types were allowed.
|
||||
Using "int" is still not allowed!
|
||||
* Compiler issues with GCC 4.6 fixed
|
||||
* Custom value recognition callbacks added with AddValIdent had lower
|
||||
priority than built in functions. This was causing problems with
|
||||
hex value recognition since detection of non hex values had priority
|
||||
over the detection of hex values. The "0" in the hex prefix "0x" would
|
||||
be read as a separate non-hex number leaving the rest of the expression
|
||||
unparseable.
|
||||
|
||||
Rev 2.0.0: 04.09.2011
|
||||
---------------------
|
||||
This release introduces a new version numbering scheme in order to make
|
||||
future changes in the ABI apparent to users of the library. The number is
|
||||
now based on the SONAME property as used by GNU/Linux.
|
||||
|
||||
Changes:
|
||||
* Beginning with this version all version numbers will be SONAME compliant
|
||||
* Project files for MSVC2010 added
|
||||
* Project files for MSVC2003 removed
|
||||
* Bytecode parsing engine cleaned up and rewritten
|
||||
* Retrieving all results of expressions made up of comma separate
|
||||
subexpressions is now possible with a new Eval overload.
|
||||
* Callback functions with fixed number of arguments can now have up to 10
|
||||
Parameters (previous limit was 5)
|
||||
|
||||
New features:
|
||||
* ternary if-then-else operator added (C++ like; "(...) ? ... : ..." )
|
||||
* new intrinsic binary operators: "&&", "||" (logical and, or)
|
||||
* A new bulkmode allows submitting large arrays as variables to compute large
|
||||
numbers of expressions with a single call. This can drastically improve
|
||||
parsing performance when interfacing the library from managed languages like
|
||||
C#. (It doesn't bring any performance benefit for C++ users though...)
|
||||
|
||||
Removed features:
|
||||
* intrinsic "and", "or" and "xor" operators have been removed. I'd like to let
|
||||
users the freedom of defining them on their own versions (either as logical or bitwise
|
||||
operators).
|
||||
* Implementation for complex numbers removed. This was merely a hack. If you
|
||||
need complex numbers try muParserX which provides native support for them.
|
||||
(see: http://beltoforion.de/muparserx/math_expression_parser_en.html)
|
||||
|
||||
Bugfixes:
|
||||
* User defined operators could collide with built in operators that entirely
|
||||
contained their identifier. i.e. user defined "&" would not work with the built
|
||||
in "&&" operator since the user defined operator was detected with a higher
|
||||
priority resulting in a syntax error.
|
||||
* Detection of unknown variables did not work properly in case a postfix operator
|
||||
was defined which was part of the undefined variable.
|
||||
i.e. If a postfix operator "m" was defined expressions like "multi*1.0" did
|
||||
not detect "multi" as an undefined variable.
|
||||
(Reference: http://sourceforge.net/tracker/index.php?func=detail&aid=3343891&group_id=137191&atid=737979)
|
||||
* Postfix operators sharing the first few characters were causing bogus parsing exception.
|
||||
(Reference: https://sourceforge.net/tracker/?func=detail&aid=3358571&group_id=137191&atid=737979)
|
||||
|
||||
Rev 1.34: 04.09.2010
|
||||
--------------------
|
||||
Changes:
|
||||
* The prefix needed for parsing hex values is now "0x" and no longer "$".
|
||||
* AddValIdent reintroduced into the DLL interface
|
||||
|
||||
New features:
|
||||
* The associativity of binary operators can now be changed. The pow operator
|
||||
is now right associative. (This is what Mathematica is using)
|
||||
* Seperator can now be used outside of functions. This allows compound
|
||||
expressions like:
|
||||
"a=10,b=20,c=a*b" The last "argument" will be taken as the return value
|
||||
|
||||
Bugfixes:
|
||||
* The copy constructor did not copy binary operator definitions. Those were lost
|
||||
in the copied parser instance.
|
||||
* Mixing special characters and alphabetic characters in binary operator names
|
||||
led to inconsistent parsing behaviour when parsing expressions like "a ++ b"
|
||||
and "a++b" when "++" is defined as a binary operator. Binary operators must
|
||||
now consist entirely of special characters or of alphabetic ones.
|
||||
(original bug report: https://sourceforge.net/projects/muparser/forums/forum/462843/topic/3696881/index/page/1)
|
||||
* User defined operators were not exactly handled like built in operators. This
|
||||
led to inconsistencies in expression evaluation when using them. The results
|
||||
differed due to slightly different precedence rules.
|
||||
* Using empty string arguments ("") would cause a crash of muParser
|
||||
|
||||
|
||||
Rev 1.32: 29.01.2010
|
||||
--------------------
|
||||
|
||||
Changes:
|
||||
* "example3" renamed to "example2"
|
||||
* Project/Makefiles files are now provided for:
|
||||
- msvc2003
|
||||
- msvc2005
|
||||
- msvc2008
|
||||
- watcom (makefile)
|
||||
- mingw (makefile)
|
||||
- bcc (makefile)
|
||||
* Project files for borland cpp builder were removed
|
||||
|
||||
|
||||
New features:
|
||||
* Added function returning muparsers version number
|
||||
* Added function for resetting the locale
|
||||
|
||||
|
||||
Bugfixes:
|
||||
* Changes example1 in order to fix issues with irritating memory leak reports.
|
||||
Added conditional code for memory leak detection with MSVC in example1.
|
||||
(see: http://www.codeproject.com/KB/recipes/FastMathParser.aspx?msg=3286367#xx3286367xx)
|
||||
* Fixed some warnings for gcc
|
||||
|
||||
|
||||
|
||||
Rev 1.31cp: 15.01.2010 (Maintainance release for CodeProject)
|
||||
----------------------
|
||||
|
||||
Changes:
|
||||
* Archive structure changed
|
||||
* C# wrapper added
|
||||
* Fixed issued that prevented compiling with VS2010 Beta2
|
||||
|
||||
|
||||
Rev 1.30: 09.06.2008
|
||||
--------------------
|
||||
|
||||
Changes:
|
||||
* Epsilon of the numerical differentiation algorithm changed to allow greater accuracy.
|
||||
|
||||
New features:
|
||||
* Setting thousands separator and decimal separator is now possible
|
||||
|
||||
Bugfixes:
|
||||
* The dll interface did not provide a callback for functions without any arguments.
|
||||
|
||||
|
||||
Rev 1.29: Januar 2008
|
||||
---------------------
|
||||
|
||||
Unrelease Version available only via SVN.
|
||||
|
||||
|
||||
Rev 1.28: 02. July, 2007
|
||||
---------------------------
|
||||
|
||||
Library changes:
|
||||
* Interface for the dynamic library changed and extended to create an interface
|
||||
using pure C functions only.
|
||||
* mupInit() removed
|
||||
|
||||
Build system:
|
||||
* MSVC7 Project files removed in favor of MSVC8
|
||||
|
||||
Bugfixes:
|
||||
* The dynamic library did not build on other systems than linux due to a misplaced
|
||||
preprocessor definition. This is fixed now.
|
||||
|
||||
|
||||
Rev 1.27:
|
||||
---------------------------
|
||||
|
||||
Build system:
|
||||
* Modified build\ directory layout introducing some subfolders
|
||||
for the various IDE supported
|
||||
* Project files for BCB and MSVC7 added
|
||||
* Switched to use bakefile 0.2.1 which now correctly creates the
|
||||
"make uninstall" target for autoconf's Makefile.in
|
||||
* Now the library debug builds are named "muparserd" instead of "muparser"
|
||||
to allow multiple mixed release/debug builds to coexist; so e.g. on Windows
|
||||
when building with DEBUG=1, you'll get "muparserd.lib" instead of "muparser.lib"
|
||||
|
||||
New Features:
|
||||
* Factory functions can now take a user defined pointer
|
||||
* String functions can now be used with up to two additional
|
||||
double parameters
|
||||
* Support for UNICODE character types added
|
||||
* Infix operator priority can now be changed by the user
|
||||
|
||||
Bugfixes:
|
||||
* An internal error was raised when evaluating an empty
|
||||
expressions
|
||||
* The error message raised in case of name collisions between
|
||||
implicitely defined variables and postfix operators did contain
|
||||
misleading data.
|
||||
|
||||
|
||||
Rev 1.26: (unofficial release)
|
||||
------------------------------
|
||||
|
||||
New Features:
|
||||
* Unary operator precedence can now be changed by the user.
|
||||
|
||||
|
||||
Rev 1.25: 5. February, 2006
|
||||
---------------------------
|
||||
|
||||
Build system: (special thanks to Francesco Montorsi for implementing it!)
|
||||
* created a bakefile-based build system which adds support for the following win32 compilers:
|
||||
-> MS visual C++ (6 and .NET)
|
||||
-> BorlandC++ (5 or greater)
|
||||
-> Mingw32 (tested with gcc 3.2)
|
||||
-> Watcom (not tested)
|
||||
and for GCC on Unix (using a standard autoconf's configure script).
|
||||
|
||||
Compatibility improvements:
|
||||
* fixed some small warnings when using -Wall with GCC on Unix
|
||||
* added inclusion guards for win32-specific portions of code
|
||||
* added fixes that remove compiler warnings on Intel C++ and the Solaris C++ compiler.
|
||||
|
||||
|
||||
Rev 1.24: 29. October, 2005
|
||||
---------------------------
|
||||
|
||||
Changes:
|
||||
|
||||
Compatibility improvements:
|
||||
* parser now works on 64 bit compilers
|
||||
* (bytecode base datatype can now be changed freely)
|
||||
|
||||
|
||||
Rev 1.23: 19. October, 2005
|
||||
---------------------------
|
||||
|
||||
Changes:
|
||||
|
||||
Bugfixes:
|
||||
* Variable factory examples in Example1.cpp and Example3.cpp contained a subtle bug.
|
||||
|
||||
New features:
|
||||
* Added a MSVC6 project file and introduced muParserFixes.h in order to make it compile with MSVC6
|
||||
|
||||
|
||||
Rev 1.22: October, 2005
|
||||
-----------------------
|
||||
|
||||
Release notes:
|
||||
|
||||
All features of Version 1.22 are similar to Version 1.21. Version 1.22 fixes a compilation issue with
|
||||
gcc 4.0. In order to fix this issue I rewrote part of the library to remove some unnecessary templates.
|
||||
This should make the code cleaner. The Borland Project files were removed. If you want to use it
|
||||
with Borland either use the dll version or create your own project files. I can't support it since I don't
|
||||
have this compiler at hand.
|
||||
|
||||
Changes:
|
||||
|
||||
Project Changes:
|
||||
* Borland project files removed
|
||||
(The code should still compile with BCB but I cant provide you with project files)
|
||||
|
||||
Internal Changes:
|
||||
* unnecessary template files have been removed:
|
||||
- new files: muParserError.cpp, muParserTokenReader.cpp, muParserCallback.cpp
|
||||
- removed Files: muIParserTypes.h
|
||||
|
||||
|
||||
Rev 1.2 / 1.21: April, 2005
|
||||
---------------------------
|
||||
|
||||
Release Notes:
|
||||
First of all the interface has changed so this version is not backwards compatible.
|
||||
After receiving a couple of questions about it, this version features support for
|
||||
user defined binary operators. Consequently the built in operators can now be
|
||||
turned off, thus you can deactivate them and write complete customized parser
|
||||
subclasses that only contain the functionality you want. Another new feature is
|
||||
the introduction of callback functions taking string arguments, implicit
|
||||
generation of variables and the Assignement operator.
|
||||
|
||||
Functionality
|
||||
* New built in operator: xor; Logical xor.
|
||||
* New built in operator: Assignement operator; Defining variables in terms of
|
||||
other variables/constants
|
||||
* New feature: Strings as arguments for callback functions
|
||||
* New feature: User defined binary operators
|
||||
* New feature: ParserInt a class with a sample implementation for
|
||||
integer numbers.
|
||||
* New feature: Callbacks to value regognition functions.
|
||||
|
||||
* Removed: all predefined postfix operators have been removed.
|
||||
* New project file: Now comes with a ready to use windows DLL.
|
||||
* New project file: Makefile for cygwin now included.
|
||||
* New example: Example3 shows usage of the DLL.
|
||||
|
||||
Interface changes
|
||||
* New member function: DefineOprt For adding user defined binary operators.
|
||||
* New member function: EnableBuiltInOprt(bool) Enables/Disables built in
|
||||
binary operators.
|
||||
* New member function: AddValIdent(...) to add callbacks for custom value
|
||||
recognition functions.
|
||||
* Removed: SetVar(), SetConst().
|
||||
* Renamed: Most interface functions have been renamed
|
||||
* Changed: The type for multiargument callbacks multfun_type has changed.
|
||||
It no longer takes a std::vector as input.
|
||||
|
||||
Internal changes
|
||||
* new class muParserTokenReader.h encapsulates the token identification
|
||||
and token assignement.
|
||||
* Internal handling of function callbacks unified as a result the performance
|
||||
of the bytecode evaluation increased.
|
||||
|
||||
|
||||
Rev 1.10 : December 30, 2004
|
||||
----------------------------
|
||||
|
||||
Release Notes:
|
||||
This version does not contain major new feature compared to V1.07 but its internal structure has
|
||||
changed significantly. The String parsing routine is slower than the one of V1.07 but bytecode
|
||||
parsing is equally fast. On the other hand the error messages of V1.09 are more flexible and you
|
||||
can change its value datatype. It should work on 64-bit systems. For this reason I supply both
|
||||
versions for download. If you use V1.07 and are happy with it there is no need for updating
|
||||
your version.
|
||||
|
||||
* New example program: Archive now contains two demo programs: One for standard C++ and one for
|
||||
managed C++.
|
||||
* New member function: RemoveVar(...) can be used for removing a single variable from the internal
|
||||
storage.
|
||||
* New member function: GetVar() can be used for querying the variable names and pointers of all
|
||||
variables defined in the parser.
|
||||
* New member function: GetConst() can be used for querying all defined constants and their values.
|
||||
* New member function: GetFunDef() can be used for querying all defined functions and the number of
|
||||
arguments they expect.
|
||||
* Internal structure changed; hanging base datatype at compile time is now possible.
|
||||
* Bugfix: Postfix operator parsing could fail in certain cases; This has been fixed now.
|
||||
* Bugfix: Variable names must will now be tested if they conflict with constant or function names.
|
||||
* Internal change: Removed most dependencies from the C-string libraries.
|
||||
* Internal change: Bytecode is now stored in a separate class: ParserByteCode.h
|
||||
* Internal change: GetUsedVar() does no longer require that variables are defined at time of call.
|
||||
* Internal change: Error treatment changed. ParserException is no longer derived from
|
||||
std::runtime_error; Internal treatment of Error messages changed.
|
||||
* New functions in Parser interface: ValidNameChars(), ValidOprtChars() and ValidPrefixOprtChars()
|
||||
they are used for defining the charset allowed for variable-, operator- and
|
||||
function names.
|
||||
|
||||
|
||||
Rev 1.09 : November 20, 2004
|
||||
----------------------------
|
||||
|
||||
* New member function: RemoveVar(...) can be used for removing a single variable from the internal
|
||||
storage.
|
||||
* Internal structure changed; changing base datatype at compile time is now possible.
|
||||
* Bug fix: Postfix operator parsing could fail in certain cases; This has been fixed now.
|
||||
* Internal change: Removed most dependencies from the C-string libraries.
|
||||
* Internal change: Bytecode is now stored in a seperate class: ParserByteCode.h.
|
||||
* Internal change: GetUsedVar() does no longer require that variables are defined at time of call.
|
||||
* Internal change: Error treatment changed. ParserException is no longer derived from
|
||||
std::runtime_error; Internal treatment of Error messages changed.
|
||||
* New functions in Parser interface; ValidNameChars(), ValidOprtChars() and ValidPrefixOprtChars()
|
||||
they are used for defining the charset allowed for variable-, operator- and function names.
|
||||
|
||||
|
||||
Rev 1.08 : November, 2004
|
||||
-------------------------
|
||||
|
||||
* unpublished; experimental template version with respect to data type and underlying string
|
||||
type (string <-> widestring). The idea was dropped...
|
||||
|
||||
|
||||
Rev 1.07 : September 4 2004
|
||||
---------------------------
|
||||
|
||||
* Improved portability; Changes to make life for MSVC 6 user easier, there are probably still some
|
||||
issues left.
|
||||
* Improved portability; Changes in order to allow compiling on BCB.
|
||||
* New function; value_type Diff(value_type *a_Var, value_type a_fPos) 4th order Differentiation with
|
||||
respect to a certain variable; added in muParser.h.
|
||||
|
||||
|
||||
Rev 1.06 : August 20 2004
|
||||
-------------------------
|
||||
|
||||
* Volatile functions added; All overloaded AddFun(...) functions can now take a third parameter
|
||||
indicating that the function can not be optimized.
|
||||
* Internal changes: muParserStack.h simplified; refactorings
|
||||
* Parser is now distributed under the MIT License; all comments changed accordingly.
|
||||
|
||||
|
||||
Rev 1.05 : August 20 2004
|
||||
-------------------------
|
||||
|
||||
* Variable/constant names will now be checked for invalid characters.
|
||||
* Querying the names of all variables used in an expression is now possible; new function: GetUsedVar().
|
||||
* Disabling bytecode parsing is now possible; new function: EnableByteCode(bool bStat).
|
||||
* Predefined functions with variable number of arguments added: sum, avg, min, max.
|
||||
* Unary prefix operators added; new functions: AddPrefixOp(...), ClearPrefixOp().
|
||||
* Postfix operator interface names changed; new function names: AddPostfixOp(...), ClearPostfixOp().
|
||||
* Hardcoded sign operators removed in favor of prefix operators; bytecode format changed accordingly.
|
||||
* Internal changes: static array removed in Command code calculation routine; misc. changes.
|
||||
|
||||
|
||||
Rev 1.04 : August 16 2004
|
||||
-------------------------
|
||||
|
||||
* Support for functions with variable number of arguments added.
|
||||
* Internal structure changed; new: ParserBase.h, ParserBase.cpp; removed: ParserException.h;
|
||||
changed: Parser.h, Parser.cpp.
|
||||
* Bug in the bytecode calculation function fixed (affected the unary minus operator).
|
||||
* Optimizer can be deactivated; new function: EnableOptimizer(bool bStat).
|
||||
|
||||
|
||||
Rev 1.03 : August 10 2004
|
||||
-------------------------
|
||||
|
||||
* Support for user-defined unary postfix operators added; new functions: AddPostOp(), InitPostOp(),
|
||||
ClearPostOp().
|
||||
* Minor changes to the bytecode parsing routine.
|
||||
* User defined functions can now have up to four parameters.
|
||||
* Performance optimized: simple formula optimization added; (precalculation of constant parts of the
|
||||
expression).
|
||||
* Bug fixes: Multi-arg function parameters, constant name lookup and unary minus did not work properly.
|
||||
|
||||
|
||||
Rev 1.02 : July 30 2004
|
||||
-----------------------
|
||||
|
||||
* Support for user defined constants added; new functions: InitConst(), AddConst(), SetConst(),
|
||||
ClearConst().
|
||||
* Single variables can now be added using AddVar(); you have now the choice of adding them either
|
||||
one by one or all at the same time using SetVar(const varmap_type &a_vVar).
|
||||
* Internal handling of variables changed, is now similar to function handling.
|
||||
* Virtual destructor added; InitFun(), InitConst() are now virtual too thus making it possible to
|
||||
derive new parsers with a modified set of default functions and constants.
|
||||
* Support for user defined functions with 2 or 3 parameters added; bytecode format changed to hold
|
||||
function parameter count.
|
||||
|
||||
|
||||
Rev 1.01 : July 23 2004
|
||||
-----------------------
|
||||
|
||||
* Support for user defined functions has been added; new functions: AddFun(), ClearFun(),
|
||||
InitFunctions().
|
||||
* Built in constants have been removed; the parser contained undocumented built in
|
||||
constants pi, e.
|
||||
There was the possibility of name conflicts with user defined variables.
|
||||
* Setting multiple variables with SetVar can now be done with a map of names and pointers as the only
|
||||
argument. For this reason, a new type Parser::varmap_type was added. The old version that took 3
|
||||
arguments (array of names, array of pointers, and array length) is now marked as deprecated.
|
||||
* The names of logarithm functions have changed. The new names are: log2 for base 2, log10 or log for
|
||||
base 10, and ln for base e.
|
||||
|
||||
|
||||
Rev 1.00 : July 21 2004
|
||||
-----------------------
|
||||
|
||||
* Initial release
|
133
muparser/Install.txt
Normal file
133
muparser/Install.txt
Normal file
|
@ -0,0 +1,133 @@
|
|||
#######################################################################
|
||||
# #
|
||||
# #
|
||||
# __________ #
|
||||
# _____ __ __\______ \_____ _______ ______ ____ _______ #
|
||||
# / \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \ #
|
||||
# | Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/ #
|
||||
# |__|_| /|____/ |____| (____ /|__| /____ > \___ >|__| #
|
||||
# \/ \/ \/ \/ #
|
||||
# Fast math parser Library #
|
||||
# #
|
||||
# Copyright (C) 2012 Ingo Berg #
|
||||
# #
|
||||
# Web: muparser.beltoforion.de #
|
||||
# e-mail: muparser@beltoforion.de #
|
||||
# #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
|
||||
|
||||
Contents
|
||||
========
|
||||
|
||||
1. Installation on win32
|
||||
2. Installation on unix
|
||||
2.1 Other miscellaneous info Unix-specific
|
||||
3. Where to ask for help
|
||||
|
||||
|
||||
|
||||
1. Installation on win32
|
||||
========================
|
||||
|
||||
muParser supports various win32 command-line compilers:
|
||||
-> mingw
|
||||
-> watcom
|
||||
-> microsoft CL
|
||||
and provides also the project files for MSVC6 IDE.
|
||||
|
||||
In order to compile muParser from makefiles, open an MSDOS
|
||||
prompt and then move to the muParser/build directory and
|
||||
type:
|
||||
|
||||
mingw32-make -fmakefile.mingw for mingw
|
||||
nmake -fmakefile.vc for msvc
|
||||
make -fmakefile.bcc for borland
|
||||
wmake -fmakefile.wat for watcom
|
||||
|
||||
All makefiles supports the following options:
|
||||
|
||||
# Set to 1 to build debug version [0,1]
|
||||
# 0 - Release
|
||||
# 1 - Debug
|
||||
DEBUG = 0
|
||||
|
||||
# Set to 1 to build shared (DLL) version [0,1]
|
||||
# 0 - Static
|
||||
# 1 - DLL
|
||||
SHARED = 0
|
||||
|
||||
# Set to 1 to compile samples [0,1]
|
||||
SAMPLES = 1
|
||||
|
||||
The muParser library is created in the 'lib' folder and the sample
|
||||
binaries are created in samples\example1 or samples\example2.
|
||||
|
||||
NOTE: samples\example1 can be compiled *only* when building
|
||||
muParser as a STATIC library (SHARED=0).
|
||||
samples\example2 can be compiled *only* when building
|
||||
muParser as a SHARED library (SHARED=1).
|
||||
|
||||
|
||||
|
||||
2. Installation on Unix/Linux
|
||||
=============================
|
||||
|
||||
muParser can be installed just extracting the sources somewhere
|
||||
and then, from a terminal, typing:
|
||||
|
||||
cd [path to muParser]
|
||||
./configure [--enable-shared=yes/no] [--enable-samples=yes/no]
|
||||
[--enable-debug=yes/no]
|
||||
make
|
||||
[sudo*] make install
|
||||
[sudo*] ldconfig
|
||||
cd samples/example1
|
||||
./example1
|
||||
|
||||
* = this command must be executed with root permissions and thus
|
||||
you have to use 'sudo' or just 'su' to gain root access.
|
||||
Note that installation and ldconfig are not strictly required unless
|
||||
you built in shared mode.
|
||||
|
||||
The "make" step will create the muParser library in 'lib' and the
|
||||
sample binary in samples/example1.
|
||||
The samples/example2 is win32-specific and thus won't be built.
|
||||
|
||||
|
||||
|
||||
2.1 Other miscellaneous info Unix-specific
|
||||
==========================================
|
||||
|
||||
If you don't like to have your muParser folder filled by temporary
|
||||
files created by GCC, then you can do the following:
|
||||
|
||||
mkdir mybuild && cd mybuild && ../configure && make
|
||||
|
||||
to put all object files in the "mybuild" directory.
|
||||
|
||||
If you want to use muParser library in your programs, you can use
|
||||
the pkg-config program (this works only if muParser was installed
|
||||
with 'make install' !). The commands:
|
||||
|
||||
pkg-config muparser --cflags
|
||||
pkg-config muparser --libs
|
||||
|
||||
will return all useful info you need to build your programs against
|
||||
muParser !
|
||||
|
||||
|
||||
|
||||
3. Where to ask for help
|
||||
========================
|
||||
|
||||
If you find problems with either compilation, installation or usage
|
||||
of muParser, then you can ask in the muParser forum at:
|
||||
|
||||
https://sourceforge.net/forum/forum.php?forum_id=462843
|
||||
|
||||
For more info about muParser, visit:
|
||||
http://sourceforge.net/projects/muparser/
|
||||
http://muparser.sourceforge.net
|
35
muparser/License.txt
Normal file
35
muparser/License.txt
Normal file
|
@ -0,0 +1,35 @@
|
|||
#######################################################################
|
||||
# #
|
||||
# #
|
||||
# __________ #
|
||||
# _____ __ __\______ \_____ _______ ______ ____ _______ #
|
||||
# / \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \ #
|
||||
# | Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/ #
|
||||
# |__|_| /|____/ |____| (____ /|__| /____ > \___ >|__| #
|
||||
# \/ \/ \/ \/ #
|
||||
# Fast math parser Library #
|
||||
# #
|
||||
# Copyright (C) 2011 Ingo Berg #
|
||||
# #
|
||||
# Web: muparser.beltoforion.de #
|
||||
# e-mail: muparser@beltoforion.de #
|
||||
# #
|
||||
# #
|
||||
#######################################################################
|
||||
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
OR OTHER DEALINGS IN THE SOFTWARE.
|
368
muparser/Makefile.in
Normal file
368
muparser/Makefile.in
Normal file
|
@ -0,0 +1,368 @@
|
|||
# =========================================================================
|
||||
# This makefile was generated by
|
||||
# Bakefile 0.2.9 (http://www.bakefile.org)
|
||||
# Do not modify, all changes will be overwritten!
|
||||
# =========================================================================
|
||||
|
||||
|
||||
@MAKE_SET@
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
datarootdir = @datarootdir@
|
||||
INSTALL = @INSTALL@
|
||||
SHARED_LD_CXX = @SHARED_LD_CXX@
|
||||
LIBEXT = @LIBEXT@
|
||||
LIBPREFIX = @LIBPREFIX@
|
||||
SO_SUFFIX = @SO_SUFFIX@
|
||||
DLLIMP_SUFFIX = @DLLIMP_SUFFIX@
|
||||
EXEEXT = @EXEEXT@
|
||||
LN_S = @LN_S@
|
||||
SETFILE = @SETFILE@
|
||||
PIC_FLAG = @PIC_FLAG@
|
||||
SONAME_FLAG = @SONAME_FLAG@
|
||||
STRIP = @STRIP@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_DIR = @INSTALL_DIR@
|
||||
BK_DEPS = @BK_DEPS@
|
||||
srcdir = @srcdir@
|
||||
top_builddir = @top_builddir@
|
||||
libdir = @libdir@
|
||||
DLLPREFIX = @DLLPREFIX@
|
||||
LIBS = @LIBS@
|
||||
AR = @AR@
|
||||
AROPTIONS = @AROPTIONS@
|
||||
RANLIB = @RANLIB@
|
||||
CXX = @CXX@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
|
||||
### Variables: ###
|
||||
|
||||
DESTDIR =
|
||||
MUPARSER_LIB_CXXFLAGS = $(____DEBUG) $(____SHARED) $(____SHARED_0) \
|
||||
-I$(srcdir)/include $(CPPFLAGS) $(CXXFLAGS)
|
||||
MUPARSER_LIB_OBJECTS = \
|
||||
muParser_lib_muParser.o \
|
||||
muParser_lib_muParserBase.o \
|
||||
muParser_lib_muParserBytecode.o \
|
||||
muParser_lib_muParserCallback.o \
|
||||
muParser_lib_muParserDLL.o \
|
||||
muParser_lib_muParserError.o \
|
||||
muParser_lib_muParserInt.o \
|
||||
muParser_lib_muParserTest.o \
|
||||
muParser_lib_muParserTokenReader.o
|
||||
MUPARSER_LIB_HEADERS = \
|
||||
include/muParser.h \
|
||||
include/muParserBase.h \
|
||||
include/muParserBytecode.h \
|
||||
include/muParserCallback.h \
|
||||
include/muParserDLL.h \
|
||||
include/muParserDef.h \
|
||||
include/muParserError.h \
|
||||
include/muParserFixes.h \
|
||||
include/muParserInt.h \
|
||||
include/muParserStack.h \
|
||||
include/muParserTemplateMagic.h \
|
||||
include/muParserTest.h \
|
||||
include/muParserToken.h \
|
||||
include/muParserTokenReader.h
|
||||
MUPARSER_DLL_CXXFLAGS = $(____DEBUG) $(____SHARED) $(____SHARED_0) \
|
||||
-I$(srcdir)/include $(PIC_FLAG) $(CPPFLAGS) $(CXXFLAGS)
|
||||
MUPARSER_DLL_OBJECTS = \
|
||||
muParser_dll_muParser.o \
|
||||
muParser_dll_muParserBase.o \
|
||||
muParser_dll_muParserBytecode.o \
|
||||
muParser_dll_muParserCallback.o \
|
||||
muParser_dll_muParserDLL.o \
|
||||
muParser_dll_muParserError.o \
|
||||
muParser_dll_muParserInt.o \
|
||||
muParser_dll_muParserTest.o \
|
||||
muParser_dll_muParserTokenReader.o
|
||||
MUPARSER_DLL_HEADERS = \
|
||||
include/muParser.h \
|
||||
include/muParserBase.h \
|
||||
include/muParserBytecode.h \
|
||||
include/muParserCallback.h \
|
||||
include/muParserDLL.h \
|
||||
include/muParserDef.h \
|
||||
include/muParserError.h \
|
||||
include/muParserFixes.h \
|
||||
include/muParserInt.h \
|
||||
include/muParserStack.h \
|
||||
include/muParserTemplateMagic.h \
|
||||
include/muParserTest.h \
|
||||
include/muParserToken.h \
|
||||
include/muParserTokenReader.h
|
||||
EXAMPLE1_CXXFLAGS = $(____DEBUG) -I$(srcdir)/include $(CPPFLAGS) $(CXXFLAGS)
|
||||
EXAMPLE1_OBJECTS = \
|
||||
example1_example1.o
|
||||
|
||||
### Conditionally set variables: ###
|
||||
|
||||
@COND_DEPS_TRACKING_0@CXXC = $(CXX)
|
||||
@COND_DEPS_TRACKING_1@CXXC = $(BK_DEPS) $(CXX)
|
||||
@COND_DEBUG_0@DEBUG_BUILD_POSTFIX =
|
||||
@COND_DEBUG_1@DEBUG_BUILD_POSTFIX = d
|
||||
@COND_SHARED_0@__muParser_lib___depname = \
|
||||
@COND_SHARED_0@ $(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(LIBEXT)
|
||||
@COND_SHARED_0@__install_muParser_lib___depname = install_muParser_lib
|
||||
@COND_SHARED_0@__uninstall_muParser_lib___depname = uninstall_muParser_lib
|
||||
@COND_SHARED_0@__install_muParser_lib_headers___depname = \
|
||||
@COND_SHARED_0@ install_muParser_lib_headers
|
||||
@COND_SHARED_0@__uninstall_muParser_lib_headers___depname = \
|
||||
@COND_SHARED_0@ uninstall_muParser_lib_headers
|
||||
COND_SHARED_1___muParser_dll___depname = \
|
||||
$(top_builddir)/lib/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3)
|
||||
@COND_SHARED_1@__muParser_dll___depname = $(COND_SHARED_1___muParser_dll___depname)
|
||||
@COND_SHARED_1@__install_muParser_dll___depname = install_muParser_dll
|
||||
@COND_SHARED_1@__uninstall_muParser_dll___depname = uninstall_muParser_dll
|
||||
COND_PLATFORM_MACOSX_1___muParser_dll___macinstnamecmd = -install_name \
|
||||
$(libdir)/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2)
|
||||
@COND_PLATFORM_MACOSX_1@__muParser_dll___macinstnamecmd = $(COND_PLATFORM_MACOSX_1___muParser_dll___macinstnamecmd)
|
||||
@COND_SHARED_1@__install_muParser_dll_headers___depname = \
|
||||
@COND_SHARED_1@ install_muParser_dll_headers
|
||||
@COND_SHARED_1@__uninstall_muParser_dll_headers___depname = \
|
||||
@COND_SHARED_1@ uninstall_muParser_dll_headers
|
||||
COND_PLATFORM_OS2_1___muParser_dll___importlib = -import \
|
||||
$(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
@COND_PLATFORM_OS2_1@__muParser_dll___importlib = $(COND_PLATFORM_OS2_1___muParser_dll___importlib)
|
||||
COND_WINDOWS_IMPLIB_1___muParser_dll___importlib = \
|
||||
-Wl,--out-implib=$(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
@COND_WINDOWS_IMPLIB_1@__muParser_dll___importlib = $(COND_WINDOWS_IMPLIB_1___muParser_dll___importlib)
|
||||
@COND_PLATFORM_MACOSX_0_USE_SOVERSION_1@__muParser_dll___targetsuf2 \
|
||||
@COND_PLATFORM_MACOSX_0_USE_SOVERSION_1@ = .$(SO_SUFFIX).2
|
||||
@COND_PLATFORM_MACOSX_1_USE_SOVERSION_1@__muParser_dll___targetsuf2 \
|
||||
@COND_PLATFORM_MACOSX_1_USE_SOVERSION_1@ = .2.$(SO_SUFFIX)
|
||||
@COND_USE_SOVERSION_0@__muParser_dll___targetsuf2 = .$(SO_SUFFIX)
|
||||
@COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1@__muParser_dll___targetsuf3 \
|
||||
@COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1@ = \
|
||||
@COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1@ .$(SO_SUFFIX).2.2.4
|
||||
@COND_PLATFORM_MACOSX_1_USE_SOVERSION_1@__muParser_dll___targetsuf3 \
|
||||
@COND_PLATFORM_MACOSX_1_USE_SOVERSION_1@ = .2.2.4.$(SO_SUFFIX)
|
||||
@COND_USE_SOVERSION_1_USE_SOVERSOLARIS_1@__muParser_dll___targetsuf3 \
|
||||
@COND_USE_SOVERSION_1_USE_SOVERSOLARIS_1@ = .$(SO_SUFFIX).2
|
||||
@COND_USE_SOVERCYGWIN_1_USE_SOVERSION_1@__muParser_dll___targetsuf3 \
|
||||
@COND_USE_SOVERCYGWIN_1_USE_SOVERSION_1@ = -2.$(SO_SUFFIX)
|
||||
@COND_USE_SOVERSION_0@__muParser_dll___targetsuf3 = .$(SO_SUFFIX)
|
||||
COND_USE_SOVERLINUX_1___muParser_dll___soname_flags = \
|
||||
$(SONAME_FLAG)$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2)
|
||||
@COND_USE_SOVERLINUX_1@__muParser_dll___soname_flags = $(COND_USE_SOVERLINUX_1___muParser_dll___soname_flags)
|
||||
COND_USE_SOVERSOLARIS_1___muParser_dll___soname_flags = \
|
||||
$(SONAME_FLAG)$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3)
|
||||
@COND_USE_SOVERSOLARIS_1@__muParser_dll___soname_flags = $(COND_USE_SOVERSOLARIS_1___muParser_dll___soname_flags)
|
||||
COND_USE_SOTWOSYMLINKS_1___muParser_dll___so_symlinks_cmd = (cd \
|
||||
$(top_builddir)/lib/; rm -f \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2); \
|
||||
$(LN_S) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2); \
|
||||
$(LN_S) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2) \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX))
|
||||
@COND_USE_SOTWOSYMLINKS_1@__muParser_dll___so_symlinks_cmd = $(COND_USE_SOTWOSYMLINKS_1___muParser_dll___so_symlinks_cmd)
|
||||
COND_USE_SOVERSOLARIS_1___muParser_dll___so_symlinks_cmd = (cd \
|
||||
$(top_builddir)/lib/; rm -f \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX); $(LN_S) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3) \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX))
|
||||
@COND_USE_SOVERSOLARIS_1@__muParser_dll___so_symlinks_cmd = $(COND_USE_SOVERSOLARIS_1___muParser_dll___so_symlinks_cmd)
|
||||
COND_USE_SOTWOSYMLINKS_1___muParser_dll___so_symlinks_inst_cmd = rm -f \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2); \
|
||||
$(LN_S) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2); \
|
||||
$(LN_S) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2) \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
@COND_USE_SOTWOSYMLINKS_1@__muParser_dll___so_symlinks_inst_cmd = $(COND_USE_SOTWOSYMLINKS_1___muParser_dll___so_symlinks_inst_cmd)
|
||||
COND_USE_SOVERSOLARIS_1___muParser_dll___so_symlinks_inst_cmd = rm -f \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX); $(LN_S) \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3) \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX);
|
||||
@COND_USE_SOVERSOLARIS_1@__muParser_dll___so_symlinks_inst_cmd = $(COND_USE_SOVERSOLARIS_1___muParser_dll___so_symlinks_inst_cmd)
|
||||
COND_USE_SOTWOSYMLINKS_1___muParser_dll___so_symlinks_uninst_cmd = rm -f \
|
||||
$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2) \
|
||||
$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
@COND_USE_SOTWOSYMLINKS_1@__muParser_dll___so_symlinks_uninst_cmd = $(COND_USE_SOTWOSYMLINKS_1___muParser_dll___so_symlinks_uninst_cmd)
|
||||
@COND_USE_SOVERSOLARIS_1@__muParser_dll___so_symlinks_uninst_cmd \
|
||||
@COND_USE_SOVERSOLARIS_1@ = rm -f \
|
||||
@COND_USE_SOVERSOLARIS_1@ $(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
@COND_PLATFORM_MACOSX_1@__muParser_dll___macver = \
|
||||
@COND_PLATFORM_MACOSX_1@ -compatibility_version 1 -current_version 1
|
||||
@COND_SAMPLES_1@__example1___depname = \
|
||||
@COND_SAMPLES_1@ $(top_builddir)/samples/example1/example1$(EXEEXT)
|
||||
@COND_PLATFORM_MAC_0@__example1___mac_setfilecmd = @true
|
||||
@COND_PLATFORM_MAC_1@__example1___mac_setfilecmd = \
|
||||
@COND_PLATFORM_MAC_1@ $(SETFILE) -t APPL \
|
||||
@COND_PLATFORM_MAC_1@ $(top_builddir)/samples/example1/example1$(EXEEXT)
|
||||
@COND_SHARED_0@____SHARED =
|
||||
@COND_SHARED_1@____SHARED = -DMUPARSER_DLL
|
||||
@COND_SHARED_0@____SHARED_0 =
|
||||
@COND_SHARED_1@____SHARED_0 = -DMUPARSERLIB_EXPORTS
|
||||
@COND_DEBUG_0@____DEBUG = -DNDEBUG
|
||||
@COND_DEBUG_1@____DEBUG =
|
||||
|
||||
### Targets: ###
|
||||
|
||||
all: $(__muParser_lib___depname) $(__muParser_dll___depname) $(__example1___depname)
|
||||
|
||||
install: $(__install_muParser_lib___depname) $(__install_muParser_lib_headers___depname) $(__install_muParser_dll___depname) $(__install_muParser_dll_headers___depname)
|
||||
$(INSTALL_DIR) $(DESTDIR)$(libdir)/pkgconfig
|
||||
$(INSTALL_DATA) build/autoconf/muparser.pc $(DESTDIR)$(libdir)/pkgconfig
|
||||
|
||||
uninstall: $(__uninstall_muParser_lib___depname) $(__uninstall_muParser_lib_headers___depname) $(__uninstall_muParser_dll___depname) $(__uninstall_muParser_dll_headers___depname)
|
||||
|
||||
install-strip: install
|
||||
$(STRIP) $(DESTDIR)$(libdir)/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3)
|
||||
|
||||
clean:
|
||||
rm -rf ./.deps ./.pch
|
||||
rm -f ./*.o
|
||||
rm -f $(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(LIBEXT)
|
||||
rm -f $(top_builddir)/lib/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3)
|
||||
rm -f $(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
rm -f $(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX) $(top_builddir)/lib/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf2)
|
||||
rm -f $(top_builddir)/samples/example1/example1$(EXEEXT)
|
||||
|
||||
distclean: clean
|
||||
rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
|
||||
rm -f build/autoconf/muparser.pc
|
||||
|
||||
@COND_SHARED_0@$(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(LIBEXT): $(MUPARSER_LIB_OBJECTS)
|
||||
@COND_SHARED_0@ rm -f $@
|
||||
@COND_SHARED_0@ $(AR) $(AROPTIONS) $@ $(MUPARSER_LIB_OBJECTS)
|
||||
@COND_SHARED_0@ $(RANLIB) $@
|
||||
|
||||
@COND_SHARED_0@install_muParser_lib: $(__muParser_lib___depname)
|
||||
@COND_SHARED_0@ $(INSTALL_DIR) $(DESTDIR)$(libdir)
|
||||
@COND_SHARED_0@ $(INSTALL_DATA) $(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(LIBEXT) $(DESTDIR)$(libdir)
|
||||
|
||||
@COND_SHARED_0@uninstall_muParser_lib:
|
||||
@COND_SHARED_0@ rm -f $(DESTDIR)$(libdir)/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(LIBEXT)
|
||||
|
||||
@COND_SHARED_0@install_muParser_lib_headers:
|
||||
@COND_SHARED_0@ $(INSTALL_DIR) $(DESTDIR)$(prefix)
|
||||
@COND_SHARED_0@ for f in $(MUPARSER_LIB_HEADERS); do \
|
||||
@COND_SHARED_0@ if test ! -d $(DESTDIR)$(prefix)/`dirname $$f` ; then \
|
||||
@COND_SHARED_0@ $(INSTALL_DIR) $(DESTDIR)$(prefix)/`dirname $$f`; \
|
||||
@COND_SHARED_0@ fi; \
|
||||
@COND_SHARED_0@ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(prefix)/$$f; \
|
||||
@COND_SHARED_0@ done
|
||||
|
||||
@COND_SHARED_0@uninstall_muParser_lib_headers:
|
||||
@COND_SHARED_0@ for f in $(MUPARSER_LIB_HEADERS); do \
|
||||
@COND_SHARED_0@ rm -f $(DESTDIR)$(prefix)/$$f; \
|
||||
@COND_SHARED_0@ done
|
||||
|
||||
@COND_SHARED_1@$(top_builddir)/lib/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3): $(MUPARSER_DLL_OBJECTS)
|
||||
@COND_SHARED_1@ $(SHARED_LD_CXX) $@ $(MUPARSER_DLL_OBJECTS) $(__muParser_dll___macinstnamecmd) $(__muParser_dll___importlib) $(__muParser_dll___soname_flags) $(__muParser_dll___macver) $(LDFLAGS) $(LIBS)
|
||||
@COND_SHARED_1@
|
||||
@COND_SHARED_1@ $(__muParser_dll___so_symlinks_cmd)
|
||||
|
||||
@COND_SHARED_1@install_muParser_dll: $(__muParser_dll___depname)
|
||||
@COND_SHARED_1@ $(INSTALL_DIR) $(DESTDIR)$(libdir)
|
||||
@COND_SHARED_1@ $(INSTALL_DATA) $(top_builddir)/lib/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX) $(DESTDIR)$(libdir)
|
||||
@COND_SHARED_1@ $(INSTALL_PROGRAM) $(top_builddir)/lib/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3) $(DESTDIR)$(libdir)
|
||||
@COND_SHARED_1@ (cd $(DESTDIR)$(libdir) ; $(__muParser_dll___so_symlinks_inst_cmd))
|
||||
|
||||
@COND_SHARED_1@uninstall_muParser_dll:
|
||||
@COND_SHARED_1@ rm -f $(DESTDIR)$(libdir)/$(LIBPREFIX)muparser$(DEBUG_BUILD_POSTFIX).$(DLLIMP_SUFFIX)
|
||||
@COND_SHARED_1@ rm -f $(DESTDIR)$(libdir)/$(DLLPREFIX)muparser$(DEBUG_BUILD_POSTFIX)$(__muParser_dll___targetsuf3)
|
||||
@COND_SHARED_1@ (cd $(DESTDIR)$(libdir) ; $(__muParser_dll___so_symlinks_uninst_cmd))
|
||||
|
||||
@COND_SHARED_1@install_muParser_dll_headers:
|
||||
@COND_SHARED_1@ $(INSTALL_DIR) $(DESTDIR)$(prefix)
|
||||
@COND_SHARED_1@ for f in $(MUPARSER_DLL_HEADERS); do \
|
||||
@COND_SHARED_1@ if test ! -d $(DESTDIR)$(prefix)/`dirname $$f` ; then \
|
||||
@COND_SHARED_1@ $(INSTALL_DIR) $(DESTDIR)$(prefix)/`dirname $$f`; \
|
||||
@COND_SHARED_1@ fi; \
|
||||
@COND_SHARED_1@ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(prefix)/$$f; \
|
||||
@COND_SHARED_1@ done
|
||||
|
||||
@COND_SHARED_1@uninstall_muParser_dll_headers:
|
||||
@COND_SHARED_1@ for f in $(MUPARSER_DLL_HEADERS); do \
|
||||
@COND_SHARED_1@ rm -f $(DESTDIR)$(prefix)/$$f; \
|
||||
@COND_SHARED_1@ done
|
||||
|
||||
@COND_SAMPLES_1@$(top_builddir)/samples/example1/example1$(EXEEXT): $(EXAMPLE1_OBJECTS) $(__muParser_lib___depname)
|
||||
@COND_SAMPLES_1@ $(CXX) -o $@ $(EXAMPLE1_OBJECTS) -L$(top_builddir)/lib -L$(srcdir)/lib $(LDFLAGS) -lmuparser$(DEBUG_BUILD_POSTFIX) $(LIBS)
|
||||
@COND_SAMPLES_1@
|
||||
@COND_SAMPLES_1@ $(__example1___mac_setfilecmd)
|
||||
|
||||
lib: $(__muParser_lib___depname) $(__muParser_dll___depname)
|
||||
|
||||
samples: $(__example1___depname)
|
||||
|
||||
documentation:
|
||||
( cd $(srcdir)/docs && doxygen )
|
||||
|
||||
muParser_lib_muParser.o: $(srcdir)/src/muParser.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParser.cpp
|
||||
|
||||
muParser_lib_muParserBase.o: $(srcdir)/src/muParserBase.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserBase.cpp
|
||||
|
||||
muParser_lib_muParserBytecode.o: $(srcdir)/src/muParserBytecode.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserBytecode.cpp
|
||||
|
||||
muParser_lib_muParserCallback.o: $(srcdir)/src/muParserCallback.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserCallback.cpp
|
||||
|
||||
muParser_lib_muParserDLL.o: $(srcdir)/src/muParserDLL.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserDLL.cpp
|
||||
|
||||
muParser_lib_muParserError.o: $(srcdir)/src/muParserError.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserError.cpp
|
||||
|
||||
muParser_lib_muParserInt.o: $(srcdir)/src/muParserInt.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserInt.cpp
|
||||
|
||||
muParser_lib_muParserTest.o: $(srcdir)/src/muParserTest.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserTest.cpp
|
||||
|
||||
muParser_lib_muParserTokenReader.o: $(srcdir)/src/muParserTokenReader.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(srcdir)/src/muParserTokenReader.cpp
|
||||
|
||||
muParser_dll_muParser.o: $(srcdir)/src/muParser.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParser.cpp
|
||||
|
||||
muParser_dll_muParserBase.o: $(srcdir)/src/muParserBase.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserBase.cpp
|
||||
|
||||
muParser_dll_muParserBytecode.o: $(srcdir)/src/muParserBytecode.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserBytecode.cpp
|
||||
|
||||
muParser_dll_muParserCallback.o: $(srcdir)/src/muParserCallback.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserCallback.cpp
|
||||
|
||||
muParser_dll_muParserDLL.o: $(srcdir)/src/muParserDLL.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserDLL.cpp
|
||||
|
||||
muParser_dll_muParserError.o: $(srcdir)/src/muParserError.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserError.cpp
|
||||
|
||||
muParser_dll_muParserInt.o: $(srcdir)/src/muParserInt.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserInt.cpp
|
||||
|
||||
muParser_dll_muParserTest.o: $(srcdir)/src/muParserTest.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserTest.cpp
|
||||
|
||||
muParser_dll_muParserTokenReader.o: $(srcdir)/src/muParserTokenReader.cpp
|
||||
$(CXXC) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(srcdir)/src/muParserTokenReader.cpp
|
||||
|
||||
example1_example1.o: $(srcdir)/samples/example1/example1.cpp
|
||||
$(CXXC) -c -o $@ $(EXAMPLE1_CXXFLAGS) $(srcdir)/samples/example1/example1.cpp
|
||||
|
||||
|
||||
# Include dependency info, if present:
|
||||
@IF_GNU_MAKE@-include ./.deps/*.d
|
||||
|
||||
.PHONY: all install uninstall clean distclean install_muParser_lib \
|
||||
uninstall_muParser_lib install_muParser_lib_headers \
|
||||
uninstall_muParser_lib_headers install_muParser_dll uninstall_muParser_dll \
|
||||
install_muParser_dll_headers uninstall_muParser_dll_headers lib samples
|
122
muparser/bk-deps
Executable file
122
muparser/bk-deps
Executable file
|
@ -0,0 +1,122 @@
|
|||
#!/bin/sh
|
||||
|
||||
# This script is part of Bakefile (http://www.bakefile.org) autoconf
|
||||
# script. It is used to track C/C++ files dependencies in portable way.
|
||||
#
|
||||
# Permission is given to use this file in any way.
|
||||
|
||||
DEPSMODE=gcc
|
||||
DEPSFLAG="-no-cpp-precomp -MMD"
|
||||
DEPSDIRBASE=.deps
|
||||
|
||||
if test $DEPSMODE = gcc ; then
|
||||
$* ${DEPSFLAG}
|
||||
status=$?
|
||||
|
||||
# determine location of created files:
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-o )
|
||||
shift
|
||||
objfile=$1
|
||||
;;
|
||||
-* )
|
||||
;;
|
||||
* )
|
||||
srcfile=$1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
objfilebase=`basename $objfile`
|
||||
builddir=`dirname $objfile`
|
||||
depfile=`basename $srcfile | sed -e 's/\..*$/.d/g'`
|
||||
depobjname=`echo $depfile |sed -e 's/\.d/.o/g'`
|
||||
depsdir=$builddir/$DEPSDIRBASE
|
||||
mkdir -p $depsdir
|
||||
|
||||
# if the compiler failed, we're done:
|
||||
if test ${status} != 0 ; then
|
||||
rm -f $depfile
|
||||
exit ${status}
|
||||
fi
|
||||
|
||||
# move created file to the location we want it in:
|
||||
if test -f $depfile ; then
|
||||
sed -e "s,$depobjname:,$objfile:,g" $depfile >${depsdir}/${objfilebase}.d
|
||||
rm -f $depfile
|
||||
else
|
||||
# "g++ -MMD -o fooobj.o foosrc.cpp" produces fooobj.d
|
||||
depfile=`echo "$objfile" | sed -e 's/\..*$/.d/g'`
|
||||
if test ! -f $depfile ; then
|
||||
# "cxx -MD -o fooobj.o foosrc.cpp" creates fooobj.o.d (Compaq C++)
|
||||
depfile="$objfile.d"
|
||||
fi
|
||||
if test -f $depfile ; then
|
||||
sed -e "\,^$objfile,!s,$depobjname:,$objfile:,g" $depfile >${depsdir}/${objfilebase}.d
|
||||
rm -f $depfile
|
||||
fi
|
||||
fi
|
||||
exit 0
|
||||
|
||||
elif test $DEPSMODE = mwcc ; then
|
||||
$* || exit $?
|
||||
# Run mwcc again with -MM and redirect into the dep file we want
|
||||
# NOTE: We can't use shift here because we need $* to be valid
|
||||
prevarg=
|
||||
for arg in $* ; do
|
||||
if test "$prevarg" = "-o"; then
|
||||
objfile=$arg
|
||||
else
|
||||
case "$arg" in
|
||||
-* )
|
||||
;;
|
||||
* )
|
||||
srcfile=$arg
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
prevarg="$arg"
|
||||
done
|
||||
|
||||
objfilebase=`basename $objfile`
|
||||
builddir=`dirname $objfile`
|
||||
depsdir=$builddir/$DEPSDIRBASE
|
||||
mkdir -p $depsdir
|
||||
|
||||
$* $DEPSFLAG >${depsdir}/${objfilebase}.d
|
||||
exit 0
|
||||
|
||||
elif test $DEPSMODE = unixcc; then
|
||||
$* || exit $?
|
||||
# Run compiler again with deps flag and redirect into the dep file.
|
||||
# It doesn't work if the '-o FILE' option is used, but without it the
|
||||
# dependency file will contain the wrong name for the object. So it is
|
||||
# removed from the command line, and the dep file is fixed with sed.
|
||||
cmd=""
|
||||
while test $# -gt 0; do
|
||||
case "$1" in
|
||||
-o )
|
||||
shift
|
||||
objfile=$1
|
||||
;;
|
||||
* )
|
||||
eval arg$#=\$1
|
||||
cmd="$cmd \$arg$#"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
objfilebase=`basename $objfile`
|
||||
builddir=`dirname $objfile`
|
||||
depsdir=$builddir/$DEPSDIRBASE
|
||||
mkdir -p $depsdir
|
||||
|
||||
eval "$cmd $DEPSFLAG" | sed "s|.*:|$objfile:|" >${depsdir}/${objfilebase}.d
|
||||
exit 0
|
||||
|
||||
else
|
||||
$*
|
||||
exit $?
|
||||
fi
|
1992
muparser/build/autoconf/aclocal.m4
vendored
Normal file
1992
muparser/build/autoconf/aclocal.m4
vendored
Normal file
File diff suppressed because it is too large
Load diff
50
muparser/build/autoconf/acregen.sh
Executable file
50
muparser/build/autoconf/acregen.sh
Executable file
|
@ -0,0 +1,50 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Author: Francesco Montorsi
|
||||
# RCS-ID: $Id: acregen.sh 236 2009-11-24 23:12:00Z frm $
|
||||
# Creation date: 14/9/2005
|
||||
#
|
||||
# A simple script to generate the configure script
|
||||
# Some features of this version:
|
||||
# - automatic test for aclocal version
|
||||
# - able to be called from any folder
|
||||
# (i.e. you can call it typing 'build/autoconf/acregen.sh', not only './acregen.sh')
|
||||
|
||||
|
||||
# called when an old version of aclocal is found
|
||||
function aclocalold()
|
||||
{
|
||||
echo "Your aclocal version is $aclocal_maj.$aclocal_min.$aclocal_rel"
|
||||
echo "Your automake installation is too old; please install automake >= $aclocal_minimal_maj.$aclocal_minimal_min.$aclocal_minimal_rel"
|
||||
echo "You can download automake from ftp://sources.redhat.com/pub/automake/"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# first check if we have an ACLOCAL version recent enough
|
||||
aclocal_verfull=$(aclocal --version)
|
||||
aclocal_maj=`echo $aclocal_verfull | sed 's/aclocal (GNU automake) \([0-9]*\).\([0-9]*\).\([0-9]*\).*/\1/'`
|
||||
aclocal_min=`echo $aclocal_verfull | sed 's/aclocal (GNU automake) \([0-9]*\).\([0-9]*\).\([0-9]*\).*/\2/'`
|
||||
aclocal_rel=`echo $aclocal_verfull | sed 's/aclocal (GNU automake) \([0-9]*\).\([0-9]*\).\([0-9]*\).*/\3/'`
|
||||
if [[ "$aclocal_rel" = "" ]]; then aclocal_rel="0"; fi
|
||||
|
||||
#echo "Your aclocal version is $aclocal_maj.$aclocal_min.$aclocal_rel" # for debugging
|
||||
|
||||
aclocal_minimal_maj=1
|
||||
aclocal_minimal_min=9
|
||||
aclocal_minimal_rel=6
|
||||
|
||||
majok=$(($aclocal_maj > $aclocal_minimal_maj))
|
||||
minok=$(($aclocal_maj == $aclocal_minimal_maj && $aclocal_min > $aclocal_minimal_min))
|
||||
relok=$(($aclocal_maj == $aclocal_minimal_maj && $aclocal_min == $aclocal_minimal_min && \
|
||||
$aclocal_rel >= $aclocal_minimal_rel))
|
||||
|
||||
versionok=$(($majok == 1 || $minok == 1 || $relok == 1))
|
||||
if [[ "$versionok" = "0" ]]; then aclocalold; fi
|
||||
|
||||
# we can safely proceed
|
||||
me=$(basename $0)
|
||||
path=${0%%/$me} # path from which the script has been launched
|
||||
current=$(pwd)
|
||||
cd $path
|
||||
aclocal && autoconf && mv configure ../..
|
||||
cd $current
|
134
muparser/build/autoconf/autoconf_inc.m4
Normal file
134
muparser/build/autoconf/autoconf_inc.m4
Normal file
|
@ -0,0 +1,134 @@
|
|||
dnl ### begin block 00_header[muparser.bkl] ###
|
||||
dnl
|
||||
dnl This macro was generated by
|
||||
dnl Bakefile 0.2.9 (http://www.bakefile.org)
|
||||
dnl Do not modify, all changes will be overwritten!
|
||||
|
||||
BAKEFILE_AUTOCONF_INC_M4_VERSION="0.2.9"
|
||||
|
||||
dnl ### begin block 20_COND_DEBUG_0[muparser.bkl] ###
|
||||
COND_DEBUG_0="#"
|
||||
if test "x$DEBUG" = "x0" ; then
|
||||
COND_DEBUG_0=""
|
||||
fi
|
||||
AC_SUBST(COND_DEBUG_0)
|
||||
dnl ### begin block 20_COND_DEBUG_1[muparser.bkl] ###
|
||||
COND_DEBUG_1="#"
|
||||
if test "x$DEBUG" = "x1" ; then
|
||||
COND_DEBUG_1=""
|
||||
fi
|
||||
AC_SUBST(COND_DEBUG_1)
|
||||
dnl ### begin block 20_COND_DEPS_TRACKING_0[muparser.bkl] ###
|
||||
COND_DEPS_TRACKING_0="#"
|
||||
if test "x$DEPS_TRACKING" = "x0" ; then
|
||||
COND_DEPS_TRACKING_0=""
|
||||
fi
|
||||
AC_SUBST(COND_DEPS_TRACKING_0)
|
||||
dnl ### begin block 20_COND_DEPS_TRACKING_1[muparser.bkl] ###
|
||||
COND_DEPS_TRACKING_1="#"
|
||||
if test "x$DEPS_TRACKING" = "x1" ; then
|
||||
COND_DEPS_TRACKING_1=""
|
||||
fi
|
||||
AC_SUBST(COND_DEPS_TRACKING_1)
|
||||
dnl ### begin block 20_COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1[muparser.bkl] ###
|
||||
COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1="#"
|
||||
if test "x$PLATFORM_MACOSX" = "x0" -a "x$USE_SOVERCYGWIN" = "x0" -a "x$USE_SOVERSION" = "x1" ; then
|
||||
COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_MACOSX_0_USE_SOVERCYGWIN_0_USE_SOVERSION_1)
|
||||
dnl ### begin block 20_COND_PLATFORM_MACOSX_0_USE_SOVERSION_1[muparser.bkl] ###
|
||||
COND_PLATFORM_MACOSX_0_USE_SOVERSION_1="#"
|
||||
if test "x$PLATFORM_MACOSX" = "x0" -a "x$USE_SOVERSION" = "x1" ; then
|
||||
COND_PLATFORM_MACOSX_0_USE_SOVERSION_1=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_MACOSX_0_USE_SOVERSION_1)
|
||||
dnl ### begin block 20_COND_PLATFORM_MACOSX_1[muparser.bkl] ###
|
||||
COND_PLATFORM_MACOSX_1="#"
|
||||
if test "x$PLATFORM_MACOSX" = "x1" ; then
|
||||
COND_PLATFORM_MACOSX_1=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_MACOSX_1)
|
||||
dnl ### begin block 20_COND_PLATFORM_MACOSX_1_USE_SOVERSION_1[muparser.bkl] ###
|
||||
COND_PLATFORM_MACOSX_1_USE_SOVERSION_1="#"
|
||||
if test "x$PLATFORM_MACOSX" = "x1" -a "x$USE_SOVERSION" = "x1" ; then
|
||||
COND_PLATFORM_MACOSX_1_USE_SOVERSION_1=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_MACOSX_1_USE_SOVERSION_1)
|
||||
dnl ### begin block 20_COND_PLATFORM_MAC_0[muparser.bkl] ###
|
||||
COND_PLATFORM_MAC_0="#"
|
||||
if test "x$PLATFORM_MAC" = "x0" ; then
|
||||
COND_PLATFORM_MAC_0=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_MAC_0)
|
||||
dnl ### begin block 20_COND_PLATFORM_MAC_1[muparser.bkl] ###
|
||||
COND_PLATFORM_MAC_1="#"
|
||||
if test "x$PLATFORM_MAC" = "x1" ; then
|
||||
COND_PLATFORM_MAC_1=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_MAC_1)
|
||||
dnl ### begin block 20_COND_PLATFORM_OS2_1[muparser.bkl] ###
|
||||
COND_PLATFORM_OS2_1="#"
|
||||
if test "x$PLATFORM_OS2" = "x1" ; then
|
||||
COND_PLATFORM_OS2_1=""
|
||||
fi
|
||||
AC_SUBST(COND_PLATFORM_OS2_1)
|
||||
dnl ### begin block 20_COND_SAMPLES_1[muparser.bkl] ###
|
||||
COND_SAMPLES_1="#"
|
||||
if test "x$SAMPLES" = "x1" ; then
|
||||
COND_SAMPLES_1=""
|
||||
fi
|
||||
AC_SUBST(COND_SAMPLES_1)
|
||||
dnl ### begin block 20_COND_SHARED_0[muparser.bkl] ###
|
||||
COND_SHARED_0="#"
|
||||
if test "x$SHARED" = "x0" ; then
|
||||
COND_SHARED_0=""
|
||||
fi
|
||||
AC_SUBST(COND_SHARED_0)
|
||||
dnl ### begin block 20_COND_SHARED_1[muparser.bkl] ###
|
||||
COND_SHARED_1="#"
|
||||
if test "x$SHARED" = "x1" ; then
|
||||
COND_SHARED_1=""
|
||||
fi
|
||||
AC_SUBST(COND_SHARED_1)
|
||||
dnl ### begin block 20_COND_USE_SOTWOSYMLINKS_1[muparser.bkl] ###
|
||||
COND_USE_SOTWOSYMLINKS_1="#"
|
||||
if test "x$USE_SOTWOSYMLINKS" = "x1" ; then
|
||||
COND_USE_SOTWOSYMLINKS_1=""
|
||||
fi
|
||||
AC_SUBST(COND_USE_SOTWOSYMLINKS_1)
|
||||
dnl ### begin block 20_COND_USE_SOVERCYGWIN_1_USE_SOVERSION_1[muparser.bkl] ###
|
||||
COND_USE_SOVERCYGWIN_1_USE_SOVERSION_1="#"
|
||||
if test "x$USE_SOVERCYGWIN" = "x1" -a "x$USE_SOVERSION" = "x1" ; then
|
||||
COND_USE_SOVERCYGWIN_1_USE_SOVERSION_1=""
|
||||
fi
|
||||
AC_SUBST(COND_USE_SOVERCYGWIN_1_USE_SOVERSION_1)
|
||||
dnl ### begin block 20_COND_USE_SOVERLINUX_1[muparser.bkl] ###
|
||||
COND_USE_SOVERLINUX_1="#"
|
||||
if test "x$USE_SOVERLINUX" = "x1" ; then
|
||||
COND_USE_SOVERLINUX_1=""
|
||||
fi
|
||||
AC_SUBST(COND_USE_SOVERLINUX_1)
|
||||
dnl ### begin block 20_COND_USE_SOVERSION_0[muparser.bkl] ###
|
||||
COND_USE_SOVERSION_0="#"
|
||||
if test "x$USE_SOVERSION" = "x0" ; then
|
||||
COND_USE_SOVERSION_0=""
|
||||
fi
|
||||
AC_SUBST(COND_USE_SOVERSION_0)
|
||||
dnl ### begin block 20_COND_USE_SOVERSION_1_USE_SOVERSOLARIS_1[muparser.bkl] ###
|
||||
COND_USE_SOVERSION_1_USE_SOVERSOLARIS_1="#"
|
||||
if test "x$USE_SOVERSION" = "x1" -a "x$USE_SOVERSOLARIS" = "x1" ; then
|
||||
COND_USE_SOVERSION_1_USE_SOVERSOLARIS_1=""
|
||||
fi
|
||||
AC_SUBST(COND_USE_SOVERSION_1_USE_SOVERSOLARIS_1)
|
||||
dnl ### begin block 20_COND_USE_SOVERSOLARIS_1[muparser.bkl] ###
|
||||
COND_USE_SOVERSOLARIS_1="#"
|
||||
if test "x$USE_SOVERSOLARIS" = "x1" ; then
|
||||
COND_USE_SOVERSOLARIS_1=""
|
||||
fi
|
||||
AC_SUBST(COND_USE_SOVERSOLARIS_1)
|
||||
dnl ### begin block 20_COND_WINDOWS_IMPLIB_1[muparser.bkl] ###
|
||||
COND_WINDOWS_IMPLIB_1="#"
|
||||
if test "x$WINDOWS_IMPLIB" = "x1" ; then
|
||||
COND_WINDOWS_IMPLIB_1=""
|
||||
fi
|
||||
AC_SUBST(COND_WINDOWS_IMPLIB_1)
|
156
muparser/build/autoconf/bakefile-presets.m4
Normal file
156
muparser/build/autoconf/bakefile-presets.m4
Normal file
|
@ -0,0 +1,156 @@
|
|||
dnl ---------------------------------------------------------------------------
|
||||
dnl Support macros for makefiles generated with Bakefile presets
|
||||
dnl ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AM_YESNO_OPTCHECK([name of the boolean variable to set],
|
||||
dnl [name of the variable with yes/no values],
|
||||
dnl [name of the --enable/--with option])
|
||||
dnl
|
||||
dnl Converts the $3 variable, supposed to contain a yes/no value to a 1/0
|
||||
dnl boolean variable and saves the result into $1.
|
||||
dnl Outputs also the standard checking-option message.
|
||||
dnl Used by the m4 macros of the presets.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_YESNO_OPTCHECK],
|
||||
[
|
||||
AC_MSG_CHECKING([for the $3 option])
|
||||
if [[ "x$$2" = "xyes" ]]; then
|
||||
AC_MSG_RESULT([yes])
|
||||
$1=1
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
$1=0
|
||||
fi
|
||||
])
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AC_BAKEFILE_UNICODEOPT([default value for the --enable-unicode option])
|
||||
dnl
|
||||
dnl Adds the --enable-unicode option to the configure script and sets the
|
||||
dnl UNICODE=0/1 variable accordingly to the value of the option.
|
||||
dnl To be used with unicodeopt.bkl preset.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_UNICODEOPT],
|
||||
[
|
||||
default="$1"
|
||||
if [[ -z "$default" ]]; then
|
||||
default="no"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([unicode],
|
||||
AC_HELP_STRING([--enable-unicode], [Builds in Unicode mode]),
|
||||
[], [enableval="$default"])
|
||||
|
||||
AC_BAKEFILE_YESNO_OPTCHECK([UNICODE], [enableval], [--enable-unicode])
|
||||
])
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AC_BAKEFILE_DEBUGOPT([default value for the --enable-debug option])
|
||||
dnl
|
||||
dnl Adds the --enable-debug option to the configure script and sets the
|
||||
dnl DEBUG=0/1 variable accordingly to the value of the option.
|
||||
dnl To be used with debugopt.bkl preset.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_DEBUGOPT],
|
||||
[
|
||||
default="$1"
|
||||
if [[ -z "$default" ]]; then
|
||||
default="no"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([debug],
|
||||
AC_HELP_STRING([--enable-debug], [Builds in debug mode]),
|
||||
[], [enableval="$default"])
|
||||
|
||||
AC_BAKEFILE_YESNO_OPTCHECK([DEBUG], [enableval], [--enable-debug])
|
||||
|
||||
dnl add the optimize/debug flags
|
||||
if [[ "x$DEBUG" = "x1" ]]; then
|
||||
|
||||
dnl NOTE: the -Wundef and -Wno-ctor-dtor-privacy are not enabled automatically by -Wall
|
||||
dnl NOTE2: the '-Wno-ctor-dtor-privacy' has sense only when compiling C++ source files
|
||||
dnl and thus we must be careful to add it only to CXXFLAGS and not to CFLAGS
|
||||
dnl (remember that CPPFLAGS is reserved for both C and C++ compilers while
|
||||
dnl CFLAGS is intended as flags for C compiler only and CXXFLAGS for C++ only)
|
||||
my_CXXFLAGS="$my_CXXFLAGS -g -O0 -Wall -Wundef -Wno-ctor-dtor-privacy"
|
||||
my_CFLAGS="$my_CFLAGS -g -O0 -Wall -Wundef"
|
||||
else
|
||||
my_CXXFLAGS="$my_CXXFLAGS -O2"
|
||||
my_CFLAGS="$my_CFLAGS -O2"
|
||||
fi
|
||||
# User-supplied CXXFLAGS must always take precedence.
|
||||
# This still sucks because using `make CFLAGS=-foobar` kills
|
||||
# the project-supplied flags again.
|
||||
CXXFLAGS="$my_CXXFLAGS $CXXFLAGS"
|
||||
CFLAGS="$my_CFLAGS $CFLAGS"
|
||||
])
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AC_BAKEFILE_SHAREDOPT([default value for the --enable-shared option])
|
||||
dnl
|
||||
dnl Adds the --enable-shared option to the configure script and sets the
|
||||
dnl SHARED=0/1 variable accordingly to the value of the option.
|
||||
dnl To be used with sharedopt.bkl preset.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_SHAREDOPT],
|
||||
[
|
||||
default="$1"
|
||||
if [[ -z "$default" ]]; then
|
||||
default="no"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([shared],
|
||||
AC_HELP_STRING([--enable-shared], [Builds in shared mode]),
|
||||
[], [enableval="$default"])
|
||||
|
||||
AC_BAKEFILE_YESNO_OPTCHECK([SHARED], [enableval], [--enable-shared])
|
||||
])
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AC_BAKEFILE_SHOW_DEBUGOPT
|
||||
dnl
|
||||
dnl Prints a message on stdout about the value of the DEBUG variable.
|
||||
dnl This macro is useful to show summary messages at the end of the configure scripts.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_SHOW_DEBUGOPT],
|
||||
[
|
||||
if [[ "$DEBUG" = "1" ]]; then
|
||||
echo " - DEBUG build"
|
||||
else
|
||||
echo " - RELEASE build"
|
||||
fi
|
||||
])
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AC_BAKEFILE_SHOW_SHAREDOPT
|
||||
dnl
|
||||
dnl Prints a message on stdout about the value of the SHARED variable.
|
||||
dnl This macro is useful to show summary messages at the end of the configure scripts.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_SHOW_SHAREDOPT],
|
||||
[
|
||||
if [[ "$SHARED" = "1" ]]; then
|
||||
echo " - SHARED mode"
|
||||
else
|
||||
echo " - STATIC mode"
|
||||
fi
|
||||
])
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl AC_BAKEFILE_SHOW_UNICODEOPT
|
||||
dnl
|
||||
dnl Prints a message on stdout about the value of the UNICODE variable.
|
||||
dnl This macro is useful to show summary messages at the end of the configure scripts.
|
||||
dnl ---------------------------------------------------------------------------
|
||||
AC_DEFUN([AC_BAKEFILE_SHOW_UNICODEOPT],
|
||||
[
|
||||
if [[ "$UNICODE" = "1" ]]; then
|
||||
echo " - UNICODE mode"
|
||||
else
|
||||
echo " - ANSI mode"
|
||||
fi
|
||||
])
|
||||
|
||||
|
1497
muparser/build/autoconf/config.guess
vendored
Executable file
1497
muparser/build/autoconf/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load diff
1608
muparser/build/autoconf/config.sub
vendored
Executable file
1608
muparser/build/autoconf/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load diff
82
muparser/build/autoconf/configure.ac
Normal file
82
muparser/build/autoconf/configure.ac
Normal file
|
@ -0,0 +1,82 @@
|
|||
# ======================================================================================
|
||||
# Author: Francesco Montorsi
|
||||
# RCS-ID: $Id: configure.ac 634 2012-12-22 10:34:32Z ibg $
|
||||
# ======================================================================================
|
||||
|
||||
|
||||
# NOTE:
|
||||
# the version of the project must be updated also in docs/Doxyfile !
|
||||
AC_INIT([muparser], [2.2.4], [muparser@beltoforion.de])
|
||||
|
||||
AC_PREREQ([2.57])
|
||||
AC_CONFIG_AUX_DIR([build/autoconf])
|
||||
AC_LANG(C++)
|
||||
|
||||
# some helpers
|
||||
m4_include(bakefile-presets.m4)
|
||||
|
||||
|
||||
|
||||
## CONFIGURE CHECKS
|
||||
#####################################################################
|
||||
|
||||
dnl This allows us to use Bakefile, recognizing the system type
|
||||
dnl (and sets the AC_CANONICAL_BUILD, AC_CANONICAL_HOST and
|
||||
dnl AC_CANONICAL_TARGET variables)
|
||||
AC_CANONICAL_SYSTEM
|
||||
|
||||
# We want to inhibit AC_PROG_C* macros adding the default "-g -O2" flags.
|
||||
# To do so, make sure that the variables are not unset - it is ok if they are
|
||||
# empty. However, their value MUST be retained, since one may have
|
||||
# called ./configure CFLAGS=-foobar.
|
||||
CFLAGS="$CFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS"
|
||||
|
||||
dnl Checks for basic programs used to compile/install.
|
||||
AC_PROG_AWK
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CXXCPP
|
||||
|
||||
|
||||
AC_BAKEFILE_DEBUGOPT([no])
|
||||
AC_BAKEFILE_SHAREDOPT([yes])
|
||||
|
||||
AC_ARG_ENABLE([samples],
|
||||
AC_HELP_STRING([--enable-samples], [Builds the library samples, too]),
|
||||
[], [enableval="yes"])
|
||||
AC_BAKEFILE_YESNO_OPTCHECK([SAMPLES], [enableval], [--enable-samples])
|
||||
|
||||
dnl Create the output folders in the current build directory
|
||||
dnl (this handles cases like:
|
||||
dnl mkdir mybuild && cd mybuild && ../configure && make )
|
||||
AS_MKDIR_P(lib)
|
||||
AS_MKDIR_P(samples/example1)
|
||||
|
||||
AC_BAKEFILE([m4_include(autoconf_inc.m4)])
|
||||
AC_CONFIG_FILES([Makefile build/autoconf/muparser.pc])
|
||||
AC_OUTPUT
|
||||
|
||||
|
||||
|
||||
## CONFIGURE END MESSAGE
|
||||
#####################################################################
|
||||
|
||||
echo
|
||||
echo " ----------------------------------------------------------------"
|
||||
echo " Configuration for $PACKAGE_NAME $PACKAGE_VERSION successfully completed."
|
||||
echo " Summary of main configuration settings for $PACKAGE_NAME:"
|
||||
AC_BAKEFILE_SHOW_SHAREDOPT
|
||||
AC_BAKEFILE_SHOW_DEBUGOPT
|
||||
if [[ "$SAMPLES" = "1" ]]; then
|
||||
echo " - SAMPLES enabled"
|
||||
else
|
||||
echo " - SAMPLES disabled"
|
||||
fi
|
||||
echo " Now, just run make."
|
||||
echo " ----------------------------------------------------------------"
|
||||
echo
|
2
muparser/build/autoconf/install-sh
Executable file
2
muparser/build/autoconf/install-sh
Executable file
|
@ -0,0 +1,2 @@
|
|||
#!/bin/sh
|
||||
|
11
muparser/build/autoconf/muparser.pc.in
Normal file
11
muparser/build/autoconf/muparser.pc.in
Normal file
|
@ -0,0 +1,11 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: @PACKAGE_NAME@
|
||||
Description: Mathematical expressions parser library
|
||||
Version: @PACKAGE_VERSION@
|
||||
Requires:
|
||||
Libs: -L${libdir} -lmuparser
|
||||
Cflags: -I${includedir}
|
39
muparser/build/bakefiles/Bakefiles.bkgen
Normal file
39
muparser/build/bakefiles/Bakefiles.bkgen
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" ?>
|
||||
|
||||
<!-- RCS-ID: $Id: Bakefiles.bkgen 635 2012-12-22 10:58:11Z ibg $ -->
|
||||
|
||||
<bakefile-gen xmlns="http://www.bakefile.org/schema/bakefile-gen">
|
||||
|
||||
<!-- you probably need to edit only this tag -->
|
||||
<input>muparser.bkl</input>
|
||||
|
||||
<disable-formats>dmars,dmars_smake,cbx_unix,cbuilderx,msevc4prj</disable-formats>
|
||||
<!-- <add-formats>autoconf,borland,mingw,msvc,watcom,msvs2003prj,msvs2005prj,msvs2008prj</add-formats> -->
|
||||
<add-formats>autoconf,mingw,msvc</add-formats>
|
||||
|
||||
<add-flags formats="mingw">-o ../makefile.mingw</add-flags>
|
||||
<add-flags formats="msvc">-o ../makefile.vc</add-flags>
|
||||
|
||||
<!-- change 20121221: Project files for msvc 2008 and 2010 are managed manually.
|
||||
msvc 2005, borland and watcom are no longer supported.
|
||||
<add-flags formats="borland">-o ../makefile.bcc</add-flags>
|
||||
<add-flags formats="watcom">-o ../makefile.wat</add-flags>
|
||||
<add-flags formats="msvs2005prj">-o ../msvc2005/muparser.sln</add-flags>
|
||||
<add-flags formats="msvs2008prj">-o ../msvc2008/muparser.sln</add-flags>
|
||||
-->
|
||||
|
||||
<!-- since it's standard on Unix to have Makefile.in and the configure script in
|
||||
the root folder of the component to build, we put Makefile.in one directory up... -->
|
||||
<add-flags formats="autoconf">
|
||||
-o../../Makefile.in
|
||||
</add-flags>
|
||||
|
||||
<!-- ...anyway, we don't want to fill the component's root with files which are
|
||||
useless for the user and just make the component looks "messy"; thus all
|
||||
autoconf files are still kept in build\; only "configure" and "Makefile.in"
|
||||
will go in the component's root -->
|
||||
<add-flags formats="autoconf">
|
||||
-DAUTOCONF_MACROS_FILE=../autoconf/autoconf_inc.m4
|
||||
</add-flags>
|
||||
|
||||
</bakefile-gen>
|
28
muparser/build/bakefiles/howto.txt
Normal file
28
muparser/build/bakefiles/howto.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
These are basic instructions for recreating the project files:
|
||||
|
||||
Changing the version number:
|
||||
----------------------------
|
||||
build/autoconf/configure.ac
|
||||
Line 9:
|
||||
AC_INIT ....
|
||||
|
||||
Change SO version
|
||||
-----------------
|
||||
muparser.bkl / tag <so_version>
|
||||
|
||||
Updating the make- and projectfiles:
|
||||
------------------------------------
|
||||
Clearing old project and makefiles:
|
||||
bakefile_gen -c
|
||||
|
||||
Remaking Projects and Makefiles:
|
||||
bakefile_gen
|
||||
|
||||
In addition to that automake must be started to create the new configure script:
|
||||
rm -rf autoconf/autom4te.cache autoconf/aclocal.m4
|
||||
../autoconf/acregen.sh
|
||||
|
||||
!!! IMPORTANT !!!
|
||||
When building bakefile from the tar.gz archive make sure to
|
||||
use the option --prefix=/usr wit the config file since its
|
||||
path will default to /usr/local. This would cause strange errors!
|
160
muparser/build/bakefiles/muparser.bkl
Normal file
160
muparser/build/bakefiles/muparser.bkl
Normal file
|
@ -0,0 +1,160 @@
|
|||
<?xml version="1.0" ?>
|
||||
|
||||
<!-- RCS-ID: $Id: muparser.bkl 635 2012-12-22 10:58:11Z ibg $ -->
|
||||
|
||||
<makefile>
|
||||
|
||||
<requires version="0.2.5"/>
|
||||
<using module="pkgconfig"/>
|
||||
|
||||
<include file="presets/debugopt.bkl"/>
|
||||
<include file="presets/sharedopt.bkl"/>
|
||||
<include file="presets/setbuilddir.bkl"/>
|
||||
|
||||
<!-- put all object files under the OBJ folder -->
|
||||
<if cond="FORMAT!='autoconf'">
|
||||
<set var="BUILDDIR">obj$(DIRSEP)$(BUILDDIR)</set>
|
||||
</if>
|
||||
|
||||
<set var="DEBUG_BUILD_POSTFIX">
|
||||
<if cond="DEBUG=='0'"></if>
|
||||
<if cond="DEBUG=='1'">d</if>
|
||||
</set>
|
||||
|
||||
|
||||
<!-- Sources for this library -->
|
||||
<!-- ======================== -->
|
||||
|
||||
<if cond="FORMAT=='autoconf'">
|
||||
<!-- Note that since autoconf 2.60 the top_builddir variable does
|
||||
not ends with '/' anymore... -->
|
||||
<set var="LIBOUTPATH">$(top_builddir)/lib</set>
|
||||
<set var="SAMPLEOUTPATH">$(top_builddir)/samples</set>
|
||||
</if>
|
||||
<if cond="'msv' in FORMAT">
|
||||
<!-- match all MSVC visual studio formats -->
|
||||
<set-srcdir>../..</set-srcdir>
|
||||
</if>
|
||||
<if cond="FORMAT in [ 'borland', 'mingw', 'watcom', 'msvc' ]">
|
||||
<set-srcdir>..</set-srcdir>
|
||||
</if>
|
||||
<if cond="FORMAT!='autoconf'">
|
||||
<set var="LIBOUTPATH">$(SRCDIR)/lib</set>
|
||||
<set var="SAMPLEOUTPATH">$(SRCDIR)/samples</set>
|
||||
</if>
|
||||
|
||||
|
||||
|
||||
<!-- Settings for this library -->
|
||||
<!-- ========================= -->
|
||||
|
||||
<template id="muparser_base" template="debugopt">
|
||||
<!-- tell Bakefile to define the MUPARSER_DLL symbol when building in shared mode -->
|
||||
<define>$(substituteFromDict(SHARED, {'1':'MUPARSER_DLL', '0':''}))</define>
|
||||
<define>$(substituteFromDict(SHARED, {'1':'MUPARSERLIB_EXPORTS', '0':''}))</define>
|
||||
<if cond="FORMAT!='autoconf'">
|
||||
<define>_WIN32</define>
|
||||
</if>
|
||||
|
||||
<sources>$(fileList('src/*.cpp'))</sources>
|
||||
<headers>$(fileList('include/*.h'))</headers>
|
||||
<dirname>$(LIBOUTPATH)</dirname>
|
||||
<include>$(SRCDIR)/include</include>
|
||||
|
||||
<install-to>$(LIBDIR)</install-to>
|
||||
<install-headers-to>$(PREFIX)</install-headers-to>
|
||||
</template>
|
||||
|
||||
<lib id="muParser_lib" template="muparser_base" cond="SHARED=='0'">
|
||||
<libname>muparser$(DEBUG_BUILD_POSTFIX)</libname>
|
||||
</lib>
|
||||
<dll id="muParser_dll" template="muparser_base" cond="SHARED=='1'">
|
||||
<dllname>muparser$(DEBUG_BUILD_POSTFIX)</dllname>
|
||||
<libname>muparser$(DEBUG_BUILD_POSTFIX)</libname>
|
||||
|
||||
<version>2.2</version>
|
||||
<so_version>2.2.4</so_version>
|
||||
<mac_version>1</mac_version> <!-- must be > 0 -->
|
||||
</dll>
|
||||
|
||||
<!-- this makes the MSVC6 project files much nicer... -->
|
||||
<set var="MSVC6PRJ_MERGED_TARGETS">muParser=muParser_lib+muParser_dll</set>
|
||||
|
||||
<!-- Installs the PKG-CONFIG file -->
|
||||
<pkgconfig id="pkgconfig" cond="FORMAT=='autoconf'">
|
||||
<src>build/autoconf/muparser.pc</src>
|
||||
</pkgconfig>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Samples for the library -->
|
||||
<!-- ======================= -->
|
||||
|
||||
<if cond="FORMAT_SUPPORTS_CONDITIONS=='1'">
|
||||
<option name="SAMPLES">
|
||||
<values>0,1</values>
|
||||
<default-value>1</default-value>
|
||||
<description>Set to 1 to compile samples</description>
|
||||
</option>
|
||||
</if>
|
||||
<if cond="FORMAT_SUPPORTS_CONDITIONS=='0'">
|
||||
<!-- Avoid to create IDE project files with multiple configurations
|
||||
which differ only for the SAMPLES=0/1 option! -->
|
||||
<set var="SAMPLES">1</set>
|
||||
</if>
|
||||
|
||||
<template id="muparser_sample" template="debugopt">
|
||||
<library>muParser_lib</library>
|
||||
<include>$(SRCDIR)/include</include>
|
||||
<lib-path>$(SRCDIR)/lib</lib-path>
|
||||
</template>
|
||||
|
||||
<if cond="FORMAT!='autoconf'">
|
||||
<exe id="example1" template="muparser_sample" cond="SAMPLES=='1' and SHARED=='0'">
|
||||
<sources>$(fileList('samples/example1/*.cpp'))</sources>
|
||||
<dirname>$(SAMPLEOUTPATH)/example1</dirname>
|
||||
<define>$(substituteFromDict(SHARED, {'1':'USINGDLL', '0':''}))</define>
|
||||
</exe>
|
||||
</if>
|
||||
<if cond="FORMAT=='autoconf'">
|
||||
<!-- On Unix this sample is always available -->
|
||||
<exe id="example1" template="muparser_sample" cond="SAMPLES=='1'">
|
||||
<sources>$(fileList('samples/example1/*.cpp'))</sources>
|
||||
<dirname>$(SAMPLEOUTPATH)/example1</dirname>
|
||||
</exe>
|
||||
</if>
|
||||
|
||||
<if cond="FORMAT!='autoconf'">
|
||||
<!-- This samples is win32-specific (it uses the DLL interface) -->
|
||||
<exe id="example2" template="muparser_sample" cond="SAMPLES=='1' and SHARED=='1'">
|
||||
<sources>$(fileList('samples/example2/*.c'))</sources>
|
||||
<dirname>$(SAMPLEOUTPATH)/example2</dirname>
|
||||
<define>$(substituteFromDict(SHARED, {'1':'USINGDLL', '0':''}))</define>
|
||||
</exe>
|
||||
</if>
|
||||
|
||||
|
||||
|
||||
<!-- Some helpers for command-line makefiles -->
|
||||
<!-- ======================================= -->
|
||||
|
||||
<phony id="lib">
|
||||
<depends>muParser_lib</depends>
|
||||
<depends>muParser_dll</depends>
|
||||
</phony>
|
||||
|
||||
<phony id="samples">
|
||||
<depends>example1</depends>
|
||||
<!-- <depends cond="FORMAT in [ 'msvc', 'msvc6prj' ]">example2</depends> -->
|
||||
<depends cond="FORMAT!='autoconf'">example2</depends>
|
||||
</phony>
|
||||
|
||||
<if cond="FORMAT_SUPPORTS_ACTIONS=='1'">
|
||||
<action id="documentation">
|
||||
<command>( cd $(SRCDIR)$(DIRSEP)docs && doxygen )</command>
|
||||
</action>
|
||||
</if>
|
||||
|
||||
</makefile>
|
||||
|
55
muparser/build/bakefiles/presets/debugopt.bkl
Normal file
55
muparser/build/bakefiles/presets/debugopt.bkl
Normal file
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" ?>
|
||||
<!-- $Id: debugopt.bkl 40 2006-12-02 15:22:02Z frm $ -->
|
||||
|
||||
<!--
|
||||
|
||||
Adds the logic for handling a DEBUG=0/1 option, which switches between debug and
|
||||
release builds.
|
||||
|
||||
Usage: use template "debugopt" for your targets:
|
||||
|
||||
<include file="presets/debugopt.bkl"/>
|
||||
|
||||
<exe id="myapp" template="debugopt">
|
||||
<sources>myapp.cpp</sources>
|
||||
</exe>
|
||||
|
||||
-->
|
||||
|
||||
<makefile>
|
||||
|
||||
<set var="DEBUG_DEFAULT" overwrite="0">0</set>
|
||||
<option name="DEBUG">
|
||||
<values>0,1</values>
|
||||
<default-value>$(DEBUG_DEFAULT)</default-value>
|
||||
<values-description>Release,Debug</values-description>
|
||||
<description>Set to 1 to build debug version</description>
|
||||
</option>
|
||||
|
||||
<template id="debugopt">
|
||||
<define>
|
||||
$(substituteFromDict(DEBUG,{'1':'','0':'NDEBUG'}))
|
||||
</define>
|
||||
<optimize>
|
||||
$(substituteFromDict(DEBUG,{'1':'off','0':'speed'}))
|
||||
</optimize>
|
||||
<debug-info>
|
||||
$(substituteFromDict(DEBUG,{'1':'on','0':'off'}))
|
||||
</debug-info>
|
||||
<warnings>
|
||||
$(substituteFromDict(DEBUG,{'1':'max','0':'no'}))
|
||||
</warnings>
|
||||
<debug-runtime-libs>
|
||||
$(substituteFromDict(DEBUG,{'1':'on','0':'off'}))
|
||||
</debug-runtime-libs>
|
||||
</template>
|
||||
|
||||
|
||||
<!-- The DEBUGBUILDPOSTFIX variable is useful to set the BUILDDIR variable
|
||||
as done in presets/setbuilddir.bkl -->
|
||||
<set var="DEBUGBUILDPOSTFIX">
|
||||
<if cond="DEBUG=='0'">rel</if>
|
||||
<if cond="DEBUG=='1'">dbg</if>
|
||||
</set>
|
||||
|
||||
</makefile>
|
63
muparser/build/bakefiles/presets/setbuilddir.bkl
Normal file
63
muparser/build/bakefiles/presets/setbuilddir.bkl
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" ?>
|
||||
<!-- $Id: setbuilddir.bkl 40 2006-12-02 15:22:02Z frm $ -->
|
||||
|
||||
<!--
|
||||
|
||||
Adds the logic for setting BUILDDIR in a smart way, checking which other presets have been
|
||||
included. Include this preset after including all other presets.
|
||||
|
||||
Usage:
|
||||
|
||||
<include file="presets/sharedopt.bkl"/>
|
||||
<include file="presets/unicodeopt.bkl"/>
|
||||
<include file="presets/debugopt.bkl"/>
|
||||
<include file="presets/setbuilddir.bkl"/>
|
||||
|
||||
<lib id="mylib_static" template="debugopt,unicodeopt" cond="SHARED=='0'">
|
||||
<sources>mylib.cpp</sources>
|
||||
</lib>
|
||||
|
||||
<dll id="mylib_shared" template="debugopt,unicodeopt" cond="SHARED=='1'">
|
||||
<sources>mylib.cpp</sources>
|
||||
</dll>
|
||||
|
||||
<set var="MSVC6PRJ_MERGED_TARGETS">mylib=mylib_static+mylib_shared</set>
|
||||
-->
|
||||
|
||||
<makefile>
|
||||
|
||||
<!--
|
||||
Setting the BUILDDIR variable using the
|
||||
SHAREDBUILDPOSTFIX/DEBUGBUILDPOSTFIX/UNICODEBUILDPOSTFIX
|
||||
variables we will keep separed the intermediate files (objects, compiled resources, exes, libs)
|
||||
generated using SHARED/DEBUG/UNICODE=0 from those generated using SHARED/DEBUG/UNICODE=1.
|
||||
|
||||
Using the same BUILDDIR for these different configurations would force the
|
||||
user to call a "make clean" (or equivalent) before rebuilding since it's not wise
|
||||
mixing a shared build with a static one or a debug build with a release one
|
||||
or a unicode build with an ansi one.
|
||||
|
||||
Last, using the COMPILER when setting BUILDDIR keeps separed the object files generated using
|
||||
different compilers (in case makefiles for different compilers are generated in the same directory).
|
||||
|
||||
NOTE: the autoconf format requires BUILDDIR='.' since using different build directories
|
||||
is already handled by the configure script.
|
||||
E.g.
|
||||
for debug builds: mkdir dbg && cd dbg && ../configure - -enable-debug
|
||||
for release builds: mkdir rel && cd rel && ../configure - -disable-debug
|
||||
...
|
||||
See autoconf documentation for more info.
|
||||
-->
|
||||
|
||||
<!-- some helpers -->
|
||||
<set var="SHRDSTR"><if cond="isdefined('SHAREDBUILDPOSTFIX')">_$(SHAREDBUILDPOSTFIX)</if></set>
|
||||
<set var="DBGSTR"><if cond="isdefined('DEBUGBUILDPOSTFIX')">_$(DEBUGBUILDPOSTFIX)</if></set>
|
||||
<set var="UNICSTR"><if cond="isdefined('UNICODEBUILDPOSTFIX')">_$(UNICODEBUILDPOSTFIX)</if></set>
|
||||
|
||||
<if cond="FORMAT!='autoconf'">
|
||||
<set var="BUILDDIR">
|
||||
$(COMPILER)$(SHRDSTR)$(DBGSTR)$(UNICSTR)
|
||||
</set>
|
||||
</if>
|
||||
|
||||
</makefile>
|
42
muparser/build/bakefiles/presets/sharedopt.bkl
Normal file
42
muparser/build/bakefiles/presets/sharedopt.bkl
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" ?>
|
||||
<!-- $Id: sharedopt.bkl 40 2006-12-02 15:22:02Z frm $ -->
|
||||
|
||||
<!--
|
||||
|
||||
Adds the logic for handling a SHARED=0/1 option, which switches between static and
|
||||
shared (DLL) builds.
|
||||
|
||||
Usage: use template "sharedopt" for your targets:
|
||||
|
||||
<include file="presets/sharedopt.bkl"/>
|
||||
|
||||
<lib id="mylib_static" cond="SHARED=='0'">
|
||||
<sources>mylib.cpp</sources>
|
||||
</lib>
|
||||
|
||||
<dll id="mylib_shared" cond="SHARED=='1'">
|
||||
<sources>mylib.cpp</sources>
|
||||
</dll>
|
||||
|
||||
<set var="MSVC6PRJ_MERGED_TARGETS">mylib=mylib_static+mylib_shared</set>
|
||||
-->
|
||||
|
||||
<makefile>
|
||||
|
||||
<set var="SHARED_DEFAULT" overwrite="0">0</set>
|
||||
<option name="SHARED">
|
||||
<values>0,1</values>
|
||||
<default-value>$(SHARED_DEFAULT)</default-value>
|
||||
<values-description>Static,DLL</values-description>
|
||||
<description>Set to 1 to build shared (DLL) version</description>
|
||||
</option>
|
||||
|
||||
|
||||
<!-- The SHAREDBUILDPOSTFIX variable is useful to set the BUILDDIR variable
|
||||
as done in presets/setbuilddir.bkl -->
|
||||
<set var="SHAREDBUILDPOSTFIX">
|
||||
<if cond="SHARED=='0'">static</if>
|
||||
<if cond="SHARED=='1'">shared</if>
|
||||
</set>
|
||||
|
||||
</makefile>
|
43
muparser/build/bakefiles/presets/unicodeopt.bkl
Normal file
43
muparser/build/bakefiles/presets/unicodeopt.bkl
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" ?>
|
||||
<!-- $Id: unicodeopt.bkl 40 2006-12-02 15:22:02Z frm $ -->
|
||||
|
||||
<!--
|
||||
|
||||
Adds the logic for handling a UNICODE=0/1 option, which switches between unicode and
|
||||
ansi builds.
|
||||
|
||||
Usage: use template "unicodeopt" for your targets:
|
||||
|
||||
<include file="presets/unicodeopt.bkl"/>
|
||||
|
||||
<exe id="myapp" template="unicodeopt">
|
||||
<sources>myapp.cpp</sources>
|
||||
</exe>
|
||||
|
||||
-->
|
||||
|
||||
<makefile>
|
||||
|
||||
<set var="UNICODE_DEFAULT" overwrite="0">0</set>
|
||||
<option name="UNICODE">
|
||||
<values>0,1</values>
|
||||
<default-value>$(UNICODE_DEFAULT)</default-value>
|
||||
<values-description>ANSI,Unicode</values-description>
|
||||
<description>Set to 1 to build Unicode version</description>
|
||||
</option>
|
||||
|
||||
<template id="unicodeopt">
|
||||
<define>
|
||||
$(substituteFromDict(UNICODE,{'1':'_UNICODE','0':''}))
|
||||
</define>
|
||||
</template>
|
||||
|
||||
|
||||
<!-- The UNICODEBUILDPOSTFIX variable is useful to set the BUILDDIR variable
|
||||
as done in presets/setbuilddir.bkl -->
|
||||
<set var="UNICODEBUILDPOSTFIX">
|
||||
<if cond="UNICODE=='0'">a</if>
|
||||
<if cond="UNICODE=='1'">u</if>
|
||||
</set>
|
||||
|
||||
</makefile>
|
283
muparser/build/makefile.mingw
Normal file
283
muparser/build/makefile.mingw
Normal file
|
@ -0,0 +1,283 @@
|
|||
# =========================================================================
|
||||
# This makefile was generated by
|
||||
# Bakefile 0.2.9 (http://www.bakefile.org)
|
||||
# Do not modify, all changes will be overwritten!
|
||||
# =========================================================================
|
||||
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# These are configurable options:
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
# Compiler flags to link shared library
|
||||
LINK_DLL_FLAGS ?= -shared
|
||||
|
||||
# C compiler
|
||||
CC = gcc
|
||||
|
||||
# C++ compiler
|
||||
CXX = g++
|
||||
|
||||
# Standard flags for CC
|
||||
CFLAGS ?=
|
||||
|
||||
# Standard flags for C++
|
||||
CXXFLAGS ?=
|
||||
|
||||
# Standard preprocessor flags (common for CC and CXX)
|
||||
CPPFLAGS ?=
|
||||
|
||||
# Standard linker flags
|
||||
LDFLAGS ?=
|
||||
|
||||
# Set to 1 to build debug version [0,1]
|
||||
DEBUG ?= 0
|
||||
|
||||
# Set to 1 to build shared (DLL) version [0,1]
|
||||
SHARED ?= 0
|
||||
|
||||
# Set to 1 to compile samples [0,1]
|
||||
SAMPLES ?= 1
|
||||
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Do not modify the rest of this file!
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
### Variables: ###
|
||||
|
||||
CPPDEPS = -MT$@ -MF$@.d -MD -MP
|
||||
MUPARSER_LIB_CXXFLAGS = $(____DEBUG) $(____DEBUG_3) $(____DEBUG_9) \
|
||||
$(____DEBUG_8) $(____SHARED) $(____SHARED_0) -D_WIN32 -I..\include \
|
||||
$(CPPFLAGS) $(CXXFLAGS)
|
||||
MUPARSER_LIB_OBJECTS = \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParser.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBase.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBytecode.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserCallback.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserDLL.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserError.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserInt.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTest.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTokenReader.o
|
||||
MUPARSER_DLL_CXXFLAGS = $(____DEBUG) $(____DEBUG_3) $(____DEBUG_9) \
|
||||
$(____DEBUG_8) $(____SHARED) $(____SHARED_0) -D_WIN32 -I..\include \
|
||||
$(CPPFLAGS) $(CXXFLAGS)
|
||||
MUPARSER_DLL_OBJECTS = \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParser.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBase.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBytecode.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserCallback.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserDLL.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserError.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserInt.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTest.o \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTokenReader.o
|
||||
EXAMPLE1_CXXFLAGS = $(____DEBUG) $(____DEBUG_3) $(____DEBUG_9) $(____DEBUG_8) \
|
||||
-I..\include $(____SHARED_1) $(CPPFLAGS) $(CXXFLAGS)
|
||||
EXAMPLE1_OBJECTS = \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example1_example1.o
|
||||
EXAMPLE2_CFLAGS = $(____DEBUG) $(____DEBUG_3) $(____DEBUG_9) $(____DEBUG_8) \
|
||||
-I..\include $(____SHARED_1) $(CPPFLAGS) $(CFLAGS)
|
||||
EXAMPLE2_OBJECTS = \
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example2_example2.o
|
||||
|
||||
### Conditionally set variables: ###
|
||||
|
||||
ifeq ($(DEBUG),0)
|
||||
DEBUGBUILDPOSTFIX = rel
|
||||
endif
|
||||
ifeq ($(DEBUG),1)
|
||||
DEBUGBUILDPOSTFIX = dbg
|
||||
endif
|
||||
ifeq ($(SHARED),0)
|
||||
SHAREDBUILDPOSTFIX = static
|
||||
endif
|
||||
ifeq ($(SHARED),1)
|
||||
SHAREDBUILDPOSTFIX = shared
|
||||
endif
|
||||
ifeq ($(DEBUG),0)
|
||||
DEBUG_BUILD_POSTFIX =
|
||||
endif
|
||||
ifeq ($(DEBUG),1)
|
||||
DEBUG_BUILD_POSTFIX = d
|
||||
endif
|
||||
ifeq ($(SHARED),0)
|
||||
__muParser_lib___depname = ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a
|
||||
endif
|
||||
ifeq ($(SHARED),1)
|
||||
__muParser_dll___depname = ..\lib\muparser$(DEBUG_BUILD_POSTFIX).dll
|
||||
endif
|
||||
ifeq ($(SAMPLES),1)
|
||||
ifeq ($(SHARED),0)
|
||||
__example1___depname = ..\samples\example1\example1.exe
|
||||
endif
|
||||
endif
|
||||
ifeq ($(SAMPLES),1)
|
||||
ifeq ($(SHARED),1)
|
||||
__example2___depname = ..\samples\example2\example2.exe
|
||||
endif
|
||||
endif
|
||||
ifeq ($(SHARED),0)
|
||||
____SHARED =
|
||||
endif
|
||||
ifeq ($(SHARED),1)
|
||||
____SHARED = -DMUPARSER_DLL
|
||||
endif
|
||||
ifeq ($(SHARED),0)
|
||||
____SHARED_0 =
|
||||
endif
|
||||
ifeq ($(SHARED),1)
|
||||
____SHARED_0 = -DMUPARSERLIB_EXPORTS
|
||||
endif
|
||||
ifeq ($(DEBUG),0)
|
||||
____DEBUG = -DNDEBUG
|
||||
endif
|
||||
ifeq ($(DEBUG),1)
|
||||
____DEBUG =
|
||||
endif
|
||||
ifeq ($(DEBUG),0)
|
||||
____DEBUG_3 = -O2
|
||||
endif
|
||||
ifeq ($(DEBUG),1)
|
||||
____DEBUG_3 = -O0
|
||||
endif
|
||||
ifeq ($(DEBUG),0)
|
||||
____DEBUG_8 =
|
||||
endif
|
||||
ifeq ($(DEBUG),1)
|
||||
____DEBUG_8 = -W -Wall
|
||||
endif
|
||||
ifeq ($(SHARED),0)
|
||||
____SHARED_1 =
|
||||
endif
|
||||
ifeq ($(SHARED),1)
|
||||
____SHARED_1 = -DUSINGDLL
|
||||
endif
|
||||
ifeq ($(DEBUG),0)
|
||||
____DEBUG_9 =
|
||||
endif
|
||||
ifeq ($(DEBUG),1)
|
||||
____DEBUG_9 = -g
|
||||
endif
|
||||
|
||||
|
||||
all: obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX):
|
||||
-if not exist obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX) mkdir obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)
|
||||
|
||||
### Targets: ###
|
||||
|
||||
all: $(__muParser_lib___depname) $(__muParser_dll___depname) $(__example1___depname) $(__example2___depname)
|
||||
|
||||
clean:
|
||||
-if exist obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.o del obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.o
|
||||
-if exist obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.d del obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.d
|
||||
-if exist ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a del ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a
|
||||
-if exist ..\lib\muparser$(DEBUG_BUILD_POSTFIX).dll del ..\lib\muparser$(DEBUG_BUILD_POSTFIX).dll
|
||||
-if exist ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a del ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a
|
||||
-if exist ..\samples\example1\example1.exe del ..\samples\example1\example1.exe
|
||||
-if exist ..\samples\example2\example2.exe del ..\samples\example2\example2.exe
|
||||
|
||||
ifeq ($(SHARED),0)
|
||||
..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a: $(MUPARSER_LIB_OBJECTS)
|
||||
if exist $@ del $@
|
||||
ar rcu $@ $(MUPARSER_LIB_OBJECTS)
|
||||
ranlib $@
|
||||
endif
|
||||
|
||||
ifeq ($(SHARED),1)
|
||||
..\lib\muparser$(DEBUG_BUILD_POSTFIX).dll: $(MUPARSER_DLL_OBJECTS)
|
||||
$(CXX) $(LINK_DLL_FLAGS) -fPIC -o $@ $(MUPARSER_DLL_OBJECTS) $(____DEBUG_9) -Wl,--out-implib=..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a $(LDFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(SAMPLES),1)
|
||||
ifeq ($(SHARED),0)
|
||||
..\samples\example1\example1.exe: $(EXAMPLE1_OBJECTS) $(__muParser_lib___depname)
|
||||
$(CXX) -o $@ $(EXAMPLE1_OBJECTS) $(____DEBUG_9) -L..\lib $(LDFLAGS) ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(SAMPLES),1)
|
||||
ifeq ($(SHARED),1)
|
||||
..\samples\example2\example2.exe: $(EXAMPLE2_OBJECTS) $(__muParser_lib___depname)
|
||||
$(CC) -o $@ $(EXAMPLE2_OBJECTS) $(____DEBUG_9) -L..\lib $(LDFLAGS) ..\lib\libmuparser$(DEBUG_BUILD_POSTFIX).a
|
||||
endif
|
||||
endif
|
||||
|
||||
lib: $(__muParser_lib___depname) $(__muParser_dll___depname)
|
||||
|
||||
samples: $(__example1___depname) $(__example2___depname)
|
||||
|
||||
documentation:
|
||||
( cd ..\docs && doxygen )
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParser.o: ../src/muParser.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBase.o: ../src/muParserBase.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBytecode.o: ../src/muParserBytecode.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserCallback.o: ../src/muParserCallback.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserDLL.o: ../src/muParserDLL.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserError.o: ../src/muParserError.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserInt.o: ../src/muParserInt.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTest.o: ../src/muParserTest.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTokenReader.o: ../src/muParserTokenReader.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_LIB_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParser.o: ../src/muParser.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBase.o: ../src/muParserBase.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBytecode.o: ../src/muParserBytecode.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserCallback.o: ../src/muParserCallback.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserDLL.o: ../src/muParserDLL.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserError.o: ../src/muParserError.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserInt.o: ../src/muParserInt.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTest.o: ../src/muParserTest.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTokenReader.o: ../src/muParserTokenReader.cpp
|
||||
$(CXX) -c -o $@ $(MUPARSER_DLL_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example1_example1.o: ../samples/example1/example1.cpp
|
||||
$(CXX) -c -o $@ $(EXAMPLE1_CXXFLAGS) $(CPPDEPS) $<
|
||||
|
||||
obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example2_example2.o: ../samples/example2/example2.c
|
||||
$(CC) -c -o $@ $(EXAMPLE2_CFLAGS) $(CPPDEPS) $<
|
||||
|
||||
.PHONY: all clean lib samples
|
||||
|
||||
|
||||
SHELL := $(COMSPEC)
|
||||
|
||||
# Dependencies tracking:
|
||||
-include obj\gcc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)/*.d
|
322
muparser/build/makefile.vc
Normal file
322
muparser/build/makefile.vc
Normal file
|
@ -0,0 +1,322 @@
|
|||
# =========================================================================
|
||||
# This makefile was generated by
|
||||
# Bakefile 0.2.9 (http://www.bakefile.org)
|
||||
# Do not modify, all changes will be overwritten!
|
||||
# =========================================================================
|
||||
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# These are configurable options:
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
# C compiler
|
||||
CC = cl
|
||||
|
||||
# C++ compiler
|
||||
CXX = cl
|
||||
|
||||
# Standard flags for CC
|
||||
CFLAGS =
|
||||
|
||||
# Standard flags for C++
|
||||
CXXFLAGS =
|
||||
|
||||
# Standard preprocessor flags (common for CC and CXX)
|
||||
CPPFLAGS =
|
||||
|
||||
# Standard linker flags
|
||||
LDFLAGS =
|
||||
|
||||
# Set to 1 to build debug version [0,1]
|
||||
# 0 - Release
|
||||
# 1 - Debug
|
||||
DEBUG = 0
|
||||
|
||||
# Set to 1 to build shared (DLL) version [0,1]
|
||||
# 0 - Static
|
||||
# 1 - DLL
|
||||
SHARED = 0
|
||||
|
||||
# Set to 1 to compile samples [0,1]
|
||||
SAMPLES = 1
|
||||
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Do not modify the rest of this file!
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
### Variables: ###
|
||||
|
||||
MUPARSER_LIB_CXXFLAGS = /MD$(DEBUG_3) /DWIN32 $(____DEBUG_8) $(____DEBUG) \
|
||||
$(____DEBUG_9) /Fd..\lib\muparser$(DEBUG_3).pdb $(____DEBUG_6) \
|
||||
$(______DEBUG) $(____SHARED) $(____SHARED_0) /D_WIN32 /I..\include /GR /EHsc \
|
||||
$(CPPFLAGS) $(CXXFLAGS)
|
||||
MUPARSER_LIB_OBJECTS = \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParser.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBase.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBytecode.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserCallback.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserDLL.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserError.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserInt.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTest.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTokenReader.obj
|
||||
MUPARSER_DLL_CXXFLAGS = /MD$(DEBUG_3) /DWIN32 $(____DEBUG_8) $(____DEBUG) \
|
||||
$(____DEBUG_9) /Fd..\lib\muparser$(DEBUG_3).pdb $(____DEBUG_6) \
|
||||
$(______DEBUG) $(____SHARED) $(____SHARED_0) /D_WIN32 /I..\include /GR /EHsc \
|
||||
$(CPPFLAGS) $(CXXFLAGS)
|
||||
MUPARSER_DLL_OBJECTS = \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParser.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBase.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBytecode.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserCallback.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserDLL.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserError.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserInt.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTest.obj \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTokenReader.obj
|
||||
EXAMPLE1_CXXFLAGS = /MD$(DEBUG_3) /DWIN32 $(____DEBUG_8) $(____DEBUG) \
|
||||
$(____DEBUG_9) /Fd..\samples\example1\example1.pdb $(____DEBUG_6) \
|
||||
$(______DEBUG) /I..\include $(____SHARED_1) /GR /EHsc $(CPPFLAGS) $(CXXFLAGS)
|
||||
EXAMPLE1_OBJECTS = \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example1_example1.obj
|
||||
EXAMPLE2_CFLAGS = /MD$(DEBUG_3) /DWIN32 $(____DEBUG_8) $(____DEBUG) \
|
||||
$(____DEBUG_9) /Fd..\samples\example2\example2.pdb $(____DEBUG_6) \
|
||||
$(______DEBUG) /I..\include $(____SHARED_1) $(CPPFLAGS) $(CFLAGS)
|
||||
EXAMPLE2_OBJECTS = \
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example2_example2.obj
|
||||
|
||||
### Conditionally set variables: ###
|
||||
|
||||
!if "$(DEBUG)" == "0"
|
||||
DEBUGBUILDPOSTFIX = rel
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
DEBUGBUILDPOSTFIX = dbg
|
||||
!endif
|
||||
!if "$(SHARED)" == "0"
|
||||
SHAREDBUILDPOSTFIX = static
|
||||
!endif
|
||||
!if "$(SHARED)" == "1"
|
||||
SHAREDBUILDPOSTFIX = shared
|
||||
!endif
|
||||
!if "$(SHARED)" == "0"
|
||||
__muParser_lib___depname = ..\lib\muparser$(DEBUG_3).lib
|
||||
!endif
|
||||
!if "$(SHARED)" == "1"
|
||||
__muParser_dll___depname = ..\lib\muparser$(DEBUG_3).dll
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_23_26 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_23_26 = $(____DEBUG_10)
|
||||
!endif
|
||||
!if "$(SAMPLES)" == "1" && "$(SHARED)" == "0"
|
||||
__example1___depname = ..\samples\example1\example1.exe
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_40_43 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_40_43 = $(____DEBUG_10)
|
||||
!endif
|
||||
!if "$(SAMPLES)" == "1" && "$(SHARED)" == "1"
|
||||
__example2___depname = ..\samples\example2\example2.exe
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_56_59 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_56_59 = $(____DEBUG_10)
|
||||
!endif
|
||||
!if "$(SHARED)" == "0"
|
||||
____SHARED =
|
||||
!endif
|
||||
!if "$(SHARED)" == "1"
|
||||
____SHARED = /DMUPARSER_DLL
|
||||
!endif
|
||||
!if "$(SHARED)" == "0"
|
||||
____SHARED_0 =
|
||||
!endif
|
||||
!if "$(SHARED)" == "1"
|
||||
____SHARED_0 = /DMUPARSERLIB_EXPORTS
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_8 = /DNDEBUG
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_8 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG = /O2
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG = /Od
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_9 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_9 = /Zi
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_5 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_5 = /DEBUG
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_6 = /w
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_6 = /W4
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
______DEBUG =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
______DEBUG = /D_DEBUG
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
DEBUG_3 =
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
DEBUG_3 = d
|
||||
!endif
|
||||
!if "$(DEBUG)" == "0"
|
||||
____DEBUG_10 = /opt:ref /opt:icf
|
||||
!endif
|
||||
!if "$(DEBUG)" == "1"
|
||||
____DEBUG_10 =
|
||||
!endif
|
||||
!if "$(SHARED)" == "0"
|
||||
____SHARED_1 =
|
||||
!endif
|
||||
!if "$(SHARED)" == "1"
|
||||
____SHARED_1 = /DUSINGDLL
|
||||
!endif
|
||||
|
||||
|
||||
all: obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX):
|
||||
-if not exist obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX) mkdir obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)
|
||||
|
||||
### Targets: ###
|
||||
|
||||
all: $(__muParser_lib___depname) $(__muParser_dll___depname) $(__example1___depname) $(__example2___depname)
|
||||
|
||||
clean:
|
||||
-if exist obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.obj del obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.obj
|
||||
-if exist obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.res del obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.res
|
||||
-if exist obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.pch del obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\*.pch
|
||||
-if exist ..\lib\muparser$(DEBUG_3).lib del ..\lib\muparser$(DEBUG_3).lib
|
||||
-if exist ..\lib\muparser$(DEBUG_3).dll del ..\lib\muparser$(DEBUG_3).dll
|
||||
-if exist ..\lib\muparser$(DEBUG_3).ilk del ..\lib\muparser$(DEBUG_3).ilk
|
||||
-if exist ..\lib\muparser$(DEBUG_3).pdb del ..\lib\muparser$(DEBUG_3).pdb
|
||||
-if exist ..\lib\muparser$(DEBUG_3).lib del ..\lib\muparser$(DEBUG_3).lib
|
||||
-if exist ..\samples\example1\example1.exe del ..\samples\example1\example1.exe
|
||||
-if exist ..\samples\example1\example1.ilk del ..\samples\example1\example1.ilk
|
||||
-if exist ..\samples\example1\example1.pdb del ..\samples\example1\example1.pdb
|
||||
-if exist ..\samples\example2\example2.exe del ..\samples\example2\example2.exe
|
||||
-if exist ..\samples\example2\example2.ilk del ..\samples\example2\example2.ilk
|
||||
-if exist ..\samples\example2\example2.pdb del ..\samples\example2\example2.pdb
|
||||
|
||||
!if "$(SHARED)" == "0"
|
||||
..\lib\muparser$(DEBUG_3).lib: $(MUPARSER_LIB_OBJECTS)
|
||||
if exist $@ del $@
|
||||
link /LIB /NOLOGO /OUT:$@ @<<
|
||||
$(MUPARSER_LIB_OBJECTS)
|
||||
<<
|
||||
!endif
|
||||
|
||||
!if "$(SHARED)" == "1"
|
||||
..\lib\muparser$(DEBUG_3).dll: $(MUPARSER_DLL_OBJECTS)
|
||||
link /DLL /NOLOGO /OUT:$@ $(____DEBUG_5) /pdb:"..\lib\muparser$(DEBUG_3).pdb" $(____DEBUG_23_26) $(LDFLAGS) @<<
|
||||
$(MUPARSER_DLL_OBJECTS) /IMPLIB:..\lib\muparser$(DEBUG_3).lib
|
||||
<<
|
||||
!endif
|
||||
|
||||
!if "$(SAMPLES)" == "1" && "$(SHARED)" == "0"
|
||||
..\samples\example1\example1.exe: $(EXAMPLE1_OBJECTS) $(__muParser_lib___depname)
|
||||
link /NOLOGO /OUT:$@ $(____DEBUG_5) /pdb:"..\samples\example1\example1.pdb" $(____DEBUG_40_43) /LIBPATH:..\lib $(LDFLAGS) @<<
|
||||
$(EXAMPLE1_OBJECTS) ..\lib\muparser$(DEBUG_3).lib
|
||||
<<
|
||||
!endif
|
||||
|
||||
!if "$(SAMPLES)" == "1" && "$(SHARED)" == "1"
|
||||
..\samples\example2\example2.exe: $(EXAMPLE2_OBJECTS) $(__muParser_lib___depname)
|
||||
link /NOLOGO /OUT:$@ $(____DEBUG_5) /pdb:"..\samples\example2\example2.pdb" $(____DEBUG_56_59) /LIBPATH:..\lib $(LDFLAGS) @<<
|
||||
$(EXAMPLE2_OBJECTS) ..\lib\muparser$(DEBUG_3).lib
|
||||
<<
|
||||
!endif
|
||||
|
||||
lib: $(__muParser_lib___depname) $(__muParser_dll___depname)
|
||||
|
||||
samples: $(__example1___depname) $(__example2___depname)
|
||||
|
||||
documentation:
|
||||
( cd ..\docs && doxygen )
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParser.obj: ..\src\muParser.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParser.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBase.obj: ..\src\muParserBase.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserBase.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserBytecode.obj: ..\src\muParserBytecode.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserBytecode.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserCallback.obj: ..\src\muParserCallback.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserCallback.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserDLL.obj: ..\src\muParserDLL.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserDLL.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserError.obj: ..\src\muParserError.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserError.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserInt.obj: ..\src\muParserInt.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserInt.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTest.obj: ..\src\muParserTest.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserTest.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_lib_muParserTokenReader.obj: ..\src\muParserTokenReader.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_LIB_CXXFLAGS) ..\src\muParserTokenReader.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParser.obj: ..\src\muParser.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParser.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBase.obj: ..\src\muParserBase.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserBase.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserBytecode.obj: ..\src\muParserBytecode.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserBytecode.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserCallback.obj: ..\src\muParserCallback.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserCallback.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserDLL.obj: ..\src\muParserDLL.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserDLL.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserError.obj: ..\src\muParserError.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserError.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserInt.obj: ..\src\muParserInt.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserInt.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTest.obj: ..\src\muParserTest.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserTest.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\muParser_dll_muParserTokenReader.obj: ..\src\muParserTokenReader.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(MUPARSER_DLL_CXXFLAGS) ..\src\muParserTokenReader.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example1_example1.obj: ..\samples\example1\example1.cpp
|
||||
$(CXX) /c /nologo /TP /Fo$@ $(EXAMPLE1_CXXFLAGS) ..\samples\example1\example1.cpp
|
||||
|
||||
obj\vc_$(SHAREDBUILDPOSTFIX)_$(DEBUGBUILDPOSTFIX)\example2_example2.obj: ..\samples\example2\example2.c
|
||||
$(CC) /c /nologo /TC /Fo$@ $(EXAMPLE2_CFLAGS) ..\samples\example2\example2.c
|
||||
|
119
muparser/build/msvc2013/muparser.sln
Normal file
119
muparser/build/msvc2013/muparser.sln
Normal file
|
@ -0,0 +1,119 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.21005.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "muparser", "muparser_muParser.vcxproj", "{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example1", "muparser_example1.vcxproj", "{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example2", "muparser_example2.vcxproj", "{B405983E-B929-5BCF-8CC8-03CF34796A23}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug DLL|Any CPU = Debug DLL|Any CPU
|
||||
Debug DLL|Mixed Platforms = Debug DLL|Mixed Platforms
|
||||
Debug DLL|Win32 = Debug DLL|Win32
|
||||
Debug DLL|x64 = Debug DLL|x64
|
||||
Debug Static|Any CPU = Debug Static|Any CPU
|
||||
Debug Static|Mixed Platforms = Debug Static|Mixed Platforms
|
||||
Debug Static|Win32 = Debug Static|Win32
|
||||
Debug Static|x64 = Debug Static|x64
|
||||
Release DLL|Any CPU = Release DLL|Any CPU
|
||||
Release DLL|Mixed Platforms = Release DLL|Mixed Platforms
|
||||
Release DLL|Win32 = Release DLL|Win32
|
||||
Release DLL|x64 = Release DLL|x64
|
||||
Release Static|Any CPU = Release Static|Any CPU
|
||||
Release Static|Mixed Platforms = Release Static|Mixed Platforms
|
||||
Release Static|Win32 = Release Static|Win32
|
||||
Release Static|x64 = Release Static|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|Any CPU.ActiveCfg = Debug DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|Any CPU.Build.0 = Debug DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|Mixed Platforms.ActiveCfg = Debug DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|Mixed Platforms.Build.0 = Debug DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|Win32.ActiveCfg = Debug DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|Win32.Build.0 = Debug DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|x64.ActiveCfg = Debug DLL|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug DLL|x64.Build.0 = Debug DLL|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|Any CPU.ActiveCfg = Debug Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|Any CPU.Build.0 = Debug Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|Mixed Platforms.ActiveCfg = Debug Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|Mixed Platforms.Build.0 = Debug Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|Win32.ActiveCfg = Debug Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|Win32.Build.0 = Debug Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|x64.ActiveCfg = Debug Static|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Debug Static|x64.Build.0 = Debug Static|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|Any CPU.ActiveCfg = Release DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|Any CPU.Build.0 = Release DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|Mixed Platforms.ActiveCfg = Release DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|Mixed Platforms.Build.0 = Release DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|Win32.ActiveCfg = Release DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|Win32.Build.0 = Release DLL|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|x64.ActiveCfg = Release DLL|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release DLL|x64.Build.0 = Release DLL|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|Any CPU.ActiveCfg = Release Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|Any CPU.Build.0 = Release Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|Mixed Platforms.ActiveCfg = Release Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|Mixed Platforms.Build.0 = Release Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|Win32.ActiveCfg = Release Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|Win32.Build.0 = Release Static|Win32
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|x64.ActiveCfg = Release Static|x64
|
||||
{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}.Release Static|x64.Build.0 = Release Static|x64
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug DLL|Any CPU.ActiveCfg = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug DLL|Mixed Platforms.ActiveCfg = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug DLL|Mixed Platforms.Build.0 = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug DLL|Win32.ActiveCfg = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug DLL|x64.ActiveCfg = Debug Static|x64
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|Any CPU.ActiveCfg = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|Any CPU.Build.0 = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|Mixed Platforms.ActiveCfg = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|Mixed Platforms.Build.0 = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|Win32.ActiveCfg = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|Win32.Build.0 = Debug Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|x64.ActiveCfg = Debug Static|x64
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Debug Static|x64.Build.0 = Debug Static|x64
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release DLL|Any CPU.ActiveCfg = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release DLL|Mixed Platforms.ActiveCfg = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release DLL|Mixed Platforms.Build.0 = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release DLL|Win32.ActiveCfg = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release DLL|x64.ActiveCfg = Release Static|x64
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|Any CPU.ActiveCfg = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|Any CPU.Build.0 = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|Mixed Platforms.ActiveCfg = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|Mixed Platforms.Build.0 = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|Win32.ActiveCfg = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|Win32.Build.0 = Release Static|Win32
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|x64.ActiveCfg = Release Static|x64
|
||||
{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}.Release Static|x64.Build.0 = Release Static|x64
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|Any CPU.ActiveCfg = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|Any CPU.Build.0 = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|Mixed Platforms.ActiveCfg = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|Mixed Platforms.Build.0 = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|Win32.ActiveCfg = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|Win32.Build.0 = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|x64.ActiveCfg = Debug DLL|x64
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug DLL|x64.Build.0 = Debug DLL|x64
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug Static|Any CPU.ActiveCfg = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug Static|Mixed Platforms.ActiveCfg = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug Static|Mixed Platforms.Build.0 = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug Static|Win32.ActiveCfg = Debug DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Debug Static|x64.ActiveCfg = Debug DLL|x64
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|Any CPU.ActiveCfg = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|Any CPU.Build.0 = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|Mixed Platforms.ActiveCfg = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|Mixed Platforms.Build.0 = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|Win32.ActiveCfg = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|Win32.Build.0 = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|x64.ActiveCfg = Release DLL|x64
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release DLL|x64.Build.0 = Release DLL|x64
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release Static|Any CPU.ActiveCfg = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release Static|Mixed Platforms.ActiveCfg = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release Static|Mixed Platforms.Build.0 = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release Static|Win32.ActiveCfg = Release DLL|Win32
|
||||
{B405983E-B929-5BCF-8CC8-03CF34796A23}.Release Static|x64.ActiveCfg = Release DLL|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
238
muparser/build/msvc2013/muparser_example1.vcxproj
Normal file
238
muparser/build/msvc2013/muparser_example1.vcxproj
Normal file
|
@ -0,0 +1,238 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug Static|Win32">
|
||||
<Configuration>Debug Static</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug Static|x64">
|
||||
<Configuration>Debug Static</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release Static|Win32">
|
||||
<Configuration>Release Static</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release Static|x64">
|
||||
<Configuration>Release Static</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>example1</ProjectName>
|
||||
<ProjectGuid>{A1DCD664-8803-54E2-B35F-84D96B9CA6DF}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">..\..\samples\example1\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">obj\vc_static_rel\example1\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">false</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">true</GenerateManifest>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">..\..\samples\example1\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">obj\vc_static_dbg\example1\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">true</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">true</GenerateManifest>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">..\..\samples\example1\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">obj\vc_static_rel\example1\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">false</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">..\..\samples\example1\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">obj\vc_static_dbg\example1\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">true</LinkIncremental>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" />
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<ObjectFileName>obj\vc_static_rel\example1\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\samples\example1\example1.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>
|
||||
</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>..\..\lib\muparser32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example1\example1.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<ProgramDatabaseFile>..\..\samples\example1\example1.pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\samples\example1\muparser_example1.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<ObjectFileName>obj\vc_static_dbg\example1\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\samples\example1\example1.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_CONSOLE;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>..\..\lib\muparserd32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example1\example1.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>..\..\samples\example1\example1.pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\samples\example1\muparser_example1.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<ObjectFileName>obj\vc_static_rel\example1\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\samples\example1\example1.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\..\lib\muparser64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example1\example1.exe</OutputFile>
|
||||
<AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<SubSystem>Console</SubSystem>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_CONSOLE;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
<ObjectFileName>obj\vc_static_dbg\example1\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\samples\example1\example1.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\..\lib\muparserd64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example1\example1.exe</OutputFile>
|
||||
<AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>..\..\samples\example1\example1.pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>NotSet</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\samples\example1\example1.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="muparser_muParser.vcxproj">
|
||||
<Project>{2a1f639a-7642-57cc-bf97-3ec5b5c89d91}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
14
muparser/build/msvc2013/muparser_example1.vcxproj.filters
Normal file
14
muparser/build/msvc2013/muparser_example1.vcxproj.filters
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\samples\example1\example1.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
208
muparser/build/msvc2013/muparser_example2.vcxproj
Normal file
208
muparser/build/msvc2013/muparser_example2.vcxproj
Normal file
|
@ -0,0 +1,208 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug DLL|Win32">
|
||||
<Configuration>Debug DLL</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug DLL|x64">
|
||||
<Configuration>Debug DLL</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release DLL|Win32">
|
||||
<Configuration>Release DLL</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release DLL|x64">
|
||||
<Configuration>Release DLL</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>example2</ProjectName>
|
||||
<ProjectGuid>{B405983E-B929-5BCF-8CC8-03CF34796A23}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">..\..\samples\example2\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">obj\vc_shared_rel\example2\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">false</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">true</GenerateManifest>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">..\..\samples\example2\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">obj\vc_shared_rel\example2\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">..\..\samples\example2\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">obj\vc_shared_dbg\example2\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">true</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">true</GenerateManifest>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">..\..\samples\example2\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">obj\vc_shared_dbg\example2\</IntDir>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" />
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;NDEBUG;USINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;NDEBUG;USINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<ObjectFileName>obj\vc_shared_rel\example2\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\samples\example2\example2.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>
|
||||
</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_CONSOLE;NDEBUG;USINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>..\..\lib\muparser32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example2\example2.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<ProgramDatabaseFile>..\..\samples\example2\example2.pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\samples\example2\muparser_example2.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\..\lib\muparser64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example2\example2.exe</OutputFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;_DEBUG;USINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_CONSOLE;_DEBUG;USINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<ObjectFileName>obj\vc_shared_dbg\example2\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\samples\example2\example2.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_CONSOLE;_DEBUG;USINGDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>..\..\lib\muparserd32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example2\example2.exe</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>..\..\samples\example2\example2.pdb</ProgramDatabaseFile>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\samples\example2\muparser_example2.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\..\lib\muparserd64.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\samples\example2\example2.exe</OutputFile>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\samples\example2\example2.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="muparser_muParser.vcxproj">
|
||||
<Project>{2a1f639a-7642-57cc-bf97-3ec5b5c89d91}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
14
muparser/build/msvc2013/muparser_example2.vcxproj.filters
Normal file
14
muparser/build/msvc2013/muparser_example2.vcxproj.filters
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\samples\example2\example2.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
411
muparser/build/msvc2013/muparser_muParser.vcxproj
Normal file
411
muparser/build/msvc2013/muparser_muParser.vcxproj
Normal file
|
@ -0,0 +1,411 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug DLL|Win32">
|
||||
<Configuration>Debug DLL</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug DLL|x64">
|
||||
<Configuration>Debug DLL</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug Static|Win32">
|
||||
<Configuration>Debug Static</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug Static|x64">
|
||||
<Configuration>Debug Static</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release DLL|Win32">
|
||||
<Configuration>Release DLL</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release DLL|x64">
|
||||
<Configuration>Release DLL</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release Static|Win32">
|
||||
<Configuration>Release Static</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release Static|x64">
|
||||
<Configuration>Release Static</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>muparser</ProjectName>
|
||||
<ProjectGuid>{2A1F639A-7642-57CC-BF97-3EC5B5C89D91}</ProjectGuid>
|
||||
<RootNamespace>muParser</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>v120</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">obj\vc_static_rel\muParser\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">obj\vc_shared_rel\muParser\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">false</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">true</GenerateManifest>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">obj\vc_static_dbg\muParser\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">obj\vc_shared_dbg\muParser\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">true</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">true</GenerateManifest>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">obj\vc_static_rel\muParser\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">obj\vc_shared_rel\muParser\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">obj\vc_static_dbg\muParser\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">..\..\lib\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">obj\vc_shared_dbg\muParser\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">true</LinkIncremental>
|
||||
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">true</GenerateManifest>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" />
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_LIB;NDEBUG;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_LIB;NDEBUG;_WIN32;MUP_USE_OPENMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<ObjectFileName>obj\vc_static_rel\muParser\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\lib\muparser.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>
|
||||
</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<OutputFile>..\..\lib\muparser32.lib</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\lib\muparser_muParser.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_USRDLL;DLL_EXPORTS;NDEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_USRDLL;DLL_EXPORTS;NDEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_WIN32;MUP_USE_OPENMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<OpenMPSupport>true</OpenMPSupport>
|
||||
<ObjectFileName>obj\vc_shared_rel\muParser\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\lib\muparser32.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>
|
||||
</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>NDEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\lib\muparser32.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<ProgramDatabaseFile>..\..\lib\muparser.pdb</ProgramDatabaseFile>
|
||||
<ImportLibrary>..\..\lib\muparser32.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\lib\muparser_muParser.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_LIB;_DEBUG;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_LIB;_DEBUG;_WIN32;MUP_USE_OPENMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<SmallerTypeCheck>true</SmallerTypeCheck>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<ObjectFileName>obj\vc_static_dbg\muParser\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\lib\muparserd.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Lib>
|
||||
<OutputFile>..\..\lib\muparserd32.lib</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</Lib>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\lib\muparser_muParser.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|Win32'">
|
||||
<Midl>
|
||||
<PreprocessorDefinitions>WIN32;_USRDLL;DLL_EXPORTS;_DEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_USRDLL;DLL_EXPORTS;_DEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_WIN32;_CRT_SECURE_NO_WARNINGS;MUP_USE_OPENMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<BufferSecurityCheck>true</BufferSecurityCheck>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<OpenMPSupport>true</OpenMPSupport>
|
||||
<ObjectFileName>obj\vc_shared_dbg\muParser\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\lib\muparserd32.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>..\..\lib\muparserd32.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>..\..\lib\muparserd32.pdb</ProgramDatabaseFile>
|
||||
<ImportLibrary>..\..\lib\muparserd32.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>..\..\lib\muparser_muParser.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_LIB;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Lib>
|
||||
<OutputFile>..\..\lib\muparser64.lib</OutputFile>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DLL|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_USRDLL;DLL_EXPORTS;NDEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;MUP_USE_OPENMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<ObjectFileName>obj\vc_shared_rel\muParser\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\lib\muparser64.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>..\..\lib\muparser64.dll</OutputFile>
|
||||
<ImportLibrary>..\..\lib\muparser64.lib</ImportLibrary>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<SmallerTypeCheck>true</SmallerTypeCheck>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<Optimization>Disabled</Optimization>
|
||||
</ClCompile>
|
||||
<Lib>
|
||||
<OutputFile>..\..\lib\muparserd64.lib</OutputFile>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug DLL|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>_USRDLL;DLL_EXPORTS;_DEBUG;MUPARSER_DLL;MUPARSERLIB_EXPORTS;_CRT_SECURE_NO_WARNINGS;MUP_USE_OPENMP;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<ObjectFileName>obj\vc_shared_dbg\muParser\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>..\..\lib\muparserd64.pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>..\..\lib\muparserd64.dll</OutputFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>..\..\lib\muparserd64.pdb</ProgramDatabaseFile>
|
||||
<ImportLibrary>..\..\lib\muparserd64.lib</ImportLibrary>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\muParser.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserBase.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserBytecode.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserCallback.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserDLL.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserError.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserInt.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserTest.cpp" />
|
||||
<ClCompile Include="..\..\src\muParserTokenReader.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\muParser.h" />
|
||||
<ClInclude Include="..\..\include\muParserBase.h" />
|
||||
<ClInclude Include="..\..\include\muParserBytecode.h" />
|
||||
<ClInclude Include="..\..\include\muParserCallback.h" />
|
||||
<ClInclude Include="..\..\include\muParserDef.h" />
|
||||
<ClInclude Include="..\..\include\muParserDLL.h" />
|
||||
<ClInclude Include="..\..\include\muParserError.h" />
|
||||
<ClInclude Include="..\..\include\muParserFixes.h" />
|
||||
<ClInclude Include="..\..\include\muParserInt.h" />
|
||||
<ClInclude Include="..\..\include\muParserStack.h" />
|
||||
<ClInclude Include="..\..\include\muParserTemplateMagic.h" />
|
||||
<ClInclude Include="..\..\include\muParserTest.h" />
|
||||
<ClInclude Include="..\..\include\muParserToken.h" />
|
||||
<ClInclude Include="..\..\include\muParserTokenReader.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
86
muparser/build/msvc2013/muparser_muParser.vcxproj.filters
Normal file
86
muparser/build/msvc2013/muparser_muParser.vcxproj.filters
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\src\muParser.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserBase.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserBytecode.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserCallback.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserDLL.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserError.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserInt.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserTest.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\muParserTokenReader.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\include\muParser.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserBase.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserBytecode.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserCallback.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserDef.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserDLL.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserError.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserFixes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserInt.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserStack.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserTest.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserToken.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserTokenReader.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\muParserTemplateMagic.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
8354
muparser/configure
vendored
Executable file
8354
muparser/configure
vendored
Executable file
File diff suppressed because it is too large
Load diff
1563
muparser/docs/Doxyfile
Normal file
1563
muparser/docs/Doxyfile
Normal file
File diff suppressed because it is too large
Load diff
15
muparser/docs/muparser_doc.html
Normal file
15
muparser/docs/muparser_doc.html
Normal file
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html style="height:100%;">
|
||||
<head>
|
||||
</head>
|
||||
|
||||
<body style="height:100%; overflow:hidden;">
|
||||
|
||||
<div style="border: 0px; position:absolute; top:0px; left:0px; width:100%; bottom:0px; padding:0px; margin:0px;">
|
||||
<iframe src="http://muparser.beltoforion.de" style="border: 0px; width:100%; height:100%;">
|
||||
Sorry, your browser doesn't support IFrames. Click <a href="http://muparser.beltoforion.de">here</a> to load the muparser documentation directly.
|
||||
</iframe>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
115
muparser/include/muParser.h
Normal file
115
muparser/include/muParser.h
Normal file
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef MU_PARSER_H
|
||||
#define MU_PARSER_H
|
||||
|
||||
//--- Standard includes ------------------------------------------------------------------------
|
||||
#include <vector>
|
||||
|
||||
//--- Parser includes --------------------------------------------------------------------------
|
||||
#include "muParserBase.h"
|
||||
#include "muParserTemplateMagic.h"
|
||||
|
||||
/** \file
|
||||
\brief Definition of the standard floating point parser.
|
||||
*/
|
||||
|
||||
namespace mu
|
||||
{
|
||||
/** \brief Mathematical expressions parser.
|
||||
|
||||
Standard implementation of the mathematical expressions parser.
|
||||
Can be used as a reference implementation for subclassing the parser.
|
||||
|
||||
<small>
|
||||
(C) 2011 Ingo Berg<br>
|
||||
muparser(at)beltoforion.de
|
||||
</small>
|
||||
*/
|
||||
/* final */ class Parser : public ParserBase
|
||||
{
|
||||
public:
|
||||
|
||||
Parser();
|
||||
|
||||
virtual void InitCharSets();
|
||||
virtual void InitFun();
|
||||
virtual void InitConst();
|
||||
virtual void InitOprt();
|
||||
virtual void OnDetectVar(string_type *pExpr, int &nStart, int &nEnd);
|
||||
|
||||
value_type Diff(value_type *a_Var,
|
||||
value_type a_fPos,
|
||||
value_type a_fEpsilon = 0) const;
|
||||
|
||||
protected:
|
||||
|
||||
// Trigonometric functions
|
||||
static value_type Sin(value_type);
|
||||
static value_type Cos(value_type);
|
||||
static value_type Tan(value_type);
|
||||
static value_type Tan2(value_type, value_type);
|
||||
// arcus functions
|
||||
static value_type ASin(value_type);
|
||||
static value_type ACos(value_type);
|
||||
static value_type ATan(value_type);
|
||||
static value_type ATan2(value_type, value_type);
|
||||
|
||||
// hyperbolic functions
|
||||
static value_type Sinh(value_type);
|
||||
static value_type Cosh(value_type);
|
||||
static value_type Tanh(value_type);
|
||||
// arcus hyperbolic functions
|
||||
static value_type ASinh(value_type);
|
||||
static value_type ACosh(value_type);
|
||||
static value_type ATanh(value_type);
|
||||
// Logarithm functions
|
||||
static value_type Log2(value_type); // Logarithm Base 2
|
||||
static value_type Log10(value_type); // Logarithm Base 10
|
||||
static value_type Ln(value_type); // Logarithm Base e (natural logarithm)
|
||||
// misc
|
||||
static value_type Exp(value_type);
|
||||
static value_type Abs(value_type);
|
||||
static value_type Sqrt(value_type);
|
||||
static value_type Rint(value_type);
|
||||
static value_type Sign(value_type);
|
||||
|
||||
// Prefix operators
|
||||
// !!! Unary Minus is a MUST if you want to use negative signs !!!
|
||||
static value_type UnaryMinus(value_type);
|
||||
static value_type UnaryPlus(value_type);
|
||||
|
||||
// Functions with variable number of arguments
|
||||
static value_type Sum(const value_type*, int); // sum
|
||||
static value_type Avg(const value_type*, int); // mean value
|
||||
static value_type Min(const value_type*, int); // minimum
|
||||
static value_type Max(const value_type*, int); // maximum
|
||||
|
||||
static int IsVal(const char_type* a_szExpr, int *a_iPos, value_type *a_fVal);
|
||||
};
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
317
muparser/include/muParserBase.h
Normal file
317
muparser/include/muParserBase.h
Normal file
|
@ -0,0 +1,317 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef MU_PARSER_BASE_H
|
||||
#define MU_PARSER_BASE_H
|
||||
|
||||
//--- Standard includes ------------------------------------------------------------------------
|
||||
#include <cmath>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <locale>
|
||||
#include <limits.h>
|
||||
|
||||
//--- Parser includes --------------------------------------------------------------------------
|
||||
#include "muParserDef.h"
|
||||
#include "muParserStack.h"
|
||||
#include "muParserTokenReader.h"
|
||||
#include "muParserBytecode.h"
|
||||
#include "muParserError.h"
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
/** \file
|
||||
\brief This file contains the class definition of the muparser engine.
|
||||
*/
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/** \brief Mathematical expressions parser (base parser engine).
|
||||
\author (C) 2013 Ingo Berg
|
||||
|
||||
This is the implementation of a bytecode based mathematical expressions parser.
|
||||
The formula will be parsed from string and converted into a bytecode.
|
||||
Future calculations will be done with the bytecode instead the formula string
|
||||
resulting in a significant performance increase.
|
||||
Complementary to a set of internally implemented functions the parser is able to handle
|
||||
user defined functions and variables.
|
||||
*/
|
||||
class ParserBase
|
||||
{
|
||||
friend class ParserTokenReader;
|
||||
|
||||
private:
|
||||
|
||||
/** \brief Typedef for the parse functions.
|
||||
|
||||
The parse function do the actual work. The parser exchanges
|
||||
the function pointer to the parser function depending on
|
||||
which state it is in. (i.e. bytecode parser vs. string parser)
|
||||
*/
|
||||
typedef value_type (ParserBase::*ParseFunction)() const;
|
||||
|
||||
/** \brief Type used for storing an array of values. */
|
||||
typedef std::vector<value_type> valbuf_type;
|
||||
|
||||
/** \brief Type for a vector of strings. */
|
||||
typedef std::vector<string_type> stringbuf_type;
|
||||
|
||||
/** \brief Typedef for the token reader. */
|
||||
typedef ParserTokenReader token_reader_type;
|
||||
|
||||
/** \brief Type used for parser tokens. */
|
||||
typedef ParserToken<value_type, string_type> token_type;
|
||||
|
||||
/** \brief Maximum number of threads spawned by OpenMP when using the bulk mode. */
|
||||
static const int s_MaxNumOpenMPThreads = 16;
|
||||
|
||||
public:
|
||||
|
||||
/** \brief Type of the error class.
|
||||
|
||||
Included for backwards compatibility.
|
||||
*/
|
||||
typedef ParserError exception_type;
|
||||
|
||||
static void EnableDebugDump(bool bDumpCmd, bool bDumpStack);
|
||||
|
||||
ParserBase();
|
||||
ParserBase(const ParserBase &a_Parser);
|
||||
ParserBase& operator=(const ParserBase &a_Parser);
|
||||
|
||||
virtual ~ParserBase();
|
||||
|
||||
value_type Eval() const;
|
||||
value_type* Eval(int &nStackSize) const;
|
||||
void Eval(value_type *results, int nBulkSize);
|
||||
|
||||
int GetNumResults() const;
|
||||
|
||||
void SetExpr(const string_type &a_sExpr);
|
||||
void SetVarFactory(facfun_type a_pFactory, void *pUserData = NULL);
|
||||
|
||||
void SetDecSep(char_type cDecSep);
|
||||
void SetThousandsSep(char_type cThousandsSep = 0);
|
||||
void ResetLocale();
|
||||
|
||||
void EnableOptimizer(bool a_bIsOn=true);
|
||||
void EnableBuiltInOprt(bool a_bIsOn=true);
|
||||
|
||||
bool HasBuiltInOprt() const;
|
||||
void AddValIdent(identfun_type a_pCallback);
|
||||
|
||||
/** \fn void mu::ParserBase::DefineFun(const string_type &a_strName, fun_type0 a_pFun, bool a_bAllowOpt = true)
|
||||
\brief Define a parser function without arguments.
|
||||
\param a_strName Name of the function
|
||||
\param a_pFun Pointer to the callback function
|
||||
\param a_bAllowOpt A flag indicating this function may be optimized
|
||||
*/
|
||||
template<typename T>
|
||||
void DefineFun(const string_type &a_strName, T a_pFun, bool a_bAllowOpt = true)
|
||||
{
|
||||
AddCallback( a_strName, ParserCallback(a_pFun, a_bAllowOpt), m_FunDef, ValidNameChars() );
|
||||
}
|
||||
|
||||
void DefineOprt(const string_type &a_strName,
|
||||
fun_type2 a_pFun,
|
||||
unsigned a_iPri=0,
|
||||
EOprtAssociativity a_eAssociativity = oaLEFT,
|
||||
bool a_bAllowOpt = false);
|
||||
void DefineConst(const string_type &a_sName, value_type a_fVal);
|
||||
void DefineStrConst(const string_type &a_sName, const string_type &a_strVal);
|
||||
void DefineVar(const string_type &a_sName, value_type *a_fVar);
|
||||
void DefinePostfixOprt(const string_type &a_strFun, fun_type1 a_pOprt, bool a_bAllowOpt=true);
|
||||
void DefineInfixOprt(const string_type &a_strName, fun_type1 a_pOprt, int a_iPrec=prINFIX, bool a_bAllowOpt=true);
|
||||
|
||||
// Clear user defined variables, constants or functions
|
||||
void ClearVar();
|
||||
void ClearFun();
|
||||
void ClearConst();
|
||||
void ClearInfixOprt();
|
||||
void ClearPostfixOprt();
|
||||
void ClearOprt();
|
||||
|
||||
void RemoveVar(const string_type &a_strVarName);
|
||||
const varmap_type& GetUsedVar() const;
|
||||
const varmap_type& GetVar() const;
|
||||
const valmap_type& GetConst() const;
|
||||
const string_type& GetExpr() const;
|
||||
const funmap_type& GetFunDef() const;
|
||||
string_type GetVersion(EParserVersionInfo eInfo = pviFULL) const;
|
||||
|
||||
const char_type ** GetOprtDef() const;
|
||||
void DefineNameChars(const char_type *a_szCharset);
|
||||
void DefineOprtChars(const char_type *a_szCharset);
|
||||
void DefineInfixOprtChars(const char_type *a_szCharset);
|
||||
|
||||
const char_type* ValidNameChars() const;
|
||||
const char_type* ValidOprtChars() const;
|
||||
const char_type* ValidInfixOprtChars() const;
|
||||
|
||||
void SetArgSep(char_type cArgSep);
|
||||
char_type GetArgSep() const;
|
||||
|
||||
void Error(EErrorCodes a_iErrc,
|
||||
int a_iPos = (int)mu::string_type::npos,
|
||||
const string_type &a_strTok = string_type() ) const;
|
||||
|
||||
protected:
|
||||
|
||||
void Init();
|
||||
|
||||
virtual void InitCharSets() = 0;
|
||||
virtual void InitFun() = 0;
|
||||
virtual void InitConst() = 0;
|
||||
virtual void InitOprt() = 0;
|
||||
|
||||
virtual void OnDetectVar(string_type *pExpr, int &nStart, int &nEnd);
|
||||
|
||||
static const char_type *c_DefaultOprt[];
|
||||
static std::locale s_locale; ///< The locale used by the parser
|
||||
static bool g_DbgDumpCmdCode;
|
||||
static bool g_DbgDumpStack;
|
||||
|
||||
/** \brief A facet class used to change decimal and thousands separator. */
|
||||
template<class TChar>
|
||||
class change_dec_sep : public std::numpunct<TChar>
|
||||
{
|
||||
public:
|
||||
|
||||
explicit change_dec_sep(char_type cDecSep, char_type cThousandsSep = 0, int nGroup = 3)
|
||||
:std::numpunct<TChar>()
|
||||
,m_nGroup(nGroup)
|
||||
,m_cDecPoint(cDecSep)
|
||||
,m_cThousandsSep(cThousandsSep)
|
||||
{}
|
||||
|
||||
protected:
|
||||
|
||||
virtual char_type do_decimal_point() const
|
||||
{
|
||||
return m_cDecPoint;
|
||||
}
|
||||
|
||||
virtual char_type do_thousands_sep() const
|
||||
{
|
||||
return m_cThousandsSep;
|
||||
}
|
||||
|
||||
virtual std::string do_grouping() const
|
||||
{
|
||||
// fix for issue 4: https://code.google.com/p/muparser/issues/detail?id=4
|
||||
// courtesy of Jens Bartsch
|
||||
// original code:
|
||||
// return std::string(1, (char)m_nGroup);
|
||||
// new code:
|
||||
return std::string(1, (char)(m_cThousandsSep > 0 ? m_nGroup : CHAR_MAX));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int m_nGroup;
|
||||
char_type m_cDecPoint;
|
||||
char_type m_cThousandsSep;
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
void Assign(const ParserBase &a_Parser);
|
||||
void InitTokenReader();
|
||||
void ReInit() const;
|
||||
|
||||
void AddCallback( const string_type &a_strName,
|
||||
const ParserCallback &a_Callback,
|
||||
funmap_type &a_Storage,
|
||||
const char_type *a_szCharSet );
|
||||
|
||||
void ApplyRemainingOprt(ParserStack<token_type> &a_stOpt,
|
||||
ParserStack<token_type> &a_stVal) const;
|
||||
void ApplyBinOprt(ParserStack<token_type> &a_stOpt,
|
||||
ParserStack<token_type> &a_stVal) const;
|
||||
|
||||
void ApplyIfElse(ParserStack<token_type> &a_stOpt,
|
||||
ParserStack<token_type> &a_stVal) const;
|
||||
|
||||
void ApplyFunc(ParserStack<token_type> &a_stOpt,
|
||||
ParserStack<token_type> &a_stVal,
|
||||
int iArgCount) const;
|
||||
|
||||
token_type ApplyStrFunc(const token_type &a_FunTok,
|
||||
const std::vector<token_type> &a_vArg) const;
|
||||
|
||||
int GetOprtPrecedence(const token_type &a_Tok) const;
|
||||
EOprtAssociativity GetOprtAssociativity(const token_type &a_Tok) const;
|
||||
|
||||
void CreateRPN() const;
|
||||
|
||||
value_type ParseString() const;
|
||||
value_type ParseCmdCode() const;
|
||||
value_type ParseCmdCodeBulk(int nOffset, int nThreadID) const;
|
||||
|
||||
void CheckName(const string_type &a_strName, const string_type &a_CharSet) const;
|
||||
void CheckOprt(const string_type &a_sName,
|
||||
const ParserCallback &a_Callback,
|
||||
const string_type &a_szCharSet) const;
|
||||
|
||||
void StackDump(const ParserStack<token_type > &a_stVal,
|
||||
const ParserStack<token_type > &a_stOprt) const;
|
||||
|
||||
/** \brief Pointer to the parser function.
|
||||
|
||||
Eval() calls the function whose address is stored there.
|
||||
*/
|
||||
mutable ParseFunction m_pParseFormula;
|
||||
mutable ParserByteCode m_vRPN; ///< The Bytecode class.
|
||||
mutable stringbuf_type m_vStringBuf; ///< String buffer, used for storing string function arguments
|
||||
stringbuf_type m_vStringVarBuf;
|
||||
|
||||
std::auto_ptr<token_reader_type> m_pTokenReader; ///< Managed pointer to the token reader object.
|
||||
|
||||
funmap_type m_FunDef; ///< Map of function names and pointers.
|
||||
funmap_type m_PostOprtDef; ///< Postfix operator callbacks
|
||||
funmap_type m_InfixOprtDef; ///< unary infix operator.
|
||||
funmap_type m_OprtDef; ///< Binary operator callbacks
|
||||
valmap_type m_ConstDef; ///< user constants.
|
||||
strmap_type m_StrVarDef; ///< user defined string constants
|
||||
varmap_type m_VarDef; ///< user defind variables.
|
||||
|
||||
bool m_bBuiltInOp; ///< Flag that can be used for switching built in operators on and off
|
||||
|
||||
string_type m_sNameChars; ///< Charset for names
|
||||
string_type m_sOprtChars; ///< Charset for postfix/ binary operator tokens
|
||||
string_type m_sInfixOprtChars; ///< Charset for infix operator tokens
|
||||
|
||||
mutable int m_nIfElseCounter; ///< Internal counter for keeping track of nested if-then-else clauses
|
||||
|
||||
// items merely used for caching state information
|
||||
mutable valbuf_type m_vStackBuffer; ///< This is merely a buffer used for the stack in the cmd parsing routine
|
||||
mutable int m_nFinalResultIdx;
|
||||
};
|
||||
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
141
muparser/include/muParserBytecode.h
Normal file
141
muparser/include/muParserBytecode.h
Normal file
|
@ -0,0 +1,141 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef MU_PARSER_BYTECODE_H
|
||||
#define MU_PARSER_BYTECODE_H
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
|
||||
#include "muParserDef.h"
|
||||
#include "muParserError.h"
|
||||
#include "muParserToken.h"
|
||||
|
||||
/** \file
|
||||
\brief Definition of the parser bytecode class.
|
||||
*/
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
struct SToken
|
||||
{
|
||||
ECmdCode Cmd;
|
||||
int StackPos;
|
||||
|
||||
union
|
||||
{
|
||||
struct //SValData
|
||||
{
|
||||
value_type *ptr;
|
||||
value_type data;
|
||||
value_type data2;
|
||||
} Val;
|
||||
|
||||
struct //SFunData
|
||||
{
|
||||
// Note: generic_fun_type is merely a placeholder. The real type could be
|
||||
// anything between gun_type1 and fun_type9. I can't use a void
|
||||
// pointer due to constraints in the ANSI standard which allows
|
||||
// data pointers and function pointers to differ in size.
|
||||
generic_fun_type ptr;
|
||||
int argc;
|
||||
int idx;
|
||||
} Fun;
|
||||
|
||||
struct //SOprtData
|
||||
{
|
||||
value_type *ptr;
|
||||
int offset;
|
||||
} Oprt;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/** \brief Bytecode implementation of the Math Parser.
|
||||
|
||||
The bytecode contains the formula converted to revers polish notation stored in a continious
|
||||
memory area. Associated with this data are operator codes, variable pointers, constant
|
||||
values and function pointers. Those are necessary in order to calculate the result.
|
||||
All those data items will be casted to the underlying datatype of the bytecode.
|
||||
|
||||
\author (C) 2004-2013 Ingo Berg
|
||||
*/
|
||||
class ParserByteCode
|
||||
{
|
||||
private:
|
||||
|
||||
/** \brief Token type for internal use only. */
|
||||
typedef ParserToken<value_type, string_type> token_type;
|
||||
|
||||
/** \brief Token vector for storing the RPN. */
|
||||
typedef std::vector<SToken> rpn_type;
|
||||
|
||||
/** \brief Position in the Calculation array. */
|
||||
unsigned m_iStackPos;
|
||||
|
||||
/** \brief Maximum size needed for the stack. */
|
||||
std::size_t m_iMaxStackSize;
|
||||
|
||||
/** \brief The actual rpn storage. */
|
||||
rpn_type m_vRPN;
|
||||
|
||||
bool m_bEnableOptimizer;
|
||||
|
||||
void ConstantFolding(ECmdCode a_Oprt);
|
||||
|
||||
public:
|
||||
|
||||
ParserByteCode();
|
||||
ParserByteCode(const ParserByteCode &a_ByteCode);
|
||||
ParserByteCode& operator=(const ParserByteCode &a_ByteCode);
|
||||
void Assign(const ParserByteCode &a_ByteCode);
|
||||
|
||||
void AddVar(value_type *a_pVar);
|
||||
void AddVal(value_type a_fVal);
|
||||
void AddOp(ECmdCode a_Oprt);
|
||||
void AddIfElse(ECmdCode a_Oprt);
|
||||
void AddAssignOp(value_type *a_pVar);
|
||||
void AddFun(generic_fun_type a_pFun, int a_iArgc);
|
||||
void AddBulkFun(generic_fun_type a_pFun, int a_iArgc);
|
||||
void AddStrFun(generic_fun_type a_pFun, int a_iArgc, int a_iIdx);
|
||||
|
||||
void EnableOptimizer(bool bStat);
|
||||
|
||||
void Finalize();
|
||||
void clear();
|
||||
std::size_t GetMaxStackSize() const;
|
||||
std::size_t GetSize() const;
|
||||
|
||||
const SToken* GetBase() const;
|
||||
void AsciiDump();
|
||||
};
|
||||
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
||||
|
118
muparser/include/muParserCallback.h
Normal file
118
muparser/include/muParserCallback.h
Normal file
|
@ -0,0 +1,118 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_CALLBACK_H
|
||||
#define MU_PARSER_CALLBACK_H
|
||||
|
||||
#include "muParserDef.h"
|
||||
|
||||
/** \file
|
||||
\brief Definition of the parser callback class.
|
||||
*/
|
||||
|
||||
namespace mu
|
||||
{
|
||||
|
||||
/** \brief Encapsulation of prototypes for a numerical parser function.
|
||||
|
||||
Encapsulates the prototyp for numerical parser functions. The class
|
||||
stores the number of arguments for parser functions as well
|
||||
as additional flags indication the function is non optimizeable.
|
||||
The pointer to the callback function pointer is stored as void*
|
||||
and needs to be casted according to the argument count.
|
||||
Negative argument counts indicate a parser function with a variable number
|
||||
of arguments.
|
||||
|
||||
\author (C) 2004-2011 Ingo Berg
|
||||
*/
|
||||
class ParserCallback
|
||||
{
|
||||
public:
|
||||
ParserCallback(fun_type0 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type1 a_pFun, bool a_bAllowOpti, int a_iPrec = -1, ECmdCode a_iCode=cmFUNC);
|
||||
ParserCallback(fun_type2 a_pFun, bool a_bAllowOpti, int a_iPrec, EOprtAssociativity a_eAssociativity);
|
||||
ParserCallback(fun_type2 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type3 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type4 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type5 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type6 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type7 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type8 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type9 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(fun_type10 a_pFun, bool a_bAllowOpti);
|
||||
|
||||
ParserCallback(bulkfun_type0 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type1 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type2 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type3 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type4 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type5 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type6 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type7 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type8 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type9 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(bulkfun_type10 a_pFun, bool a_bAllowOpti);
|
||||
|
||||
ParserCallback(multfun_type a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(strfun_type1 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(strfun_type2 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback(strfun_type3 a_pFun, bool a_bAllowOpti);
|
||||
ParserCallback();
|
||||
ParserCallback(const ParserCallback &a_Fun);
|
||||
|
||||
ParserCallback* Clone() const;
|
||||
|
||||
bool IsOptimizable() const;
|
||||
void* GetAddr() const;
|
||||
ECmdCode GetCode() const;
|
||||
ETypeCode GetType() const;
|
||||
int GetPri() const;
|
||||
EOprtAssociativity GetAssociativity() const;
|
||||
int GetArgc() const;
|
||||
|
||||
private:
|
||||
void *m_pFun; ///< Pointer to the callback function, casted to void
|
||||
|
||||
/** \brief Number of numeric function arguments
|
||||
|
||||
This number is negative for functions with variable number of arguments. in this cases
|
||||
they represent the actual number of arguments found.
|
||||
*/
|
||||
int m_iArgc;
|
||||
int m_iPri; ///< Valid only for binary and infix operators; Operator precedence.
|
||||
EOprtAssociativity m_eOprtAsct; ///< Operator associativity; Valid only for binary operators
|
||||
ECmdCode m_iCode;
|
||||
ETypeCode m_iType;
|
||||
bool m_bAllowOpti; ///< Flag indication optimizeability
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Container for Callback objects. */
|
||||
typedef std::map<string_type, ParserCallback> funmap_type;
|
||||
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
241
muparser/include/muParserDLL.h
Normal file
241
muparser/include/muParserDLL.h
Normal file
|
@ -0,0 +1,241 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef MU_PARSER_DLL_H
|
||||
#define MU_PARSER_DLL_H
|
||||
|
||||
#if defined(WIN32) || defined(_WIN32)
|
||||
#ifdef MUPARSERLIB_EXPORTS
|
||||
#define API_EXPORT(TYPE) __declspec(dllexport) TYPE __cdecl
|
||||
#else
|
||||
#define API_EXPORT(TYPE) __declspec(dllimport) TYPE __cdecl
|
||||
#endif
|
||||
#else
|
||||
#define API_EXPORT(TYPE) TYPE
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/** \file
|
||||
\brief This file contains the DLL interface of muparser.
|
||||
*/
|
||||
|
||||
// Basic types
|
||||
typedef void* muParserHandle_t; // parser handle
|
||||
|
||||
#ifndef _UNICODE
|
||||
typedef char muChar_t; // character type
|
||||
#else
|
||||
typedef wchar_t muChar_t; // character type
|
||||
#endif
|
||||
|
||||
typedef int muBool_t; // boolean type
|
||||
typedef int muInt_t; // integer type
|
||||
typedef double muFloat_t; // floating point type
|
||||
|
||||
// function types for calculation
|
||||
typedef muFloat_t (*muFun0_t )();
|
||||
typedef muFloat_t (*muFun1_t )(muFloat_t);
|
||||
typedef muFloat_t (*muFun2_t )(muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun3_t )(muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun4_t )(muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun5_t )(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun6_t )(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun7_t )(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun8_t )(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun9_t )(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muFun10_t)(muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
|
||||
// Function prototypes for bulkmode functions
|
||||
typedef muFloat_t (*muBulkFun0_t )(int, int);
|
||||
typedef muFloat_t (*muBulkFun1_t )(int, int, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun2_t )(int, int, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun3_t )(int, int, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun4_t )(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun5_t )(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun6_t )(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun7_t )(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun8_t )(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun9_t )(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
typedef muFloat_t (*muBulkFun10_t)(int, int, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t, muFloat_t);
|
||||
|
||||
typedef muFloat_t (*muMultFun_t)(const muFloat_t*, muInt_t);
|
||||
typedef muFloat_t (*muStrFun1_t)(const muChar_t*);
|
||||
typedef muFloat_t (*muStrFun2_t)(const muChar_t*, muFloat_t);
|
||||
typedef muFloat_t (*muStrFun3_t)(const muChar_t*, muFloat_t, muFloat_t);
|
||||
|
||||
// Functions for parser management
|
||||
typedef void (*muErrorHandler_t)(muParserHandle_t a_hParser); // [optional] callback to an error handler
|
||||
typedef muFloat_t* (*muFacFun_t)(const muChar_t*, void*); // [optional] callback for creating new variables
|
||||
typedef muInt_t (*muIdentFun_t)(const muChar_t*, muInt_t*, muFloat_t*); // [optional] value identification callbacks
|
||||
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
// Constants
|
||||
static const int muOPRT_ASCT_LEFT = 0;
|
||||
static const int muOPRT_ASCT_RIGHT = 1;
|
||||
|
||||
static const int muBASETYPE_FLOAT = 0;
|
||||
static const int muBASETYPE_INT = 1;
|
||||
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
// muParser C compatible bindings
|
||||
//
|
||||
//
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Basic operations / initialization
|
||||
API_EXPORT(muParserHandle_t) mupCreate(int nBaseType);
|
||||
API_EXPORT(void) mupRelease(muParserHandle_t a_hParser);
|
||||
API_EXPORT(const muChar_t*) mupGetExpr(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupSetExpr(muParserHandle_t a_hParser, const muChar_t *a_szExpr);
|
||||
API_EXPORT(void) mupSetVarFactory(muParserHandle_t a_hParser, muFacFun_t a_pFactory, void* pUserData);
|
||||
API_EXPORT(const muChar_t*) mupGetVersion(muParserHandle_t a_hParser);
|
||||
API_EXPORT(muFloat_t) mupEval(muParserHandle_t a_hParser);
|
||||
API_EXPORT(muFloat_t*) mupEvalMulti(muParserHandle_t a_hParser, int *nNum);
|
||||
API_EXPORT(void) mupEvalBulk(muParserHandle_t a_hParser, muFloat_t *a_fResult, int nSize);
|
||||
|
||||
// Defining callbacks / variables / constants
|
||||
API_EXPORT(void) mupDefineFun0(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun0_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun1(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun1_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun2(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun2_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun3(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun3_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun4(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun4_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun5(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun5_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun6(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun6_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun7(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun7_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun8(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun8_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun9(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun9_t a_pFun, muBool_t a_bOptimize);
|
||||
API_EXPORT(void) mupDefineFun10(muParserHandle_t a_hParser, const muChar_t *a_szName, muFun10_t a_pFun, muBool_t a_bOptimize);
|
||||
|
||||
// Defining bulkmode functions
|
||||
API_EXPORT(void) mupDefineBulkFun0(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun0_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun1(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun1_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun2(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun2_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun3(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun3_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun4(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun4_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun5(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun5_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun6(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun6_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun7(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun7_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun8(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun8_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun9(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun9_t a_pFun);
|
||||
API_EXPORT(void) mupDefineBulkFun10(muParserHandle_t a_hParser, const muChar_t *a_szName, muBulkFun10_t a_pFun);
|
||||
|
||||
// string functions
|
||||
API_EXPORT(void) mupDefineStrFun1(muParserHandle_t a_hParser, const muChar_t *a_szName, muStrFun1_t a_pFun);
|
||||
API_EXPORT(void) mupDefineStrFun2(muParserHandle_t a_hParser, const muChar_t *a_szName, muStrFun2_t a_pFun);
|
||||
API_EXPORT(void) mupDefineStrFun3(muParserHandle_t a_hParser, const muChar_t *a_szName, muStrFun3_t a_pFun);
|
||||
|
||||
API_EXPORT(void) mupDefineMultFun( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muMultFun_t a_pFun,
|
||||
muBool_t a_bOptimize);
|
||||
|
||||
API_EXPORT(void) mupDefineOprt( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muFun2_t a_pFun,
|
||||
muInt_t a_nPrec,
|
||||
muInt_t a_nOprtAsct,
|
||||
muBool_t a_bOptimize);
|
||||
|
||||
API_EXPORT(void) mupDefineConst( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muFloat_t a_fVal );
|
||||
|
||||
API_EXPORT(void) mupDefineStrConst( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
const muChar_t *a_sVal );
|
||||
|
||||
API_EXPORT(void) mupDefineVar( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muFloat_t *a_fVar);
|
||||
|
||||
API_EXPORT(void) mupDefineBulkVar( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muFloat_t *a_fVar);
|
||||
|
||||
API_EXPORT(void) mupDefinePostfixOprt( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muFun1_t a_pOprt,
|
||||
muBool_t a_bOptimize);
|
||||
|
||||
|
||||
API_EXPORT(void) mupDefineInfixOprt( muParserHandle_t a_hParser,
|
||||
const muChar_t* a_szName,
|
||||
muFun1_t a_pOprt,
|
||||
muBool_t a_bOptimize);
|
||||
|
||||
// Define character sets for identifiers
|
||||
API_EXPORT(void) mupDefineNameChars(muParserHandle_t a_hParser, const muChar_t* a_szCharset);
|
||||
API_EXPORT(void) mupDefineOprtChars(muParserHandle_t a_hParser, const muChar_t* a_szCharset);
|
||||
API_EXPORT(void) mupDefineInfixOprtChars(muParserHandle_t a_hParser, const muChar_t* a_szCharset);
|
||||
|
||||
// Remove all / single variables
|
||||
API_EXPORT(void) mupRemoveVar(muParserHandle_t a_hParser, const muChar_t* a_szName);
|
||||
API_EXPORT(void) mupClearVar(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupClearConst(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupClearOprt(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupClearFun(muParserHandle_t a_hParser);
|
||||
|
||||
// Querying variables / expression variables / constants
|
||||
API_EXPORT(int) mupGetExprVarNum(muParserHandle_t a_hParser);
|
||||
API_EXPORT(int) mupGetVarNum(muParserHandle_t a_hParser);
|
||||
API_EXPORT(int) mupGetConstNum(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupGetExprVar(muParserHandle_t a_hParser, unsigned a_iVar, const muChar_t** a_pszName, muFloat_t** a_pVar);
|
||||
API_EXPORT(void) mupGetVar(muParserHandle_t a_hParser, unsigned a_iVar, const muChar_t** a_pszName, muFloat_t** a_pVar);
|
||||
API_EXPORT(void) mupGetConst(muParserHandle_t a_hParser, unsigned a_iVar, const muChar_t** a_pszName, muFloat_t* a_pVar);
|
||||
API_EXPORT(void) mupSetArgSep(muParserHandle_t a_hParser, const muChar_t cArgSep);
|
||||
API_EXPORT(void) mupSetDecSep(muParserHandle_t a_hParser, const muChar_t cArgSep);
|
||||
API_EXPORT(void) mupSetThousandsSep(muParserHandle_t a_hParser, const muChar_t cArgSep);
|
||||
API_EXPORT(void) mupResetLocale(muParserHandle_t a_hParser);
|
||||
|
||||
// Add value recognition callbacks
|
||||
API_EXPORT(void) mupAddValIdent(muParserHandle_t a_hParser, muIdentFun_t);
|
||||
|
||||
// Error handling
|
||||
API_EXPORT(muBool_t) mupError(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupErrorReset(muParserHandle_t a_hParser);
|
||||
API_EXPORT(void) mupSetErrorHandler(muParserHandle_t a_hParser, muErrorHandler_t a_pErrHandler);
|
||||
API_EXPORT(const muChar_t*) mupGetErrorMsg(muParserHandle_t a_hParser);
|
||||
API_EXPORT(muInt_t) mupGetErrorCode(muParserHandle_t a_hParser);
|
||||
API_EXPORT(muInt_t) mupGetErrorPos(muParserHandle_t a_hParser);
|
||||
API_EXPORT(const muChar_t*) mupGetErrorToken(muParserHandle_t a_hParser);
|
||||
//API_EXPORT(const muChar_t*) mupGetErrorExpr(muParserHandle_t a_hParser);
|
||||
|
||||
// This is used for .NET only. It creates a new variable allowing the dll to
|
||||
// manage the variable rather than the .NET garbage collector.
|
||||
API_EXPORT(muFloat_t*) mupCreateVar();
|
||||
API_EXPORT(void) mupReleaseVar(muFloat_t*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // include guard
|
368
muparser/include/muParserDef.h
Normal file
368
muparser/include/muParserDef.h
Normal file
|
@ -0,0 +1,368 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2014 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef MUP_DEF_H
|
||||
#define MUP_DEF_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <map>
|
||||
|
||||
#include "muParserFixes.h"
|
||||
|
||||
/** \file
|
||||
\brief This file contains standard definitions used by the parser.
|
||||
*/
|
||||
|
||||
#define MUP_VERSION _T("2.2.5")
|
||||
#define MUP_VERSION_DATE _T("20150427; GC")
|
||||
|
||||
#define MUP_CHARS _T("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||
|
||||
/** \brief If this macro is defined mathematical exceptions (div by zero) will be thrown as exceptions. */
|
||||
//#define MUP_MATH_EXCEPTIONS
|
||||
|
||||
/** \brief Define the base datatype for values.
|
||||
|
||||
This datatype must be a built in value type. You can not use custom classes.
|
||||
It should be working with all types except "int"!
|
||||
*/
|
||||
#define MUP_BASETYPE double
|
||||
|
||||
/** \brief Activate this option in order to compile with OpenMP support.
|
||||
|
||||
OpenMP is used only in the bulk mode it may increase the performance a bit.
|
||||
*/
|
||||
//#define MUP_USE_OPENMP
|
||||
|
||||
#if defined(_UNICODE)
|
||||
/** \brief Definition of the basic parser string type. */
|
||||
#define MUP_STRING_TYPE std::wstring
|
||||
|
||||
#if !defined(_T)
|
||||
#define _T(x) L##x
|
||||
#endif // not defined _T
|
||||
#else
|
||||
#ifndef _T
|
||||
#define _T(x) x
|
||||
#endif
|
||||
|
||||
/** \brief Definition of the basic parser string type. */
|
||||
#define MUP_STRING_TYPE std::string
|
||||
#endif
|
||||
|
||||
#if defined(_DEBUG)
|
||||
/** \brief Debug macro to force an abortion of the programm with a certain message.
|
||||
*/
|
||||
#define MUP_FAIL(MSG) \
|
||||
{ \
|
||||
bool MSG=false; \
|
||||
assert(MSG); \
|
||||
}
|
||||
|
||||
/** \brief An assertion that does not kill the program.
|
||||
|
||||
This macro is neutralised in UNICODE builds. It's
|
||||
too difficult to translate.
|
||||
*/
|
||||
#define MUP_ASSERT(COND) \
|
||||
if (!(COND)) \
|
||||
{ \
|
||||
stringstream_type ss; \
|
||||
ss << _T("Assertion \"") _T(#COND) _T("\" failed: ") \
|
||||
<< __FILE__ << _T(" line ") \
|
||||
<< __LINE__ << _T("."); \
|
||||
throw ParserError( ss.str() ); \
|
||||
}
|
||||
#else
|
||||
#define MUP_FAIL(MSG)
|
||||
#define MUP_ASSERT(COND)
|
||||
#endif
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
#if defined(_UNICODE)
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Encapsulate wcout. */
|
||||
inline std::wostream& console()
|
||||
{
|
||||
return std::wcout;
|
||||
}
|
||||
|
||||
/** \brief Encapsulate cin. */
|
||||
inline std::wistream& console_in()
|
||||
{
|
||||
return std::wcin;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/** \brief Encapsulate cout.
|
||||
|
||||
Used for supporting UNICODE more easily.
|
||||
*/
|
||||
inline std::ostream& console()
|
||||
{
|
||||
return std::cout;
|
||||
}
|
||||
|
||||
/** \brief Encapsulate cin.
|
||||
|
||||
Used for supporting UNICODE more easily.
|
||||
*/
|
||||
inline std::istream& console_in()
|
||||
{
|
||||
return std::cin;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Bytecode values.
|
||||
|
||||
\attention The order of the operator entries must match the order in ParserBase::c_DefaultOprt!
|
||||
*/
|
||||
enum ECmdCode
|
||||
{
|
||||
// The following are codes for built in binary operators
|
||||
// apart from built in operators the user has the opportunity to
|
||||
// add user defined operators.
|
||||
cmLE = 0, ///< Operator item: less or equal
|
||||
cmGE = 1, ///< Operator item: greater or equal
|
||||
cmNEQ = 2, ///< Operator item: not equal
|
||||
cmEQ = 3, ///< Operator item: equals
|
||||
cmLT = 4, ///< Operator item: less than
|
||||
cmGT = 5, ///< Operator item: greater than
|
||||
cmADD = 6, ///< Operator item: add
|
||||
cmSUB = 7, ///< Operator item: subtract
|
||||
cmMUL = 8, ///< Operator item: multiply
|
||||
cmDIV = 9, ///< Operator item: division
|
||||
cmPOW = 10, ///< Operator item: y to the power of ...
|
||||
cmLAND = 11,
|
||||
cmLOR = 12,
|
||||
cmASSIGN = 13, ///< Operator item: Assignment operator
|
||||
cmBO = 14, ///< Operator item: opening bracket
|
||||
cmBC = 15, ///< Operator item: closing bracket
|
||||
cmIF = 16, ///< For use in the ternary if-then-else operator
|
||||
cmELSE = 17, ///< For use in the ternary if-then-else operator
|
||||
cmENDIF = 18, ///< For use in the ternary if-then-else operator
|
||||
cmARG_SEP = 19, ///< function argument separator
|
||||
cmVAR = 20, ///< variable item
|
||||
cmVAL = 21, ///< value item
|
||||
|
||||
// For optimization purposes
|
||||
cmVARPOW2,
|
||||
cmVARPOW3,
|
||||
cmVARPOW4,
|
||||
cmVARMUL,
|
||||
cmPOW2,
|
||||
|
||||
// operators and functions
|
||||
cmFUNC, ///< Code for a generic function item
|
||||
cmFUNC_STR, ///< Code for a function with a string parameter
|
||||
cmFUNC_BULK, ///< Special callbacks for Bulk mode with an additional parameter for the bulk index
|
||||
cmSTRING, ///< Code for a string token
|
||||
cmOPRT_BIN, ///< user defined binary operator
|
||||
cmOPRT_POSTFIX, ///< code for postfix operators
|
||||
cmOPRT_INFIX, ///< code for infix operators
|
||||
cmEND, ///< end of formula
|
||||
cmUNKNOWN ///< uninitialized item
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Types internally used by the parser.
|
||||
*/
|
||||
enum ETypeCode
|
||||
{
|
||||
tpSTR = 0, ///< String type (Function arguments and constants only, no string variables)
|
||||
tpDBL = 1, ///< Floating point variables
|
||||
tpVOID = 2 ///< Undefined type.
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
enum EParserVersionInfo
|
||||
{
|
||||
pviBRIEF,
|
||||
pviFULL
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Parser operator precedence values. */
|
||||
enum EOprtAssociativity
|
||||
{
|
||||
oaLEFT = 0,
|
||||
oaRIGHT = 1,
|
||||
oaNONE = 2
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Parser operator precedence values. */
|
||||
enum EOprtPrecedence
|
||||
{
|
||||
// binary operators
|
||||
prLOR = 1,
|
||||
prLAND = 2,
|
||||
prLOGIC = 3, ///< logic operators
|
||||
prCMP = 4, ///< comparsion operators
|
||||
prADD_SUB = 5, ///< addition
|
||||
prMUL_DIV = 6, ///< multiplication/division
|
||||
prPOW = 7, ///< power operator priority (highest)
|
||||
|
||||
// infix operators
|
||||
prINFIX = 6, ///< Signs have a higher priority than ADD_SUB, but lower than power operator
|
||||
prPOSTFIX = 6 ///< Postfix operator priority (currently unused)
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// basic types
|
||||
|
||||
/** \brief The numeric datatype used by the parser.
|
||||
|
||||
Normally this is a floating point type either single or double precision.
|
||||
*/
|
||||
typedef MUP_BASETYPE value_type;
|
||||
|
||||
/** \brief The stringtype used by the parser.
|
||||
|
||||
Depends on wether UNICODE is used or not.
|
||||
*/
|
||||
typedef MUP_STRING_TYPE string_type;
|
||||
|
||||
/** \brief The character type used by the parser.
|
||||
|
||||
Depends on wether UNICODE is used or not.
|
||||
*/
|
||||
typedef string_type::value_type char_type;
|
||||
|
||||
/** \brief Typedef for easily using stringstream that respect the parser stringtype. */
|
||||
typedef std::basic_stringstream<char_type,
|
||||
std::char_traits<char_type>,
|
||||
std::allocator<char_type> > stringstream_type;
|
||||
|
||||
// Data container types
|
||||
|
||||
/** \brief Type used for storing variables. */
|
||||
typedef std::map<string_type, value_type*> varmap_type;
|
||||
|
||||
/** \brief Type used for storing constants. */
|
||||
typedef std::map<string_type, value_type> valmap_type;
|
||||
|
||||
/** \brief Type for assigning a string name to an index in the internal string table. */
|
||||
typedef std::map<string_type, std::size_t> strmap_type;
|
||||
|
||||
// Parser callbacks
|
||||
|
||||
/** \brief Callback type used for functions without arguments. */
|
||||
typedef value_type (*generic_fun_type)();
|
||||
|
||||
/** \brief Callback type used for functions without arguments. */
|
||||
typedef value_type (*fun_type0)();
|
||||
|
||||
/** \brief Callback type used for functions with a single arguments. */
|
||||
typedef value_type (*fun_type1)(value_type);
|
||||
|
||||
/** \brief Callback type used for functions with two arguments. */
|
||||
typedef value_type (*fun_type2)(value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with three arguments. */
|
||||
typedef value_type (*fun_type3)(value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with four arguments. */
|
||||
typedef value_type (*fun_type4)(value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*fun_type5)(value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*fun_type6)(value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*fun_type7)(value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*fun_type8)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*fun_type9)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*fun_type10)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions without arguments. */
|
||||
typedef value_type (*bulkfun_type0)(int, int);
|
||||
|
||||
/** \brief Callback type used for functions with a single arguments. */
|
||||
typedef value_type (*bulkfun_type1)(int, int, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with two arguments. */
|
||||
typedef value_type (*bulkfun_type2)(int, int, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with three arguments. */
|
||||
typedef value_type (*bulkfun_type3)(int, int, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with four arguments. */
|
||||
typedef value_type (*bulkfun_type4)(int, int, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*bulkfun_type5)(int, int, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*bulkfun_type6)(int, int, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*bulkfun_type7)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*bulkfun_type8)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*bulkfun_type9)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with five arguments. */
|
||||
typedef value_type (*bulkfun_type10)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type);
|
||||
|
||||
/** \brief Callback type used for functions with a variable argument list. */
|
||||
typedef value_type (*multfun_type)(const value_type*, int);
|
||||
|
||||
/** \brief Callback type used for functions taking a string as an argument. */
|
||||
typedef value_type (*strfun_type1)(const char_type*);
|
||||
|
||||
/** \brief Callback type used for functions taking a string and a value as arguments. */
|
||||
typedef value_type (*strfun_type2)(const char_type*, value_type);
|
||||
|
||||
/** \brief Callback type used for functions taking a string and two values as arguments. */
|
||||
typedef value_type (*strfun_type3)(const char_type*, value_type, value_type);
|
||||
|
||||
/** \brief Callback used for functions that identify values in a string. */
|
||||
typedef int (*identfun_type)(const char_type *sExpr, int *nPos, value_type *fVal);
|
||||
|
||||
/** \brief Callback used for variable creation factory functions. */
|
||||
typedef value_type* (*facfun_type)(const char_type*, void*);
|
||||
} // end of namespace
|
||||
|
||||
#endif
|
||||
|
176
muparser/include/muParserError.h
Normal file
176
muparser/include/muParserError.h
Normal file
|
@ -0,0 +1,176 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_ERROR_H
|
||||
#define MU_PARSER_ERROR_H
|
||||
|
||||
#include <cassert>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
#include "muParserDef.h"
|
||||
|
||||
/** \file
|
||||
\brief This file defines the error class used by the parser.
|
||||
*/
|
||||
|
||||
namespace mu
|
||||
{
|
||||
|
||||
/** \brief Error codes. */
|
||||
enum EErrorCodes
|
||||
{
|
||||
// Formula syntax errors
|
||||
ecUNEXPECTED_OPERATOR = 0, ///< Unexpected binary operator found
|
||||
ecUNASSIGNABLE_TOKEN = 1, ///< Token cant be identified.
|
||||
ecUNEXPECTED_EOF = 2, ///< Unexpected end of formula. (Example: "2+sin(")
|
||||
ecUNEXPECTED_ARG_SEP = 3, ///< An unexpected comma has been found. (Example: "1,23")
|
||||
ecUNEXPECTED_ARG = 4, ///< An unexpected argument has been found
|
||||
ecUNEXPECTED_VAL = 5, ///< An unexpected value token has been found
|
||||
ecUNEXPECTED_VAR = 6, ///< An unexpected variable token has been found
|
||||
ecUNEXPECTED_PARENS = 7, ///< Unexpected Parenthesis, opening or closing
|
||||
ecUNEXPECTED_STR = 8, ///< A string has been found at an inapropriate position
|
||||
ecSTRING_EXPECTED = 9, ///< A string function has been called with a different type of argument
|
||||
ecVAL_EXPECTED = 10, ///< A numerical function has been called with a non value type of argument
|
||||
ecMISSING_PARENS = 11, ///< Missing parens. (Example: "3*sin(3")
|
||||
ecUNEXPECTED_FUN = 12, ///< Unexpected function found. (Example: "sin(8)cos(9)")
|
||||
ecUNTERMINATED_STRING = 13, ///< unterminated string constant. (Example: "3*valueof("hello)")
|
||||
ecTOO_MANY_PARAMS = 14, ///< Too many function parameters
|
||||
ecTOO_FEW_PARAMS = 15, ///< Too few function parameters. (Example: "ite(1<2,2)")
|
||||
ecOPRT_TYPE_CONFLICT = 16, ///< binary operators may only be applied to value items of the same type
|
||||
ecSTR_RESULT = 17, ///< result is a string
|
||||
|
||||
// Invalid Parser input Parameters
|
||||
ecINVALID_NAME = 18, ///< Invalid function, variable or constant name.
|
||||
ecINVALID_BINOP_IDENT = 19, ///< Invalid binary operator identifier
|
||||
ecINVALID_INFIX_IDENT = 20, ///< Invalid function, variable or constant name.
|
||||
ecINVALID_POSTFIX_IDENT = 21, ///< Invalid function, variable or constant name.
|
||||
|
||||
ecBUILTIN_OVERLOAD = 22, ///< Trying to overload builtin operator
|
||||
ecINVALID_FUN_PTR = 23, ///< Invalid callback function pointer
|
||||
ecINVALID_VAR_PTR = 24, ///< Invalid variable pointer
|
||||
ecEMPTY_EXPRESSION = 25, ///< The Expression is empty
|
||||
ecNAME_CONFLICT = 26, ///< Name conflict
|
||||
ecOPT_PRI = 27, ///< Invalid operator priority
|
||||
//
|
||||
ecDOMAIN_ERROR = 28, ///< catch division by zero, sqrt(-1), log(0) (currently unused)
|
||||
ecDIV_BY_ZERO = 29, ///< Division by zero (currently unused)
|
||||
ecGENERIC = 30, ///< Generic error
|
||||
ecLOCALE = 31, ///< Conflict with current locale
|
||||
|
||||
ecUNEXPECTED_CONDITIONAL = 32,
|
||||
ecMISSING_ELSE_CLAUSE = 33,
|
||||
ecMISPLACED_COLON = 34,
|
||||
|
||||
ecUNREASONABLE_NUMBER_OF_COMPUTATIONS = 35,
|
||||
|
||||
// internal errors
|
||||
ecINTERNAL_ERROR = 36, ///< Internal error of any kind.
|
||||
|
||||
// The last two are special entries
|
||||
ecCOUNT, ///< This is no error code, It just stores just the total number of error codes
|
||||
ecUNDEFINED = -1 ///< Undefined message, placeholder to detect unassigned error messages
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief A class that handles the error messages.
|
||||
*/
|
||||
class ParserErrorMsg
|
||||
{
|
||||
public:
|
||||
typedef ParserErrorMsg self_type;
|
||||
|
||||
ParserErrorMsg& operator=(const ParserErrorMsg &);
|
||||
ParserErrorMsg(const ParserErrorMsg&);
|
||||
ParserErrorMsg();
|
||||
|
||||
~ParserErrorMsg();
|
||||
|
||||
static const ParserErrorMsg& Instance();
|
||||
string_type operator[](unsigned a_iIdx) const;
|
||||
|
||||
private:
|
||||
std::vector<string_type> m_vErrMsg; ///< A vector with the predefined error messages
|
||||
static const self_type m_Instance; ///< The instance pointer
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Error class of the parser.
|
||||
\author Ingo Berg
|
||||
|
||||
Part of the math parser package.
|
||||
*/
|
||||
class ParserError
|
||||
{
|
||||
private:
|
||||
|
||||
/** \brief Replace all ocuurences of a substring with another string. */
|
||||
void ReplaceSubString( string_type &strSource,
|
||||
const string_type &strFind,
|
||||
const string_type &strReplaceWith);
|
||||
void Reset();
|
||||
|
||||
public:
|
||||
|
||||
ParserError();
|
||||
explicit ParserError(EErrorCodes a_iErrc);
|
||||
explicit ParserError(const string_type &sMsg);
|
||||
ParserError( EErrorCodes a_iErrc,
|
||||
const string_type &sTok,
|
||||
const string_type &sFormula = string_type(),
|
||||
int a_iPos = -1);
|
||||
ParserError( EErrorCodes a_iErrc,
|
||||
int a_iPos,
|
||||
const string_type &sTok);
|
||||
ParserError( const char_type *a_szMsg,
|
||||
int a_iPos = -1,
|
||||
const string_type &sTok = string_type());
|
||||
ParserError(const ParserError &a_Obj);
|
||||
ParserError& operator=(const ParserError &a_Obj);
|
||||
~ParserError();
|
||||
|
||||
void SetFormula(const string_type &a_strFormula);
|
||||
const string_type& GetExpr() const;
|
||||
const string_type& GetMsg() const;
|
||||
int GetPos() const;
|
||||
const string_type& GetToken() const;
|
||||
EErrorCodes GetCode() const;
|
||||
|
||||
private:
|
||||
string_type m_strMsg; ///< The message string
|
||||
string_type m_strFormula; ///< Formula string
|
||||
string_type m_strTok; ///< Token related with the error
|
||||
int m_iPos; ///< Formula position related to the error
|
||||
EErrorCodes m_iErrc; ///< Error code
|
||||
const ParserErrorMsg &m_ErrMsg;
|
||||
};
|
||||
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
62
muparser/include/muParserFixes.h
Normal file
62
muparser/include/muParserFixes.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_FIXES_H
|
||||
#define MU_PARSER_FIXES_H
|
||||
|
||||
/** \file
|
||||
\brief This file contains compatibility fixes for some platforms.
|
||||
*/
|
||||
|
||||
//
|
||||
// Compatibility fixes
|
||||
//
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Intel Compiler
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifdef __INTEL_COMPILER
|
||||
|
||||
// remark #981: operands are evaluated in unspecified order
|
||||
// disabled -> completely pointless if the functions do not have side effects
|
||||
//
|
||||
#pragma warning(disable:981)
|
||||
|
||||
// remark #383: value copied to temporary, reference to temporary used
|
||||
#pragma warning(disable:383)
|
||||
|
||||
// remark #1572: floating-point equality and inequality comparisons are unreliable
|
||||
// disabled -> everyone knows it, the parser passes this problem
|
||||
// deliberately to the user
|
||||
#pragma warning(disable:1572)
|
||||
|
||||
#endif
|
||||
|
||||
#endif // include guard
|
||||
|
||||
|
140
muparser/include/muParserInt.h
Normal file
140
muparser/include/muParserInt.h
Normal file
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_INT_H
|
||||
#define MU_PARSER_INT_H
|
||||
|
||||
#include "muParserBase.h"
|
||||
#include <vector>
|
||||
|
||||
|
||||
/** \file
|
||||
\brief Definition of a parser using integer value.
|
||||
*/
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
|
||||
/** \brief Mathematical expressions parser.
|
||||
|
||||
This version of the parser handles only integer numbers. It disables the built in operators thus it is
|
||||
slower than muParser. Integer values are stored in the double value_type and converted if needed.
|
||||
*/
|
||||
class ParserInt : public ParserBase
|
||||
{
|
||||
private:
|
||||
static int Round(value_type v) { return (int)(v + ((v>=0) ? 0.5 : -0.5) ); };
|
||||
|
||||
static value_type Abs(value_type);
|
||||
static value_type Sign(value_type);
|
||||
static value_type Ite(value_type, value_type, value_type);
|
||||
// !! The unary Minus is a MUST, otherwise you cant use negative signs !!
|
||||
static value_type UnaryMinus(value_type);
|
||||
// Functions with variable number of arguments
|
||||
static value_type Sum(const value_type* a_afArg, int a_iArgc); // sum
|
||||
static value_type Min(const value_type* a_afArg, int a_iArgc); // minimum
|
||||
static value_type Max(const value_type* a_afArg, int a_iArgc); // maximum
|
||||
// binary operator callbacks
|
||||
static value_type Add(value_type v1, value_type v2);
|
||||
static value_type Sub(value_type v1, value_type v2);
|
||||
static value_type Mul(value_type v1, value_type v2);
|
||||
static value_type Div(value_type v1, value_type v2);
|
||||
static value_type Mod(value_type v1, value_type v2);
|
||||
static value_type Pow(value_type v1, value_type v2);
|
||||
static value_type Shr(value_type v1, value_type v2);
|
||||
static value_type Shl(value_type v1, value_type v2);
|
||||
static value_type LogAnd(value_type v1, value_type v2);
|
||||
static value_type LogOr(value_type v1, value_type v2);
|
||||
static value_type And(value_type v1, value_type v2);
|
||||
static value_type Or(value_type v1, value_type v2);
|
||||
static value_type Xor(value_type v1, value_type v2);
|
||||
static value_type Less(value_type v1, value_type v2);
|
||||
static value_type Greater(value_type v1, value_type v2);
|
||||
static value_type LessEq(value_type v1, value_type v2);
|
||||
static value_type GreaterEq(value_type v1, value_type v2);
|
||||
static value_type Equal(value_type v1, value_type v2);
|
||||
static value_type NotEqual(value_type v1, value_type v2);
|
||||
static value_type Not(value_type v1);
|
||||
|
||||
static int IsHexVal(const char_type* a_szExpr, int *a_iPos, value_type *a_iVal);
|
||||
static int IsBinVal(const char_type* a_szExpr, int *a_iPos, value_type *a_iVal);
|
||||
static int IsVal (const char_type* a_szExpr, int *a_iPos, value_type *a_iVal);
|
||||
|
||||
/** \brief A facet class used to change decimal and thousands separator. */
|
||||
template<class TChar>
|
||||
class change_dec_sep : public std::numpunct<TChar>
|
||||
{
|
||||
public:
|
||||
|
||||
explicit change_dec_sep(char_type cDecSep, char_type cThousandsSep = 0, int nGroup = 3)
|
||||
:std::numpunct<TChar>()
|
||||
,m_cDecPoint(cDecSep)
|
||||
,m_cThousandsSep(cThousandsSep)
|
||||
,m_nGroup(nGroup)
|
||||
{}
|
||||
|
||||
protected:
|
||||
|
||||
virtual char_type do_decimal_point() const
|
||||
{
|
||||
return m_cDecPoint;
|
||||
}
|
||||
|
||||
virtual char_type do_thousands_sep() const
|
||||
{
|
||||
return m_cThousandsSep;
|
||||
}
|
||||
|
||||
virtual std::string do_grouping() const
|
||||
{
|
||||
// fix for issue 4: https://code.google.com/p/muparser/issues/detail?id=4
|
||||
// courtesy of Jens Bartsch
|
||||
// original code:
|
||||
// return std::string(1, (char)m_nGroup);
|
||||
// new code:
|
||||
return std::string(1, (char)(m_cThousandsSep > 0 ? m_nGroup : CHAR_MAX));
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int m_nGroup;
|
||||
char_type m_cDecPoint;
|
||||
char_type m_cThousandsSep;
|
||||
};
|
||||
|
||||
public:
|
||||
ParserInt();
|
||||
|
||||
virtual void InitFun();
|
||||
virtual void InitOprt();
|
||||
virtual void InitConst();
|
||||
virtual void InitCharSets();
|
||||
};
|
||||
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
125
muparser/include/muParserStack.h
Normal file
125
muparser/include/muParserStack.h
Normal file
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_STACK_H
|
||||
#define MU_PARSER_STACK_H
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
|
||||
#include "muParserError.h"
|
||||
#include "muParserToken.h"
|
||||
|
||||
/** \file
|
||||
\brief This file defines the stack used by muparser.
|
||||
*/
|
||||
|
||||
namespace mu
|
||||
{
|
||||
|
||||
/** \brief Parser stack implementation.
|
||||
|
||||
Stack implementation based on a std::stack. The behaviour of pop() had been
|
||||
slightly changed in order to get an error code if the stack is empty.
|
||||
The stack is used within the Parser both as a value stack and as an operator stack.
|
||||
|
||||
\author (C) 2004-2011 Ingo Berg
|
||||
*/
|
||||
template <typename TValueType>
|
||||
class ParserStack
|
||||
{
|
||||
private:
|
||||
|
||||
/** \brief Type of the underlying stack implementation. */
|
||||
typedef std::stack<TValueType, std::vector<TValueType> > impl_type;
|
||||
|
||||
impl_type m_Stack; ///< This is the actual stack.
|
||||
|
||||
public:
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserStack()
|
||||
:m_Stack()
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
virtual ~ParserStack()
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Pop a value from the stack.
|
||||
|
||||
Unlike the standard implementation this function will return the value that
|
||||
is going to be taken from the stack.
|
||||
|
||||
\throw ParserException in case the stack is empty.
|
||||
\sa pop(int &a_iErrc)
|
||||
*/
|
||||
TValueType pop()
|
||||
{
|
||||
if (empty())
|
||||
throw ParserError( _T("stack is empty.") );
|
||||
|
||||
TValueType el = top();
|
||||
m_Stack.pop();
|
||||
return el;
|
||||
}
|
||||
|
||||
/** \brief Push an object into the stack.
|
||||
|
||||
\param a_Val object to push into the stack.
|
||||
\throw nothrow
|
||||
*/
|
||||
void push(const TValueType& a_Val)
|
||||
{
|
||||
m_Stack.push(a_Val);
|
||||
}
|
||||
|
||||
/** \brief Return the number of stored elements. */
|
||||
unsigned size() const
|
||||
{
|
||||
return (unsigned)m_Stack.size();
|
||||
}
|
||||
|
||||
/** \brief Returns true if stack is empty false otherwise. */
|
||||
bool empty() const
|
||||
{
|
||||
return m_Stack.empty();
|
||||
}
|
||||
|
||||
/** \brief Return reference to the top object in the stack.
|
||||
|
||||
The top object is the one pushed most recently.
|
||||
*/
|
||||
TValueType& top()
|
||||
{
|
||||
return m_Stack.top();
|
||||
}
|
||||
};
|
||||
} // namespace MathUtils
|
||||
|
||||
#endif
|
113
muparser/include/muParserTemplateMagic.h
Normal file
113
muparser/include/muParserTemplateMagic.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
#ifndef MU_PARSER_TEMPLATE_MAGIC_H
|
||||
#define MU_PARSER_TEMPLATE_MAGIC_H
|
||||
|
||||
#include <cmath>
|
||||
#include "muParserError.h"
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
//
|
||||
// Compile time type detection
|
||||
//
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
|
||||
/** \brief A class singling out integer types at compile time using
|
||||
template meta programming.
|
||||
*/
|
||||
template<typename T>
|
||||
struct TypeInfo
|
||||
{
|
||||
static bool IsInteger() { return false; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<char>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<short>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<int>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<long>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<unsigned char>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<unsigned short>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<unsigned int>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TypeInfo<unsigned long>
|
||||
{
|
||||
static bool IsInteger() { return true; }
|
||||
};
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
//
|
||||
// Standard math functions with dummy overload for integer types
|
||||
//
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
|
||||
/** \brief A template class for providing wrappers for essential math functions.
|
||||
|
||||
This template is spezialized for several types in order to provide a unified interface
|
||||
for parser internal math function calls regardless of the data type.
|
||||
*/
|
||||
template<typename T>
|
||||
struct MathImpl
|
||||
{
|
||||
static T Sin(T v) { return sin(v); }
|
||||
static T Cos(T v) { return cos(v); }
|
||||
static T Tan(T v) { return tan(v); }
|
||||
static T ASin(T v) { return asin(v); }
|
||||
static T ACos(T v) { return acos(v); }
|
||||
static T ATan(T v) { return atan(v); }
|
||||
static T ATan2(T v1, T v2) { return atan2(v1, v2); }
|
||||
static T Sinh(T v) { return sinh(v); }
|
||||
static T Cosh(T v) { return cosh(v); }
|
||||
static T Tanh(T v) { return tanh(v); }
|
||||
static T ASinh(T v) { return log(v + sqrt(v * v + 1)); }
|
||||
static T ACosh(T v) { return log(v + sqrt(v * v - 1)); }
|
||||
static T ATanh(T v) { return ((T)0.5 * log((1 + v) / (1 - v))); }
|
||||
static T Log(T v) { return log(v); }
|
||||
static T Log2(T v) { return log(v)/log((T)2); } // Logarithm base 2
|
||||
static T Log10(T v) { return log10(v); } // Logarithm base 10
|
||||
static T Exp(T v) { return exp(v); }
|
||||
static T Abs(T v) { return (v>=0) ? v : -v; }
|
||||
static T Sqrt(T v) { return sqrt(v); }
|
||||
static T Rint(T v) { return floor(v + (T)0.5); }
|
||||
static T Sign(T v) { return (T)((v<0) ? -1 : (v>0) ? 1 : 0); }
|
||||
static T Pow(T v1, T v2) { return std::pow(v1, v2); }
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
214
muparser/include/muParserTest.h
Normal file
214
muparser/include/muParserTest.h
Normal file
|
@ -0,0 +1,214 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_TEST_H
|
||||
#define MU_PARSER_TEST_H
|
||||
|
||||
#include <string>
|
||||
#include <cstdlib>
|
||||
#include <numeric> // for accumulate
|
||||
#include "muParser.h"
|
||||
#include "muParserInt.h"
|
||||
|
||||
/** \file
|
||||
\brief This file contains the parser test class.
|
||||
*/
|
||||
|
||||
namespace mu
|
||||
{
|
||||
/** \brief Namespace for test cases. */
|
||||
namespace Test
|
||||
{
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Test cases for unit testing.
|
||||
|
||||
(C) 2004-2011 Ingo Berg
|
||||
*/
|
||||
class ParserTester // final
|
||||
{
|
||||
private:
|
||||
static int c_iCount;
|
||||
|
||||
// Multiarg callbacks
|
||||
static value_type f1of1(value_type v) { return v;};
|
||||
|
||||
static value_type f1of2(value_type v, value_type ) {return v;};
|
||||
static value_type f2of2(value_type , value_type v) {return v;};
|
||||
|
||||
static value_type f1of3(value_type v, value_type , value_type ) {return v;};
|
||||
static value_type f2of3(value_type , value_type v, value_type ) {return v;};
|
||||
static value_type f3of3(value_type , value_type , value_type v) {return v;};
|
||||
|
||||
static value_type f1of4(value_type v, value_type, value_type , value_type ) {return v;}
|
||||
static value_type f2of4(value_type , value_type v, value_type , value_type ) {return v;}
|
||||
static value_type f3of4(value_type , value_type, value_type v, value_type ) {return v;}
|
||||
static value_type f4of4(value_type , value_type, value_type , value_type v) {return v;}
|
||||
|
||||
static value_type f1of5(value_type v, value_type, value_type , value_type , value_type ) { return v; }
|
||||
static value_type f2of5(value_type , value_type v, value_type , value_type , value_type ) { return v; }
|
||||
static value_type f3of5(value_type , value_type, value_type v, value_type , value_type ) { return v; }
|
||||
static value_type f4of5(value_type , value_type, value_type , value_type v, value_type ) { return v; }
|
||||
static value_type f5of5(value_type , value_type, value_type , value_type , value_type v) { return v; }
|
||||
|
||||
static value_type Min(value_type a_fVal1, value_type a_fVal2) { return (a_fVal1<a_fVal2) ? a_fVal1 : a_fVal2; }
|
||||
static value_type Max(value_type a_fVal1, value_type a_fVal2) { return (a_fVal1>a_fVal2) ? a_fVal1 : a_fVal2; }
|
||||
|
||||
static value_type plus2(value_type v1) { return v1+2; }
|
||||
static value_type times3(value_type v1) { return v1*3; }
|
||||
static value_type sqr(value_type v1) { return v1*v1; }
|
||||
static value_type sign(value_type v) { return -v; }
|
||||
static value_type add(value_type v1, value_type v2) { return v1+v2; }
|
||||
static value_type land(value_type v1, value_type v2) { return (int)v1 & (int)v2; }
|
||||
|
||||
|
||||
static value_type FirstArg(const value_type* a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw mu::Parser::exception_type( _T("too few arguments for function FirstArg.") );
|
||||
|
||||
return a_afArg[0];
|
||||
}
|
||||
|
||||
static value_type LastArg(const value_type* a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw mu::Parser::exception_type( _T("too few arguments for function LastArg.") );
|
||||
|
||||
return a_afArg[a_iArgc-1];
|
||||
}
|
||||
|
||||
static value_type Sum(const value_type* a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw mu::Parser::exception_type( _T("too few arguments for function sum.") );
|
||||
|
||||
value_type fRes=0;
|
||||
for (int i=0; i<a_iArgc; ++i) fRes += a_afArg[i];
|
||||
return fRes;
|
||||
}
|
||||
|
||||
static value_type Rnd(value_type v)
|
||||
{
|
||||
return (value_type)(1+(v*std::rand()/(RAND_MAX+1.0)));
|
||||
}
|
||||
|
||||
static value_type RndWithString(const char_type*)
|
||||
{
|
||||
return (value_type)( 1 + (1000.0f * std::rand() / (RAND_MAX + 1.0) ) );
|
||||
}
|
||||
|
||||
static value_type Ping()
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
|
||||
static value_type ValueOf(const char_type*)
|
||||
{
|
||||
return 123;
|
||||
}
|
||||
|
||||
static value_type StrFun1(const char_type* v1)
|
||||
{
|
||||
int val(0);
|
||||
stringstream_type(v1) >> val;
|
||||
return (value_type)val;
|
||||
}
|
||||
|
||||
static value_type StrFun2(const char_type* v1, value_type v2)
|
||||
{
|
||||
int val(0);
|
||||
stringstream_type(v1) >> val;
|
||||
return (value_type)(val + v2);
|
||||
}
|
||||
|
||||
static value_type StrFun3(const char_type* v1, value_type v2, value_type v3)
|
||||
{
|
||||
int val(0);
|
||||
stringstream_type(v1) >> val;
|
||||
return val + v2 + v3;
|
||||
}
|
||||
|
||||
static value_type StrToFloat(const char_type* a_szMsg)
|
||||
{
|
||||
value_type val(0);
|
||||
stringstream_type(a_szMsg) >> val;
|
||||
return val;
|
||||
}
|
||||
|
||||
// postfix operator callback
|
||||
static value_type Mega(value_type a_fVal) { return a_fVal * (value_type)1e6; }
|
||||
static value_type Micro(value_type a_fVal) { return a_fVal * (value_type)1e-6; }
|
||||
static value_type Milli(value_type a_fVal) { return a_fVal / (value_type)1e3; }
|
||||
|
||||
// Custom value recognition
|
||||
static int IsHexVal(const char_type *a_szExpr, int *a_iPos, value_type *a_fVal);
|
||||
|
||||
int TestNames();
|
||||
int TestSyntax();
|
||||
int TestMultiArg();
|
||||
int TestPostFix();
|
||||
int TestExpression();
|
||||
int TestInfixOprt();
|
||||
int TestBinOprt();
|
||||
int TestVarConst();
|
||||
int TestInterface();
|
||||
int TestException();
|
||||
int TestStrArg();
|
||||
int TestIfThenElse();
|
||||
int TestBulkMode();
|
||||
|
||||
void Abort() const;
|
||||
|
||||
public:
|
||||
typedef int (ParserTester::*testfun_type)();
|
||||
|
||||
ParserTester();
|
||||
void Run();
|
||||
|
||||
private:
|
||||
std::vector<testfun_type> m_vTestFun;
|
||||
void AddTest(testfun_type a_pFun);
|
||||
|
||||
// Test Double Parser
|
||||
int EqnTest(const string_type& a_str, double a_fRes, bool a_fPass);
|
||||
int EqnTestWithVarChange(const string_type& a_str,
|
||||
double a_fRes1,
|
||||
double a_fVar1,
|
||||
double a_fRes2,
|
||||
double a_fVar2);
|
||||
int ThrowTest(const string_type& a_str, int a_iErrc, bool a_bFail = true);
|
||||
|
||||
// Test Int Parser
|
||||
int EqnTestInt(const string_type& a_str, double a_fRes, bool a_fPass);
|
||||
|
||||
// Test Bulkmode
|
||||
int EqnTestBulk(const string_type& a_str, double a_fRes[4], bool a_fPass);
|
||||
};
|
||||
} // namespace Test
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
||||
|
401
muparser/include/muParserToken.h
Normal file
401
muparser/include/muParserToken.h
Normal file
|
@ -0,0 +1,401 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_TOKEN_H
|
||||
#define MU_PARSER_TOKEN_H
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
#include "muParserError.h"
|
||||
#include "muParserCallback.h"
|
||||
|
||||
/** \file
|
||||
\brief This file contains the parser token definition.
|
||||
*/
|
||||
|
||||
namespace mu
|
||||
{
|
||||
/** \brief Encapsulation of the data for a single formula token.
|
||||
|
||||
Formula token implementation. Part of the Math Parser Package.
|
||||
Formula tokens can be either one of the following:
|
||||
<ul>
|
||||
<li>value</li>
|
||||
<li>variable</li>
|
||||
<li>function with numerical arguments</li>
|
||||
<li>functions with a string as argument</li>
|
||||
<li>prefix operators</li>
|
||||
<li>infix operators</li>
|
||||
<li>binary operator</li>
|
||||
</ul>
|
||||
|
||||
\author (C) 2004-2013 Ingo Berg
|
||||
*/
|
||||
template<typename TBase, typename TString>
|
||||
class ParserToken
|
||||
{
|
||||
private:
|
||||
|
||||
ECmdCode m_iCode; ///< Type of the token; The token type is a constant of type #ECmdCode.
|
||||
ETypeCode m_iType;
|
||||
void *m_pTok; ///< Stores Token pointer; not applicable for all tokens
|
||||
int m_iIdx; ///< An otional index to an external buffer storing the token data
|
||||
TString m_strTok; ///< Token string
|
||||
TString m_strVal; ///< Value for string variables
|
||||
value_type m_fVal; ///< the value
|
||||
std::auto_ptr<ParserCallback> m_pCallback;
|
||||
|
||||
public:
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor (default).
|
||||
|
||||
Sets token to an neutral state of type cmUNKNOWN.
|
||||
\throw nothrow
|
||||
\sa ECmdCode
|
||||
*/
|
||||
ParserToken()
|
||||
:m_iCode(cmUNKNOWN)
|
||||
,m_iType(tpVOID)
|
||||
,m_pTok(0)
|
||||
,m_iIdx(-1)
|
||||
,m_strTok()
|
||||
,m_strVal()
|
||||
,m_fVal(0)
|
||||
,m_pCallback()
|
||||
{}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Create token from another one.
|
||||
|
||||
Implemented by calling Assign(...)
|
||||
\throw nothrow
|
||||
\post m_iType==cmUNKNOWN
|
||||
\sa #Assign
|
||||
*/
|
||||
ParserToken(const ParserToken &a_Tok)
|
||||
{
|
||||
Assign(a_Tok);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Assignement operator.
|
||||
|
||||
Copy token state from another token and return this.
|
||||
Implemented by calling Assign(...).
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserToken& operator=(const ParserToken &a_Tok)
|
||||
{
|
||||
Assign(a_Tok);
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Copy token information from argument.
|
||||
|
||||
\throw nothrow
|
||||
*/
|
||||
void Assign(const ParserToken &a_Tok)
|
||||
{
|
||||
m_iCode = a_Tok.m_iCode;
|
||||
m_pTok = a_Tok.m_pTok;
|
||||
m_strTok = a_Tok.m_strTok;
|
||||
m_iIdx = a_Tok.m_iIdx;
|
||||
m_strVal = a_Tok.m_strVal;
|
||||
m_iType = a_Tok.m_iType;
|
||||
m_fVal = a_Tok.m_fVal;
|
||||
// create new callback object if a_Tok has one
|
||||
m_pCallback.reset(a_Tok.m_pCallback.get() ? a_Tok.m_pCallback->Clone() : 0);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Assign a token type.
|
||||
|
||||
Token may not be of type value, variable or function. Those have seperate set functions.
|
||||
|
||||
\pre [assert] a_iType!=cmVAR
|
||||
\pre [assert] a_iType!=cmVAL
|
||||
\pre [assert] a_iType!=cmFUNC
|
||||
\post m_fVal = 0
|
||||
\post m_pTok = 0
|
||||
*/
|
||||
ParserToken& Set(ECmdCode a_iType, const TString &a_strTok=TString())
|
||||
{
|
||||
// The following types cant be set this way, they have special Set functions
|
||||
assert(a_iType!=cmVAR);
|
||||
assert(a_iType!=cmVAL);
|
||||
assert(a_iType!=cmFUNC);
|
||||
|
||||
m_iCode = a_iType;
|
||||
m_iType = tpVOID;
|
||||
m_pTok = 0;
|
||||
m_strTok = a_strTok;
|
||||
m_iIdx = -1;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Set Callback type. */
|
||||
ParserToken& Set(const ParserCallback &a_pCallback, const TString &a_sTok)
|
||||
{
|
||||
assert(a_pCallback.GetAddr());
|
||||
|
||||
m_iCode = a_pCallback.GetCode();
|
||||
m_iType = tpVOID;
|
||||
m_strTok = a_sTok;
|
||||
m_pCallback.reset(new ParserCallback(a_pCallback));
|
||||
|
||||
m_pTok = 0;
|
||||
m_iIdx = -1;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Make this token a value token.
|
||||
|
||||
Member variables not necessary for value tokens will be invalidated.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserToken& SetVal(TBase a_fVal, const TString &a_strTok=TString())
|
||||
{
|
||||
m_iCode = cmVAL;
|
||||
m_iType = tpDBL;
|
||||
m_fVal = a_fVal;
|
||||
m_strTok = a_strTok;
|
||||
m_iIdx = -1;
|
||||
|
||||
m_pTok = 0;
|
||||
m_pCallback.reset(0);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief make this token a variable token.
|
||||
|
||||
Member variables not necessary for variable tokens will be invalidated.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserToken& SetVar(TBase *a_pVar, const TString &a_strTok)
|
||||
{
|
||||
m_iCode = cmVAR;
|
||||
m_iType = tpDBL;
|
||||
m_strTok = a_strTok;
|
||||
m_iIdx = -1;
|
||||
m_pTok = (void*)a_pVar;
|
||||
m_pCallback.reset(0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Make this token a variable token.
|
||||
|
||||
Member variables not necessary for variable tokens will be invalidated.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserToken& SetString(const TString &a_strTok, std::size_t a_iSize)
|
||||
{
|
||||
m_iCode = cmSTRING;
|
||||
m_iType = tpSTR;
|
||||
m_strTok = a_strTok;
|
||||
m_iIdx = static_cast<int>(a_iSize);
|
||||
|
||||
m_pTok = 0;
|
||||
m_pCallback.reset(0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Set an index associated with the token related data.
|
||||
|
||||
In cmSTRFUNC - This is the index to a string table in the main parser.
|
||||
\param a_iIdx The index the string function result will take in the bytecode parser.
|
||||
\throw exception_type if #a_iIdx<0 or #m_iType!=cmSTRING
|
||||
*/
|
||||
void SetIdx(int a_iIdx)
|
||||
{
|
||||
if (m_iCode!=cmSTRING || a_iIdx<0)
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
m_iIdx = a_iIdx;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return Index associated with the token related data.
|
||||
|
||||
In cmSTRFUNC - This is the index to a string table in the main parser.
|
||||
|
||||
\throw exception_type if #m_iIdx<0 or #m_iType!=cmSTRING
|
||||
\return The index the result will take in the Bytecode calculatin array (#m_iIdx).
|
||||
*/
|
||||
int GetIdx() const
|
||||
{
|
||||
if (m_iIdx<0 || m_iCode!=cmSTRING )
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
return m_iIdx;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return the token type.
|
||||
|
||||
\return #m_iType
|
||||
\throw nothrow
|
||||
*/
|
||||
ECmdCode GetCode() const
|
||||
{
|
||||
if (m_pCallback.get())
|
||||
{
|
||||
return m_pCallback->GetCode();
|
||||
}
|
||||
else
|
||||
{
|
||||
return m_iCode;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
ETypeCode GetType() const
|
||||
{
|
||||
if (m_pCallback.get())
|
||||
{
|
||||
return m_pCallback->GetType();
|
||||
}
|
||||
else
|
||||
{
|
||||
return m_iType;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int GetPri() const
|
||||
{
|
||||
if ( !m_pCallback.get())
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
if ( m_pCallback->GetCode()!=cmOPRT_BIN && m_pCallback->GetCode()!=cmOPRT_INFIX)
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
return m_pCallback->GetPri();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
EOprtAssociativity GetAssociativity() const
|
||||
{
|
||||
if (m_pCallback.get()==NULL || m_pCallback->GetCode()!=cmOPRT_BIN)
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
return m_pCallback->GetAssociativity();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return the address of the callback function assoziated with
|
||||
function and operator tokens.
|
||||
|
||||
\return The pointer stored in #m_pTok.
|
||||
\throw exception_type if token type is non of:
|
||||
<ul>
|
||||
<li>cmFUNC</li>
|
||||
<li>cmSTRFUNC</li>
|
||||
<li>cmPOSTOP</li>
|
||||
<li>cmINFIXOP</li>
|
||||
<li>cmOPRT_BIN</li>
|
||||
</ul>
|
||||
\sa ECmdCode
|
||||
*/
|
||||
generic_fun_type GetFuncAddr() const
|
||||
{
|
||||
return (m_pCallback.get()) ? (generic_fun_type)m_pCallback->GetAddr() : 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \biref Get value of the token.
|
||||
|
||||
Only applicable to variable and value tokens.
|
||||
\throw exception_type if token is no value/variable token.
|
||||
*/
|
||||
TBase GetVal() const
|
||||
{
|
||||
switch (m_iCode)
|
||||
{
|
||||
case cmVAL: return m_fVal;
|
||||
case cmVAR: return *((TBase*)m_pTok);
|
||||
default: throw ParserError(ecVAL_EXPECTED);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Get address of a variable token.
|
||||
|
||||
Valid only if m_iType==CmdVar.
|
||||
\throw exception_type if token is no variable token.
|
||||
*/
|
||||
TBase* GetVar() const
|
||||
{
|
||||
if (m_iCode!=cmVAR)
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
return (TBase*)m_pTok;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return the number of function arguments.
|
||||
|
||||
Valid only if m_iType==CmdFUNC.
|
||||
*/
|
||||
int GetArgCount() const
|
||||
{
|
||||
assert(m_pCallback.get());
|
||||
|
||||
if (!m_pCallback->GetAddr())
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
|
||||
return m_pCallback->GetArgc();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return the token identifier.
|
||||
|
||||
If #m_iType is cmSTRING the token identifier is the value of the string argument
|
||||
for a string function.
|
||||
\return #m_strTok
|
||||
\throw nothrow
|
||||
\sa m_strTok
|
||||
*/
|
||||
const TString& GetAsString() const
|
||||
{
|
||||
return m_strTok;
|
||||
}
|
||||
};
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
161
muparser/include/muParserTokenReader.h
Normal file
161
muparser/include/muParserTokenReader.h
Normal file
|
@ -0,0 +1,161 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef MU_PARSER_TOKEN_READER_H
|
||||
#define MU_PARSER_TOKEN_READER_H
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <stack>
|
||||
#include <string>
|
||||
|
||||
#include "muParserDef.h"
|
||||
#include "muParserToken.h"
|
||||
|
||||
/** \file
|
||||
\brief This file contains the parser token reader definition.
|
||||
*/
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
// Forward declaration
|
||||
class ParserBase;
|
||||
|
||||
/** \brief Token reader for the ParserBase class.
|
||||
|
||||
*/
|
||||
class ParserTokenReader
|
||||
{
|
||||
private:
|
||||
|
||||
typedef ParserToken<value_type, string_type> token_type;
|
||||
|
||||
public:
|
||||
|
||||
ParserTokenReader(ParserBase *a_pParent);
|
||||
ParserTokenReader* Clone(ParserBase *a_pParent) const;
|
||||
|
||||
void AddValIdent(identfun_type a_pCallback);
|
||||
void SetVarCreator(facfun_type a_pFactory, void *pUserData);
|
||||
void SetFormula(const string_type &a_strFormula);
|
||||
void SetArgSep(char_type cArgSep);
|
||||
|
||||
int GetPos() const;
|
||||
const string_type& GetExpr() const;
|
||||
varmap_type& GetUsedVar();
|
||||
char_type GetArgSep() const;
|
||||
|
||||
void IgnoreUndefVar(bool bIgnore);
|
||||
void ReInit();
|
||||
token_type ReadNextToken();
|
||||
|
||||
private:
|
||||
|
||||
/** \brief Syntax codes.
|
||||
|
||||
The syntax codes control the syntax check done during the first time parsing of
|
||||
the expression string. They are flags that indicate which tokens are allowed next
|
||||
if certain tokens are identified.
|
||||
*/
|
||||
enum ESynCodes
|
||||
{
|
||||
noBO = 1 << 0, ///< to avoid i.e. "cos(7)("
|
||||
noBC = 1 << 1, ///< to avoid i.e. "sin)" or "()"
|
||||
noVAL = 1 << 2, ///< to avoid i.e. "tan 2" or "sin(8)3.14"
|
||||
noVAR = 1 << 3, ///< to avoid i.e. "sin a" or "sin(8)a"
|
||||
noARG_SEP = 1 << 4, ///< to avoid i.e. ",," or "+," ...
|
||||
noFUN = 1 << 5, ///< to avoid i.e. "sqrt cos" or "(1)sin"
|
||||
noOPT = 1 << 6, ///< to avoid i.e. "(+)"
|
||||
noPOSTOP = 1 << 7, ///< to avoid i.e. "(5!!)" "sin!"
|
||||
noINFIXOP = 1 << 8, ///< to avoid i.e. "++4" "!!4"
|
||||
noEND = 1 << 9, ///< to avoid unexpected end of formula
|
||||
noSTR = 1 << 10, ///< to block numeric arguments on string functions
|
||||
noASSIGN = 1 << 11, ///< to block assignement to constant i.e. "4=7"
|
||||
noIF = 1 << 12,
|
||||
noELSE = 1 << 13,
|
||||
sfSTART_OF_LINE = noOPT | noBC | noPOSTOP | noASSIGN | noIF | noELSE | noARG_SEP,
|
||||
noANY = ~0 ///< All of he above flags set
|
||||
};
|
||||
|
||||
ParserTokenReader(const ParserTokenReader &a_Reader);
|
||||
ParserTokenReader& operator=(const ParserTokenReader &a_Reader);
|
||||
void Assign(const ParserTokenReader &a_Reader);
|
||||
|
||||
void SetParent(ParserBase *a_pParent);
|
||||
int ExtractToken(const char_type *a_szCharSet,
|
||||
string_type &a_strTok,
|
||||
int a_iPos) const;
|
||||
int ExtractOperatorToken(string_type &a_sTok, int a_iPos) const;
|
||||
|
||||
bool IsBuiltIn(token_type &a_Tok);
|
||||
bool IsArgSep(token_type &a_Tok);
|
||||
bool IsEOF(token_type &a_Tok);
|
||||
bool IsInfixOpTok(token_type &a_Tok);
|
||||
bool IsFunTok(token_type &a_Tok);
|
||||
bool IsPostOpTok(token_type &a_Tok);
|
||||
bool IsOprt(token_type &a_Tok);
|
||||
bool IsValTok(token_type &a_Tok);
|
||||
bool IsVarTok(token_type &a_Tok);
|
||||
bool IsStrVarTok(token_type &a_Tok);
|
||||
bool IsUndefVarTok(token_type &a_Tok);
|
||||
bool IsString(token_type &a_Tok);
|
||||
void Error(EErrorCodes a_iErrc,
|
||||
int a_iPos = -1,
|
||||
const string_type &a_sTok = string_type() ) const;
|
||||
|
||||
token_type& SaveBeforeReturn(const token_type &tok);
|
||||
|
||||
ParserBase *m_pParser;
|
||||
string_type m_strFormula;
|
||||
int m_iPos;
|
||||
int m_iSynFlags;
|
||||
bool m_bIgnoreUndefVar;
|
||||
|
||||
const funmap_type *m_pFunDef;
|
||||
const funmap_type *m_pPostOprtDef;
|
||||
const funmap_type *m_pInfixOprtDef;
|
||||
const funmap_type *m_pOprtDef;
|
||||
const valmap_type *m_pConstDef;
|
||||
const strmap_type *m_pStrVarDef;
|
||||
varmap_type *m_pVarDef; ///< The only non const pointer to parser internals
|
||||
facfun_type m_pFactory;
|
||||
void *m_pFactoryData;
|
||||
std::list<identfun_type> m_vIdentFun; ///< Value token identification function
|
||||
varmap_type m_UsedVar;
|
||||
value_type m_fZero; ///< Dummy value of zero, referenced by undefined variables
|
||||
int m_iBrackets;
|
||||
token_type m_lastTok;
|
||||
char_type m_cArgSep; ///< The character used for separating function arguments
|
||||
};
|
||||
} // namespace mu
|
||||
|
||||
#endif
|
||||
|
||||
|
1
muparser/lib/Readme.txt
Normal file
1
muparser/lib/Readme.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Here goes the libraries (both static and shared) for this component.
|
592
muparser/samples/example1/example1.cpp
Normal file
592
muparser/samples/example1/example1.cpp
Normal file
|
@ -0,0 +1,592 @@
|
|||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// __________
|
||||
// _____ __ __\______ \_____ _______ ______ ____ _______
|
||||
// / \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
// | Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
// |__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
// \/ \/ \/ \/
|
||||
// (C) 2015 Ingo Berg
|
||||
//
|
||||
// example1.cpp - using the parser as a static library
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include "muParserTest.h"
|
||||
|
||||
#if defined(_WIN32) && defined(_DEBUG)
|
||||
#define _CRTDBG_MAP_ALLOC
|
||||
#include <stdlib.h>
|
||||
#include <crtdbg.h>
|
||||
#define CREATE_LEAKAGE_REPORT
|
||||
#endif
|
||||
|
||||
#if defined( USINGDLL ) && defined( _WIN32 )
|
||||
#error This sample can be used only with STATIC builds of muParser (on win32)
|
||||
#endif
|
||||
|
||||
/** \brief This macro will enable mathematical constants like M_PI. */
|
||||
#define _USE_MATH_DEFINES
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <locale>
|
||||
#include <limits>
|
||||
#include <ios>
|
||||
#include <iomanip>
|
||||
#include <numeric>
|
||||
|
||||
#include "muParser.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace mu;
|
||||
|
||||
|
||||
#if defined(CREATE_LEAKAGE_REPORT)
|
||||
|
||||
// Dumping memory leaks in the destructor of the static guard
|
||||
// guarantees i won't get false positives from the ParserErrorMsg
|
||||
// class wich is a singleton with a static instance.
|
||||
struct DumpLeaks
|
||||
{
|
||||
~DumpLeaks()
|
||||
{
|
||||
_CrtDumpMemoryLeaks();
|
||||
}
|
||||
} static LeakDumper;
|
||||
|
||||
#endif
|
||||
|
||||
// Forward declarations
|
||||
void CalcBulk();
|
||||
|
||||
// Operator callback functions
|
||||
value_type Mega(value_type a_fVal) { return a_fVal * 1e6; }
|
||||
value_type Milli(value_type a_fVal) { return a_fVal / (value_type)1e3; }
|
||||
value_type Rnd(value_type v) { return v*std::rand()/(value_type)(RAND_MAX+1.0); }
|
||||
value_type Not(value_type v) { return v==0; }
|
||||
value_type Add(value_type v1, value_type v2) { return v1+v2; }
|
||||
value_type Mul(value_type v1, value_type v2) { return v1*v2; }
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type ThrowAnException(value_type)
|
||||
{
|
||||
throw std::runtime_error("This function does throw an exception.");
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type BulkFun1(int nBulkIdx, int nThreadIdx, value_type v1)
|
||||
{
|
||||
// Note: I'm just doing something with all three parameters to shut
|
||||
// compiler warnings up!
|
||||
return nBulkIdx + nThreadIdx + v1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type Ping()
|
||||
{
|
||||
mu::console() << "ping\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type StrFun0(const char_type *szMsg)
|
||||
{
|
||||
if (szMsg)
|
||||
mu::console() << szMsg << std::endl;
|
||||
|
||||
return 999;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type StrFun2(const char_type *v1, value_type v2,value_type v3)
|
||||
{
|
||||
mu::console() << v1 << std::endl;
|
||||
return v2+v3;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type Debug(mu::value_type v1, mu::value_type v2)
|
||||
{
|
||||
ParserBase::EnableDebugDump(v1!=0, v2!=0);
|
||||
mu::console() << _T("Bytecode dumping ") << ((v1!=0) ? _T("active") : _T("inactive")) << _T("\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Factory function for creating new parser variables
|
||||
// This could as well be a function performing database queries.
|
||||
value_type* AddVariable(const char_type *a_szName, void *a_pUserData)
|
||||
{
|
||||
// I don't want dynamic allocation here, so i used this static buffer
|
||||
// If you want dynamic allocation you must allocate all variables dynamically
|
||||
// in order to delete them later on. Or you find other ways to keep track of
|
||||
// variables that have been created implicitely.
|
||||
static value_type afValBuf[100];
|
||||
static int iVal = -1;
|
||||
|
||||
++iVal;
|
||||
|
||||
mu::console() << _T("Generating new variable \"")
|
||||
<< a_szName << std::dec << _T("\" (slots left: ")
|
||||
<< 99-iVal << _T(")")
|
||||
<< _T(" User data pointer is:")
|
||||
<< std::hex << a_pUserData <<endl;
|
||||
afValBuf[iVal] = 0;
|
||||
|
||||
if (iVal>=99)
|
||||
throw mu::ParserError( _T("Variable buffer overflow.") );
|
||||
else
|
||||
return &afValBuf[iVal];
|
||||
}
|
||||
|
||||
int IsHexValue(const char_type *a_szExpr, int *a_iPos, value_type *a_fVal)
|
||||
{
|
||||
if (a_szExpr[1]==0 || (a_szExpr[0]!='0' || a_szExpr[1]!='x') )
|
||||
return 0;
|
||||
|
||||
unsigned iVal(0);
|
||||
|
||||
// New code based on streams for UNICODE compliance:
|
||||
stringstream_type::pos_type nPos(0);
|
||||
stringstream_type ss(a_szExpr + 2);
|
||||
ss >> std::hex >> iVal;
|
||||
nPos = ss.tellg();
|
||||
|
||||
if (nPos==(stringstream_type::pos_type)0)
|
||||
return 1;
|
||||
|
||||
*a_iPos += (int)(2 + nPos);
|
||||
*a_fVal = (value_type)iVal;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void Splash()
|
||||
{
|
||||
mu::console() << _T(" __________ \n");
|
||||
mu::console() << _T(" _____ __ __\\______ \\_____ _______ ______ ____ _______\n");
|
||||
mu::console() << _T(" / \\ | | \\| ___/\\__ \\ \\_ __ \\/ ___/_/ __ \\\\_ __ \\ \n");
|
||||
mu::console() << _T(" | Y Y \\| | /| | / __ \\_| | \\/\\___ \\ \\ ___/ | | \\/ \n");
|
||||
mu::console() << _T(" |__|_| /|____/ |____| (____ /|__| /____ > \\___ >|__| \n");
|
||||
mu::console() << _T(" \\/ \\/ \\/ \\/ \n");
|
||||
mu::console() << _T(" Version ") << Parser().GetVersion(pviFULL) << _T("\n");
|
||||
mu::console() << _T(" (C) 2015 Ingo Berg\n");
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type SelfTest()
|
||||
{
|
||||
mu::console() << _T( "-----------------------------------------------------------\n");
|
||||
mu::console() << _T( "Running test suite:\n\n");
|
||||
|
||||
// Skip the self test if the value type is set to an integer type.
|
||||
if (mu::TypeInfo<mu::value_type>::IsInteger())
|
||||
{
|
||||
mu::console() << _T( " Test skipped: integer data type are not compatible with the unit test!\n\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
mu::Test::ParserTester pt;
|
||||
pt.Run();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type Help()
|
||||
{
|
||||
mu::console() << _T( "-----------------------------------------------------------\n");
|
||||
mu::console() << _T( "Commands:\n\n");
|
||||
mu::console() << _T( " list var - list parser variables\n");
|
||||
mu::console() << _T( " list exprvar - list expression variables\n");
|
||||
mu::console() << _T( " list const - list all numeric parser constants\n");
|
||||
mu::console() << _T( " opt on - enable optimizer (default)\n");
|
||||
mu::console() << _T( " opt off - disable optimizer\n");
|
||||
mu::console() << _T( " locale de - switch to german locale\n");
|
||||
mu::console() << _T( " locale en - switch to english locale\n");
|
||||
mu::console() << _T( " locale reset - reset locale\n");
|
||||
mu::console() << _T( " test bulk - test bulk mode\n");
|
||||
mu::console() << _T( " quit - exits the parser\n");
|
||||
mu::console() << _T( "\nConstants:\n\n");
|
||||
mu::console() << _T( " \"_e\" 2.718281828459045235360287\n");
|
||||
mu::console() << _T( " \"_pi\" 3.141592653589793238462643\n");
|
||||
mu::console() << _T( "-----------------------------------------------------------\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/*
|
||||
void CheckLocale()
|
||||
{
|
||||
// Local names:
|
||||
// "C" - the classic C locale
|
||||
// "de_DE" - not for Windows?
|
||||
// "en_US" - not for Windows?
|
||||
// "German_germany" - For MSVC8
|
||||
try
|
||||
{
|
||||
std::locale loc("German_germany");
|
||||
console() << _T("Locale settings:\n");
|
||||
console() << _T(" Decimal point: '") << std::use_facet<numpunct<char_type> >(loc).decimal_point() << _T("'\n");
|
||||
console() << _T(" Thousands sep: '") << std::use_facet<numpunct<char_type> >(loc).thousands_sep() << _T("'\n");
|
||||
console() << _T(" Grouping: '") << std::use_facet<numpunct<char_type> >(loc).grouping() << _T("'\n");
|
||||
console() << _T(" True is named: '") << std::use_facet<numpunct<char_type> >(loc).truename() << _T("'\n");
|
||||
console() << _T(" False is named: '") << std::use_facet<numpunct<char_type> >(loc).falsename() << _T("'\n");
|
||||
console() << _T("-----------------------------------------------------------\n");
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
console() << _T("Locale settings:\n");
|
||||
console() << _T(" invalid locale name\n");
|
||||
console() << _T("-----------------------------------------------------------\n");
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void CheckDiff()
|
||||
{
|
||||
mu::Parser parser;
|
||||
value_type x = 1,
|
||||
v1,
|
||||
v2,
|
||||
v3,
|
||||
eps(pow(std::numeric_limits<value_type>::epsilon(), 0.2));
|
||||
parser.DefineVar(_T("x"), &x);
|
||||
parser.SetExpr(_T("_e^-x*sin(x)"));
|
||||
|
||||
v1 = parser.Diff(&x, 1),
|
||||
v2 = parser.Diff(&x, 1, eps);
|
||||
v3 = cos((value_type)1.0)/exp((value_type)1) - sin((value_type)1.0)/exp((value_type)1); //-0.110793765307;
|
||||
mu::console() << parser.GetExpr() << _T("\n");
|
||||
mu::console() << _T("v1 = ") << v1 << _T("; v1-v3 = ") << v1-v3 << _T("\n");
|
||||
mu::console() << _T("v2 = ") << v2 << _T("; v2-v3 = ") << v2-v3 << _T("\n");
|
||||
}
|
||||
*/
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ListVar(const mu::ParserBase &parser)
|
||||
{
|
||||
// Query the used variables (must be done after calc)
|
||||
mu::varmap_type variables = parser.GetVar();
|
||||
if (!variables.size())
|
||||
return;
|
||||
|
||||
cout << "\nParser variables:\n";
|
||||
cout << "-----------------\n";
|
||||
cout << "Number: " << (int)variables.size() << "\n";
|
||||
varmap_type::const_iterator item = variables.begin();
|
||||
for (; item!=variables.end(); ++item)
|
||||
mu::console() << _T("Name: ") << item->first << _T(" Address: [0x") << item->second << _T("]\n");
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ListConst(const mu::ParserBase &parser)
|
||||
{
|
||||
mu::console() << _T("\nParser constants:\n");
|
||||
mu::console() << _T("-----------------\n");
|
||||
|
||||
mu::valmap_type cmap = parser.GetConst();
|
||||
if (!cmap.size())
|
||||
{
|
||||
mu::console() << _T("Expression does not contain constants\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
valmap_type::const_iterator item = cmap.begin();
|
||||
for (; item!=cmap.end(); ++item)
|
||||
mu::console() << _T(" ") << item->first << _T(" = ") << item->second << _T("\n");
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ListExprVar(const mu::ParserBase &parser)
|
||||
{
|
||||
string_type sExpr = parser.GetExpr();
|
||||
if (sExpr.length()==0)
|
||||
{
|
||||
cout << _T("Expression string is empty\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Query the used variables (must be done after calc)
|
||||
mu::console() << _T("\nExpression variables:\n");
|
||||
mu::console() << _T("---------------------\n");
|
||||
mu::console() << _T("Expression: ") << parser.GetExpr() << _T("\n");
|
||||
|
||||
varmap_type variables = parser.GetUsedVar();
|
||||
if (!variables.size())
|
||||
{
|
||||
mu::console() << _T("Expression does not contain variables\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
mu::console() << _T("Number: ") << (int)variables.size() << _T("\n");
|
||||
mu::varmap_type::const_iterator item = variables.begin();
|
||||
for (; item!=variables.end(); ++item)
|
||||
mu::console() << _T("Name: ") << item->first << _T(" Address: [0x") << item->second << _T("]\n");
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check for external keywords.
|
||||
*/
|
||||
int CheckKeywords(const mu::char_type *a_szLine, mu::Parser &a_Parser)
|
||||
{
|
||||
string_type sLine(a_szLine);
|
||||
|
||||
if ( sLine == _T("quit") )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if ( sLine == _T("list var") )
|
||||
{
|
||||
ListVar(a_Parser);
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("opt on") )
|
||||
{
|
||||
a_Parser.EnableOptimizer(true);
|
||||
mu::console() << _T("Optimizer enabled\n");
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("opt off") )
|
||||
{
|
||||
a_Parser.EnableOptimizer(false);
|
||||
mu::console() << _T("Optimizer disabled\n");
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("list const") )
|
||||
{
|
||||
ListConst(a_Parser);
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("list exprvar") )
|
||||
{
|
||||
ListExprVar(a_Parser);
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("locale de") )
|
||||
{
|
||||
mu::console() << _T("Setting german locale: ArgSep=';' DecSep=',' ThousandsSep='.'\n");
|
||||
a_Parser.SetArgSep(';');
|
||||
a_Parser.SetDecSep(',');
|
||||
a_Parser.SetThousandsSep('.');
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("locale en") )
|
||||
{
|
||||
mu::console() << _T("Setting english locale: ArgSep=',' DecSep='.' ThousandsSep=''\n");
|
||||
a_Parser.SetArgSep(',');
|
||||
a_Parser.SetDecSep('.');
|
||||
a_Parser.SetThousandsSep();
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("locale reset") )
|
||||
{
|
||||
mu::console() << _T("Resetting locale\n");
|
||||
a_Parser.ResetLocale();
|
||||
return 1;
|
||||
}
|
||||
else if ( sLine == _T("test bulk") )
|
||||
{
|
||||
mu::console() << _T("Testing bulk mode\n");
|
||||
CalcBulk();
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void CalcBulk()
|
||||
{
|
||||
const int nBulkSize = 200;
|
||||
value_type *x = new value_type[nBulkSize];
|
||||
value_type *y = new value_type[nBulkSize];
|
||||
value_type *result = new value_type[nBulkSize];
|
||||
|
||||
try
|
||||
{
|
||||
for (int i=0; i<nBulkSize; ++i)
|
||||
{
|
||||
x[i] = i;
|
||||
y[i] = (value_type)i/10;
|
||||
}
|
||||
mu::Parser parser;
|
||||
parser.DefineVar(_T("x"), x);
|
||||
parser.DefineVar(_T("y"), y);
|
||||
parser.DefineFun(_T("fun1"), BulkFun1);
|
||||
parser.SetExpr(_T("fun1(0)+x+y"));
|
||||
parser.Eval(result, nBulkSize);
|
||||
|
||||
for (int i=0; i<nBulkSize; ++i)
|
||||
{
|
||||
mu::console() << _T("Eqn. ") << i << _T(": x=") << x[i] << _T("; y=") << y[i] << _T("; result=") << result[i] << _T("\n");
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
delete [] x;
|
||||
delete [] y;
|
||||
delete [] result;
|
||||
throw;
|
||||
}
|
||||
|
||||
delete [] x;
|
||||
delete [] y;
|
||||
delete [] result;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void Calc()
|
||||
{
|
||||
mu::Parser parser;
|
||||
|
||||
// Change locale settings if necessary
|
||||
// function argument separator: sum(2;3;4) vs. sum(2,3,4)
|
||||
// decimal separator: 3,14 vs. 3.14
|
||||
// thousands separator: 1000000 vs 1.000.000
|
||||
//#define USE_GERMAN_LOCALE
|
||||
#ifdef USE_GERMAN_LOCALE
|
||||
parser.SetArgSep(';');
|
||||
parser.SetDecSep(',');
|
||||
parser.SetThousandsSep('.');
|
||||
#else
|
||||
// this is the default, so i it's commented:
|
||||
//parser.SetArgSep(',');
|
||||
//parser.SetDecSep('.');
|
||||
//parser.SetThousandsSep('');
|
||||
#endif
|
||||
|
||||
// Add some variables
|
||||
value_type vVarVal[] = { 1, 2 }; // Values of the parser variables
|
||||
parser.DefineVar(_T("a"), &vVarVal[0]); // Assign Variable names and bind them to the C++ variables
|
||||
parser.DefineVar(_T("b"), &vVarVal[1]);
|
||||
parser.DefineVar(_T("ft"), &vVarVal[1]);
|
||||
parser.DefineStrConst(_T("sVar1"), _T("Sample string 1") );
|
||||
parser.DefineStrConst(_T("sVar2"), _T("Sample string 2") );
|
||||
parser.AddValIdent(IsHexValue);
|
||||
|
||||
// Add user defined unary operators
|
||||
parser.DefinePostfixOprt(_T("M"), Mega);
|
||||
parser.DefinePostfixOprt(_T("m"), Milli);
|
||||
parser.DefineInfixOprt(_T("!"), Not);
|
||||
parser.DefineFun(_T("strfun0"), StrFun0);
|
||||
parser.DefineFun(_T("strfun2"), StrFun2);
|
||||
parser.DefineFun(_T("ping"), Ping);
|
||||
parser.DefineFun(_T("rnd"), Rnd); // Add an unoptimizeable function
|
||||
parser.DefineFun(_T("throw"), ThrowAnException);
|
||||
|
||||
|
||||
parser.DefineOprt(_T("add"), Add, 0);
|
||||
parser.DefineOprt(_T("mul"), Mul, 1);
|
||||
|
||||
// These are service and debug functions
|
||||
parser.DefineFun(_T("debug"), Debug);
|
||||
parser.DefineFun(_T("selftest"), SelfTest);
|
||||
parser.DefineFun(_T("help"), Help);
|
||||
|
||||
parser.DefinePostfixOprt(_T("{ft}"), Milli);
|
||||
parser.DefinePostfixOprt(_T("ft"), Milli);
|
||||
#ifdef _DEBUG
|
||||
// parser.EnableDebugDump(1, 0);
|
||||
#endif
|
||||
|
||||
// Define the variable factory
|
||||
parser.SetVarFactory(AddVariable, &parser);
|
||||
|
||||
for(;;)
|
||||
{
|
||||
try
|
||||
{
|
||||
string_type sLine;
|
||||
std::getline(mu::console_in(), sLine);
|
||||
|
||||
switch (CheckKeywords(sLine.c_str(), parser))
|
||||
{
|
||||
case 0: break;
|
||||
case 1: continue;
|
||||
case -1: return;
|
||||
}
|
||||
|
||||
if (!sLine.length())
|
||||
continue;
|
||||
|
||||
parser.SetExpr(sLine);
|
||||
mu::console() << std::setprecision(12);
|
||||
|
||||
// There are multiple ways to retrieve the result...
|
||||
// 1.) If you know there is only a single return value or in case you only need the last
|
||||
// result of an expression consisting of comma separated subexpressions you can
|
||||
// simply use:
|
||||
mu::console() << _T("ans=") << parser.Eval() << _T("\n");
|
||||
|
||||
// 2.) As an alternative you can also retrieve multiple return values using this API:
|
||||
int nNum = parser.GetNumResults();
|
||||
if (nNum>1)
|
||||
{
|
||||
mu::console() << _T("Multiple return values detected! Complete list:\n");
|
||||
|
||||
// this is the hard way if you need to retrieve multiple subexpression
|
||||
// results
|
||||
value_type *v = parser.Eval(nNum);
|
||||
mu::console() << std::setprecision(12);
|
||||
for (int i=0; i<nNum; ++i)
|
||||
{
|
||||
mu::console() << v[i] << _T("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(mu::Parser::exception_type &e)
|
||||
{
|
||||
mu::console() << _T("\nError:\n");
|
||||
mu::console() << _T("------\n");
|
||||
mu::console() << _T("Message: ") << e.GetMsg() << _T("\n");
|
||||
mu::console() << _T("Expression: \"") << e.GetExpr() << _T("\"\n");
|
||||
mu::console() << _T("Token: \"") << e.GetToken() << _T("\"\n");
|
||||
mu::console() << _T("Position: ") << (int)e.GetPos() << _T("\n");
|
||||
mu::console() << _T("Errc: ") << std::dec << e.GetCode() << _T("\n");
|
||||
}
|
||||
} // while running
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
int main(int, char**)
|
||||
{
|
||||
Splash();
|
||||
SelfTest();
|
||||
Help();
|
||||
|
||||
// CheckLocale();
|
||||
// CheckDiff();
|
||||
|
||||
mu::console() << _T("Enter an expression or a command:\n");
|
||||
|
||||
try
|
||||
{
|
||||
Calc();
|
||||
}
|
||||
catch(Parser::exception_type &e)
|
||||
{
|
||||
// Only erros raised during the initialization will end up here
|
||||
// formula related errors are treated in Calc()
|
||||
console() << _T("Initialization error: ") << e.GetMsg() << endl;
|
||||
console() << _T("aborting...") << endl;
|
||||
string_type sBuf;
|
||||
console_in() >> sBuf;
|
||||
}
|
||||
catch(std::exception & /*exc*/)
|
||||
{
|
||||
// there is no unicode compliant way to query exc.what()
|
||||
// so i'll leave it for this example.
|
||||
console() << _T("aborting...\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
18
muparser/samples/example2/Readme.txt
Normal file
18
muparser/samples/example2/Readme.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
|
||||
Copyright (C) 2010
|
||||
Ingo Berg
|
||||
|
||||
|
||||
This sample demonstrates using muParsers C-interface. The C-Interface
|
||||
is usefull when interfacing muParser from different languages such
|
||||
as C#. This sample is intended for use with the MS-Windows OS.
|
||||
|
||||
You may need to copy the muparser.dll file from the ..\..\lib
|
||||
folder in this directory in order to run this sample.
|
442
muparser/samples/example2/example2.c
Normal file
442
muparser/samples/example2/example2.c
Normal file
|
@ -0,0 +1,442 @@
|
|||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#include "muParserDLL.h"
|
||||
|
||||
#define PARSER_CONST_PI 3.141592653589793238462643
|
||||
#define PARSER_CONST_E 2.718281828459045235360287
|
||||
#define PARSER_MAXVARS 10
|
||||
|
||||
#ifndef _UNICODE
|
||||
#define _T(x) x
|
||||
#define myprintf printf
|
||||
#define mystrlen strlen
|
||||
#define myfgets fgets
|
||||
#define mystrcmp strcmp
|
||||
#else
|
||||
#define _T(x) L ##x
|
||||
#define myprintf wprintf
|
||||
#define mystrlen wcslen
|
||||
#define myfgets fgetws
|
||||
#define mystrcmp wcscmp
|
||||
#endif
|
||||
|
||||
extern void CalcBulk();
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Callbacks for postfix operators
|
||||
muFloat_t Mega(muFloat_t a_fVal)
|
||||
{
|
||||
return a_fVal * 1.0e6;
|
||||
}
|
||||
|
||||
muFloat_t Milli(muFloat_t a_fVal)
|
||||
{
|
||||
return a_fVal / 1.0e3;
|
||||
}
|
||||
|
||||
muFloat_t ZeroArg()
|
||||
{
|
||||
myprintf(_T("i'm a function without arguments.\n"));
|
||||
return 123;
|
||||
}
|
||||
|
||||
muFloat_t BulkTest(int nBulkIdx, int nThreadIdx, muFloat_t v1)
|
||||
{
|
||||
(void*)&nThreadIdx; // STFU compiler warning...
|
||||
myprintf(_T("%d,%2.2f\n"), nBulkIdx, v1);
|
||||
return v1 / (nBulkIdx + 1);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Callbacks for infix operators
|
||||
muFloat_t Not(muFloat_t v) { return v == 0; }
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Function callbacks
|
||||
muFloat_t Rnd(muFloat_t v) { return v * rand() / (muFloat_t)(RAND_MAX + 1.0); }
|
||||
|
||||
muFloat_t SampleQuery(const muChar_t *szMsg)
|
||||
{
|
||||
if (szMsg)
|
||||
{
|
||||
myprintf(_T("%s\n"), szMsg);
|
||||
}
|
||||
|
||||
return 999;
|
||||
}
|
||||
|
||||
muFloat_t Sum(const muFloat_t *a_afArg, int a_iArgc)
|
||||
{
|
||||
muFloat_t fRes = 0;
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < a_iArgc; ++i)
|
||||
fRes += a_afArg[i];
|
||||
|
||||
return fRes;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Binarty operator callbacks
|
||||
muFloat_t Add(muFloat_t v1, muFloat_t v2)
|
||||
{
|
||||
return v1 + v2;
|
||||
}
|
||||
|
||||
muFloat_t Mul(muFloat_t v1, muFloat_t v2)
|
||||
{
|
||||
return v1*v2;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Factory function for creating new parser variables
|
||||
// This could as well be a function performing database queries.
|
||||
muFloat_t* AddVariable(const muChar_t* a_szName, void *pUserData)
|
||||
{
|
||||
static muFloat_t afValBuf[PARSER_MAXVARS]; // I don't want dynamic allocation here
|
||||
static int iVal = 0; // so i used this buffer
|
||||
|
||||
myprintf(_T("Generating new variable \"%s\" (slots left: %d; context pointer: 0x%x)\n"), a_szName, PARSER_MAXVARS - iVal, (int)pUserData);
|
||||
|
||||
afValBuf[iVal] = 0;
|
||||
if (iVal >= PARSER_MAXVARS - 1)
|
||||
{
|
||||
myprintf(_T("Variable buffer overflow."));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &afValBuf[iVal++];
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void Intro(muParserHandle_t hParser)
|
||||
{
|
||||
myprintf(_T(" __________ \n"));
|
||||
myprintf(_T(" _____ __ __\\______ \\_____ _______ ______ ____ _______\n"));
|
||||
myprintf(_T(" / \\ | | \\| ___/\\__ \\ \\_ __ \\/ ___/_/ __ \\\\_ __ \\ \n"));
|
||||
myprintf(_T(" | Y Y \\| | /| | / __ \\_| | \\/\\___ \\ \\ ___/ | | \\/ \n"));
|
||||
myprintf(_T(" |__|_| /|____/ |____| (____ /|__| /____ > \\___ >|__| \n"));
|
||||
myprintf(_T(" \\/ \\/ \\/ \\/ \n"));
|
||||
myprintf(_T(" Version %s (DLL)\n"), mupGetVersion(hParser));
|
||||
#ifdef _UNICODE
|
||||
myprintf(_T(" Sample build with UNICODE support\n"));
|
||||
#else
|
||||
myprintf(_T(" Sample build with ASCII support\n"));
|
||||
#endif
|
||||
myprintf(_T(" (C) 2015 Ingo Berg\n"));
|
||||
myprintf(_T("---------------------------------------\n"));
|
||||
myprintf(_T("Commands:\n"));
|
||||
myprintf(_T(" list var - list parser variables\n"));
|
||||
myprintf(_T(" list exprvar - list expression variables\n"));
|
||||
myprintf(_T(" list const - list all numeric parser constants\n"));
|
||||
myprintf(_T(" locale de - switch to german locale\n"));
|
||||
myprintf(_T(" locale en - switch to english locale\n"));
|
||||
myprintf(_T(" locale reset - reset locale\n"));
|
||||
myprintf(_T(" test bulk - test bulk mode\n"));
|
||||
myprintf(_T(" quit - exits the parser\n\n"));
|
||||
myprintf(_T("---------------------------------------\n"));
|
||||
myprintf(_T("Constants:\n"));
|
||||
myprintf(_T(" \"_e\" 2.718281828459045235360287\n"));
|
||||
myprintf(_T(" \"_pi\" 3.141592653589793238462643\n"));
|
||||
myprintf(_T("---------------------------------------\n"));
|
||||
myprintf(_T("Please enter an expression:\n"));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Callback function for parser errors
|
||||
void OnError(muParserHandle_t hParser)
|
||||
{
|
||||
myprintf(_T("\nError:\n"));
|
||||
myprintf(_T("------\n"));
|
||||
myprintf(_T("Message: \"%s\"\n"), mupGetErrorMsg(hParser));
|
||||
myprintf(_T("Token: \"%s\"\n"), mupGetErrorToken(hParser));
|
||||
myprintf(_T("Position: %d\n"), mupGetErrorPos(hParser));
|
||||
myprintf(_T("Errc: %d\n"), mupGetErrorCode(hParser));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ListVar(muParserHandle_t a_hParser)
|
||||
{
|
||||
int iNumVar = mupGetVarNum(a_hParser);
|
||||
int i = 0;
|
||||
|
||||
if (iNumVar == 0)
|
||||
{
|
||||
myprintf(_T("No variables defined\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
myprintf(_T("\nExpression variables:\n"));
|
||||
myprintf(_T("---------------------\n"));
|
||||
myprintf(_T("Number: %d\n"), iNumVar);
|
||||
|
||||
for (i = 0; i < iNumVar; ++i)
|
||||
{
|
||||
const muChar_t* szName = 0;
|
||||
muFloat_t* pVar = 0;
|
||||
|
||||
mupGetVar(a_hParser, i, &szName, &pVar);
|
||||
myprintf(_T("Name: %s Address: [0x%x]\n"), szName, (long long)pVar);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ListExprVar(muParserHandle_t a_hParser)
|
||||
{
|
||||
muInt_t iNumVar = mupGetExprVarNum(a_hParser),
|
||||
i = 0;
|
||||
|
||||
if (iNumVar == 0)
|
||||
{
|
||||
myprintf(_T("Expression dos not contain variables\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
myprintf(_T("\nExpression variables:\n"));
|
||||
myprintf(_T("---------------------\n"));
|
||||
myprintf(_T("Expression: %s\n"), mupGetExpr(a_hParser));
|
||||
myprintf(_T("Number: %d\n"), iNumVar);
|
||||
|
||||
for (i = 0; i < iNumVar; ++i)
|
||||
{
|
||||
const muChar_t* szName = 0;
|
||||
muFloat_t* pVar = 0;
|
||||
|
||||
mupGetExprVar(a_hParser, i, &szName, &pVar);
|
||||
myprintf(_T("Name: %s Address: [0x%x]\n"), szName, (long long)pVar);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ListConst(muParserHandle_t a_hParser)
|
||||
{
|
||||
muInt_t iNumVar = mupGetConstNum(a_hParser),
|
||||
i = 0;
|
||||
|
||||
if (iNumVar == 0)
|
||||
{
|
||||
myprintf(_T("No constants defined\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
myprintf(_T("\nParser constants:\n"));
|
||||
myprintf(_T("---------------------\n"));
|
||||
myprintf(_T("Number: %d"), iNumVar);
|
||||
|
||||
for (i = 0; i < iNumVar; ++i)
|
||||
{
|
||||
const muChar_t* szName = 0;
|
||||
muFloat_t fVal = 0;
|
||||
|
||||
mupGetConst(a_hParser, i, &szName, &fVal);
|
||||
myprintf(_T(" %s = %f\n"), szName, fVal);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check for external keywords.
|
||||
*/
|
||||
int CheckKeywords(const muChar_t *a_szLine, muParserHandle_t a_hParser)
|
||||
{
|
||||
if (!mystrcmp(a_szLine, _T("quit")))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("list var")))
|
||||
{
|
||||
ListVar(a_hParser);
|
||||
return 1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("list exprvar")))
|
||||
{
|
||||
ListExprVar(a_hParser);
|
||||
return 1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("list const")))
|
||||
{
|
||||
ListConst(a_hParser);
|
||||
return 1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("locale de")))
|
||||
{
|
||||
myprintf(_T("Setting german locale: ArgSep=';' DecSep=',' ThousandsSep='.'\n"));
|
||||
mupSetArgSep(a_hParser, ';');
|
||||
mupSetDecSep(a_hParser, ',');
|
||||
mupSetThousandsSep(a_hParser, '.');
|
||||
return 1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("locale en")))
|
||||
{
|
||||
myprintf(_T("Setting english locale: ArgSep=',' DecSep='.' ThousandsSep=''\n"));
|
||||
mupSetArgSep(a_hParser, ',');
|
||||
mupSetDecSep(a_hParser, '.');
|
||||
mupSetThousandsSep(a_hParser, 0);
|
||||
return 1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("locale reset")))
|
||||
{
|
||||
myprintf(_T("Resetting locale\n"));
|
||||
mupResetLocale(a_hParser);
|
||||
return 1;
|
||||
}
|
||||
else if (!mystrcmp(a_szLine, _T("test bulk")))
|
||||
{
|
||||
myprintf(_T("Testing bulk mode\n"));
|
||||
CalcBulk();
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void CalcBulk()
|
||||
{
|
||||
int nBulkSize = 200, i;
|
||||
muFloat_t *x = (muFloat_t*)malloc(nBulkSize * sizeof(muFloat_t));
|
||||
muFloat_t *y = (muFloat_t*)malloc(nBulkSize * sizeof(muFloat_t));
|
||||
muFloat_t *r = (muFloat_t*)malloc(nBulkSize * sizeof(muFloat_t));
|
||||
|
||||
muParserHandle_t hParser = mupCreate(muBASETYPE_FLOAT); // initialize the parser
|
||||
|
||||
for (i = 0; i < nBulkSize; ++i)
|
||||
{
|
||||
x[i] = i;
|
||||
y[i] = i;
|
||||
r[i] = 0;
|
||||
}
|
||||
|
||||
mupDefineVar(hParser, _T("x"), x);
|
||||
mupDefineVar(hParser, _T("y"), y);
|
||||
mupDefineBulkFun1(hParser, _T("bulktest"), BulkTest);
|
||||
mupSetExpr(hParser, _T("bulktest(x+y)"));
|
||||
mupEvalBulk(hParser, r, nBulkSize);
|
||||
if (mupError(hParser))
|
||||
{
|
||||
myprintf(_T("\nError:\n"));
|
||||
myprintf(_T("------\n"));
|
||||
myprintf(_T("Message: %s\n"), mupGetErrorMsg(hParser));
|
||||
myprintf(_T("Token: %s\n"), mupGetErrorToken(hParser));
|
||||
myprintf(_T("Position: %d\n"), mupGetErrorPos(hParser));
|
||||
myprintf(_T("Errc: %d\n"), mupGetErrorCode(hParser));
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < nBulkSize; ++i)
|
||||
{
|
||||
myprintf(_T("%d: bulkfun(%2.2f + %2.2f) = %2.2f\n"), i, x[i], y[i], r[i]);
|
||||
x[i] = i;
|
||||
y[i] = (muFloat_t)i / 10;
|
||||
}
|
||||
|
||||
free(x);
|
||||
free(y);
|
||||
free(r);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void Calc()
|
||||
{
|
||||
muChar_t szLine[100];
|
||||
muFloat_t fVal = 0,
|
||||
afVarVal[] = { 1, 2 }; // Values of the parser variables
|
||||
muParserHandle_t hParser;
|
||||
|
||||
hParser = mupCreate(muBASETYPE_FLOAT); // initialize the parser
|
||||
Intro(hParser);
|
||||
|
||||
// Set an error handler [optional]
|
||||
// the only function that does not take a parser instance handle
|
||||
mupSetErrorHandler(hParser, OnError);
|
||||
|
||||
//#define GERMAN_LOCALS
|
||||
#ifdef GERMAN_LOCALS
|
||||
mupSetArgSep(hParser, ';');
|
||||
mupSetDecSep(hParser, ',');
|
||||
mupSetThousandsSep(hParser, '.');
|
||||
#else
|
||||
mupSetArgSep(hParser, ',');
|
||||
mupSetDecSep(hParser, '.');
|
||||
#endif
|
||||
|
||||
// Set a variable factory
|
||||
mupSetVarFactory(hParser, AddVariable, NULL);
|
||||
|
||||
// Define parser variables and bind them to C++ variables [optional]
|
||||
mupDefineConst(hParser, _T("const1"), 1);
|
||||
mupDefineConst(hParser, _T("const2"), 2);
|
||||
mupDefineStrConst(hParser, _T("strBuf"), _T("Hallo welt"));
|
||||
|
||||
// Define parser variables and bind them to C++ variables [optional]
|
||||
mupDefineVar(hParser, _T("a"), &afVarVal[0]);
|
||||
mupDefineVar(hParser, _T("b"), &afVarVal[1]);
|
||||
|
||||
// Define postfix operators [optional]
|
||||
mupDefinePostfixOprt(hParser, _T("M"), Mega, 0);
|
||||
mupDefinePostfixOprt(hParser, _T("m"), Milli, 0);
|
||||
|
||||
// Define infix operator [optional]
|
||||
mupDefineInfixOprt(hParser, _T("!"), Not, 0);
|
||||
|
||||
// Define functions [optional]
|
||||
// mupDefineStrFun(hParser, "query", SampleQuery, 0); // Add an unoptimizeable function
|
||||
mupDefineFun0(hParser, _T("zero"), ZeroArg, 0);
|
||||
mupDefineFun1(hParser, _T("rnd"), Rnd, 0); // Add an unoptimizeable function
|
||||
mupDefineFun1(hParser, _T("rnd2"), Rnd, 1);
|
||||
mupDefineMultFun(hParser, _T("_sum"), Sum, 0); // "sum" is already a default function
|
||||
|
||||
// Define binary operators [optional]
|
||||
mupDefineOprt(hParser, _T("add"), Add, 0, muOPRT_ASCT_LEFT, 0);
|
||||
mupDefineOprt(hParser, _T("mul"), Mul, 1, muOPRT_ASCT_LEFT, 0);
|
||||
|
||||
while (myfgets(szLine, 99, stdin))
|
||||
{
|
||||
szLine[mystrlen(szLine) - 1] = 0; // overwrite the newline
|
||||
|
||||
switch (CheckKeywords(szLine, hParser))
|
||||
{
|
||||
case 0: break; // no keyword found; parse the line
|
||||
case 1: continue; // A Keyword was found do not parse the line
|
||||
case -1: return; // abort the application
|
||||
}
|
||||
|
||||
mupSetExpr(hParser, szLine);
|
||||
|
||||
fVal = mupEval(hParser);
|
||||
|
||||
|
||||
// Without an Error handler function
|
||||
// you must use this for error treatment:
|
||||
//if (mupError(hParser))
|
||||
//{
|
||||
// printf("\nError:\n");
|
||||
// printf("------\n");
|
||||
// printf("Message: %s\n", mupGetErrorMsg(hParser) );
|
||||
// printf("Token: %s\n", mupGetErrorToken(hParser) );
|
||||
// printf("Position: %s\n", mupGetErrorPos(hParser) );
|
||||
// printf("Errc: %d\n", mupGetErrorCode(hParser) );
|
||||
// continue;
|
||||
//}
|
||||
|
||||
if (!mupError(hParser))
|
||||
myprintf(_T("%f\n"), fVal);
|
||||
|
||||
} // while
|
||||
|
||||
// finalle free the parser ressources
|
||||
mupRelease(hParser);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// The next line is just for shutting up the compiler warning
|
||||
// about unused variables without getting another warning about not
|
||||
// beeing able to use type lists in function declarations.
|
||||
myprintf(_T("Executing \"%s\" (argc=%d)\n"), argv[0], argc);
|
||||
Calc();
|
||||
printf(_T("done..."));
|
||||
}
|
100
muparser/shared-ld-sh
Executable file
100
muparser/shared-ld-sh
Executable file
|
@ -0,0 +1,100 @@
|
|||
#!/bin/sh
|
||||
#-----------------------------------------------------------------------------
|
||||
#-- Name: distrib/mac/shared-ld-sh
|
||||
#-- Purpose: Link a mach-o dynamic shared library for Darwin / Mac OS X
|
||||
#-- Author: Gilles Depeyrot
|
||||
#-- Copyright: (c) 2002 Gilles Depeyrot
|
||||
#-- Licence: any use permitted
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
verbose=0
|
||||
args=""
|
||||
objects=""
|
||||
linking_flag="-dynamiclib"
|
||||
ldargs="-r -keep_private_externs -nostdlib"
|
||||
|
||||
if test "x$CXX" = "x"; then
|
||||
CXX="c++"
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
|
||||
-v)
|
||||
verbose=1
|
||||
;;
|
||||
|
||||
-o|-compatibility_version|-current_version|-framework|-undefined|-install_name)
|
||||
# collect these options and values
|
||||
args="${args} $1 $2"
|
||||
shift
|
||||
;;
|
||||
|
||||
-arch|-isysroot)
|
||||
# collect these options and values
|
||||
ldargs="${ldargs} $1 $2"
|
||||
shift
|
||||
;;
|
||||
|
||||
-s|-Wl,*)
|
||||
# collect these load args
|
||||
ldargs="${ldargs} $1"
|
||||
;;
|
||||
|
||||
-l*|-L*|-flat_namespace|-headerpad_max_install_names)
|
||||
# collect these options
|
||||
args="${args} $1"
|
||||
;;
|
||||
|
||||
-dynamiclib|-bundle)
|
||||
linking_flag="$1"
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo "shared-ld: unhandled option '$1'"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
*.o | *.a | *.dylib)
|
||||
# collect object files
|
||||
objects="${objects} $1"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "shared-ld: unhandled argument '$1'"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
status=0
|
||||
|
||||
#
|
||||
# Link one module containing all the others
|
||||
#
|
||||
if test ${verbose} = 1; then
|
||||
echo "$CXX ${ldargs} ${objects} -o master.$$.o"
|
||||
fi
|
||||
$CXX ${ldargs} ${objects} -o master.$$.o
|
||||
status=$?
|
||||
|
||||
#
|
||||
# Link the shared library from the single module created, but only if the
|
||||
# previous command didn't fail:
|
||||
#
|
||||
if test ${status} = 0; then
|
||||
if test ${verbose} = 1; then
|
||||
echo "$CXX ${linking_flag} master.$$.o ${args}"
|
||||
fi
|
||||
$CXX ${linking_flag} master.$$.o ${args}
|
||||
status=$?
|
||||
fi
|
||||
|
||||
#
|
||||
# Remove intermediate module
|
||||
#
|
||||
rm -f master.$$.o
|
||||
|
||||
exit $status
|
397
muparser/src/muParser.cpp
Normal file
397
muparser/src/muParser.cpp
Normal file
|
@ -0,0 +1,397 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
|
||||
Copyright (C) 2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "muParser.h"
|
||||
#include "muParserTemplateMagic.h"
|
||||
|
||||
//--- Standard includes ------------------------------------------------------------------------
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <numeric>
|
||||
|
||||
/** \brief Pi (what else?). */
|
||||
#define PARSER_CONST_PI 3.141592653589793238462643
|
||||
|
||||
/** \brief The Eulerian number. */
|
||||
#define PARSER_CONST_E 2.718281828459045235360287
|
||||
|
||||
using namespace std;
|
||||
|
||||
/** \file
|
||||
\brief Implementation of the standard floating point parser.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/** \brief Namespace for mathematical applications. */
|
||||
namespace mu
|
||||
{
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Trigonometric function
|
||||
value_type Parser::Sin(value_type v) { return MathImpl<value_type>::Sin(v); }
|
||||
value_type Parser::Cos(value_type v) { return MathImpl<value_type>::Cos(v); }
|
||||
value_type Parser::Tan(value_type v) { return MathImpl<value_type>::Tan(v); }
|
||||
value_type Parser::ASin(value_type v) { return MathImpl<value_type>::ASin(v); }
|
||||
value_type Parser::ACos(value_type v) { return MathImpl<value_type>::ACos(v); }
|
||||
value_type Parser::ATan(value_type v) { return MathImpl<value_type>::ATan(v); }
|
||||
value_type Parser::ATan2(value_type v1, value_type v2) { return MathImpl<value_type>::ATan2(v1, v2); }
|
||||
value_type Parser::Sinh(value_type v) { return MathImpl<value_type>::Sinh(v); }
|
||||
value_type Parser::Cosh(value_type v) { return MathImpl<value_type>::Cosh(v); }
|
||||
value_type Parser::Tanh(value_type v) { return MathImpl<value_type>::Tanh(v); }
|
||||
value_type Parser::ASinh(value_type v) { return MathImpl<value_type>::ASinh(v); }
|
||||
value_type Parser::ACosh(value_type v) { return MathImpl<value_type>::ACosh(v); }
|
||||
value_type Parser::ATanh(value_type v) { return MathImpl<value_type>::ATanh(v); }
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Logarithm functions
|
||||
|
||||
// Logarithm base 2
|
||||
value_type Parser::Log2(value_type v)
|
||||
{
|
||||
#ifdef MUP_MATH_EXCEPTIONS
|
||||
if (v<=0)
|
||||
throw ParserError(ecDOMAIN_ERROR, _T("Log2"));
|
||||
#endif
|
||||
|
||||
return MathImpl<value_type>::Log2(v);
|
||||
}
|
||||
|
||||
// Logarithm base 10
|
||||
value_type Parser::Log10(value_type v)
|
||||
{
|
||||
#ifdef MUP_MATH_EXCEPTIONS
|
||||
if (v<=0)
|
||||
throw ParserError(ecDOMAIN_ERROR, _T("Log10"));
|
||||
#endif
|
||||
|
||||
return MathImpl<value_type>::Log10(v);
|
||||
}
|
||||
|
||||
// Logarithm base e (natural logarithm)
|
||||
value_type Parser::Ln(value_type v)
|
||||
{
|
||||
#ifdef MUP_MATH_EXCEPTIONS
|
||||
if (v<=0)
|
||||
throw ParserError(ecDOMAIN_ERROR, _T("Ln"));
|
||||
#endif
|
||||
|
||||
return MathImpl<value_type>::Log(v);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// misc
|
||||
value_type Parser::Exp(value_type v) { return MathImpl<value_type>::Exp(v); }
|
||||
value_type Parser::Abs(value_type v) { return MathImpl<value_type>::Abs(v); }
|
||||
value_type Parser::Sqrt(value_type v)
|
||||
{
|
||||
#ifdef MUP_MATH_EXCEPTIONS
|
||||
if (v<0)
|
||||
throw ParserError(ecDOMAIN_ERROR, _T("sqrt"));
|
||||
#endif
|
||||
|
||||
return MathImpl<value_type>::Sqrt(v);
|
||||
}
|
||||
value_type Parser::Rint(value_type v) { return MathImpl<value_type>::Rint(v); }
|
||||
value_type Parser::Sign(value_type v) { return MathImpl<value_type>::Sign(v); }
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Callback for the unary minus operator.
|
||||
\param v The value to negate
|
||||
\return -v
|
||||
*/
|
||||
value_type Parser::UnaryMinus(value_type v)
|
||||
{
|
||||
return -v;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Callback for the unary minus operator.
|
||||
\param v The value to negate
|
||||
\return -v
|
||||
*/
|
||||
value_type Parser::UnaryPlus(value_type v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Callback for adding multiple values.
|
||||
\param [in] a_afArg Vector with the function arguments
|
||||
\param [in] a_iArgc The size of a_afArg
|
||||
*/
|
||||
value_type Parser::Sum(const value_type *a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw exception_type(_T("too few arguments for function sum."));
|
||||
|
||||
value_type fRes=0;
|
||||
for (int i=0; i<a_iArgc; ++i) fRes += a_afArg[i];
|
||||
return fRes;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Callback for averaging multiple values.
|
||||
\param [in] a_afArg Vector with the function arguments
|
||||
\param [in] a_iArgc The size of a_afArg
|
||||
*/
|
||||
value_type Parser::Avg(const value_type *a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw exception_type(_T("too few arguments for function sum."));
|
||||
|
||||
value_type fRes=0;
|
||||
for (int i=0; i<a_iArgc; ++i) fRes += a_afArg[i];
|
||||
return fRes/(value_type)a_iArgc;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Callback for determining the minimum value out of a vector.
|
||||
\param [in] a_afArg Vector with the function arguments
|
||||
\param [in] a_iArgc The size of a_afArg
|
||||
*/
|
||||
value_type Parser::Min(const value_type *a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw exception_type(_T("too few arguments for function min."));
|
||||
|
||||
value_type fRes=a_afArg[0];
|
||||
for (int i=0; i<a_iArgc; ++i)
|
||||
fRes = std::min(fRes, a_afArg[i]);
|
||||
|
||||
return fRes;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Callback for determining the maximum value out of a vector.
|
||||
\param [in] a_afArg Vector with the function arguments
|
||||
\param [in] a_iArgc The size of a_afArg
|
||||
*/
|
||||
value_type Parser::Max(const value_type *a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw exception_type(_T("too few arguments for function min."));
|
||||
|
||||
value_type fRes=a_afArg[0];
|
||||
for (int i=0; i<a_iArgc; ++i) fRes = std::max(fRes, a_afArg[i]);
|
||||
|
||||
return fRes;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Default value recognition callback.
|
||||
\param [in] a_szExpr Pointer to the expression
|
||||
\param [in, out] a_iPos Pointer to an index storing the current position within the expression
|
||||
\param [out] a_fVal Pointer where the value should be stored in case one is found.
|
||||
\return 1 if a value was found 0 otherwise.
|
||||
*/
|
||||
int Parser::IsVal(const char_type* a_szExpr, int *a_iPos, value_type *a_fVal)
|
||||
{
|
||||
value_type fVal(0);
|
||||
|
||||
stringstream_type stream(a_szExpr);
|
||||
stream.seekg(0); // todo: check if this really is necessary
|
||||
stream.imbue(Parser::s_locale);
|
||||
stream >> fVal;
|
||||
stringstream_type::pos_type iEnd = stream.tellg(); // Position after reading
|
||||
|
||||
if (iEnd==(stringstream_type::pos_type)-1)
|
||||
return 0;
|
||||
|
||||
*a_iPos += (int)iEnd;
|
||||
*a_fVal = fVal;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor.
|
||||
|
||||
Call ParserBase class constructor and trigger Function, Operator and Constant initialization.
|
||||
*/
|
||||
Parser::Parser()
|
||||
:ParserBase()
|
||||
{
|
||||
AddValIdent(IsVal);
|
||||
|
||||
InitCharSets();
|
||||
InitFun();
|
||||
InitConst();
|
||||
InitOprt();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Define the character sets.
|
||||
\sa DefineNameChars, DefineOprtChars, DefineInfixOprtChars
|
||||
|
||||
This function is used for initializing the default character sets that define
|
||||
the characters to be useable in function and variable names and operators.
|
||||
*/
|
||||
void Parser::InitCharSets()
|
||||
{
|
||||
DefineNameChars( _T("0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") );
|
||||
DefineOprtChars( _T("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-*^/?<>=#!$%&|~'_{}") );
|
||||
DefineInfixOprtChars( _T("/+-*^?<>=#!$%&|~'_") );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Initialize the default functions. */
|
||||
void Parser::InitFun()
|
||||
{
|
||||
if (mu::TypeInfo<mu::value_type>::IsInteger())
|
||||
{
|
||||
// When setting MUP_BASETYPE to an integer type
|
||||
// Place functions for dealing with integer values here
|
||||
// ...
|
||||
// ...
|
||||
// ...
|
||||
}
|
||||
else
|
||||
{
|
||||
// trigonometric functions
|
||||
DefineFun(_T("sin"), Sin);
|
||||
DefineFun(_T("cos"), Cos);
|
||||
DefineFun(_T("tan"), Tan);
|
||||
// arcus functions
|
||||
DefineFun(_T("asin"), ASin);
|
||||
DefineFun(_T("acos"), ACos);
|
||||
DefineFun(_T("atan"), ATan);
|
||||
DefineFun(_T("atan2"), ATan2);
|
||||
// hyperbolic functions
|
||||
DefineFun(_T("sinh"), Sinh);
|
||||
DefineFun(_T("cosh"), Cosh);
|
||||
DefineFun(_T("tanh"), Tanh);
|
||||
// arcus hyperbolic functions
|
||||
DefineFun(_T("asinh"), ASinh);
|
||||
DefineFun(_T("acosh"), ACosh);
|
||||
DefineFun(_T("atanh"), ATanh);
|
||||
// Logarithm functions
|
||||
DefineFun(_T("log2"), Log2);
|
||||
DefineFun(_T("log10"), Log10);
|
||||
DefineFun(_T("log"), Ln);
|
||||
DefineFun(_T("ln"), Ln);
|
||||
// misc
|
||||
DefineFun(_T("exp"), Exp);
|
||||
DefineFun(_T("sqrt"), Sqrt);
|
||||
DefineFun(_T("sign"), Sign);
|
||||
DefineFun(_T("rint"), Rint);
|
||||
DefineFun(_T("abs"), Abs);
|
||||
// Functions with variable number of arguments
|
||||
DefineFun(_T("sum"), Sum);
|
||||
DefineFun(_T("avg"), Avg);
|
||||
DefineFun(_T("min"), Min);
|
||||
DefineFun(_T("max"), Max);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Initialize constants.
|
||||
|
||||
By default the parser recognizes two constants. Pi ("pi") and the Eulerian
|
||||
number ("_e").
|
||||
*/
|
||||
void Parser::InitConst()
|
||||
{
|
||||
DefineConst(_T("_pi"), (value_type)PARSER_CONST_PI);
|
||||
DefineConst(_T("_e"), (value_type)PARSER_CONST_E);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Initialize operators.
|
||||
|
||||
By default only the unary minus operator is added.
|
||||
*/
|
||||
void Parser::InitOprt()
|
||||
{
|
||||
DefineInfixOprt(_T("-"), UnaryMinus);
|
||||
DefineInfixOprt(_T("+"), UnaryPlus);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void Parser::OnDetectVar(string_type * /*pExpr*/, int & /*nStart*/, int & /*nEnd*/)
|
||||
{
|
||||
// this is just sample code to illustrate modifying variable names on the fly.
|
||||
// I'm not sure anyone really needs such a feature...
|
||||
/*
|
||||
|
||||
|
||||
string sVar(pExpr->begin()+nStart, pExpr->begin()+nEnd);
|
||||
string sRepl = std::string("_") + sVar + "_";
|
||||
|
||||
int nOrigVarEnd = nEnd;
|
||||
cout << "variable detected!\n";
|
||||
cout << " Expr: " << *pExpr << "\n";
|
||||
cout << " Start: " << nStart << "\n";
|
||||
cout << " End: " << nEnd << "\n";
|
||||
cout << " Var: \"" << sVar << "\"\n";
|
||||
cout << " Repl: \"" << sRepl << "\"\n";
|
||||
nEnd = nStart + sRepl.length();
|
||||
cout << " End: " << nEnd << "\n";
|
||||
pExpr->replace(pExpr->begin()+nStart, pExpr->begin()+nOrigVarEnd, sRepl);
|
||||
cout << " New expr: " << *pExpr << "\n";
|
||||
*/
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Numerically differentiate with regard to a variable.
|
||||
\param [in] a_Var Pointer to the differentiation variable.
|
||||
\param [in] a_fPos Position at which the differentiation should take place.
|
||||
\param [in] a_fEpsilon Epsilon used for the numerical differentiation.
|
||||
|
||||
Numerical differentiation uses a 5 point operator yielding a 4th order
|
||||
formula. The default value for epsilon is 0.00074 which is
|
||||
numeric_limits<double>::epsilon() ^ (1/5) as suggested in the muparser
|
||||
forum:
|
||||
|
||||
http://sourceforge.net/forum/forum.php?thread_id=1994611&forum_id=462843
|
||||
*/
|
||||
value_type Parser::Diff(value_type *a_Var,
|
||||
value_type a_fPos,
|
||||
value_type a_fEpsilon) const
|
||||
{
|
||||
value_type fRes(0),
|
||||
fBuf(*a_Var),
|
||||
f[4] = {0,0,0,0},
|
||||
fEpsilon(a_fEpsilon);
|
||||
|
||||
// Backwards compatible calculation of epsilon inc case the user doesn't provide
|
||||
// his own epsilon
|
||||
if (fEpsilon==0)
|
||||
fEpsilon = (a_fPos==0) ? (value_type)1e-10 : (value_type)1e-7 * a_fPos;
|
||||
|
||||
*a_Var = a_fPos+2 * fEpsilon; f[0] = Eval();
|
||||
*a_Var = a_fPos+1 * fEpsilon; f[1] = Eval();
|
||||
*a_Var = a_fPos-1 * fEpsilon; f[2] = Eval();
|
||||
*a_Var = a_fPos-2 * fEpsilon; f[3] = Eval();
|
||||
*a_Var = fBuf; // restore variable
|
||||
|
||||
fRes = (-f[0] + 8*f[1] - 8*f[2] + f[3]) / (12*fEpsilon);
|
||||
return fRes;
|
||||
}
|
||||
} // namespace mu
|
1778
muparser/src/muParserBase.cpp
Normal file
1778
muparser/src/muParserBase.cpp
Normal file
File diff suppressed because it is too large
Load diff
588
muparser/src/muParserBytecode.cpp
Normal file
588
muparser/src/muParserBytecode.cpp
Normal file
|
@ -0,0 +1,588 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "muParserBytecode.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
|
||||
#include "muParserDef.h"
|
||||
#include "muParserError.h"
|
||||
#include "muParserToken.h"
|
||||
#include "muParserStack.h"
|
||||
#include "muParserTemplateMagic.h"
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Bytecode default constructor. */
|
||||
ParserByteCode::ParserByteCode()
|
||||
:m_iStackPos(0)
|
||||
,m_iMaxStackSize(0)
|
||||
,m_vRPN()
|
||||
,m_bEnableOptimizer(true)
|
||||
{
|
||||
m_vRPN.reserve(50);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Copy constructor.
|
||||
|
||||
Implemented in Terms of Assign(const ParserByteCode &a_ByteCode)
|
||||
*/
|
||||
ParserByteCode::ParserByteCode(const ParserByteCode &a_ByteCode)
|
||||
{
|
||||
Assign(a_ByteCode);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Assignment operator.
|
||||
|
||||
Implemented in Terms of Assign(const ParserByteCode &a_ByteCode)
|
||||
*/
|
||||
ParserByteCode& ParserByteCode::operator=(const ParserByteCode &a_ByteCode)
|
||||
{
|
||||
Assign(a_ByteCode);
|
||||
return *this;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserByteCode::EnableOptimizer(bool bStat)
|
||||
{
|
||||
m_bEnableOptimizer = bStat;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Copy state of another object to this.
|
||||
|
||||
\throw nowthrow
|
||||
*/
|
||||
void ParserByteCode::Assign(const ParserByteCode &a_ByteCode)
|
||||
{
|
||||
if (this==&a_ByteCode)
|
||||
return;
|
||||
|
||||
m_iStackPos = a_ByteCode.m_iStackPos;
|
||||
m_vRPN = a_ByteCode.m_vRPN;
|
||||
m_iMaxStackSize = a_ByteCode.m_iMaxStackSize;
|
||||
m_bEnableOptimizer = a_ByteCode.m_bEnableOptimizer;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add a Variable pointer to bytecode.
|
||||
\param a_pVar Pointer to be added.
|
||||
\throw nothrow
|
||||
*/
|
||||
void ParserByteCode::AddVar(value_type *a_pVar)
|
||||
{
|
||||
++m_iStackPos;
|
||||
m_iMaxStackSize = std::max(m_iMaxStackSize, (size_t)m_iStackPos);
|
||||
|
||||
// optimization does not apply
|
||||
SToken tok;
|
||||
tok.Cmd = cmVAR;
|
||||
tok.Val.ptr = a_pVar;
|
||||
tok.Val.data = 1;
|
||||
tok.Val.data2 = 0;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add a Variable pointer to bytecode.
|
||||
|
||||
Value entries in byte code consist of:
|
||||
<ul>
|
||||
<li>value array position of the value</li>
|
||||
<li>the operator code according to ParserToken::cmVAL</li>
|
||||
<li>the value stored in #mc_iSizeVal number of bytecode entries.</li>
|
||||
</ul>
|
||||
|
||||
\param a_pVal Value to be added.
|
||||
\throw nothrow
|
||||
*/
|
||||
void ParserByteCode::AddVal(value_type a_fVal)
|
||||
{
|
||||
++m_iStackPos;
|
||||
m_iMaxStackSize = std::max(m_iMaxStackSize, (size_t)m_iStackPos);
|
||||
|
||||
// If optimization does not apply
|
||||
SToken tok;
|
||||
tok.Cmd = cmVAL;
|
||||
tok.Val.ptr = NULL;
|
||||
tok.Val.data = 0;
|
||||
tok.Val.data2 = a_fVal;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserByteCode::ConstantFolding(ECmdCode a_Oprt)
|
||||
{
|
||||
std::size_t sz = m_vRPN.size();
|
||||
value_type &x = m_vRPN[sz-2].Val.data2,
|
||||
&y = m_vRPN[sz-1].Val.data2;
|
||||
switch (a_Oprt)
|
||||
{
|
||||
case cmLAND: x = (int)x && (int)y; m_vRPN.pop_back(); break;
|
||||
case cmLOR: x = (int)x || (int)y; m_vRPN.pop_back(); break;
|
||||
case cmLT: x = x < y; m_vRPN.pop_back(); break;
|
||||
case cmGT: x = x > y; m_vRPN.pop_back(); break;
|
||||
case cmLE: x = x <= y; m_vRPN.pop_back(); break;
|
||||
case cmGE: x = x >= y; m_vRPN.pop_back(); break;
|
||||
case cmNEQ: x = x != y; m_vRPN.pop_back(); break;
|
||||
case cmEQ: x = x == y; m_vRPN.pop_back(); break;
|
||||
case cmADD: x = x + y; m_vRPN.pop_back(); break;
|
||||
case cmSUB: x = x - y; m_vRPN.pop_back(); break;
|
||||
case cmMUL: x = x * y; m_vRPN.pop_back(); break;
|
||||
case cmDIV:
|
||||
|
||||
#if defined(MUP_MATH_EXCEPTIONS)
|
||||
if (y==0)
|
||||
throw ParserError(ecDIV_BY_ZERO, _T("0"));
|
||||
#endif
|
||||
|
||||
x = x / y;
|
||||
m_vRPN.pop_back();
|
||||
break;
|
||||
|
||||
case cmPOW: x = MathImpl<value_type>::Pow(x, y);
|
||||
m_vRPN.pop_back();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
} // switch opcode
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add an operator identifier to bytecode.
|
||||
|
||||
Operator entries in byte code consist of:
|
||||
<ul>
|
||||
<li>value array position of the result</li>
|
||||
<li>the operator code according to ParserToken::ECmdCode</li>
|
||||
</ul>
|
||||
|
||||
\sa ParserToken::ECmdCode
|
||||
*/
|
||||
void ParserByteCode::AddOp(ECmdCode a_Oprt)
|
||||
{
|
||||
bool bOptimized = false;
|
||||
|
||||
if (m_bEnableOptimizer)
|
||||
{
|
||||
std::size_t sz = m_vRPN.size();
|
||||
|
||||
// Check for foldable constants like:
|
||||
// cmVAL cmVAL cmADD
|
||||
// where cmADD can stand fopr any binary operator applied to
|
||||
// two constant values.
|
||||
if (sz>=2 && m_vRPN[sz-2].Cmd == cmVAL && m_vRPN[sz-1].Cmd == cmVAL)
|
||||
{
|
||||
ConstantFolding(a_Oprt);
|
||||
bOptimized = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(a_Oprt)
|
||||
{
|
||||
case cmPOW:
|
||||
// Optimization for polynomials of low order
|
||||
if (m_vRPN[sz-2].Cmd == cmVAR && m_vRPN[sz-1].Cmd == cmVAL)
|
||||
{
|
||||
if (m_vRPN[sz-1].Val.data2==2)
|
||||
m_vRPN[sz-2].Cmd = cmVARPOW2;
|
||||
else if (m_vRPN[sz-1].Val.data2==3)
|
||||
m_vRPN[sz-2].Cmd = cmVARPOW3;
|
||||
else if (m_vRPN[sz-1].Val.data2==4)
|
||||
m_vRPN[sz-2].Cmd = cmVARPOW4;
|
||||
else
|
||||
break;
|
||||
|
||||
m_vRPN.pop_back();
|
||||
bOptimized = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case cmSUB:
|
||||
case cmADD:
|
||||
// Simple optimization based on pattern recognition for a shitload of different
|
||||
// bytecode combinations of addition/subtraction
|
||||
if ( (m_vRPN[sz-1].Cmd == cmVAR && m_vRPN[sz-2].Cmd == cmVAL) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVAL && m_vRPN[sz-2].Cmd == cmVAR) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVAL && m_vRPN[sz-2].Cmd == cmVARMUL) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVARMUL && m_vRPN[sz-2].Cmd == cmVAL) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVAR && m_vRPN[sz-2].Cmd == cmVAR && m_vRPN[sz-2].Val.ptr == m_vRPN[sz-1].Val.ptr) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVAR && m_vRPN[sz-2].Cmd == cmVARMUL && m_vRPN[sz-2].Val.ptr == m_vRPN[sz-1].Val.ptr) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVARMUL && m_vRPN[sz-2].Cmd == cmVAR && m_vRPN[sz-2].Val.ptr == m_vRPN[sz-1].Val.ptr) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVARMUL && m_vRPN[sz-2].Cmd == cmVARMUL && m_vRPN[sz-2].Val.ptr == m_vRPN[sz-1].Val.ptr) )
|
||||
{
|
||||
assert( (m_vRPN[sz-2].Val.ptr==NULL && m_vRPN[sz-1].Val.ptr!=NULL) ||
|
||||
(m_vRPN[sz-2].Val.ptr!=NULL && m_vRPN[sz-1].Val.ptr==NULL) ||
|
||||
(m_vRPN[sz-2].Val.ptr == m_vRPN[sz-1].Val.ptr) );
|
||||
|
||||
m_vRPN[sz-2].Cmd = cmVARMUL;
|
||||
m_vRPN[sz-2].Val.ptr = (value_type*)((long long)(m_vRPN[sz-2].Val.ptr) | (long long)(m_vRPN[sz-1].Val.ptr)); // variable
|
||||
m_vRPN[sz-2].Val.data2 += ((a_Oprt==cmSUB) ? -1 : 1) * m_vRPN[sz-1].Val.data2; // offset
|
||||
m_vRPN[sz-2].Val.data += ((a_Oprt==cmSUB) ? -1 : 1) * m_vRPN[sz-1].Val.data; // multiplicand
|
||||
m_vRPN.pop_back();
|
||||
bOptimized = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case cmMUL:
|
||||
if ( (m_vRPN[sz-1].Cmd == cmVAR && m_vRPN[sz-2].Cmd == cmVAL) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVAL && m_vRPN[sz-2].Cmd == cmVAR) )
|
||||
{
|
||||
m_vRPN[sz-2].Cmd = cmVARMUL;
|
||||
m_vRPN[sz-2].Val.ptr = (value_type*)((long long)(m_vRPN[sz-2].Val.ptr) | (long long)(m_vRPN[sz-1].Val.ptr));
|
||||
m_vRPN[sz-2].Val.data = m_vRPN[sz-2].Val.data2 + m_vRPN[sz-1].Val.data2;
|
||||
m_vRPN[sz-2].Val.data2 = 0;
|
||||
m_vRPN.pop_back();
|
||||
bOptimized = true;
|
||||
}
|
||||
else if ( (m_vRPN[sz-1].Cmd == cmVAL && m_vRPN[sz-2].Cmd == cmVARMUL) ||
|
||||
(m_vRPN[sz-1].Cmd == cmVARMUL && m_vRPN[sz-2].Cmd == cmVAL) )
|
||||
{
|
||||
// Optimization: 2*(3*b+1) or (3*b+1)*2 -> 6*b+2
|
||||
m_vRPN[sz-2].Cmd = cmVARMUL;
|
||||
m_vRPN[sz-2].Val.ptr = (value_type*)((long long)(m_vRPN[sz-2].Val.ptr) | (long long)(m_vRPN[sz-1].Val.ptr));
|
||||
if (m_vRPN[sz-1].Cmd == cmVAL)
|
||||
{
|
||||
m_vRPN[sz-2].Val.data *= m_vRPN[sz-1].Val.data2;
|
||||
m_vRPN[sz-2].Val.data2 *= m_vRPN[sz-1].Val.data2;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_vRPN[sz-2].Val.data = m_vRPN[sz-1].Val.data * m_vRPN[sz-2].Val.data2;
|
||||
m_vRPN[sz-2].Val.data2 = m_vRPN[sz-1].Val.data2 * m_vRPN[sz-2].Val.data2;
|
||||
}
|
||||
m_vRPN.pop_back();
|
||||
bOptimized = true;
|
||||
}
|
||||
else if (m_vRPN[sz-1].Cmd == cmVAR && m_vRPN[sz-2].Cmd == cmVAR &&
|
||||
m_vRPN[sz-1].Val.ptr == m_vRPN[sz-2].Val.ptr)
|
||||
{
|
||||
// Optimization: a*a -> a^2
|
||||
m_vRPN[sz-2].Cmd = cmVARPOW2;
|
||||
m_vRPN.pop_back();
|
||||
bOptimized = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case cmDIV:
|
||||
if (m_vRPN[sz-1].Cmd == cmVAL && m_vRPN[sz-2].Cmd == cmVARMUL && m_vRPN[sz-1].Val.data2!=0)
|
||||
{
|
||||
// Optimization: 4*a/2 -> 2*a
|
||||
m_vRPN[sz-2].Val.data /= m_vRPN[sz-1].Val.data2;
|
||||
m_vRPN[sz-2].Val.data2 /= m_vRPN[sz-1].Val.data2;
|
||||
m_vRPN.pop_back();
|
||||
bOptimized = true;
|
||||
}
|
||||
break;
|
||||
|
||||
} // switch a_Oprt
|
||||
}
|
||||
}
|
||||
|
||||
// If optimization can't be applied just write the value
|
||||
if (!bOptimized)
|
||||
{
|
||||
--m_iStackPos;
|
||||
SToken tok;
|
||||
tok.Cmd = a_Oprt;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserByteCode::AddIfElse(ECmdCode a_Oprt)
|
||||
{
|
||||
SToken tok;
|
||||
tok.Cmd = a_Oprt;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add an assignment operator
|
||||
|
||||
Operator entries in byte code consist of:
|
||||
<ul>
|
||||
<li>cmASSIGN code</li>
|
||||
<li>the pointer of the destination variable</li>
|
||||
</ul>
|
||||
|
||||
\sa ParserToken::ECmdCode
|
||||
*/
|
||||
void ParserByteCode::AddAssignOp(value_type *a_pVar)
|
||||
{
|
||||
--m_iStackPos;
|
||||
|
||||
SToken tok;
|
||||
tok.Cmd = cmASSIGN;
|
||||
tok.Oprt.ptr = a_pVar;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add function to bytecode.
|
||||
|
||||
\param a_iArgc Number of arguments, negative numbers indicate multiarg functions.
|
||||
\param a_pFun Pointer to function callback.
|
||||
*/
|
||||
void ParserByteCode::AddFun(generic_fun_type a_pFun, int a_iArgc)
|
||||
{
|
||||
if (a_iArgc>=0)
|
||||
{
|
||||
m_iStackPos = m_iStackPos - a_iArgc + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// function with unlimited number of arguments
|
||||
m_iStackPos = m_iStackPos + a_iArgc + 1;
|
||||
}
|
||||
m_iMaxStackSize = std::max(m_iMaxStackSize, (size_t)m_iStackPos);
|
||||
|
||||
SToken tok;
|
||||
tok.Cmd = cmFUNC;
|
||||
tok.Fun.argc = a_iArgc;
|
||||
tok.Fun.ptr = a_pFun;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add a bulk function to bytecode.
|
||||
|
||||
\param a_iArgc Number of arguments, negative numbers indicate multiarg functions.
|
||||
\param a_pFun Pointer to function callback.
|
||||
*/
|
||||
void ParserByteCode::AddBulkFun(generic_fun_type a_pFun, int a_iArgc)
|
||||
{
|
||||
m_iStackPos = m_iStackPos - a_iArgc + 1;
|
||||
m_iMaxStackSize = std::max(m_iMaxStackSize, (size_t)m_iStackPos);
|
||||
|
||||
SToken tok;
|
||||
tok.Cmd = cmFUNC_BULK;
|
||||
tok.Fun.argc = a_iArgc;
|
||||
tok.Fun.ptr = a_pFun;
|
||||
m_vRPN.push_back(tok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add Strung function entry to the parser bytecode.
|
||||
\throw nothrow
|
||||
|
||||
A string function entry consists of the stack position of the return value,
|
||||
followed by a cmSTRFUNC code, the function pointer and an index into the
|
||||
string buffer maintained by the parser.
|
||||
*/
|
||||
void ParserByteCode::AddStrFun(generic_fun_type a_pFun, int a_iArgc, int a_iIdx)
|
||||
{
|
||||
m_iStackPos = m_iStackPos - a_iArgc + 1;
|
||||
|
||||
SToken tok;
|
||||
tok.Cmd = cmFUNC_STR;
|
||||
tok.Fun.argc = a_iArgc;
|
||||
tok.Fun.idx = a_iIdx;
|
||||
tok.Fun.ptr = a_pFun;
|
||||
m_vRPN.push_back(tok);
|
||||
|
||||
m_iMaxStackSize = std::max(m_iMaxStackSize, (size_t)m_iStackPos);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Add end marker to bytecode.
|
||||
|
||||
\throw nothrow
|
||||
*/
|
||||
void ParserByteCode::Finalize()
|
||||
{
|
||||
SToken tok;
|
||||
tok.Cmd = cmEND;
|
||||
m_vRPN.push_back(tok);
|
||||
rpn_type(m_vRPN).swap(m_vRPN); // shrink bytecode vector to fit
|
||||
|
||||
// Determine the if-then-else jump offsets
|
||||
ParserStack<int> stIf, stElse;
|
||||
int idx;
|
||||
for (int i=0; i<(int)m_vRPN.size(); ++i)
|
||||
{
|
||||
switch(m_vRPN[i].Cmd)
|
||||
{
|
||||
case cmIF:
|
||||
stIf.push(i);
|
||||
break;
|
||||
|
||||
case cmELSE:
|
||||
stElse.push(i);
|
||||
idx = stIf.pop();
|
||||
m_vRPN[idx].Oprt.offset = i - idx;
|
||||
break;
|
||||
|
||||
case cmENDIF:
|
||||
idx = stElse.pop();
|
||||
m_vRPN[idx].Oprt.offset = i - idx;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
const SToken* ParserByteCode::GetBase() const
|
||||
{
|
||||
if (m_vRPN.size()==0)
|
||||
throw ParserError(ecINTERNAL_ERROR);
|
||||
else
|
||||
return &m_vRPN[0];
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
std::size_t ParserByteCode::GetMaxStackSize() const
|
||||
{
|
||||
return m_iMaxStackSize+1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Returns the number of entries in the bytecode. */
|
||||
std::size_t ParserByteCode::GetSize() const
|
||||
{
|
||||
return m_vRPN.size();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Delete the bytecode.
|
||||
|
||||
\throw nothrow
|
||||
|
||||
The name of this function is a violation of my own coding guidelines
|
||||
but this way it's more in line with the STL functions thus more
|
||||
intuitive.
|
||||
*/
|
||||
void ParserByteCode::clear()
|
||||
{
|
||||
m_vRPN.clear();
|
||||
m_iStackPos = 0;
|
||||
m_iMaxStackSize = 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Dump bytecode (for debugging only!). */
|
||||
void ParserByteCode::AsciiDump()
|
||||
{
|
||||
if (!m_vRPN.size())
|
||||
{
|
||||
mu::console() << _T("No bytecode available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mu::console() << _T("Number of RPN tokens:") << (int)m_vRPN.size() << _T("\n");
|
||||
for (std::size_t i=0; i<m_vRPN.size() && m_vRPN[i].Cmd!=cmEND; ++i)
|
||||
{
|
||||
mu::console() << std::dec << i << _T(" : \t");
|
||||
switch (m_vRPN[i].Cmd)
|
||||
{
|
||||
case cmVAL: mu::console() << _T("VAL \t");
|
||||
mu::console() << _T("[") << m_vRPN[i].Val.data2 << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmVAR: mu::console() << _T("VAR \t");
|
||||
mu::console() << _T("[ADDR: 0x") << std::hex << m_vRPN[i].Val.ptr << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmVARPOW2: mu::console() << _T("VARPOW2 \t");
|
||||
mu::console() << _T("[ADDR: 0x") << std::hex << m_vRPN[i].Val.ptr << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmVARPOW3: mu::console() << _T("VARPOW3 \t");
|
||||
mu::console() << _T("[ADDR: 0x") << std::hex << m_vRPN[i].Val.ptr << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmVARPOW4: mu::console() << _T("VARPOW4 \t");
|
||||
mu::console() << _T("[ADDR: 0x") << std::hex << m_vRPN[i].Val.ptr << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmVARMUL: mu::console() << _T("VARMUL \t");
|
||||
mu::console() << _T("[ADDR: 0x") << std::hex << m_vRPN[i].Val.ptr << _T("]");
|
||||
mu::console() << _T(" * [") << m_vRPN[i].Val.data << _T("]");
|
||||
mu::console() << _T(" + [") << m_vRPN[i].Val.data2 << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmFUNC: mu::console() << _T("CALL\t");
|
||||
mu::console() << _T("[ARG:") << std::dec << m_vRPN[i].Fun.argc << _T("]");
|
||||
mu::console() << _T("[ADDR: 0x") << std::hex << m_vRPN[i].Fun.ptr << _T("]");
|
||||
mu::console() << _T("\n");
|
||||
break;
|
||||
|
||||
case cmFUNC_STR:
|
||||
mu::console() << _T("CALL STRFUNC\t");
|
||||
mu::console() << _T("[ARG:") << std::dec << m_vRPN[i].Fun.argc << _T("]");
|
||||
mu::console() << _T("[IDX:") << std::dec << m_vRPN[i].Fun.idx << _T("]");
|
||||
mu::console() << _T("[ADDR: 0x") << m_vRPN[i].Fun.ptr << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmLT: mu::console() << _T("LT\n"); break;
|
||||
case cmGT: mu::console() << _T("GT\n"); break;
|
||||
case cmLE: mu::console() << _T("LE\n"); break;
|
||||
case cmGE: mu::console() << _T("GE\n"); break;
|
||||
case cmEQ: mu::console() << _T("EQ\n"); break;
|
||||
case cmNEQ: mu::console() << _T("NEQ\n"); break;
|
||||
case cmADD: mu::console() << _T("ADD\n"); break;
|
||||
case cmLAND: mu::console() << _T("&&\n"); break;
|
||||
case cmLOR: mu::console() << _T("||\n"); break;
|
||||
case cmSUB: mu::console() << _T("SUB\n"); break;
|
||||
case cmMUL: mu::console() << _T("MUL\n"); break;
|
||||
case cmDIV: mu::console() << _T("DIV\n"); break;
|
||||
case cmPOW: mu::console() << _T("POW\n"); break;
|
||||
|
||||
case cmIF: mu::console() << _T("IF\t");
|
||||
mu::console() << _T("[OFFSET:") << std::dec << m_vRPN[i].Oprt.offset << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmELSE: mu::console() << _T("ELSE\t");
|
||||
mu::console() << _T("[OFFSET:") << std::dec << m_vRPN[i].Oprt.offset << _T("]\n");
|
||||
break;
|
||||
|
||||
case cmENDIF: mu::console() << _T("ENDIF\n"); break;
|
||||
|
||||
case cmASSIGN:
|
||||
mu::console() << _T("ASSIGN\t");
|
||||
mu::console() << _T("[ADDR: 0x") << m_vRPN[i].Oprt.ptr << _T("]\n");
|
||||
break;
|
||||
|
||||
default: mu::console() << _T("(unknown code: ") << m_vRPN[i].Cmd << _T(")\n");
|
||||
break;
|
||||
} // switch cmdCode
|
||||
} // while bytecode
|
||||
|
||||
mu::console() << _T("END") << std::endl;
|
||||
}
|
||||
} // namespace mu
|
463
muparser/src/muParserCallback.cpp
Normal file
463
muparser/src/muParserCallback.cpp
Normal file
|
@ -0,0 +1,463 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2004-2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "muParserCallback.h"
|
||||
|
||||
/** \file
|
||||
\brief Implementation of the parser callback class.
|
||||
*/
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type0 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(0)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type1 a_pFun, bool a_bAllowOpti, int a_iPrec, ECmdCode a_iCode)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(1)
|
||||
,m_iPri(a_iPrec)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(a_iCode)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor for constructing function callbacks taking two arguments.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserCallback::ParserCallback(fun_type2 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(2)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor for constructing binary operator callbacks.
|
||||
\param a_pFun Pointer to a static function taking two arguments
|
||||
\param a_bAllowOpti A flag indicating this function can be optimized
|
||||
\param a_iPrec The operator precedence
|
||||
\param a_eOprtAsct The operators associativity
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserCallback::ParserCallback(fun_type2 a_pFun,
|
||||
bool a_bAllowOpti,
|
||||
int a_iPrec,
|
||||
EOprtAssociativity a_eOprtAsct)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(2)
|
||||
,m_iPri(a_iPrec)
|
||||
,m_eOprtAsct(a_eOprtAsct)
|
||||
,m_iCode(cmOPRT_BIN)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type3 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(3)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type4 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(4)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type5 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(5)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type6 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(6)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type7 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(7)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type8 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(8)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type9 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(9)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(fun_type10 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(10)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type0 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(0)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type1 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(1)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor for constructing function callbacks taking two arguments.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserCallback::ParserCallback(bulkfun_type2 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(2)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type3 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(3)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type4 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(4)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type5 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(5)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type6 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(6)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type7 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(7)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type8 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(8)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type9 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(9)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(bulkfun_type10 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(10)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_BULK)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(multfun_type a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(-1)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC)
|
||||
,m_iType(tpDBL)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(strfun_type1 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(0)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_STR)
|
||||
,m_iType(tpSTR)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(strfun_type2 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(1)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_STR)
|
||||
,m_iType(tpSTR)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserCallback::ParserCallback(strfun_type3 a_pFun, bool a_bAllowOpti)
|
||||
:m_pFun((void*)a_pFun)
|
||||
,m_iArgc(2)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmFUNC_STR)
|
||||
,m_iType(tpSTR)
|
||||
,m_bAllowOpti(a_bAllowOpti)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Default constructor.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserCallback::ParserCallback()
|
||||
:m_pFun(0)
|
||||
,m_iArgc(0)
|
||||
,m_iPri(-1)
|
||||
,m_eOprtAsct(oaNONE)
|
||||
,m_iCode(cmUNKNOWN)
|
||||
,m_iType(tpVOID)
|
||||
,m_bAllowOpti(0)
|
||||
{}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Copy constructor.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserCallback::ParserCallback(const ParserCallback &ref)
|
||||
{
|
||||
m_pFun = ref.m_pFun;
|
||||
m_iArgc = ref.m_iArgc;
|
||||
m_bAllowOpti = ref.m_bAllowOpti;
|
||||
m_iCode = ref.m_iCode;
|
||||
m_iType = ref.m_iType;
|
||||
m_iPri = ref.m_iPri;
|
||||
m_eOprtAsct = ref.m_eOprtAsct;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Clone this instance and return a pointer to the new instance. */
|
||||
ParserCallback* ParserCallback::Clone() const
|
||||
{
|
||||
return new ParserCallback(*this);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return tru if the function is conservative.
|
||||
|
||||
Conservative functions return always the same result for the same argument.
|
||||
\throw nothrow
|
||||
*/
|
||||
bool ParserCallback::IsOptimizable() const
|
||||
{
|
||||
return m_bAllowOpti;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Get the callback address for the parser function.
|
||||
|
||||
The type of the address is void. It needs to be recasted according to the
|
||||
argument number to the right type.
|
||||
|
||||
\throw nothrow
|
||||
\return #pFun
|
||||
*/
|
||||
void* ParserCallback::GetAddr() const
|
||||
{
|
||||
return m_pFun;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return the callback code. */
|
||||
ECmdCode ParserCallback::GetCode() const
|
||||
{
|
||||
return m_iCode;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ETypeCode ParserCallback::GetType() const
|
||||
{
|
||||
return m_iType;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return the operator precedence.
|
||||
\throw nothrown
|
||||
|
||||
Only valid if the callback token is an operator token (binary or infix).
|
||||
*/
|
||||
int ParserCallback::GetPri() const
|
||||
{
|
||||
return m_iPri;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return the operators associativity.
|
||||
\throw nothrown
|
||||
|
||||
Only valid if the callback token is a binary operator token.
|
||||
*/
|
||||
EOprtAssociativity ParserCallback::GetAssociativity() const
|
||||
{
|
||||
return m_eOprtAsct;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Returns the number of function Arguments. */
|
||||
int ParserCallback::GetArgc() const
|
||||
{
|
||||
return m_iArgc;
|
||||
}
|
||||
} // namespace mu
|
1096
muparser/src/muParserDLL.cpp
Normal file
1096
muparser/src/muParserDLL.cpp
Normal file
File diff suppressed because it is too large
Load diff
337
muparser/src/muParserError.cpp
Normal file
337
muparser/src/muParserError.cpp
Normal file
|
@ -0,0 +1,337 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "muParserError.h"
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
const ParserErrorMsg ParserErrorMsg::m_Instance;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
const ParserErrorMsg& ParserErrorMsg::Instance()
|
||||
{
|
||||
return m_Instance;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
string_type ParserErrorMsg::operator[](unsigned a_iIdx) const
|
||||
{
|
||||
return (a_iIdx<m_vErrMsg.size()) ? m_vErrMsg[a_iIdx] : string_type();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserErrorMsg::~ParserErrorMsg()
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Assignement operator is deactivated.
|
||||
*/
|
||||
ParserErrorMsg& ParserErrorMsg::operator=(const ParserErrorMsg& )
|
||||
{
|
||||
assert(false);
|
||||
return *this;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserErrorMsg::ParserErrorMsg(const ParserErrorMsg&)
|
||||
{}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserErrorMsg::ParserErrorMsg()
|
||||
:m_vErrMsg(0)
|
||||
{
|
||||
m_vErrMsg.resize(ecCOUNT);
|
||||
|
||||
m_vErrMsg[ecUNASSIGNABLE_TOKEN] = _T("Unexpected token \"$TOK$\" found at position $POS$.");
|
||||
m_vErrMsg[ecINTERNAL_ERROR] = _T("Internal error");
|
||||
m_vErrMsg[ecINVALID_NAME] = _T("Invalid function-, variable- or constant name: \"$TOK$\".");
|
||||
m_vErrMsg[ecINVALID_BINOP_IDENT] = _T("Invalid binary operator identifier: \"$TOK$\".");
|
||||
m_vErrMsg[ecINVALID_INFIX_IDENT] = _T("Invalid infix operator identifier: \"$TOK$\".");
|
||||
m_vErrMsg[ecINVALID_POSTFIX_IDENT] = _T("Invalid postfix operator identifier: \"$TOK$\".");
|
||||
m_vErrMsg[ecINVALID_FUN_PTR] = _T("Invalid pointer to callback function.");
|
||||
m_vErrMsg[ecEMPTY_EXPRESSION] = _T("Expression is empty.");
|
||||
m_vErrMsg[ecINVALID_VAR_PTR] = _T("Invalid pointer to variable.");
|
||||
m_vErrMsg[ecUNEXPECTED_OPERATOR] = _T("Unexpected operator \"$TOK$\" found at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_EOF] = _T("Unexpected end of expression at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_ARG_SEP] = _T("Unexpected argument separator at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_PARENS] = _T("Unexpected parenthesis \"$TOK$\" at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_FUN] = _T("Unexpected function \"$TOK$\" at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_VAL] = _T("Unexpected value \"$TOK$\" found at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_VAR] = _T("Unexpected variable \"$TOK$\" found at position $POS$");
|
||||
m_vErrMsg[ecUNEXPECTED_ARG] = _T("Function arguments used without a function (position: $POS$)");
|
||||
m_vErrMsg[ecMISSING_PARENS] = _T("Missing parenthesis");
|
||||
m_vErrMsg[ecTOO_MANY_PARAMS] = _T("Too many parameters for function \"$TOK$\" at expression position $POS$");
|
||||
m_vErrMsg[ecTOO_FEW_PARAMS] = _T("Too few parameters for function \"$TOK$\" at expression position $POS$");
|
||||
m_vErrMsg[ecDIV_BY_ZERO] = _T("Divide by zero");
|
||||
m_vErrMsg[ecDOMAIN_ERROR] = _T("Domain error");
|
||||
m_vErrMsg[ecNAME_CONFLICT] = _T("Name conflict");
|
||||
m_vErrMsg[ecOPT_PRI] = _T("Invalid value for operator priority (must be greater or equal to zero).");
|
||||
m_vErrMsg[ecBUILTIN_OVERLOAD] = _T("user defined binary operator \"$TOK$\" conflicts with a built in operator.");
|
||||
m_vErrMsg[ecUNEXPECTED_STR] = _T("Unexpected string token found at position $POS$.");
|
||||
m_vErrMsg[ecUNTERMINATED_STRING] = _T("Unterminated string starting at position $POS$.");
|
||||
m_vErrMsg[ecSTRING_EXPECTED] = _T("String function called with a non string type of argument.");
|
||||
m_vErrMsg[ecVAL_EXPECTED] = _T("String value used where a numerical argument is expected.");
|
||||
m_vErrMsg[ecOPRT_TYPE_CONFLICT] = _T("No suitable overload for operator \"$TOK$\" at position $POS$.");
|
||||
m_vErrMsg[ecSTR_RESULT] = _T("Function result is a string.");
|
||||
m_vErrMsg[ecGENERIC] = _T("Parser error.");
|
||||
m_vErrMsg[ecLOCALE] = _T("Decimal separator is identic to function argument separator.");
|
||||
m_vErrMsg[ecUNEXPECTED_CONDITIONAL] = _T("The \"$TOK$\" operator must be preceeded by a closing bracket.");
|
||||
m_vErrMsg[ecMISSING_ELSE_CLAUSE] = _T("If-then-else operator is missing an else clause");
|
||||
m_vErrMsg[ecMISPLACED_COLON] = _T("Misplaced colon at position $POS$");
|
||||
m_vErrMsg[ecUNREASONABLE_NUMBER_OF_COMPUTATIONS] = _T("Number of computations to small for bulk mode. (Vectorisation overhead too costly)");
|
||||
|
||||
#if defined(_DEBUG)
|
||||
for (int i=0; i<ecCOUNT; ++i)
|
||||
if (!m_vErrMsg[i].length())
|
||||
assert(false);
|
||||
#endif
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// ParserError class
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
/** \brief Default constructor. */
|
||||
ParserError::ParserError()
|
||||
:m_strMsg()
|
||||
,m_strFormula()
|
||||
,m_strTok()
|
||||
,m_iPos(-1)
|
||||
,m_iErrc(ecUNDEFINED)
|
||||
,m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief This Constructor is used for internal exceptions only.
|
||||
|
||||
It does not contain any information but the error code.
|
||||
*/
|
||||
ParserError::ParserError(EErrorCodes a_iErrc)
|
||||
:m_strMsg()
|
||||
,m_strFormula()
|
||||
,m_strTok()
|
||||
,m_iPos(-1)
|
||||
,m_iErrc(a_iErrc)
|
||||
,m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
m_strMsg = m_ErrMsg[m_iErrc];
|
||||
stringstream_type stream;
|
||||
stream << (int)m_iPos;
|
||||
ReplaceSubString(m_strMsg, _T("$POS$"), stream.str());
|
||||
ReplaceSubString(m_strMsg, _T("$TOK$"), m_strTok);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Construct an error from a message text. */
|
||||
ParserError::ParserError(const string_type &sMsg)
|
||||
:m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
Reset();
|
||||
m_strMsg = sMsg;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Construct an error object.
|
||||
\param [in] a_iErrc the error code.
|
||||
\param [in] sTok The token string related to this error.
|
||||
\param [in] sExpr The expression related to the error.
|
||||
\param [in] a_iPos the position in the expression where the error occurred.
|
||||
*/
|
||||
ParserError::ParserError( EErrorCodes iErrc,
|
||||
const string_type &sTok,
|
||||
const string_type &sExpr,
|
||||
int iPos )
|
||||
:m_strMsg()
|
||||
,m_strFormula(sExpr)
|
||||
,m_strTok(sTok)
|
||||
,m_iPos(iPos)
|
||||
,m_iErrc(iErrc)
|
||||
,m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
m_strMsg = m_ErrMsg[m_iErrc];
|
||||
stringstream_type stream;
|
||||
stream << (int)m_iPos;
|
||||
ReplaceSubString(m_strMsg, _T("$POS$"), stream.str());
|
||||
ReplaceSubString(m_strMsg, _T("$TOK$"), m_strTok);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Construct an error object.
|
||||
\param [in] iErrc the error code.
|
||||
\param [in] iPos the position in the expression where the error occurred.
|
||||
\param [in] sTok The token string related to this error.
|
||||
*/
|
||||
ParserError::ParserError(EErrorCodes iErrc, int iPos, const string_type &sTok)
|
||||
:m_strMsg()
|
||||
,m_strFormula()
|
||||
,m_strTok(sTok)
|
||||
,m_iPos(iPos)
|
||||
,m_iErrc(iErrc)
|
||||
,m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
m_strMsg = m_ErrMsg[m_iErrc];
|
||||
stringstream_type stream;
|
||||
stream << (int)m_iPos;
|
||||
ReplaceSubString(m_strMsg, _T("$POS$"), stream.str());
|
||||
ReplaceSubString(m_strMsg, _T("$TOK$"), m_strTok);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Construct an error object.
|
||||
\param [in] szMsg The error message text.
|
||||
\param [in] iPos the position related to the error.
|
||||
\param [in] sTok The token string related to this error.
|
||||
*/
|
||||
ParserError::ParserError(const char_type *szMsg, int iPos, const string_type &sTok)
|
||||
:m_strMsg(szMsg)
|
||||
,m_strFormula()
|
||||
,m_strTok(sTok)
|
||||
,m_iPos(iPos)
|
||||
,m_iErrc(ecGENERIC)
|
||||
,m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
stringstream_type stream;
|
||||
stream << (int)m_iPos;
|
||||
ReplaceSubString(m_strMsg, _T("$POS$"), stream.str());
|
||||
ReplaceSubString(m_strMsg, _T("$TOK$"), m_strTok);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Copy constructor. */
|
||||
ParserError::ParserError(const ParserError &a_Obj)
|
||||
:m_strMsg(a_Obj.m_strMsg)
|
||||
,m_strFormula(a_Obj.m_strFormula)
|
||||
,m_strTok(a_Obj.m_strTok)
|
||||
,m_iPos(a_Obj.m_iPos)
|
||||
,m_iErrc(a_Obj.m_iErrc)
|
||||
,m_ErrMsg(ParserErrorMsg::Instance())
|
||||
{
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Assignment operator. */
|
||||
ParserError& ParserError::operator=(const ParserError &a_Obj)
|
||||
{
|
||||
if (this==&a_Obj)
|
||||
return *this;
|
||||
|
||||
m_strMsg = a_Obj.m_strMsg;
|
||||
m_strFormula = a_Obj.m_strFormula;
|
||||
m_strTok = a_Obj.m_strTok;
|
||||
m_iPos = a_Obj.m_iPos;
|
||||
m_iErrc = a_Obj.m_iErrc;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
ParserError::~ParserError()
|
||||
{}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Replace all occurrences of a substring with another string.
|
||||
\param strFind The string that shall be replaced.
|
||||
\param strReplaceWith The string that should be inserted instead of strFind
|
||||
*/
|
||||
void ParserError::ReplaceSubString( string_type &strSource,
|
||||
const string_type &strFind,
|
||||
const string_type &strReplaceWith)
|
||||
{
|
||||
string_type strResult;
|
||||
string_type::size_type iPos(0), iNext(0);
|
||||
|
||||
for(;;)
|
||||
{
|
||||
iNext = strSource.find(strFind, iPos);
|
||||
strResult.append(strSource, iPos, iNext-iPos);
|
||||
|
||||
if( iNext==string_type::npos )
|
||||
break;
|
||||
|
||||
strResult.append(strReplaceWith);
|
||||
iPos = iNext + strFind.length();
|
||||
}
|
||||
|
||||
strSource.swap(strResult);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Reset the erro object. */
|
||||
void ParserError::Reset()
|
||||
{
|
||||
m_strMsg = _T("");
|
||||
m_strFormula = _T("");
|
||||
m_strTok = _T("");
|
||||
m_iPos = -1;
|
||||
m_iErrc = ecUNDEFINED;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Set the expression related to this error. */
|
||||
void ParserError::SetFormula(const string_type &a_strFormula)
|
||||
{
|
||||
m_strFormula = a_strFormula;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief gets the expression related tp this error.*/
|
||||
const string_type& ParserError::GetExpr() const
|
||||
{
|
||||
return m_strFormula;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Returns the message string for this error. */
|
||||
const string_type& ParserError::GetMsg() const
|
||||
{
|
||||
return m_strMsg;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return the formula position related to the error.
|
||||
|
||||
If the error is not related to a distinct position this will return -1
|
||||
*/
|
||||
int ParserError::GetPos() const
|
||||
{
|
||||
return m_iPos;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return string related with this token (if available). */
|
||||
const string_type& ParserError::GetToken() const
|
||||
{
|
||||
return m_strTok;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/** \brief Return the error code. */
|
||||
EErrorCodes ParserError::GetCode() const
|
||||
{
|
||||
return m_iErrc;
|
||||
}
|
||||
} // namespace mu
|
280
muparser/src/muParserInt.cpp
Normal file
280
muparser/src/muParserInt.cpp
Normal file
|
@ -0,0 +1,280 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2011 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "muParserInt.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <numeric>
|
||||
|
||||
using namespace std;
|
||||
|
||||
/** \file
|
||||
\brief Implementation of a parser using integer value.
|
||||
*/
|
||||
|
||||
/** \brief Namespace for mathematical applications. */
|
||||
namespace mu
|
||||
{
|
||||
value_type ParserInt::Abs(value_type v) { return (value_type)Round(fabs((double)v)); }
|
||||
value_type ParserInt::Sign(value_type v) { return (Round(v)<0) ? -1 : (Round(v)>0) ? 1 : 0; }
|
||||
value_type ParserInt::Ite(value_type v1,
|
||||
value_type v2,
|
||||
value_type v3) { return (Round(v1)==1) ? Round(v2) : Round(v3); }
|
||||
value_type ParserInt::Add(value_type v1, value_type v2) { return Round(v1) + Round(v2); }
|
||||
value_type ParserInt::Sub(value_type v1, value_type v2) { return Round(v1) - Round(v2); }
|
||||
value_type ParserInt::Mul(value_type v1, value_type v2) { return Round(v1) * Round(v2); }
|
||||
value_type ParserInt::Div(value_type v1, value_type v2) { return Round(v1) / Round(v2); }
|
||||
value_type ParserInt::Mod(value_type v1, value_type v2) { return Round(v1) % Round(v2); }
|
||||
value_type ParserInt::Shr(value_type v1, value_type v2) { return Round(v1) >> Round(v2); }
|
||||
value_type ParserInt::Shl(value_type v1, value_type v2) { return Round(v1) << Round(v2); }
|
||||
value_type ParserInt::LogAnd(value_type v1, value_type v2) { return Round(v1) & Round(v2); }
|
||||
value_type ParserInt::LogOr(value_type v1, value_type v2) { return Round(v1) | Round(v2); }
|
||||
value_type ParserInt::And(value_type v1, value_type v2) { return Round(v1) && Round(v2); }
|
||||
value_type ParserInt::Or(value_type v1, value_type v2) { return Round(v1) || Round(v2); }
|
||||
value_type ParserInt::Less(value_type v1, value_type v2) { return Round(v1) < Round(v2); }
|
||||
value_type ParserInt::Greater(value_type v1, value_type v2) { return Round(v1) > Round(v2); }
|
||||
value_type ParserInt::LessEq(value_type v1, value_type v2) { return Round(v1) <= Round(v2); }
|
||||
value_type ParserInt::GreaterEq(value_type v1, value_type v2) { return Round(v1) >= Round(v2); }
|
||||
value_type ParserInt::Equal(value_type v1, value_type v2) { return Round(v1) == Round(v2); }
|
||||
value_type ParserInt::NotEqual(value_type v1, value_type v2) { return Round(v1) != Round(v2); }
|
||||
value_type ParserInt::Not(value_type v) { return !Round(v); }
|
||||
|
||||
value_type ParserInt::Pow(value_type v1, value_type v2)
|
||||
{
|
||||
return std::pow((double)Round(v1), (double)Round(v2));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Unary operator Callbacks: Infix operators
|
||||
value_type ParserInt::UnaryMinus(value_type v)
|
||||
{
|
||||
return -Round(v);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type ParserInt::Sum(const value_type* a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw ParserError(_T("too few arguments for function sum."));
|
||||
|
||||
value_type fRes=0;
|
||||
for (int i=0; i<a_iArgc; ++i)
|
||||
fRes += a_afArg[i];
|
||||
|
||||
return fRes;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type ParserInt::Min(const value_type* a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw ParserError( _T("too few arguments for function min.") );
|
||||
|
||||
value_type fRes=a_afArg[0];
|
||||
for (int i=0; i<a_iArgc; ++i)
|
||||
fRes = std::min(fRes, a_afArg[i]);
|
||||
|
||||
return fRes;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
value_type ParserInt::Max(const value_type* a_afArg, int a_iArgc)
|
||||
{
|
||||
if (!a_iArgc)
|
||||
throw ParserError(_T("too few arguments for function min."));
|
||||
|
||||
value_type fRes=a_afArg[0];
|
||||
for (int i=0; i<a_iArgc; ++i)
|
||||
fRes = std::max(fRes, a_afArg[i]);
|
||||
|
||||
return fRes;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Default value recognition callback
|
||||
int ParserInt::IsVal(const char_type *a_szExpr, int *a_iPos, value_type *a_fVal)
|
||||
{
|
||||
string_type buf(a_szExpr);
|
||||
std::size_t pos = buf.find_first_not_of(_T("0123456789"));
|
||||
|
||||
if (pos==std::string::npos)
|
||||
return 0;
|
||||
|
||||
stringstream_type stream( buf.substr(0, pos ) );
|
||||
int iVal(0);
|
||||
|
||||
stream >> iVal;
|
||||
if (stream.fail())
|
||||
return 0;
|
||||
|
||||
stringstream_type::pos_type iEnd = stream.tellg(); // Position after reading
|
||||
if (stream.fail())
|
||||
iEnd = stream.str().length();
|
||||
|
||||
if (iEnd==(stringstream_type::pos_type)-1)
|
||||
return 0;
|
||||
|
||||
*a_iPos += (int)iEnd;
|
||||
*a_fVal = (value_type)iVal;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check a given position in the expression for the presence of
|
||||
a hex value.
|
||||
\param a_szExpr Pointer to the expression string
|
||||
\param [in/out] a_iPos Pointer to an integer value holding the current parsing
|
||||
position in the expression.
|
||||
\param [out] a_fVal Pointer to the position where the detected value shall be stored.
|
||||
|
||||
Hey values must be prefixed with "0x" in order to be detected properly.
|
||||
*/
|
||||
int ParserInt::IsHexVal(const char_type *a_szExpr, int *a_iPos, value_type *a_fVal)
|
||||
{
|
||||
if (a_szExpr[1]==0 || (a_szExpr[0]!='0' || a_szExpr[1]!='x') )
|
||||
return 0;
|
||||
|
||||
unsigned iVal(0);
|
||||
|
||||
// New code based on streams for UNICODE compliance:
|
||||
stringstream_type::pos_type nPos(0);
|
||||
stringstream_type ss(a_szExpr + 2);
|
||||
ss >> std::hex >> iVal;
|
||||
nPos = ss.tellg();
|
||||
|
||||
if (nPos==(stringstream_type::pos_type)0)
|
||||
return 1;
|
||||
|
||||
*a_iPos += (int)(2 + nPos);
|
||||
*a_fVal = (value_type)iVal;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
int ParserInt::IsBinVal(const char_type *a_szExpr, int *a_iPos, value_type *a_fVal)
|
||||
{
|
||||
if (a_szExpr[0]!='#')
|
||||
return 0;
|
||||
|
||||
unsigned iVal(0),
|
||||
iBits(sizeof(iVal)*8),
|
||||
i(0);
|
||||
|
||||
for (i=0; (a_szExpr[i+1]=='0' || a_szExpr[i+1]=='1') && i<iBits; ++i)
|
||||
iVal |= (int)(a_szExpr[i+1]=='1') << ((iBits-1)-i);
|
||||
|
||||
if (i==0)
|
||||
return 0;
|
||||
|
||||
if (i==iBits)
|
||||
throw exception_type(_T("Binary to integer conversion error (overflow)."));
|
||||
|
||||
*a_fVal = (unsigned)(iVal >> (iBits-i) );
|
||||
*a_iPos += i+1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor.
|
||||
|
||||
Call ParserBase class constructor and trigger Function, Operator and Constant initialization.
|
||||
*/
|
||||
ParserInt::ParserInt()
|
||||
:ParserBase()
|
||||
{
|
||||
AddValIdent(IsVal); // lowest priority
|
||||
AddValIdent(IsBinVal);
|
||||
AddValIdent(IsHexVal); // highest priority
|
||||
|
||||
InitCharSets();
|
||||
InitFun();
|
||||
InitOprt();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserInt::InitConst()
|
||||
{
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserInt::InitCharSets()
|
||||
{
|
||||
DefineNameChars( _T("0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") );
|
||||
DefineOprtChars( _T("+-*^/?<>=!%&|~'_") );
|
||||
DefineInfixOprtChars( _T("/+-*^?<>=!%&|~'_") );
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Initialize the default functions. */
|
||||
void ParserInt::InitFun()
|
||||
{
|
||||
DefineFun( _T("sign"), Sign);
|
||||
DefineFun( _T("abs"), Abs);
|
||||
DefineFun( _T("if"), Ite);
|
||||
DefineFun( _T("sum"), Sum);
|
||||
DefineFun( _T("min"), Min);
|
||||
DefineFun( _T("max"), Max);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Initialize operators. */
|
||||
void ParserInt::InitOprt()
|
||||
{
|
||||
// disable all built in operators, not all of them useful for integer numbers
|
||||
// (they don't do rounding of values)
|
||||
EnableBuiltInOprt(false);
|
||||
|
||||
// Disable all built in operators, they wont work with integer numbers
|
||||
// since they are designed for floating point numbers
|
||||
DefineInfixOprt( _T("-"), UnaryMinus);
|
||||
DefineInfixOprt( _T("!"), Not);
|
||||
|
||||
DefineOprt( _T("&"), LogAnd, prLOGIC);
|
||||
DefineOprt( _T("|"), LogOr, prLOGIC);
|
||||
DefineOprt( _T("&&"), And, prLOGIC);
|
||||
DefineOprt( _T("||"), Or, prLOGIC);
|
||||
|
||||
DefineOprt( _T("<"), Less, prCMP);
|
||||
DefineOprt( _T(">"), Greater, prCMP);
|
||||
DefineOprt( _T("<="), LessEq, prCMP);
|
||||
DefineOprt( _T(">="), GreaterEq, prCMP);
|
||||
DefineOprt( _T("=="), Equal, prCMP);
|
||||
DefineOprt( _T("!="), NotEqual, prCMP);
|
||||
|
||||
DefineOprt( _T("+"), Add, prADD_SUB);
|
||||
DefineOprt( _T("-"), Sub, prADD_SUB);
|
||||
|
||||
DefineOprt( _T("*"), Mul, prMUL_DIV);
|
||||
DefineOprt( _T("/"), Div, prMUL_DIV);
|
||||
DefineOprt( _T("%"), Mod, prMUL_DIV);
|
||||
|
||||
DefineOprt( _T("^"), Pow, prPOW, oaRIGHT);
|
||||
DefineOprt( _T(">>"), Shr, prMUL_DIV+1);
|
||||
DefineOprt( _T("<<"), Shl, prMUL_DIV+1);
|
||||
}
|
||||
|
||||
} // namespace mu
|
1552
muparser/src/muParserTest.cpp
Normal file
1552
muparser/src/muParserTest.cpp
Normal file
File diff suppressed because it is too large
Load diff
958
muparser/src/muParserTokenReader.cpp
Normal file
958
muparser/src/muParserTokenReader.cpp
Normal file
|
@ -0,0 +1,958 @@
|
|||
/*
|
||||
__________
|
||||
_____ __ __\______ \_____ _______ ______ ____ _______
|
||||
/ \ | | \| ___/\__ \ \_ __ \/ ___/_/ __ \\_ __ \
|
||||
| Y Y \| | /| | / __ \_| | \/\___ \ \ ___/ | | \/
|
||||
|__|_| /|____/ |____| (____ /|__| /____ > \___ >|__|
|
||||
\/ \/ \/ \/
|
||||
Copyright (C) 2013 Ingo Berg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
||||
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include <cassert>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <stack>
|
||||
#include <string>
|
||||
|
||||
#include "muParserTokenReader.h"
|
||||
#include "muParserBase.h"
|
||||
|
||||
/** \file
|
||||
\brief This file contains the parser token reader implementation.
|
||||
*/
|
||||
|
||||
|
||||
namespace mu
|
||||
{
|
||||
|
||||
// Forward declaration
|
||||
class ParserBase;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Copy constructor.
|
||||
|
||||
\sa Assign
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserTokenReader::ParserTokenReader(const ParserTokenReader &a_Reader)
|
||||
{
|
||||
Assign(a_Reader);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Assignment operator.
|
||||
|
||||
Self assignment will be suppressed otherwise #Assign is called.
|
||||
|
||||
\param a_Reader Object to copy to this token reader.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserTokenReader& ParserTokenReader::operator=(const ParserTokenReader &a_Reader)
|
||||
{
|
||||
if (&a_Reader!=this)
|
||||
Assign(a_Reader);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Assign state of a token reader to this token reader.
|
||||
|
||||
\param a_Reader Object from which the state should be copied.
|
||||
\throw nothrow
|
||||
*/
|
||||
void ParserTokenReader::Assign(const ParserTokenReader &a_Reader)
|
||||
{
|
||||
m_pParser = a_Reader.m_pParser;
|
||||
m_strFormula = a_Reader.m_strFormula;
|
||||
m_iPos = a_Reader.m_iPos;
|
||||
m_iSynFlags = a_Reader.m_iSynFlags;
|
||||
|
||||
m_UsedVar = a_Reader.m_UsedVar;
|
||||
m_pFunDef = a_Reader.m_pFunDef;
|
||||
m_pConstDef = a_Reader.m_pConstDef;
|
||||
m_pVarDef = a_Reader.m_pVarDef;
|
||||
m_pStrVarDef = a_Reader.m_pStrVarDef;
|
||||
m_pPostOprtDef = a_Reader.m_pPostOprtDef;
|
||||
m_pInfixOprtDef = a_Reader.m_pInfixOprtDef;
|
||||
m_pOprtDef = a_Reader.m_pOprtDef;
|
||||
m_bIgnoreUndefVar = a_Reader.m_bIgnoreUndefVar;
|
||||
m_vIdentFun = a_Reader.m_vIdentFun;
|
||||
m_pFactory = a_Reader.m_pFactory;
|
||||
m_pFactoryData = a_Reader.m_pFactoryData;
|
||||
m_iBrackets = a_Reader.m_iBrackets;
|
||||
m_cArgSep = a_Reader.m_cArgSep;
|
||||
m_fZero = a_Reader.m_fZero;
|
||||
m_lastTok = a_Reader.m_lastTok;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Constructor.
|
||||
|
||||
Create a Token reader and bind it to a parser object.
|
||||
|
||||
\pre [assert] a_pParser may not be NULL
|
||||
\post #m_pParser==a_pParser
|
||||
\param a_pParent Parent parser object of the token reader.
|
||||
*/
|
||||
ParserTokenReader::ParserTokenReader(ParserBase *a_pParent)
|
||||
:m_pParser(a_pParent)
|
||||
,m_strFormula()
|
||||
,m_iPos(0)
|
||||
,m_iSynFlags(0)
|
||||
,m_bIgnoreUndefVar(false)
|
||||
,m_pFunDef(NULL)
|
||||
,m_pPostOprtDef(NULL)
|
||||
,m_pInfixOprtDef(NULL)
|
||||
,m_pOprtDef(NULL)
|
||||
,m_pConstDef(NULL)
|
||||
,m_pStrVarDef(NULL)
|
||||
,m_pVarDef(NULL)
|
||||
,m_pFactory(NULL)
|
||||
,m_pFactoryData(NULL)
|
||||
,m_vIdentFun()
|
||||
,m_UsedVar()
|
||||
,m_fZero(0)
|
||||
,m_iBrackets(0)
|
||||
,m_lastTok()
|
||||
,m_cArgSep(',')
|
||||
{
|
||||
assert(m_pParser);
|
||||
SetParent(m_pParser);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Create instance of a ParserTokenReader identical with this
|
||||
and return its pointer.
|
||||
|
||||
This is a factory method the calling function must take care of the object destruction.
|
||||
|
||||
\return A new ParserTokenReader object.
|
||||
\throw nothrow
|
||||
*/
|
||||
ParserTokenReader* ParserTokenReader::Clone(ParserBase *a_pParent) const
|
||||
{
|
||||
std::auto_ptr<ParserTokenReader> ptr(new ParserTokenReader(*this));
|
||||
ptr->SetParent(a_pParent);
|
||||
return ptr.release();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ParserTokenReader::token_type& ParserTokenReader::SaveBeforeReturn(const token_type &tok)
|
||||
{
|
||||
m_lastTok = tok;
|
||||
return m_lastTok;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserTokenReader::AddValIdent(identfun_type a_pCallback)
|
||||
{
|
||||
// Use push_front is used to give user defined callbacks a higher priority than
|
||||
// the built in ones. Otherwise reading hex numbers would not work
|
||||
// since the "0" in "0xff" would always be read first making parsing of
|
||||
// the rest impossible.
|
||||
// reference:
|
||||
// http://sourceforge.net/projects/muparser/forums/forum/462843/topic/4824956
|
||||
m_vIdentFun.push_front(a_pCallback);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserTokenReader::SetVarCreator(facfun_type a_pFactory, void *pUserData)
|
||||
{
|
||||
m_pFactory = a_pFactory;
|
||||
m_pFactoryData = pUserData;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return the current position of the token reader in the formula string.
|
||||
|
||||
\return #m_iPos
|
||||
\throw nothrow
|
||||
*/
|
||||
int ParserTokenReader::GetPos() const
|
||||
{
|
||||
return m_iPos;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return a reference to the formula.
|
||||
|
||||
\return #m_strFormula
|
||||
\throw nothrow
|
||||
*/
|
||||
const string_type& ParserTokenReader::GetExpr() const
|
||||
{
|
||||
return m_strFormula;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Return a map containing the used variables only. */
|
||||
varmap_type& ParserTokenReader::GetUsedVar()
|
||||
{
|
||||
return m_UsedVar;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Initialize the token Reader.
|
||||
|
||||
Sets the formula position index to zero and set Syntax flags to default for initial formula parsing.
|
||||
\pre [assert] triggered if a_szFormula==0
|
||||
*/
|
||||
void ParserTokenReader::SetFormula(const string_type &a_strFormula)
|
||||
{
|
||||
m_strFormula = a_strFormula;
|
||||
ReInit();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Set Flag that controls behaviour in case of undefined variables being found.
|
||||
|
||||
If true, the parser does not throw an exception if an undefined variable is found.
|
||||
otherwise it does. This variable is used internally only!
|
||||
It suppresses a "undefined variable" exception in GetUsedVar().
|
||||
Those function should return a complete list of variables including
|
||||
those the are not defined by the time of it's call.
|
||||
*/
|
||||
void ParserTokenReader::IgnoreUndefVar(bool bIgnore)
|
||||
{
|
||||
m_bIgnoreUndefVar = bIgnore;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Reset the token reader to the start of the formula.
|
||||
|
||||
The syntax flags will be reset to a value appropriate for the
|
||||
start of a formula.
|
||||
\post #m_iPos==0, #m_iSynFlags = noOPT | noBC | noPOSTOP | noSTR
|
||||
\throw nothrow
|
||||
\sa ESynCodes
|
||||
*/
|
||||
void ParserTokenReader::ReInit()
|
||||
{
|
||||
m_iPos = 0;
|
||||
m_iSynFlags = sfSTART_OF_LINE;
|
||||
m_iBrackets = 0;
|
||||
m_UsedVar.clear();
|
||||
m_lastTok = token_type();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Read the next token from the string. */
|
||||
ParserTokenReader::token_type ParserTokenReader::ReadNextToken()
|
||||
{
|
||||
assert(m_pParser);
|
||||
|
||||
const char_type *szFormula = m_strFormula.c_str();
|
||||
token_type tok;
|
||||
|
||||
// Ignore all non printable characters when reading the expression
|
||||
while (szFormula[m_iPos]>0 && szFormula[m_iPos]<=0x20)
|
||||
++m_iPos;
|
||||
|
||||
if ( IsEOF(tok) ) return SaveBeforeReturn(tok); // Check for end of formula
|
||||
if ( IsOprt(tok) ) return SaveBeforeReturn(tok); // Check for user defined binary operator
|
||||
if ( IsFunTok(tok) ) return SaveBeforeReturn(tok); // Check for function token
|
||||
if ( IsBuiltIn(tok) ) return SaveBeforeReturn(tok); // Check built in operators / tokens
|
||||
if ( IsArgSep(tok) ) return SaveBeforeReturn(tok); // Check for function argument separators
|
||||
if ( IsValTok(tok) ) return SaveBeforeReturn(tok); // Check for values / constant tokens
|
||||
if ( IsVarTok(tok) ) return SaveBeforeReturn(tok); // Check for variable tokens
|
||||
if ( IsStrVarTok(tok) ) return SaveBeforeReturn(tok); // Check for string variables
|
||||
if ( IsString(tok) ) return SaveBeforeReturn(tok); // Check for String tokens
|
||||
if ( IsInfixOpTok(tok) ) return SaveBeforeReturn(tok); // Check for unary operators
|
||||
if ( IsPostOpTok(tok) ) return SaveBeforeReturn(tok); // Check for unary operators
|
||||
|
||||
// Check String for undefined variable token. Done only if a
|
||||
// flag is set indicating to ignore undefined variables.
|
||||
// This is a way to conditionally avoid an error if
|
||||
// undefined variables occur.
|
||||
// (The GetUsedVar function must suppress the error for
|
||||
// undefined variables in order to collect all variable
|
||||
// names including the undefined ones.)
|
||||
if ( (m_bIgnoreUndefVar || m_pFactory) && IsUndefVarTok(tok) )
|
||||
return SaveBeforeReturn(tok);
|
||||
|
||||
// Check for unknown token
|
||||
//
|
||||
// !!! From this point on there is no exit without an exception possible...
|
||||
//
|
||||
string_type strTok;
|
||||
int iEnd = ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos);
|
||||
if (iEnd!=m_iPos)
|
||||
Error(ecUNASSIGNABLE_TOKEN, m_iPos, strTok);
|
||||
|
||||
Error(ecUNASSIGNABLE_TOKEN, m_iPos, m_strFormula.substr(m_iPos));
|
||||
return token_type(); // never reached
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserTokenReader::SetParent(ParserBase *a_pParent)
|
||||
{
|
||||
m_pParser = a_pParent;
|
||||
m_pFunDef = &a_pParent->m_FunDef;
|
||||
m_pOprtDef = &a_pParent->m_OprtDef;
|
||||
m_pInfixOprtDef = &a_pParent->m_InfixOprtDef;
|
||||
m_pPostOprtDef = &a_pParent->m_PostOprtDef;
|
||||
m_pVarDef = &a_pParent->m_VarDef;
|
||||
m_pStrVarDef = &a_pParent->m_StrVarDef;
|
||||
m_pConstDef = &a_pParent->m_ConstDef;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Extract all characters that belong to a certain charset.
|
||||
|
||||
\param a_szCharSet [in] Const char array of the characters allowed in the token.
|
||||
\param a_strTok [out] The string that consists entirely of characters listed in a_szCharSet.
|
||||
\param a_iPos [in] Position in the string from where to start reading.
|
||||
\return The Position of the first character not listed in a_szCharSet.
|
||||
\throw nothrow
|
||||
*/
|
||||
int ParserTokenReader::ExtractToken(const char_type *a_szCharSet,
|
||||
string_type &a_sTok,
|
||||
int a_iPos) const
|
||||
{
|
||||
int iEnd = (int)m_strFormula.find_first_not_of(a_szCharSet, a_iPos);
|
||||
|
||||
if (iEnd==(int)string_type::npos)
|
||||
iEnd = (int)m_strFormula.length();
|
||||
|
||||
// Assign token string if there was something found
|
||||
if (a_iPos!=iEnd)
|
||||
a_sTok = string_type( m_strFormula.begin()+a_iPos, m_strFormula.begin()+iEnd);
|
||||
|
||||
return iEnd;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check Expression for the presence of a binary operator token.
|
||||
|
||||
Userdefined binary operator "++" gives inconsistent parsing result for
|
||||
the equations "a++b" and "a ++ b" if alphabetic characters are allowed
|
||||
in operator tokens. To avoid this this function checks specifically
|
||||
for operator tokens.
|
||||
*/
|
||||
int ParserTokenReader::ExtractOperatorToken(string_type &a_sTok,
|
||||
int a_iPos) const
|
||||
{
|
||||
// Changed as per Issue 6: https://code.google.com/p/muparser/issues/detail?id=6
|
||||
int iEnd = (int)m_strFormula.find_first_not_of(m_pParser->ValidOprtChars(), a_iPos);
|
||||
if (iEnd==(int)string_type::npos)
|
||||
iEnd = (int)m_strFormula.length();
|
||||
|
||||
// Assign token string if there was something found
|
||||
if (a_iPos!=iEnd)
|
||||
{
|
||||
a_sTok = string_type( m_strFormula.begin() + a_iPos, m_strFormula.begin() + iEnd);
|
||||
return iEnd;
|
||||
}
|
||||
else
|
||||
{
|
||||
// There is still the chance of having to deal with an operator consisting exclusively
|
||||
// of alphabetic characters.
|
||||
return ExtractToken(MUP_CHARS, a_sTok, a_iPos);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check if a built in operator or other token can be found
|
||||
\param a_Tok [out] Operator token if one is found. This can either be a binary operator or an infix operator token.
|
||||
\return true if an operator token has been found.
|
||||
*/
|
||||
bool ParserTokenReader::IsBuiltIn(token_type &a_Tok)
|
||||
{
|
||||
const char_type **const pOprtDef = m_pParser->GetOprtDef(),
|
||||
*const szFormula = m_strFormula.c_str();
|
||||
|
||||
// Compare token with function and operator strings
|
||||
// check string for operator/function
|
||||
for (int i=0; pOprtDef[i]; i++)
|
||||
{
|
||||
std::size_t len( std::char_traits<char_type>::length(pOprtDef[i]) );
|
||||
if ( string_type(pOprtDef[i]) == string_type(szFormula + m_iPos, szFormula + m_iPos + len) )
|
||||
{
|
||||
switch(i)
|
||||
{
|
||||
//case cmAND:
|
||||
//case cmOR:
|
||||
//case cmXOR:
|
||||
case cmLAND:
|
||||
case cmLOR:
|
||||
case cmLT:
|
||||
case cmGT:
|
||||
case cmLE:
|
||||
case cmGE:
|
||||
case cmNEQ:
|
||||
case cmEQ:
|
||||
case cmADD:
|
||||
case cmSUB:
|
||||
case cmMUL:
|
||||
case cmDIV:
|
||||
case cmPOW:
|
||||
case cmASSIGN:
|
||||
//if (len!=sTok.length())
|
||||
// continue;
|
||||
|
||||
// The assignment operator need special treatment
|
||||
if (i==cmASSIGN && m_iSynFlags & noASSIGN)
|
||||
Error(ecUNEXPECTED_OPERATOR, m_iPos, pOprtDef[i]);
|
||||
|
||||
if (!m_pParser->HasBuiltInOprt()) continue;
|
||||
if (m_iSynFlags & noOPT)
|
||||
{
|
||||
// Maybe its an infix operator not an operator
|
||||
// Both operator types can share characters in
|
||||
// their identifiers
|
||||
if ( IsInfixOpTok(a_Tok) )
|
||||
return true;
|
||||
|
||||
Error(ecUNEXPECTED_OPERATOR, m_iPos, pOprtDef[i]);
|
||||
}
|
||||
|
||||
m_iSynFlags = noBC | noOPT | noARG_SEP | noPOSTOP | noASSIGN | noIF | noELSE | noEND;
|
||||
break;
|
||||
|
||||
case cmBO:
|
||||
if (m_iSynFlags & noBO)
|
||||
Error(ecUNEXPECTED_PARENS, m_iPos, pOprtDef[i]);
|
||||
|
||||
if (m_lastTok.GetCode()==cmFUNC)
|
||||
m_iSynFlags = noOPT | noEND | noARG_SEP | noPOSTOP | noASSIGN | noIF | noELSE;
|
||||
else
|
||||
m_iSynFlags = noBC | noOPT | noEND | noARG_SEP | noPOSTOP | noASSIGN| noIF | noELSE;
|
||||
|
||||
++m_iBrackets;
|
||||
break;
|
||||
|
||||
case cmBC:
|
||||
if (m_iSynFlags & noBC)
|
||||
Error(ecUNEXPECTED_PARENS, m_iPos, pOprtDef[i]);
|
||||
|
||||
m_iSynFlags = noBO | noVAR | noVAL | noFUN | noINFIXOP | noSTR | noASSIGN;
|
||||
|
||||
if (--m_iBrackets<0)
|
||||
Error(ecUNEXPECTED_PARENS, m_iPos, pOprtDef[i]);
|
||||
break;
|
||||
|
||||
case cmELSE:
|
||||
if (m_iSynFlags & noELSE)
|
||||
Error(ecUNEXPECTED_CONDITIONAL, m_iPos, pOprtDef[i]);
|
||||
|
||||
m_iSynFlags = noBC | noPOSTOP | noEND | noOPT | noIF | noELSE;
|
||||
break;
|
||||
|
||||
case cmIF:
|
||||
if (m_iSynFlags & noIF)
|
||||
Error(ecUNEXPECTED_CONDITIONAL, m_iPos, pOprtDef[i]);
|
||||
|
||||
m_iSynFlags = noBC | noPOSTOP | noEND | noOPT | noIF | noELSE;
|
||||
break;
|
||||
|
||||
default: // The operator is listed in c_DefaultOprt, but not here. This is a bad thing...
|
||||
Error(ecINTERNAL_ERROR);
|
||||
} // switch operator id
|
||||
|
||||
m_iPos += (int)len;
|
||||
a_Tok.Set( (ECmdCode)i, pOprtDef[i] );
|
||||
return true;
|
||||
} // if operator string found
|
||||
} // end of for all operator strings
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
bool ParserTokenReader::IsArgSep(token_type &a_Tok)
|
||||
{
|
||||
const char_type* szFormula = m_strFormula.c_str();
|
||||
|
||||
if (szFormula[m_iPos]==m_cArgSep)
|
||||
{
|
||||
// copy the separator into null terminated string
|
||||
char_type szSep[2];
|
||||
szSep[0] = m_cArgSep;
|
||||
szSep[1] = 0;
|
||||
|
||||
if (m_iSynFlags & noARG_SEP)
|
||||
Error(ecUNEXPECTED_ARG_SEP, m_iPos, szSep);
|
||||
|
||||
m_iSynFlags = noBC | noOPT | noEND | noARG_SEP | noPOSTOP | noASSIGN;
|
||||
m_iPos++;
|
||||
a_Tok.Set(cmARG_SEP, szSep);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check for End of Formula.
|
||||
|
||||
\return true if an end of formula is found false otherwise.
|
||||
\param a_Tok [out] If an eof is found the corresponding token will be stored there.
|
||||
\throw nothrow
|
||||
\sa IsOprt, IsFunTok, IsStrFunTok, IsValTok, IsVarTok, IsString, IsInfixOpTok, IsPostOpTok
|
||||
*/
|
||||
bool ParserTokenReader::IsEOF(token_type &a_Tok)
|
||||
{
|
||||
const char_type* szFormula = m_strFormula.c_str();
|
||||
|
||||
// check for EOF
|
||||
if ( !szFormula[m_iPos] /*|| szFormula[m_iPos] == '\n'*/)
|
||||
{
|
||||
if ( m_iSynFlags & noEND )
|
||||
Error(ecUNEXPECTED_EOF, m_iPos);
|
||||
|
||||
if (m_iBrackets>0)
|
||||
Error(ecMISSING_PARENS, m_iPos, _T(")"));
|
||||
|
||||
m_iSynFlags = 0;
|
||||
a_Tok.Set(cmEND);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check if a string position contains a unary infix operator.
|
||||
\return true if a function token has been found false otherwise.
|
||||
*/
|
||||
bool ParserTokenReader::IsInfixOpTok(token_type &a_Tok)
|
||||
{
|
||||
string_type sTok;
|
||||
int iEnd = ExtractToken(m_pParser->ValidInfixOprtChars(), sTok, m_iPos);
|
||||
if (iEnd==m_iPos)
|
||||
return false;
|
||||
|
||||
// iterate over all postfix operator strings
|
||||
funmap_type::const_reverse_iterator it = m_pInfixOprtDef->rbegin();
|
||||
for ( ; it!=m_pInfixOprtDef->rend(); ++it)
|
||||
{
|
||||
if (sTok.find(it->first)!=0)
|
||||
continue;
|
||||
|
||||
a_Tok.Set(it->second, it->first);
|
||||
m_iPos += (int)it->first.length();
|
||||
|
||||
if (m_iSynFlags & noINFIXOP)
|
||||
Error(ecUNEXPECTED_OPERATOR, m_iPos, a_Tok.GetAsString());
|
||||
|
||||
m_iSynFlags = noPOSTOP | noINFIXOP | noOPT | noBC | noSTR | noASSIGN;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
/*
|
||||
a_Tok.Set(item->second, sTok);
|
||||
m_iPos = (int)iEnd;
|
||||
|
||||
if (m_iSynFlags & noINFIXOP)
|
||||
Error(ecUNEXPECTED_OPERATOR, m_iPos, a_Tok.GetAsString());
|
||||
|
||||
m_iSynFlags = noPOSTOP | noINFIXOP | noOPT | noBC | noSTR | noASSIGN;
|
||||
return true;
|
||||
*/
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check whether the token at a given position is a function token.
|
||||
\param a_Tok [out] If a value token is found it will be placed here.
|
||||
\throw ParserException if Syntaxflags do not allow a function at a_iPos
|
||||
\return true if a function token has been found false otherwise.
|
||||
\pre [assert] m_pParser!=0
|
||||
*/
|
||||
bool ParserTokenReader::IsFunTok(token_type &a_Tok)
|
||||
{
|
||||
string_type strTok;
|
||||
int iEnd = ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos);
|
||||
if (iEnd==m_iPos)
|
||||
return false;
|
||||
|
||||
funmap_type::const_iterator item = m_pFunDef->find(strTok);
|
||||
if (item==m_pFunDef->end())
|
||||
return false;
|
||||
|
||||
// Check if the next sign is an opening bracket
|
||||
const char_type *szFormula = m_strFormula.c_str();
|
||||
if (szFormula[iEnd]!='(')
|
||||
return false;
|
||||
|
||||
a_Tok.Set(item->second, strTok);
|
||||
|
||||
m_iPos = (int)iEnd;
|
||||
if (m_iSynFlags & noFUN)
|
||||
Error(ecUNEXPECTED_FUN, m_iPos-(int)a_Tok.GetAsString().length(), a_Tok.GetAsString());
|
||||
|
||||
m_iSynFlags = noANY ^ noBO;
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check if a string position contains a binary operator.
|
||||
\param a_Tok [out] Operator token if one is found. This can either be a binary operator or an infix operator token.
|
||||
\return true if an operator token has been found.
|
||||
*/
|
||||
bool ParserTokenReader::IsOprt(token_type &a_Tok)
|
||||
{
|
||||
const char_type *const szExpr = m_strFormula.c_str();
|
||||
string_type strTok;
|
||||
|
||||
int iEnd = ExtractOperatorToken(strTok, m_iPos);
|
||||
if (iEnd==m_iPos)
|
||||
return false;
|
||||
|
||||
// Check if the operator is a built in operator, if so ignore it here
|
||||
const char_type **const pOprtDef = m_pParser->GetOprtDef();
|
||||
for (int i=0; m_pParser->HasBuiltInOprt() && pOprtDef[i]; ++i)
|
||||
{
|
||||
if (string_type(pOprtDef[i])==strTok)
|
||||
return false;
|
||||
}
|
||||
|
||||
// Note:
|
||||
// All tokens in oprt_bin_maptype are have been sorted by their length
|
||||
// Long operators must come first! Otherwise short names (like: "add") that
|
||||
// are part of long token names (like: "add123") will be found instead
|
||||
// of the long ones.
|
||||
// Length sorting is done with ascending length so we use a reverse iterator here.
|
||||
funmap_type::const_reverse_iterator it = m_pOprtDef->rbegin();
|
||||
for ( ; it!=m_pOprtDef->rend(); ++it)
|
||||
{
|
||||
const string_type &sID = it->first;
|
||||
if ( sID == string_type(szExpr + m_iPos, szExpr + m_iPos + sID.length()) )
|
||||
{
|
||||
a_Tok.Set(it->second, strTok);
|
||||
|
||||
// operator was found
|
||||
if (m_iSynFlags & noOPT)
|
||||
{
|
||||
// An operator was found but is not expected to occur at
|
||||
// this position of the formula, maybe it is an infix
|
||||
// operator, not a binary operator. Both operator types
|
||||
// can share characters in their identifiers.
|
||||
if ( IsInfixOpTok(a_Tok) )
|
||||
return true;
|
||||
else
|
||||
{
|
||||
// nope, no infix operator
|
||||
return false;
|
||||
//Error(ecUNEXPECTED_OPERATOR, m_iPos, a_Tok.GetAsString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
m_iPos += (int)sID.length();
|
||||
m_iSynFlags = noBC | noOPT | noARG_SEP | noPOSTOP | noEND | noASSIGN;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check if a string position contains a unary post value operator. */
|
||||
bool ParserTokenReader::IsPostOpTok(token_type &a_Tok)
|
||||
{
|
||||
// <ibg 20110629> Do not check for postfix operators if they are not allowed at
|
||||
// the current expression index.
|
||||
//
|
||||
// This will fix the bug reported here:
|
||||
//
|
||||
// http://sourceforge.net/tracker/index.php?func=detail&aid=3343891&group_id=137191&atid=737979
|
||||
//
|
||||
if (m_iSynFlags & noPOSTOP)
|
||||
return false;
|
||||
// </ibg>
|
||||
|
||||
// Tricky problem with equations like "3m+5":
|
||||
// m is a postfix operator, + is a valid sign for postfix operators and
|
||||
// for binary operators parser detects "m+" as operator string and
|
||||
// finds no matching postfix operator.
|
||||
//
|
||||
// This is a special case so this routine slightly differs from the other
|
||||
// token readers.
|
||||
|
||||
// Test if there could be a postfix operator
|
||||
string_type sTok;
|
||||
int iEnd = ExtractToken(m_pParser->ValidOprtChars(), sTok, m_iPos);
|
||||
if (iEnd==m_iPos)
|
||||
return false;
|
||||
|
||||
// iterate over all postfix operator strings
|
||||
funmap_type::const_reverse_iterator it = m_pPostOprtDef->rbegin();
|
||||
for ( ; it!=m_pPostOprtDef->rend(); ++it)
|
||||
{
|
||||
if (sTok.find(it->first)!=0)
|
||||
continue;
|
||||
|
||||
a_Tok.Set(it->second, sTok);
|
||||
m_iPos += (int)it->first.length();
|
||||
|
||||
m_iSynFlags = noVAL | noVAR | noFUN | noBO | noPOSTOP | noSTR | noASSIGN;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check whether the token at a given position is a value token.
|
||||
|
||||
Value tokens are either values or constants.
|
||||
|
||||
\param a_Tok [out] If a value token is found it will be placed here.
|
||||
\return true if a value token has been found.
|
||||
*/
|
||||
bool ParserTokenReader::IsValTok(token_type &a_Tok)
|
||||
{
|
||||
assert(m_pConstDef);
|
||||
assert(m_pParser);
|
||||
|
||||
string_type strTok;
|
||||
value_type fVal(0);
|
||||
int iEnd(0);
|
||||
|
||||
// 2.) Check for user defined constant
|
||||
// Read everything that could be a constant name
|
||||
iEnd = ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos);
|
||||
if (iEnd!=m_iPos)
|
||||
{
|
||||
valmap_type::const_iterator item = m_pConstDef->find(strTok);
|
||||
if (item!=m_pConstDef->end())
|
||||
{
|
||||
m_iPos = iEnd;
|
||||
a_Tok.SetVal(item->second, strTok);
|
||||
|
||||
if (m_iSynFlags & noVAL)
|
||||
Error(ecUNEXPECTED_VAL, m_iPos - (int)strTok.length(), strTok);
|
||||
|
||||
m_iSynFlags = noVAL | noVAR | noFUN | noBO | noINFIXOP | noSTR | noASSIGN;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 3.call the value recognition functions provided by the user
|
||||
// Call user defined value recognition functions
|
||||
std::list<identfun_type>::const_iterator item = m_vIdentFun.begin();
|
||||
for (item = m_vIdentFun.begin(); item!=m_vIdentFun.end(); ++item)
|
||||
{
|
||||
int iStart = m_iPos;
|
||||
if ( (*item)(m_strFormula.c_str() + m_iPos, &m_iPos, &fVal)==1 )
|
||||
{
|
||||
// 2013-11-27 Issue 2: https://code.google.com/p/muparser/issues/detail?id=2
|
||||
strTok.assign(m_strFormula.c_str(), iStart, m_iPos-iStart);
|
||||
|
||||
if (m_iSynFlags & noVAL)
|
||||
Error(ecUNEXPECTED_VAL, m_iPos - (int)strTok.length(), strTok);
|
||||
|
||||
a_Tok.SetVal(fVal, strTok);
|
||||
m_iSynFlags = noVAL | noVAR | noFUN | noBO | noINFIXOP | noSTR | noASSIGN;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check wheter a token at a given position is a variable token.
|
||||
\param a_Tok [out] If a variable token has been found it will be placed here.
|
||||
\return true if a variable token has been found.
|
||||
*/
|
||||
bool ParserTokenReader::IsVarTok(token_type &a_Tok)
|
||||
{
|
||||
if (m_pVarDef->empty())
|
||||
return false;
|
||||
|
||||
string_type strTok;
|
||||
int iEnd = ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos);
|
||||
if (iEnd==m_iPos)
|
||||
return false;
|
||||
|
||||
varmap_type::const_iterator item = m_pVarDef->find(strTok);
|
||||
if (item==m_pVarDef->end())
|
||||
return false;
|
||||
|
||||
if (m_iSynFlags & noVAR)
|
||||
Error(ecUNEXPECTED_VAR, m_iPos, strTok);
|
||||
|
||||
m_pParser->OnDetectVar(&m_strFormula, m_iPos, iEnd);
|
||||
|
||||
m_iPos = iEnd;
|
||||
a_Tok.SetVar(item->second, strTok);
|
||||
m_UsedVar[item->first] = item->second; // Add variable to used-var-list
|
||||
|
||||
m_iSynFlags = noVAL | noVAR | noFUN | noBO | noINFIXOP | noSTR;
|
||||
|
||||
// Zur Info hier die SynFlags von IsVal():
|
||||
// m_iSynFlags = noVAL | noVAR | noFUN | noBO | noINFIXOP | noSTR | noASSIGN;
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
bool ParserTokenReader::IsStrVarTok(token_type &a_Tok)
|
||||
{
|
||||
if (!m_pStrVarDef || m_pStrVarDef->empty())
|
||||
return false;
|
||||
|
||||
string_type strTok;
|
||||
int iEnd = ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos);
|
||||
if (iEnd==m_iPos)
|
||||
return false;
|
||||
|
||||
strmap_type::const_iterator item = m_pStrVarDef->find(strTok);
|
||||
if (item==m_pStrVarDef->end())
|
||||
return false;
|
||||
|
||||
if (m_iSynFlags & noSTR)
|
||||
Error(ecUNEXPECTED_VAR, m_iPos, strTok);
|
||||
|
||||
m_iPos = iEnd;
|
||||
if (!m_pParser->m_vStringVarBuf.size())
|
||||
Error(ecINTERNAL_ERROR);
|
||||
|
||||
a_Tok.SetString(m_pParser->m_vStringVarBuf[item->second], m_pParser->m_vStringVarBuf.size() );
|
||||
|
||||
m_iSynFlags = noANY ^ ( noBC | noOPT | noEND | noARG_SEP);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check wheter a token at a given position is an undefined variable.
|
||||
|
||||
\param a_Tok [out] If a variable tom_pParser->m_vStringBufken has been found it will be placed here.
|
||||
\return true if a variable token has been found.
|
||||
\throw nothrow
|
||||
*/
|
||||
bool ParserTokenReader::IsUndefVarTok(token_type &a_Tok)
|
||||
{
|
||||
string_type strTok;
|
||||
int iEnd( ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos) );
|
||||
if ( iEnd==m_iPos )
|
||||
return false;
|
||||
|
||||
if (m_iSynFlags & noVAR)
|
||||
{
|
||||
// <ibg/> 20061021 added token string strTok instead of a_Tok.GetAsString() as the
|
||||
// token identifier.
|
||||
// related bug report:
|
||||
// http://sourceforge.net/tracker/index.php?func=detail&aid=1578779&group_id=137191&atid=737979
|
||||
Error(ecUNEXPECTED_VAR, m_iPos - (int)a_Tok.GetAsString().length(), strTok);
|
||||
}
|
||||
|
||||
// If a factory is available implicitely create new variables
|
||||
if (m_pFactory)
|
||||
{
|
||||
value_type *fVar = m_pFactory(strTok.c_str(), m_pFactoryData);
|
||||
a_Tok.SetVar(fVar, strTok );
|
||||
|
||||
// Do not use m_pParser->DefineVar( strTok, fVar );
|
||||
// in order to define the new variable, it will clear the
|
||||
// m_UsedVar array which will kill previously defined variables
|
||||
// from the list
|
||||
// This is safe because the new variable can never override an existing one
|
||||
// because they are checked first!
|
||||
(*m_pVarDef)[strTok] = fVar;
|
||||
m_UsedVar[strTok] = fVar; // Add variable to used-var-list
|
||||
}
|
||||
else
|
||||
{
|
||||
a_Tok.SetVar((value_type*)&m_fZero, strTok);
|
||||
m_UsedVar[strTok] = 0; // Add variable to used-var-list
|
||||
}
|
||||
|
||||
m_iPos = iEnd;
|
||||
|
||||
// Call the variable factory in order to let it define a new parser variable
|
||||
m_iSynFlags = noVAL | noVAR | noFUN | noBO | noPOSTOP | noINFIXOP | noSTR;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Check wheter a token at a given position is a string.
|
||||
\param a_Tok [out] If a variable token has been found it will be placed here.
|
||||
\return true if a string token has been found.
|
||||
\sa IsOprt, IsFunTok, IsStrFunTok, IsValTok, IsVarTok, IsEOF, IsInfixOpTok, IsPostOpTok
|
||||
\throw nothrow
|
||||
*/
|
||||
bool ParserTokenReader::IsString(token_type &a_Tok)
|
||||
{
|
||||
if (m_strFormula[m_iPos]!='"')
|
||||
return false;
|
||||
|
||||
string_type strBuf(&m_strFormula[m_iPos+1]);
|
||||
std::size_t iEnd(0), iSkip(0);
|
||||
|
||||
// parser over escaped '\"' end replace them with '"'
|
||||
for(iEnd=(int)strBuf.find( _T("\"") ); iEnd!=0 && iEnd!=string_type::npos; iEnd=(int)strBuf.find( _T("\""), iEnd))
|
||||
{
|
||||
if (strBuf[iEnd-1]!='\\') break;
|
||||
strBuf.replace(iEnd-1, 2, _T("\"") );
|
||||
iSkip++;
|
||||
}
|
||||
|
||||
if (iEnd==string_type::npos)
|
||||
Error(ecUNTERMINATED_STRING, m_iPos, _T("\"") );
|
||||
|
||||
string_type strTok(strBuf.begin(), strBuf.begin()+iEnd);
|
||||
|
||||
if (m_iSynFlags & noSTR)
|
||||
Error(ecUNEXPECTED_STR, m_iPos, strTok);
|
||||
|
||||
m_pParser->m_vStringBuf.push_back(strTok); // Store string in internal buffer
|
||||
a_Tok.SetString(strTok, m_pParser->m_vStringBuf.size());
|
||||
|
||||
m_iPos += (int)strTok.length() + 2 + (int)iSkip; // +2 wg Anführungszeichen; +iSkip für entfernte escape zeichen
|
||||
m_iSynFlags = noANY ^ ( noARG_SEP | noBC | noOPT | noEND );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
/** \brief Create an error containing the parse error position.
|
||||
|
||||
This function will create an Parser Exception object containing the error text and its position.
|
||||
|
||||
\param a_iErrc [in] The error code of type #EErrorCodes.
|
||||
\param a_iPos [in] The position where the error was detected.
|
||||
\param a_strTok [in] The token string representation associated with the error.
|
||||
\throw ParserException always throws thats the only purpose of this function.
|
||||
*/
|
||||
void ParserTokenReader::Error( EErrorCodes a_iErrc,
|
||||
int a_iPos,
|
||||
const string_type &a_sTok) const
|
||||
{
|
||||
m_pParser->Error(a_iErrc, a_iPos, a_sTok);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void ParserTokenReader::SetArgSep(char_type cArgSep)
|
||||
{
|
||||
m_cArgSep = cArgSep;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
char_type ParserTokenReader::GetArgSep() const
|
||||
{
|
||||
return m_cArgSep;
|
||||
}
|
||||
} // namespace mu
|
||||
|
Loading…
Reference in a new issue