New Upstream Release - muparserx

Ready changes

Summary

Merged new upstream version: 4.0.12 (was: 4.0.11).

Resulting package

Built on 2023-06-09T14:53 (took 6m3s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases libmuparserx-devapt install -t fresh-releases libmuparserx4.0.11-dbgsymapt install -t fresh-releases libmuparserx4.0.11

Lintian Result

Diff

diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml
new file mode 100644
index 0000000..c204f90
--- /dev/null
+++ b/.github/workflows/basic.yml
@@ -0,0 +1,48 @@
+name: build
+
+on:
+  push:
+    paths-ignore:
+      - '**/*.md'
+  pull_request:
+    paths-ignore:
+      - '**/*.md'
+
+env:
+  CMAKE_BUILD_TYPE: Debug
+  CMAKE_BUILD_DIR: ${{ github.workspace }}/build
+
+jobs:
+  build:
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [windows-2022, ubuntu-22.04, macOS-12]
+
+    runs-on: ${{ matrix.os }}
+
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Build
+      shell: bash
+      run: |
+        mkdir -p $CMAKE_BUILD_DIR
+        cd  $CMAKE_BUILD_DIR
+        cmake -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE ..
+        cmake --build .
+
+    - name: Test Examples
+      shell: bash
+      working-directory: ${{ env.CMAKE_BUILD_DIR }}
+      run: |
+        if [[ ${{ matrix.os }} == windows* ]]; then
+          EXAMPLE="$CMAKE_BUILD_TYPE/example.exe"
+        else
+          EXAMPLE="./example"
+        fi
+        $EXAMPLE &> example.log << EOF
+        quit
+        EOF
+        cat example.log
+        grep -e "Test passed.*expressions" example.log || (grep -e "Test failed.*expressions" example.log; exit 1)
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..3571436
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,6 @@
+{
+    "files.associations": {
+        "type_traits": "cpp",
+        "limits": "cpp"
+    }
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..06ef6b5
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,28 @@
+{
+    "tasks": [
+        {
+            "type": "cppbuild",
+            "label": "C/C++: g++ Aktive Datei kompilieren",
+            "command": "/usr/bin/g++",
+            "args": [
+                "-fdiagnostics-color=always",
+                "-g",
+                "${file}",
+                "-o",
+                "${fileDirname}/${fileBasenameNoExtension}"
+            ],
+            "options": {
+                "cwd": "${fileDirname}"
+            },
+            "problemMatcher": [
+                "$gcc"
+            ],
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            },
+            "detail": "Vom Debugger generierte Aufgabe."
+        }
+    ],
+    "version": "2.0.0"
+}
\ No newline at end of file
diff --git a/CHANGELOG b/CHANGELOG
index acad597..552400a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,7 +7,7 @@
 #  |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \    #
 #        \/                     \/           \/     \/           \_/    #
 #                                                                       #
-#  Copyright (C) 2021 Ingo Berg, et al.                                 #
+#  Copyright (C) 2023 Ingo Berg, et al.                                 #
 #                                                                       #
 #  Web:     http://beltoforion.de/article.php?a=muparserx               #
 #  GitHub:  http://https://github.com/beltoforion/muparserx             #
@@ -30,6 +30,35 @@
 #                                                                       #
 #########################################################################
 
+V4.0.12 (20221204)
+-----------------
+
+Bugfixes:
+    Issue 116: Changed implementation of parsing double values to fix #116 on Mac.
+    Issue 115: String constants starting woth "or" confused with operator during parsing step
+    Issue 117: Equals operator behavior inconsistent when checking boolean values. (no type check)
+
+Changes:
+
+    C++17 is now the minimum required C++ version to compile the code
+    added a wide string option to cmake (USE_WIDE_STRING)
+    removed compatibility fixes for older compilers (mostly MSVC)
+    fixed compiler warnings
+
+V4.0.11 (20211123)
+-----------------
+Bugfixes:
+
+    Issue 112: Compilation issue due to an invalid header file name
+
+V4.0.10 (20211122)
+-----------------
+Bugfixes:
+
+    Issue 107: Complex multiplication-assignment did not work correctly
+    Issue 110: Short evaluation for binary operators added (thanks to user egyptyu)
+
+
 V4.0.9 (20200619)
 -----------------
 Bugfixes:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 97ddcfd..2bc28fc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,120 +1,122 @@
-########################################################################
-# Project setup
-########################################################################
-cmake_minimum_required(VERSION 2.8.12)
-project(muparserx CXX)
-
-########################################################################
-# Extract version
-########################################################################
-set(MUPARSERX_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/parser)
-file(READ "${MUPARSERX_SOURCE_DIR}/mpDefines.h" mpDefines_h)
-string(REGEX MATCH "\\#define MUP_PARSER_VERSION _T\\(\"([0-9]+\\.[0-9]+\\.[0-9]+) \\(" MUPARSERX_VERSION_MATCHES "${mpDefines_h}")
-if(NOT MUPARSERX_VERSION_MATCHES)
-    message(FATAL_ERROR "Failed to extract version number from mpDefines.h")
-endif(NOT MUPARSERX_VERSION_MATCHES)
-set(MUPARSERX_VERSION ${CMAKE_MATCH_1})
-
-########################################################################
-# Compiler specific flags
-########################################################################
-if(CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
-
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
-
-    #C++11 is a required language feature for this project
-    include(CheckCXXCompilerFlag)
-    CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_STD_CXX11)
-    if(HAS_STD_CXX11)
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-    else(HAS_STD_CXX11)
-        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
-    endif()
-
-endif(CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
-
-if(MSVC)
-    add_compile_options(/MP) #multi-core build
-endif(MSVC)
-
-########################################################################
-# Build library
-# Defaults to static, set BUILD_SHARED_LIBS=ON for shared
-########################################################################
-file(GLOB MUPARSERX_SOURCES "${MUPARSERX_SOURCE_DIR}/*.cpp")
-include_directories(${MUPARSERX_SOURCE_DIR})
-add_library(muparserx ${MUPARSERX_SOURCES})
-set_target_properties(muparserx PROPERTIES VERSION ${MUPARSERX_VERSION})
-set_property(TARGET muparserx PROPERTY POSITION_INDEPENDENT_CODE TRUE)
-set_target_properties(muparserx PROPERTIES SOVERSION ${MUPARSERX_VERSION})
-set_target_properties(muparserx PROPERTIES VERSION ${MUPARSERX_VERSION})
-
-#link with lib math when found
-find_library(
-    M_LIBRARY NAMES m
-    PATHS /usr/lib /usr/lib64
-)
-if(M_LIBRARY)
-    target_link_libraries(muparserx ${M_LIBRARY})
-endif(M_LIBRARY)
-
-install(TARGETS muparserx
-    LIBRARY DESTINATION lib${LIB_SUFFIX} # .so file
-    ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
-    RUNTIME DESTINATION bin              # .dll file
-)
-
-########################################################################
-# Build pkg config file
-########################################################################
-configure_file(
-    ${CMAKE_CURRENT_SOURCE_DIR}/muparserx.in.pc
-    ${CMAKE_CURRENT_BINARY_DIR}/muparserx.pc
-@ONLY)
-
-install(
-    FILES ${CMAKE_CURRENT_BINARY_DIR}/muparserx.pc
-    DESTINATION lib${LIB_SUFFIX}/pkgconfig
-)
-
-########################################################################
-# Install project config
-########################################################################
-configure_file(
-    ${PROJECT_SOURCE_DIR}/cmake/muparserxConfigVersion.in.cmake
-    ${PROJECT_BINARY_DIR}/muparserxConfigVersion.cmake
-@ONLY)
-set(cmake_files
-    ${PROJECT_SOURCE_DIR}/cmake/muparserxConfig.cmake
-    ${PROJECT_BINARY_DIR}/muparserxConfigVersion.cmake)
-if (UNIX)
-    install(FILES ${cmake_files} DESTINATION share/cmake/muparserx)
-elseif (WIN32)
-    install(FILES ${cmake_files} DESTINATION cmake)
-endif ()
-
-########################################################################
-# Install headers
-########################################################################
-file(GLOB MUPARSERX_HEADERS "${MUPARSERX_SOURCE_DIR}/*.h")
-install(
-    FILES ${MUPARSERX_HEADERS}
-    DESTINATION include/muparserx
-)
-
-########################################################################
-# Example application
-########################################################################
-option(BUILD_EXAMPLES "enable building example applications" ON)
-if(BUILD_EXAMPLES)
-    add_executable(example sample/example.cpp sample/timer.cpp)
-    target_link_libraries(example muparserx)
-endif(BUILD_EXAMPLES)
-
-########################################################################
-# Print summary
-########################################################################
-message(STATUS "Building muparserx version: ${MUPARSERX_VERSION}")
-message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
+########################################################################
+# Project setup
+########################################################################
+cmake_minimum_required(VERSION 2.8.12)
+project(muparserx CXX)
+
+########################################################################
+# Extract version
+########################################################################
+set(MUPARSERX_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/parser)
+file(READ "${MUPARSERX_SOURCE_DIR}/mpDefines.h" mpDefines_h)
+string(REGEX MATCH "\\#define MUP_PARSER_VERSION _T\\(\"([0-9]+\\.[0-9]+\\.[0-9]+) \\(" MUPARSERX_VERSION_MATCHES "${mpDefines_h}")
+if(NOT MUPARSERX_VERSION_MATCHES)
+    message(FATAL_ERROR "Failed to extract version number from mpDefines.h")
+endif(NOT MUPARSERX_VERSION_MATCHES)
+set(MUPARSERX_VERSION ${CMAKE_MATCH_1})
+
+########################################################################
+# Compiler specific flags
+########################################################################
+if(CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
+    set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG -g3 -gdwarf-3")
+    set(CMAKE_CXX_FLAGS_COVERAGE "-D_DEBUG -g3 -gdwarf-3 --coverage")
+
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
+
+endif(CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
+
+if(MSVC)
+    add_compile_options(/MP) #multi-core build
+    add_compile_options(/std:c++17)
+endif(MSVC)
+
+########################################################################
+# Build library
+# Defaults to static, set BUILD_SHARED_LIBS=ON for shared
+########################################################################
+file(GLOB MUPARSERX_SOURCES "${MUPARSERX_SOURCE_DIR}/*.cpp")
+include_directories(${MUPARSERX_SOURCE_DIR})
+add_library(muparserx ${MUPARSERX_SOURCES})
+set_target_properties(muparserx PROPERTIES VERSION ${MUPARSERX_VERSION})
+set_property(TARGET muparserx PROPERTY POSITION_INDEPENDENT_CODE TRUE)
+set_target_properties(muparserx PROPERTIES SOVERSION ${MUPARSERX_VERSION})
+set_target_properties(muparserx PROPERTIES VERSION ${MUPARSERX_VERSION})
+
+#link with lib math when found
+find_library(
+    M_LIBRARY NAMES m
+    PATHS /usr/lib /usr/lib64
+)
+if(M_LIBRARY)
+    target_link_libraries(muparserx ${M_LIBRARY})
+endif(M_LIBRARY)
+
+install(TARGETS muparserx
+    LIBRARY DESTINATION lib${LIB_SUFFIX} # .so file
+    ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file
+    RUNTIME DESTINATION bin              # .dll file
+)
+
+########################################################################
+# Build pkg config file
+########################################################################
+configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/muparserx.in.pc
+    ${CMAKE_CURRENT_BINARY_DIR}/muparserx.pc
+@ONLY)
+
+install(
+    FILES ${CMAKE_CURRENT_BINARY_DIR}/muparserx.pc
+    DESTINATION lib${LIB_SUFFIX}/pkgconfig
+)
+
+########################################################################
+# Install project config
+########################################################################
+configure_file(
+    ${PROJECT_SOURCE_DIR}/cmake/muparserxConfigVersion.in.cmake
+    ${PROJECT_BINARY_DIR}/muparserxConfigVersion.cmake
+@ONLY)
+set(cmake_files
+    ${PROJECT_SOURCE_DIR}/cmake/muparserxConfig.cmake
+    ${PROJECT_BINARY_DIR}/muparserxConfigVersion.cmake)
+if (UNIX)
+    install(FILES ${cmake_files} DESTINATION share/cmake/muparserx)
+elseif (WIN32)
+    install(FILES ${cmake_files} DESTINATION cmake)
+endif ()
+
+########################################################################
+# Install headers
+########################################################################
+file(GLOB MUPARSERX_HEADERS "${MUPARSERX_SOURCE_DIR}/*.h")
+install(
+    FILES ${MUPARSERX_HEADERS}
+    DESTINATION include/muparserx
+)
+
+########################################################################
+# Options
+########################################################################
+
+option(BUILD_EXAMPLES "enable building example applications" ON)
+if(BUILD_EXAMPLES)
+    add_executable(example sample/example.cpp sample/timer.cpp)
+    target_link_libraries(example muparserx)
+endif(BUILD_EXAMPLES)
+
+option(USE_WIDE_STRING "use UNICODE characters" OFF)
+if(USE_WIDE_STRING)
+    add_compile_definitions(MUP_USE_WIDE_STRING)
+endif(USE_WIDE_STRING)
+
+########################################################################
+# Print summary
+########################################################################
+
+message(STATUS "Building muparserx version: ${MUPARSERX_VERSION}")
+message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")
diff --git a/CMakeSettings.json b/CMakeSettings.json
new file mode 100644
index 0000000..78d67a4
--- /dev/null
+++ b/CMakeSettings.json
@@ -0,0 +1,45 @@
+{
+  "configurations": [
+    {
+      "name": "x64-Debug",
+      "generator": "Ninja",
+      "configurationType": "Debug",
+      "inheritEnvironments": [ "msvc_x64_x64" ],
+      "buildRoot": "${projectDir}\\out\\build\\${name}",
+      "installRoot": "${projectDir}\\out\\install\\${name}",
+      "cmakeCommandArgs": "",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "variables": [
+        {
+          "name": "USE_WIDE_STRING",
+          "value": "True",
+          "type": "BOOL"
+        }
+      ]
+    },
+    {
+      "name": "x64-Clang-Debug",
+      "generator": "Ninja",
+      "configurationType": "Debug",
+      "buildRoot": "${projectDir}\\out\\build\\${name}",
+      "installRoot": "${projectDir}\\out\\install\\${name}",
+      "cmakeCommandArgs": "",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "inheritEnvironments": [ "clang_cl_x64_x64" ],
+      "variables": [
+        {
+          "name": "CMAKE_CXX_COMPILER",
+          "value": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\x64\\bin\\clang.exe",
+          "type": "FILEPATH"
+        },
+        {
+          "name": "USE_WIDE_STRING",
+          "value": "True",
+          "type": "BOOL"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2a43b2d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,1324 @@
+# CMAKE generated file: DO NOT EDIT!
+# Generated by "Unix Makefiles" Generator, CMake Version 3.22
+
+# Default target executed when no arguments are given to make.
+default_target: all
+.PHONY : default_target
+
+# Allow only one "make -f Makefile2" at a time, but pass parallelism.
+.NOTPARALLEL:
+
+#=============================================================================
+# Special targets provided by cmake.
+
+# Disable implicit rules so canonical targets will work.
+.SUFFIXES:
+
+# Disable VCS-based implicit rules.
+% : %,v
+
+# Disable VCS-based implicit rules.
+% : RCS/%
+
+# Disable VCS-based implicit rules.
+% : RCS/%,v
+
+# Disable VCS-based implicit rules.
+% : SCCS/s.%
+
+# Disable VCS-based implicit rules.
+% : s.%
+
+.SUFFIXES: .hpux_make_needs_suffix_list
+
+# Command-line flag to silence nested $(MAKE).
+$(VERBOSE)MAKESILENT = -s
+
+#Suppress display of executed commands.
+$(VERBOSE).SILENT:
+
+# A target that is always out of date.
+cmake_force:
+.PHONY : cmake_force
+
+#=============================================================================
+# Set environment variables for the build.
+
+# The shell in which to execute make rules.
+SHELL = /bin/sh
+
+# The CMake executable.
+CMAKE_COMMAND = /usr/bin/cmake
+
+# The command to remove a file.
+RM = /usr/bin/cmake -E rm -f
+
+# Escaping for special characters.
+EQUALS = =
+
+# The top-level source directory on which CMake was run.
+CMAKE_SOURCE_DIR = /home/user/Dokumente/GitHub/muparserx
+
+# The top-level build directory on which CMake was run.
+CMAKE_BINARY_DIR = /home/user/Dokumente/GitHub/muparserx
+
+#=============================================================================
+# Targets provided globally by CMake.
+
+# Special rule for the target edit_cache
+edit_cache:
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
+	/usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
+.PHONY : edit_cache
+
+# Special rule for the target edit_cache
+edit_cache/fast: edit_cache
+.PHONY : edit_cache/fast
+
+# Special rule for the target rebuild_cache
+rebuild_cache:
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
+	/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
+.PHONY : rebuild_cache
+
+# Special rule for the target rebuild_cache
+rebuild_cache/fast: rebuild_cache
+.PHONY : rebuild_cache/fast
+
+# Special rule for the target list_install_components
+list_install_components:
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\""
+.PHONY : list_install_components
+
+# Special rule for the target list_install_components
+list_install_components/fast: list_install_components
+.PHONY : list_install_components/fast
+
+# Special rule for the target install
+install: preinstall
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..."
+	/usr/bin/cmake -P cmake_install.cmake
+.PHONY : install
+
+# Special rule for the target install
+install/fast: preinstall/fast
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..."
+	/usr/bin/cmake -P cmake_install.cmake
+.PHONY : install/fast
+
+# Special rule for the target install/local
+install/local: preinstall
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..."
+	/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
+.PHONY : install/local
+
+# Special rule for the target install/local
+install/local/fast: preinstall/fast
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..."
+	/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
+.PHONY : install/local/fast
+
+# Special rule for the target install/strip
+install/strip: preinstall
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..."
+	/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
+.PHONY : install/strip
+
+# Special rule for the target install/strip
+install/strip/fast: preinstall/fast
+	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..."
+	/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
+.PHONY : install/strip/fast
+
+# The main all target
+all: cmake_check_build_system
+	$(CMAKE_COMMAND) -E cmake_progress_start /home/user/Dokumente/GitHub/muparserx/CMakeFiles /home/user/Dokumente/GitHub/muparserx//CMakeFiles/progress.marks
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all
+	$(CMAKE_COMMAND) -E cmake_progress_start /home/user/Dokumente/GitHub/muparserx/CMakeFiles 0
+.PHONY : all
+
+# The main clean target
+clean:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean
+.PHONY : clean
+
+# The main clean target
+clean/fast: clean
+.PHONY : clean/fast
+
+# Prepare targets for installation.
+preinstall: all
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
+.PHONY : preinstall
+
+# Prepare targets for installation.
+preinstall/fast:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
+.PHONY : preinstall/fast
+
+# clear depends
+depend:
+	$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
+.PHONY : depend
+
+#=============================================================================
+# Target rules for targets named muparserx
+
+# Build rule for target.
+muparserx: cmake_check_build_system
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 muparserx
+.PHONY : muparserx
+
+# fast build rule for target.
+muparserx/fast:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/build
+.PHONY : muparserx/fast
+
+#=============================================================================
+# Target rules for targets named example
+
+# Build rule for target.
+example: cmake_check_build_system
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 example
+.PHONY : example
+
+# fast build rule for target.
+example/fast:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/build
+.PHONY : example/fast
+
+parser/mpError.o: parser/mpError.cpp.o
+.PHONY : parser/mpError.o
+
+# target to build an object file
+parser/mpError.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpError.cpp.o
+.PHONY : parser/mpError.cpp.o
+
+parser/mpError.i: parser/mpError.cpp.i
+.PHONY : parser/mpError.i
+
+# target to preprocess a source file
+parser/mpError.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpError.cpp.i
+.PHONY : parser/mpError.cpp.i
+
+parser/mpError.s: parser/mpError.cpp.s
+.PHONY : parser/mpError.s
+
+# target to generate assembly for a file
+parser/mpError.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpError.cpp.s
+.PHONY : parser/mpError.cpp.s
+
+parser/mpFuncCmplx.o: parser/mpFuncCmplx.cpp.o
+.PHONY : parser/mpFuncCmplx.o
+
+# target to build an object file
+parser/mpFuncCmplx.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncCmplx.cpp.o
+.PHONY : parser/mpFuncCmplx.cpp.o
+
+parser/mpFuncCmplx.i: parser/mpFuncCmplx.cpp.i
+.PHONY : parser/mpFuncCmplx.i
+
+# target to preprocess a source file
+parser/mpFuncCmplx.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncCmplx.cpp.i
+.PHONY : parser/mpFuncCmplx.cpp.i
+
+parser/mpFuncCmplx.s: parser/mpFuncCmplx.cpp.s
+.PHONY : parser/mpFuncCmplx.s
+
+# target to generate assembly for a file
+parser/mpFuncCmplx.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncCmplx.cpp.s
+.PHONY : parser/mpFuncCmplx.cpp.s
+
+parser/mpFuncCommon.o: parser/mpFuncCommon.cpp.o
+.PHONY : parser/mpFuncCommon.o
+
+# target to build an object file
+parser/mpFuncCommon.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncCommon.cpp.o
+.PHONY : parser/mpFuncCommon.cpp.o
+
+parser/mpFuncCommon.i: parser/mpFuncCommon.cpp.i
+.PHONY : parser/mpFuncCommon.i
+
+# target to preprocess a source file
+parser/mpFuncCommon.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncCommon.cpp.i
+.PHONY : parser/mpFuncCommon.cpp.i
+
+parser/mpFuncCommon.s: parser/mpFuncCommon.cpp.s
+.PHONY : parser/mpFuncCommon.s
+
+# target to generate assembly for a file
+parser/mpFuncCommon.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncCommon.cpp.s
+.PHONY : parser/mpFuncCommon.cpp.s
+
+parser/mpFuncMatrix.o: parser/mpFuncMatrix.cpp.o
+.PHONY : parser/mpFuncMatrix.o
+
+# target to build an object file
+parser/mpFuncMatrix.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncMatrix.cpp.o
+.PHONY : parser/mpFuncMatrix.cpp.o
+
+parser/mpFuncMatrix.i: parser/mpFuncMatrix.cpp.i
+.PHONY : parser/mpFuncMatrix.i
+
+# target to preprocess a source file
+parser/mpFuncMatrix.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncMatrix.cpp.i
+.PHONY : parser/mpFuncMatrix.cpp.i
+
+parser/mpFuncMatrix.s: parser/mpFuncMatrix.cpp.s
+.PHONY : parser/mpFuncMatrix.s
+
+# target to generate assembly for a file
+parser/mpFuncMatrix.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncMatrix.cpp.s
+.PHONY : parser/mpFuncMatrix.cpp.s
+
+parser/mpFuncNonCmplx.o: parser/mpFuncNonCmplx.cpp.o
+.PHONY : parser/mpFuncNonCmplx.o
+
+# target to build an object file
+parser/mpFuncNonCmplx.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncNonCmplx.cpp.o
+.PHONY : parser/mpFuncNonCmplx.cpp.o
+
+parser/mpFuncNonCmplx.i: parser/mpFuncNonCmplx.cpp.i
+.PHONY : parser/mpFuncNonCmplx.i
+
+# target to preprocess a source file
+parser/mpFuncNonCmplx.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncNonCmplx.cpp.i
+.PHONY : parser/mpFuncNonCmplx.cpp.i
+
+parser/mpFuncNonCmplx.s: parser/mpFuncNonCmplx.cpp.s
+.PHONY : parser/mpFuncNonCmplx.s
+
+# target to generate assembly for a file
+parser/mpFuncNonCmplx.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncNonCmplx.cpp.s
+.PHONY : parser/mpFuncNonCmplx.cpp.s
+
+parser/mpFuncStr.o: parser/mpFuncStr.cpp.o
+.PHONY : parser/mpFuncStr.o
+
+# target to build an object file
+parser/mpFuncStr.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncStr.cpp.o
+.PHONY : parser/mpFuncStr.cpp.o
+
+parser/mpFuncStr.i: parser/mpFuncStr.cpp.i
+.PHONY : parser/mpFuncStr.i
+
+# target to preprocess a source file
+parser/mpFuncStr.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncStr.cpp.i
+.PHONY : parser/mpFuncStr.cpp.i
+
+parser/mpFuncStr.s: parser/mpFuncStr.cpp.s
+.PHONY : parser/mpFuncStr.s
+
+# target to generate assembly for a file
+parser/mpFuncStr.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpFuncStr.cpp.s
+.PHONY : parser/mpFuncStr.cpp.s
+
+parser/mpICallback.o: parser/mpICallback.cpp.o
+.PHONY : parser/mpICallback.o
+
+# target to build an object file
+parser/mpICallback.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpICallback.cpp.o
+.PHONY : parser/mpICallback.cpp.o
+
+parser/mpICallback.i: parser/mpICallback.cpp.i
+.PHONY : parser/mpICallback.i
+
+# target to preprocess a source file
+parser/mpICallback.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpICallback.cpp.i
+.PHONY : parser/mpICallback.cpp.i
+
+parser/mpICallback.s: parser/mpICallback.cpp.s
+.PHONY : parser/mpICallback.s
+
+# target to generate assembly for a file
+parser/mpICallback.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpICallback.cpp.s
+.PHONY : parser/mpICallback.cpp.s
+
+parser/mpIOprt.o: parser/mpIOprt.cpp.o
+.PHONY : parser/mpIOprt.o
+
+# target to build an object file
+parser/mpIOprt.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIOprt.cpp.o
+.PHONY : parser/mpIOprt.cpp.o
+
+parser/mpIOprt.i: parser/mpIOprt.cpp.i
+.PHONY : parser/mpIOprt.i
+
+# target to preprocess a source file
+parser/mpIOprt.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIOprt.cpp.i
+.PHONY : parser/mpIOprt.cpp.i
+
+parser/mpIOprt.s: parser/mpIOprt.cpp.s
+.PHONY : parser/mpIOprt.s
+
+# target to generate assembly for a file
+parser/mpIOprt.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIOprt.cpp.s
+.PHONY : parser/mpIOprt.cpp.s
+
+parser/mpIOprtBinShortcut.o: parser/mpIOprtBinShortcut.cpp.o
+.PHONY : parser/mpIOprtBinShortcut.o
+
+# target to build an object file
+parser/mpIOprtBinShortcut.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIOprtBinShortcut.cpp.o
+.PHONY : parser/mpIOprtBinShortcut.cpp.o
+
+parser/mpIOprtBinShortcut.i: parser/mpIOprtBinShortcut.cpp.i
+.PHONY : parser/mpIOprtBinShortcut.i
+
+# target to preprocess a source file
+parser/mpIOprtBinShortcut.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIOprtBinShortcut.cpp.i
+.PHONY : parser/mpIOprtBinShortcut.cpp.i
+
+parser/mpIOprtBinShortcut.s: parser/mpIOprtBinShortcut.cpp.s
+.PHONY : parser/mpIOprtBinShortcut.s
+
+# target to generate assembly for a file
+parser/mpIOprtBinShortcut.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIOprtBinShortcut.cpp.s
+.PHONY : parser/mpIOprtBinShortcut.cpp.s
+
+parser/mpIPackage.o: parser/mpIPackage.cpp.o
+.PHONY : parser/mpIPackage.o
+
+# target to build an object file
+parser/mpIPackage.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIPackage.cpp.o
+.PHONY : parser/mpIPackage.cpp.o
+
+parser/mpIPackage.i: parser/mpIPackage.cpp.i
+.PHONY : parser/mpIPackage.i
+
+# target to preprocess a source file
+parser/mpIPackage.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIPackage.cpp.i
+.PHONY : parser/mpIPackage.cpp.i
+
+parser/mpIPackage.s: parser/mpIPackage.cpp.s
+.PHONY : parser/mpIPackage.s
+
+# target to generate assembly for a file
+parser/mpIPackage.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIPackage.cpp.s
+.PHONY : parser/mpIPackage.cpp.s
+
+parser/mpIToken.o: parser/mpIToken.cpp.o
+.PHONY : parser/mpIToken.o
+
+# target to build an object file
+parser/mpIToken.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIToken.cpp.o
+.PHONY : parser/mpIToken.cpp.o
+
+parser/mpIToken.i: parser/mpIToken.cpp.i
+.PHONY : parser/mpIToken.i
+
+# target to preprocess a source file
+parser/mpIToken.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIToken.cpp.i
+.PHONY : parser/mpIToken.cpp.i
+
+parser/mpIToken.s: parser/mpIToken.cpp.s
+.PHONY : parser/mpIToken.s
+
+# target to generate assembly for a file
+parser/mpIToken.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIToken.cpp.s
+.PHONY : parser/mpIToken.cpp.s
+
+parser/mpIValReader.o: parser/mpIValReader.cpp.o
+.PHONY : parser/mpIValReader.o
+
+# target to build an object file
+parser/mpIValReader.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIValReader.cpp.o
+.PHONY : parser/mpIValReader.cpp.o
+
+parser/mpIValReader.i: parser/mpIValReader.cpp.i
+.PHONY : parser/mpIValReader.i
+
+# target to preprocess a source file
+parser/mpIValReader.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIValReader.cpp.i
+.PHONY : parser/mpIValReader.cpp.i
+
+parser/mpIValReader.s: parser/mpIValReader.cpp.s
+.PHONY : parser/mpIValReader.s
+
+# target to generate assembly for a file
+parser/mpIValReader.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIValReader.cpp.s
+.PHONY : parser/mpIValReader.cpp.s
+
+parser/mpIValue.o: parser/mpIValue.cpp.o
+.PHONY : parser/mpIValue.o
+
+# target to build an object file
+parser/mpIValue.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIValue.cpp.o
+.PHONY : parser/mpIValue.cpp.o
+
+parser/mpIValue.i: parser/mpIValue.cpp.i
+.PHONY : parser/mpIValue.i
+
+# target to preprocess a source file
+parser/mpIValue.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIValue.cpp.i
+.PHONY : parser/mpIValue.cpp.i
+
+parser/mpIValue.s: parser/mpIValue.cpp.s
+.PHONY : parser/mpIValue.s
+
+# target to generate assembly for a file
+parser/mpIValue.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIValue.cpp.s
+.PHONY : parser/mpIValue.cpp.s
+
+parser/mpIfThenElse.o: parser/mpIfThenElse.cpp.o
+.PHONY : parser/mpIfThenElse.o
+
+# target to build an object file
+parser/mpIfThenElse.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIfThenElse.cpp.o
+.PHONY : parser/mpIfThenElse.cpp.o
+
+parser/mpIfThenElse.i: parser/mpIfThenElse.cpp.i
+.PHONY : parser/mpIfThenElse.i
+
+# target to preprocess a source file
+parser/mpIfThenElse.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIfThenElse.cpp.i
+.PHONY : parser/mpIfThenElse.cpp.i
+
+parser/mpIfThenElse.s: parser/mpIfThenElse.cpp.s
+.PHONY : parser/mpIfThenElse.s
+
+# target to generate assembly for a file
+parser/mpIfThenElse.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpIfThenElse.cpp.s
+.PHONY : parser/mpIfThenElse.cpp.s
+
+parser/mpOprtBinAssign.o: parser/mpOprtBinAssign.cpp.o
+.PHONY : parser/mpOprtBinAssign.o
+
+# target to build an object file
+parser/mpOprtBinAssign.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinAssign.cpp.o
+.PHONY : parser/mpOprtBinAssign.cpp.o
+
+parser/mpOprtBinAssign.i: parser/mpOprtBinAssign.cpp.i
+.PHONY : parser/mpOprtBinAssign.i
+
+# target to preprocess a source file
+parser/mpOprtBinAssign.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinAssign.cpp.i
+.PHONY : parser/mpOprtBinAssign.cpp.i
+
+parser/mpOprtBinAssign.s: parser/mpOprtBinAssign.cpp.s
+.PHONY : parser/mpOprtBinAssign.s
+
+# target to generate assembly for a file
+parser/mpOprtBinAssign.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinAssign.cpp.s
+.PHONY : parser/mpOprtBinAssign.cpp.s
+
+parser/mpOprtBinCommon.o: parser/mpOprtBinCommon.cpp.o
+.PHONY : parser/mpOprtBinCommon.o
+
+# target to build an object file
+parser/mpOprtBinCommon.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinCommon.cpp.o
+.PHONY : parser/mpOprtBinCommon.cpp.o
+
+parser/mpOprtBinCommon.i: parser/mpOprtBinCommon.cpp.i
+.PHONY : parser/mpOprtBinCommon.i
+
+# target to preprocess a source file
+parser/mpOprtBinCommon.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinCommon.cpp.i
+.PHONY : parser/mpOprtBinCommon.cpp.i
+
+parser/mpOprtBinCommon.s: parser/mpOprtBinCommon.cpp.s
+.PHONY : parser/mpOprtBinCommon.s
+
+# target to generate assembly for a file
+parser/mpOprtBinCommon.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinCommon.cpp.s
+.PHONY : parser/mpOprtBinCommon.cpp.s
+
+parser/mpOprtBinShortcut.o: parser/mpOprtBinShortcut.cpp.o
+.PHONY : parser/mpOprtBinShortcut.o
+
+# target to build an object file
+parser/mpOprtBinShortcut.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinShortcut.cpp.o
+.PHONY : parser/mpOprtBinShortcut.cpp.o
+
+parser/mpOprtBinShortcut.i: parser/mpOprtBinShortcut.cpp.i
+.PHONY : parser/mpOprtBinShortcut.i
+
+# target to preprocess a source file
+parser/mpOprtBinShortcut.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinShortcut.cpp.i
+.PHONY : parser/mpOprtBinShortcut.cpp.i
+
+parser/mpOprtBinShortcut.s: parser/mpOprtBinShortcut.cpp.s
+.PHONY : parser/mpOprtBinShortcut.s
+
+# target to generate assembly for a file
+parser/mpOprtBinShortcut.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtBinShortcut.cpp.s
+.PHONY : parser/mpOprtBinShortcut.cpp.s
+
+parser/mpOprtCmplx.o: parser/mpOprtCmplx.cpp.o
+.PHONY : parser/mpOprtCmplx.o
+
+# target to build an object file
+parser/mpOprtCmplx.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtCmplx.cpp.o
+.PHONY : parser/mpOprtCmplx.cpp.o
+
+parser/mpOprtCmplx.i: parser/mpOprtCmplx.cpp.i
+.PHONY : parser/mpOprtCmplx.i
+
+# target to preprocess a source file
+parser/mpOprtCmplx.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtCmplx.cpp.i
+.PHONY : parser/mpOprtCmplx.cpp.i
+
+parser/mpOprtCmplx.s: parser/mpOprtCmplx.cpp.s
+.PHONY : parser/mpOprtCmplx.s
+
+# target to generate assembly for a file
+parser/mpOprtCmplx.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtCmplx.cpp.s
+.PHONY : parser/mpOprtCmplx.cpp.s
+
+parser/mpOprtIndex.o: parser/mpOprtIndex.cpp.o
+.PHONY : parser/mpOprtIndex.o
+
+# target to build an object file
+parser/mpOprtIndex.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtIndex.cpp.o
+.PHONY : parser/mpOprtIndex.cpp.o
+
+parser/mpOprtIndex.i: parser/mpOprtIndex.cpp.i
+.PHONY : parser/mpOprtIndex.i
+
+# target to preprocess a source file
+parser/mpOprtIndex.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtIndex.cpp.i
+.PHONY : parser/mpOprtIndex.cpp.i
+
+parser/mpOprtIndex.s: parser/mpOprtIndex.cpp.s
+.PHONY : parser/mpOprtIndex.s
+
+# target to generate assembly for a file
+parser/mpOprtIndex.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtIndex.cpp.s
+.PHONY : parser/mpOprtIndex.cpp.s
+
+parser/mpOprtMatrix.o: parser/mpOprtMatrix.cpp.o
+.PHONY : parser/mpOprtMatrix.o
+
+# target to build an object file
+parser/mpOprtMatrix.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtMatrix.cpp.o
+.PHONY : parser/mpOprtMatrix.cpp.o
+
+parser/mpOprtMatrix.i: parser/mpOprtMatrix.cpp.i
+.PHONY : parser/mpOprtMatrix.i
+
+# target to preprocess a source file
+parser/mpOprtMatrix.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtMatrix.cpp.i
+.PHONY : parser/mpOprtMatrix.cpp.i
+
+parser/mpOprtMatrix.s: parser/mpOprtMatrix.cpp.s
+.PHONY : parser/mpOprtMatrix.s
+
+# target to generate assembly for a file
+parser/mpOprtMatrix.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtMatrix.cpp.s
+.PHONY : parser/mpOprtMatrix.cpp.s
+
+parser/mpOprtNonCmplx.o: parser/mpOprtNonCmplx.cpp.o
+.PHONY : parser/mpOprtNonCmplx.o
+
+# target to build an object file
+parser/mpOprtNonCmplx.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtNonCmplx.cpp.o
+.PHONY : parser/mpOprtNonCmplx.cpp.o
+
+parser/mpOprtNonCmplx.i: parser/mpOprtNonCmplx.cpp.i
+.PHONY : parser/mpOprtNonCmplx.i
+
+# target to preprocess a source file
+parser/mpOprtNonCmplx.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtNonCmplx.cpp.i
+.PHONY : parser/mpOprtNonCmplx.cpp.i
+
+parser/mpOprtNonCmplx.s: parser/mpOprtNonCmplx.cpp.s
+.PHONY : parser/mpOprtNonCmplx.s
+
+# target to generate assembly for a file
+parser/mpOprtNonCmplx.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtNonCmplx.cpp.s
+.PHONY : parser/mpOprtNonCmplx.cpp.s
+
+parser/mpOprtPostfixCommon.o: parser/mpOprtPostfixCommon.cpp.o
+.PHONY : parser/mpOprtPostfixCommon.o
+
+# target to build an object file
+parser/mpOprtPostfixCommon.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtPostfixCommon.cpp.o
+.PHONY : parser/mpOprtPostfixCommon.cpp.o
+
+parser/mpOprtPostfixCommon.i: parser/mpOprtPostfixCommon.cpp.i
+.PHONY : parser/mpOprtPostfixCommon.i
+
+# target to preprocess a source file
+parser/mpOprtPostfixCommon.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtPostfixCommon.cpp.i
+.PHONY : parser/mpOprtPostfixCommon.cpp.i
+
+parser/mpOprtPostfixCommon.s: parser/mpOprtPostfixCommon.cpp.s
+.PHONY : parser/mpOprtPostfixCommon.s
+
+# target to generate assembly for a file
+parser/mpOprtPostfixCommon.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpOprtPostfixCommon.cpp.s
+.PHONY : parser/mpOprtPostfixCommon.cpp.s
+
+parser/mpPackageCmplx.o: parser/mpPackageCmplx.cpp.o
+.PHONY : parser/mpPackageCmplx.o
+
+# target to build an object file
+parser/mpPackageCmplx.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageCmplx.cpp.o
+.PHONY : parser/mpPackageCmplx.cpp.o
+
+parser/mpPackageCmplx.i: parser/mpPackageCmplx.cpp.i
+.PHONY : parser/mpPackageCmplx.i
+
+# target to preprocess a source file
+parser/mpPackageCmplx.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageCmplx.cpp.i
+.PHONY : parser/mpPackageCmplx.cpp.i
+
+parser/mpPackageCmplx.s: parser/mpPackageCmplx.cpp.s
+.PHONY : parser/mpPackageCmplx.s
+
+# target to generate assembly for a file
+parser/mpPackageCmplx.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageCmplx.cpp.s
+.PHONY : parser/mpPackageCmplx.cpp.s
+
+parser/mpPackageCommon.o: parser/mpPackageCommon.cpp.o
+.PHONY : parser/mpPackageCommon.o
+
+# target to build an object file
+parser/mpPackageCommon.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageCommon.cpp.o
+.PHONY : parser/mpPackageCommon.cpp.o
+
+parser/mpPackageCommon.i: parser/mpPackageCommon.cpp.i
+.PHONY : parser/mpPackageCommon.i
+
+# target to preprocess a source file
+parser/mpPackageCommon.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageCommon.cpp.i
+.PHONY : parser/mpPackageCommon.cpp.i
+
+parser/mpPackageCommon.s: parser/mpPackageCommon.cpp.s
+.PHONY : parser/mpPackageCommon.s
+
+# target to generate assembly for a file
+parser/mpPackageCommon.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageCommon.cpp.s
+.PHONY : parser/mpPackageCommon.cpp.s
+
+parser/mpPackageMatrix.o: parser/mpPackageMatrix.cpp.o
+.PHONY : parser/mpPackageMatrix.o
+
+# target to build an object file
+parser/mpPackageMatrix.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageMatrix.cpp.o
+.PHONY : parser/mpPackageMatrix.cpp.o
+
+parser/mpPackageMatrix.i: parser/mpPackageMatrix.cpp.i
+.PHONY : parser/mpPackageMatrix.i
+
+# target to preprocess a source file
+parser/mpPackageMatrix.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageMatrix.cpp.i
+.PHONY : parser/mpPackageMatrix.cpp.i
+
+parser/mpPackageMatrix.s: parser/mpPackageMatrix.cpp.s
+.PHONY : parser/mpPackageMatrix.s
+
+# target to generate assembly for a file
+parser/mpPackageMatrix.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageMatrix.cpp.s
+.PHONY : parser/mpPackageMatrix.cpp.s
+
+parser/mpPackageNonCmplx.o: parser/mpPackageNonCmplx.cpp.o
+.PHONY : parser/mpPackageNonCmplx.o
+
+# target to build an object file
+parser/mpPackageNonCmplx.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageNonCmplx.cpp.o
+.PHONY : parser/mpPackageNonCmplx.cpp.o
+
+parser/mpPackageNonCmplx.i: parser/mpPackageNonCmplx.cpp.i
+.PHONY : parser/mpPackageNonCmplx.i
+
+# target to preprocess a source file
+parser/mpPackageNonCmplx.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageNonCmplx.cpp.i
+.PHONY : parser/mpPackageNonCmplx.cpp.i
+
+parser/mpPackageNonCmplx.s: parser/mpPackageNonCmplx.cpp.s
+.PHONY : parser/mpPackageNonCmplx.s
+
+# target to generate assembly for a file
+parser/mpPackageNonCmplx.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageNonCmplx.cpp.s
+.PHONY : parser/mpPackageNonCmplx.cpp.s
+
+parser/mpPackageStr.o: parser/mpPackageStr.cpp.o
+.PHONY : parser/mpPackageStr.o
+
+# target to build an object file
+parser/mpPackageStr.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageStr.cpp.o
+.PHONY : parser/mpPackageStr.cpp.o
+
+parser/mpPackageStr.i: parser/mpPackageStr.cpp.i
+.PHONY : parser/mpPackageStr.i
+
+# target to preprocess a source file
+parser/mpPackageStr.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageStr.cpp.i
+.PHONY : parser/mpPackageStr.cpp.i
+
+parser/mpPackageStr.s: parser/mpPackageStr.cpp.s
+.PHONY : parser/mpPackageStr.s
+
+# target to generate assembly for a file
+parser/mpPackageStr.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageStr.cpp.s
+.PHONY : parser/mpPackageStr.cpp.s
+
+parser/mpPackageUnit.o: parser/mpPackageUnit.cpp.o
+.PHONY : parser/mpPackageUnit.o
+
+# target to build an object file
+parser/mpPackageUnit.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageUnit.cpp.o
+.PHONY : parser/mpPackageUnit.cpp.o
+
+parser/mpPackageUnit.i: parser/mpPackageUnit.cpp.i
+.PHONY : parser/mpPackageUnit.i
+
+# target to preprocess a source file
+parser/mpPackageUnit.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageUnit.cpp.i
+.PHONY : parser/mpPackageUnit.cpp.i
+
+parser/mpPackageUnit.s: parser/mpPackageUnit.cpp.s
+.PHONY : parser/mpPackageUnit.s
+
+# target to generate assembly for a file
+parser/mpPackageUnit.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpPackageUnit.cpp.s
+.PHONY : parser/mpPackageUnit.cpp.s
+
+parser/mpParser.o: parser/mpParser.cpp.o
+.PHONY : parser/mpParser.o
+
+# target to build an object file
+parser/mpParser.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParser.cpp.o
+.PHONY : parser/mpParser.cpp.o
+
+parser/mpParser.i: parser/mpParser.cpp.i
+.PHONY : parser/mpParser.i
+
+# target to preprocess a source file
+parser/mpParser.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParser.cpp.i
+.PHONY : parser/mpParser.cpp.i
+
+parser/mpParser.s: parser/mpParser.cpp.s
+.PHONY : parser/mpParser.s
+
+# target to generate assembly for a file
+parser/mpParser.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParser.cpp.s
+.PHONY : parser/mpParser.cpp.s
+
+parser/mpParserBase.o: parser/mpParserBase.cpp.o
+.PHONY : parser/mpParserBase.o
+
+# target to build an object file
+parser/mpParserBase.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParserBase.cpp.o
+.PHONY : parser/mpParserBase.cpp.o
+
+parser/mpParserBase.i: parser/mpParserBase.cpp.i
+.PHONY : parser/mpParserBase.i
+
+# target to preprocess a source file
+parser/mpParserBase.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParserBase.cpp.i
+.PHONY : parser/mpParserBase.cpp.i
+
+parser/mpParserBase.s: parser/mpParserBase.cpp.s
+.PHONY : parser/mpParserBase.s
+
+# target to generate assembly for a file
+parser/mpParserBase.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParserBase.cpp.s
+.PHONY : parser/mpParserBase.cpp.s
+
+parser/mpParserMessageProvider.o: parser/mpParserMessageProvider.cpp.o
+.PHONY : parser/mpParserMessageProvider.o
+
+# target to build an object file
+parser/mpParserMessageProvider.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParserMessageProvider.cpp.o
+.PHONY : parser/mpParserMessageProvider.cpp.o
+
+parser/mpParserMessageProvider.i: parser/mpParserMessageProvider.cpp.i
+.PHONY : parser/mpParserMessageProvider.i
+
+# target to preprocess a source file
+parser/mpParserMessageProvider.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParserMessageProvider.cpp.i
+.PHONY : parser/mpParserMessageProvider.cpp.i
+
+parser/mpParserMessageProvider.s: parser/mpParserMessageProvider.cpp.s
+.PHONY : parser/mpParserMessageProvider.s
+
+# target to generate assembly for a file
+parser/mpParserMessageProvider.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpParserMessageProvider.cpp.s
+.PHONY : parser/mpParserMessageProvider.cpp.s
+
+parser/mpRPN.o: parser/mpRPN.cpp.o
+.PHONY : parser/mpRPN.o
+
+# target to build an object file
+parser/mpRPN.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpRPN.cpp.o
+.PHONY : parser/mpRPN.cpp.o
+
+parser/mpRPN.i: parser/mpRPN.cpp.i
+.PHONY : parser/mpRPN.i
+
+# target to preprocess a source file
+parser/mpRPN.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpRPN.cpp.i
+.PHONY : parser/mpRPN.cpp.i
+
+parser/mpRPN.s: parser/mpRPN.cpp.s
+.PHONY : parser/mpRPN.s
+
+# target to generate assembly for a file
+parser/mpRPN.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpRPN.cpp.s
+.PHONY : parser/mpRPN.cpp.s
+
+parser/mpScriptTokens.o: parser/mpScriptTokens.cpp.o
+.PHONY : parser/mpScriptTokens.o
+
+# target to build an object file
+parser/mpScriptTokens.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpScriptTokens.cpp.o
+.PHONY : parser/mpScriptTokens.cpp.o
+
+parser/mpScriptTokens.i: parser/mpScriptTokens.cpp.i
+.PHONY : parser/mpScriptTokens.i
+
+# target to preprocess a source file
+parser/mpScriptTokens.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpScriptTokens.cpp.i
+.PHONY : parser/mpScriptTokens.cpp.i
+
+parser/mpScriptTokens.s: parser/mpScriptTokens.cpp.s
+.PHONY : parser/mpScriptTokens.s
+
+# target to generate assembly for a file
+parser/mpScriptTokens.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpScriptTokens.cpp.s
+.PHONY : parser/mpScriptTokens.cpp.s
+
+parser/mpTest.o: parser/mpTest.cpp.o
+.PHONY : parser/mpTest.o
+
+# target to build an object file
+parser/mpTest.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpTest.cpp.o
+.PHONY : parser/mpTest.cpp.o
+
+parser/mpTest.i: parser/mpTest.cpp.i
+.PHONY : parser/mpTest.i
+
+# target to preprocess a source file
+parser/mpTest.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpTest.cpp.i
+.PHONY : parser/mpTest.cpp.i
+
+parser/mpTest.s: parser/mpTest.cpp.s
+.PHONY : parser/mpTest.s
+
+# target to generate assembly for a file
+parser/mpTest.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpTest.cpp.s
+.PHONY : parser/mpTest.cpp.s
+
+parser/mpTokenReader.o: parser/mpTokenReader.cpp.o
+.PHONY : parser/mpTokenReader.o
+
+# target to build an object file
+parser/mpTokenReader.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpTokenReader.cpp.o
+.PHONY : parser/mpTokenReader.cpp.o
+
+parser/mpTokenReader.i: parser/mpTokenReader.cpp.i
+.PHONY : parser/mpTokenReader.i
+
+# target to preprocess a source file
+parser/mpTokenReader.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpTokenReader.cpp.i
+.PHONY : parser/mpTokenReader.cpp.i
+
+parser/mpTokenReader.s: parser/mpTokenReader.cpp.s
+.PHONY : parser/mpTokenReader.s
+
+# target to generate assembly for a file
+parser/mpTokenReader.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpTokenReader.cpp.s
+.PHONY : parser/mpTokenReader.cpp.s
+
+parser/mpValReader.o: parser/mpValReader.cpp.o
+.PHONY : parser/mpValReader.o
+
+# target to build an object file
+parser/mpValReader.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValReader.cpp.o
+.PHONY : parser/mpValReader.cpp.o
+
+parser/mpValReader.i: parser/mpValReader.cpp.i
+.PHONY : parser/mpValReader.i
+
+# target to preprocess a source file
+parser/mpValReader.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValReader.cpp.i
+.PHONY : parser/mpValReader.cpp.i
+
+parser/mpValReader.s: parser/mpValReader.cpp.s
+.PHONY : parser/mpValReader.s
+
+# target to generate assembly for a file
+parser/mpValReader.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValReader.cpp.s
+.PHONY : parser/mpValReader.cpp.s
+
+parser/mpValue.o: parser/mpValue.cpp.o
+.PHONY : parser/mpValue.o
+
+# target to build an object file
+parser/mpValue.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValue.cpp.o
+.PHONY : parser/mpValue.cpp.o
+
+parser/mpValue.i: parser/mpValue.cpp.i
+.PHONY : parser/mpValue.i
+
+# target to preprocess a source file
+parser/mpValue.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValue.cpp.i
+.PHONY : parser/mpValue.cpp.i
+
+parser/mpValue.s: parser/mpValue.cpp.s
+.PHONY : parser/mpValue.s
+
+# target to generate assembly for a file
+parser/mpValue.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValue.cpp.s
+.PHONY : parser/mpValue.cpp.s
+
+parser/mpValueCache.o: parser/mpValueCache.cpp.o
+.PHONY : parser/mpValueCache.o
+
+# target to build an object file
+parser/mpValueCache.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValueCache.cpp.o
+.PHONY : parser/mpValueCache.cpp.o
+
+parser/mpValueCache.i: parser/mpValueCache.cpp.i
+.PHONY : parser/mpValueCache.i
+
+# target to preprocess a source file
+parser/mpValueCache.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValueCache.cpp.i
+.PHONY : parser/mpValueCache.cpp.i
+
+parser/mpValueCache.s: parser/mpValueCache.cpp.s
+.PHONY : parser/mpValueCache.s
+
+# target to generate assembly for a file
+parser/mpValueCache.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpValueCache.cpp.s
+.PHONY : parser/mpValueCache.cpp.s
+
+parser/mpVariable.o: parser/mpVariable.cpp.o
+.PHONY : parser/mpVariable.o
+
+# target to build an object file
+parser/mpVariable.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpVariable.cpp.o
+.PHONY : parser/mpVariable.cpp.o
+
+parser/mpVariable.i: parser/mpVariable.cpp.i
+.PHONY : parser/mpVariable.i
+
+# target to preprocess a source file
+parser/mpVariable.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpVariable.cpp.i
+.PHONY : parser/mpVariable.cpp.i
+
+parser/mpVariable.s: parser/mpVariable.cpp.s
+.PHONY : parser/mpVariable.s
+
+# target to generate assembly for a file
+parser/mpVariable.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/muparserx.dir/build.make CMakeFiles/muparserx.dir/parser/mpVariable.cpp.s
+.PHONY : parser/mpVariable.cpp.s
+
+sample/example.o: sample/example.cpp.o
+.PHONY : sample/example.o
+
+# target to build an object file
+sample/example.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/sample/example.cpp.o
+.PHONY : sample/example.cpp.o
+
+sample/example.i: sample/example.cpp.i
+.PHONY : sample/example.i
+
+# target to preprocess a source file
+sample/example.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/sample/example.cpp.i
+.PHONY : sample/example.cpp.i
+
+sample/example.s: sample/example.cpp.s
+.PHONY : sample/example.s
+
+# target to generate assembly for a file
+sample/example.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/sample/example.cpp.s
+.PHONY : sample/example.cpp.s
+
+sample/timer.o: sample/timer.cpp.o
+.PHONY : sample/timer.o
+
+# target to build an object file
+sample/timer.cpp.o:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/sample/timer.cpp.o
+.PHONY : sample/timer.cpp.o
+
+sample/timer.i: sample/timer.cpp.i
+.PHONY : sample/timer.i
+
+# target to preprocess a source file
+sample/timer.cpp.i:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/sample/timer.cpp.i
+.PHONY : sample/timer.cpp.i
+
+sample/timer.s: sample/timer.cpp.s
+.PHONY : sample/timer.s
+
+# target to generate assembly for a file
+sample/timer.cpp.s:
+	$(MAKE) $(MAKESILENT) -f CMakeFiles/example.dir/build.make CMakeFiles/example.dir/sample/timer.cpp.s
+.PHONY : sample/timer.cpp.s
+
+# Help Target
+help:
+	@echo "The following are some of the valid targets for this Makefile:"
+	@echo "... all (the default if no target is provided)"
+	@echo "... clean"
+	@echo "... depend"
+	@echo "... edit_cache"
+	@echo "... install"
+	@echo "... install/local"
+	@echo "... install/strip"
+	@echo "... list_install_components"
+	@echo "... rebuild_cache"
+	@echo "... example"
+	@echo "... muparserx"
+	@echo "... parser/mpError.o"
+	@echo "... parser/mpError.i"
+	@echo "... parser/mpError.s"
+	@echo "... parser/mpFuncCmplx.o"
+	@echo "... parser/mpFuncCmplx.i"
+	@echo "... parser/mpFuncCmplx.s"
+	@echo "... parser/mpFuncCommon.o"
+	@echo "... parser/mpFuncCommon.i"
+	@echo "... parser/mpFuncCommon.s"
+	@echo "... parser/mpFuncMatrix.o"
+	@echo "... parser/mpFuncMatrix.i"
+	@echo "... parser/mpFuncMatrix.s"
+	@echo "... parser/mpFuncNonCmplx.o"
+	@echo "... parser/mpFuncNonCmplx.i"
+	@echo "... parser/mpFuncNonCmplx.s"
+	@echo "... parser/mpFuncStr.o"
+	@echo "... parser/mpFuncStr.i"
+	@echo "... parser/mpFuncStr.s"
+	@echo "... parser/mpICallback.o"
+	@echo "... parser/mpICallback.i"
+	@echo "... parser/mpICallback.s"
+	@echo "... parser/mpIOprt.o"
+	@echo "... parser/mpIOprt.i"
+	@echo "... parser/mpIOprt.s"
+	@echo "... parser/mpIOprtBinShortcut.o"
+	@echo "... parser/mpIOprtBinShortcut.i"
+	@echo "... parser/mpIOprtBinShortcut.s"
+	@echo "... parser/mpIPackage.o"
+	@echo "... parser/mpIPackage.i"
+	@echo "... parser/mpIPackage.s"
+	@echo "... parser/mpIToken.o"
+	@echo "... parser/mpIToken.i"
+	@echo "... parser/mpIToken.s"
+	@echo "... parser/mpIValReader.o"
+	@echo "... parser/mpIValReader.i"
+	@echo "... parser/mpIValReader.s"
+	@echo "... parser/mpIValue.o"
+	@echo "... parser/mpIValue.i"
+	@echo "... parser/mpIValue.s"
+	@echo "... parser/mpIfThenElse.o"
+	@echo "... parser/mpIfThenElse.i"
+	@echo "... parser/mpIfThenElse.s"
+	@echo "... parser/mpOprtBinAssign.o"
+	@echo "... parser/mpOprtBinAssign.i"
+	@echo "... parser/mpOprtBinAssign.s"
+	@echo "... parser/mpOprtBinCommon.o"
+	@echo "... parser/mpOprtBinCommon.i"
+	@echo "... parser/mpOprtBinCommon.s"
+	@echo "... parser/mpOprtBinShortcut.o"
+	@echo "... parser/mpOprtBinShortcut.i"
+	@echo "... parser/mpOprtBinShortcut.s"
+	@echo "... parser/mpOprtCmplx.o"
+	@echo "... parser/mpOprtCmplx.i"
+	@echo "... parser/mpOprtCmplx.s"
+	@echo "... parser/mpOprtIndex.o"
+	@echo "... parser/mpOprtIndex.i"
+	@echo "... parser/mpOprtIndex.s"
+	@echo "... parser/mpOprtMatrix.o"
+	@echo "... parser/mpOprtMatrix.i"
+	@echo "... parser/mpOprtMatrix.s"
+	@echo "... parser/mpOprtNonCmplx.o"
+	@echo "... parser/mpOprtNonCmplx.i"
+	@echo "... parser/mpOprtNonCmplx.s"
+	@echo "... parser/mpOprtPostfixCommon.o"
+	@echo "... parser/mpOprtPostfixCommon.i"
+	@echo "... parser/mpOprtPostfixCommon.s"
+	@echo "... parser/mpPackageCmplx.o"
+	@echo "... parser/mpPackageCmplx.i"
+	@echo "... parser/mpPackageCmplx.s"
+	@echo "... parser/mpPackageCommon.o"
+	@echo "... parser/mpPackageCommon.i"
+	@echo "... parser/mpPackageCommon.s"
+	@echo "... parser/mpPackageMatrix.o"
+	@echo "... parser/mpPackageMatrix.i"
+	@echo "... parser/mpPackageMatrix.s"
+	@echo "... parser/mpPackageNonCmplx.o"
+	@echo "... parser/mpPackageNonCmplx.i"
+	@echo "... parser/mpPackageNonCmplx.s"
+	@echo "... parser/mpPackageStr.o"
+	@echo "... parser/mpPackageStr.i"
+	@echo "... parser/mpPackageStr.s"
+	@echo "... parser/mpPackageUnit.o"
+	@echo "... parser/mpPackageUnit.i"
+	@echo "... parser/mpPackageUnit.s"
+	@echo "... parser/mpParser.o"
+	@echo "... parser/mpParser.i"
+	@echo "... parser/mpParser.s"
+	@echo "... parser/mpParserBase.o"
+	@echo "... parser/mpParserBase.i"
+	@echo "... parser/mpParserBase.s"
+	@echo "... parser/mpParserMessageProvider.o"
+	@echo "... parser/mpParserMessageProvider.i"
+	@echo "... parser/mpParserMessageProvider.s"
+	@echo "... parser/mpRPN.o"
+	@echo "... parser/mpRPN.i"
+	@echo "... parser/mpRPN.s"
+	@echo "... parser/mpScriptTokens.o"
+	@echo "... parser/mpScriptTokens.i"
+	@echo "... parser/mpScriptTokens.s"
+	@echo "... parser/mpTest.o"
+	@echo "... parser/mpTest.i"
+	@echo "... parser/mpTest.s"
+	@echo "... parser/mpTokenReader.o"
+	@echo "... parser/mpTokenReader.i"
+	@echo "... parser/mpTokenReader.s"
+	@echo "... parser/mpValReader.o"
+	@echo "... parser/mpValReader.i"
+	@echo "... parser/mpValReader.s"
+	@echo "... parser/mpValue.o"
+	@echo "... parser/mpValue.i"
+	@echo "... parser/mpValue.s"
+	@echo "... parser/mpValueCache.o"
+	@echo "... parser/mpValueCache.i"
+	@echo "... parser/mpValueCache.s"
+	@echo "... parser/mpVariable.o"
+	@echo "... parser/mpVariable.i"
+	@echo "... parser/mpVariable.s"
+	@echo "... sample/example.o"
+	@echo "... sample/example.i"
+	@echo "... sample/example.s"
+	@echo "... sample/timer.o"
+	@echo "... sample/timer.i"
+	@echo "... sample/timer.s"
+.PHONY : help
+
+
+
+#=============================================================================
+# Special targets to cleanup operation of make.
+
+# Special rule to run CMake to check the build system integrity.
+# No rule that depends on this can have commands that come from listfiles
+# because they might be regenerated.
+cmake_check_build_system:
+	$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
+.PHONY : cmake_check_build_system
+
diff --git a/Readme.md b/Readme.md
index 686cb29..4ad8af0 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,24 +1,33 @@
-![titleimage](http://beltoforion.de/en/muparserx/images/muparserx.jpg)
+![_title](https://user-images.githubusercontent.com/2202567/196066131-a421b3c0-20e0-46e7-88ee-15ae29b215cd.jpg)
 
 [![GitHub issues](https://img.shields.io/github/issues/beltoforion/muparserx.svg?maxAge=360)](https://github.com/beltoforion/muparserx/issues)
 [![Version](https://img.shields.io/github/release/beltoforion/muparserx.svg?maxAge=360)](https://github.com/beltoforion/muparserx/blob/master/CHANGELOG)
 [![Packaging status](https://repology.org/badge/tiny-repos/muparserx.svg)](https://repology.org/project/muparserx/versions)
 <!-- [![License](https://img.shields.io/github/license/beltoforion/muparserx.svg?maxAge=360000)](https://github.com/beltoforion/muparserx/blob/master/License.md) -->
 
-muparserx 4.0.11
+muparserx
 ===========================
 
-The evaluation of a mathematical expression is a standard task required in many applications. It can be solved by either using a standard math expression parser such as muparser or by embedding a scripting language such as Lua. There are however some limitations: Although muparser is pretty fast it will only work with scalar values and although Lua is very flexible it does neither support binary operators for arrays nor complex numbers. So if you need a math expression parser with support for arrays, matrices and strings muparserx may be able to help you.
-
-For details please consult the [muparserx documentation](https://beltoforion.de/en/muparserx)
+V4.0.12 (20230304)
+------------------
+Bugfixes:
+  - Issue 116: Changed implementation of parsing double values to fix #116 on Mac.
+  - Issue 115: String constants starting woth "or" confused with operator during parsing step
+  - Issue 117: Equals operator behavior inconsistent when checking boolean values. (no type check) 
+  
+Changes:
+  - C++17 is now the minimum required C++ version to compile the code
+  - added a wide string option to cmake (USE_WIDE_STRING)
+  - removed compatibility fixes for older compilers (mostly MSVC)
+  - fixed compiler warnings 
 
 V4.0.11 (20211123)
------------------
+------------------
 Bugfixes:
-  - Issue 112:  COmpilation issue due to an invalid header file name
+  - Issue 112:  Compilation issue due to an invalid header file name
  
 V4.0.10 (20211122)
------------------
+------------------
 Bugfixes:
   - Issue 107:  Complex multiplication-assignment did not work correctly
   - Issue 110:  Short evaluation for binary operators added (thanks to user egyptyu)
diff --git a/cmake_install.cmake b/cmake_install.cmake
new file mode 100644
index 0000000..a6d9cb1
--- /dev/null
+++ b/cmake_install.cmake
@@ -0,0 +1,123 @@
+# Install script for directory: /home/user/Dokumente/GitHub/muparserx
+
+# Set the install prefix
+if(NOT DEFINED CMAKE_INSTALL_PREFIX)
+  set(CMAKE_INSTALL_PREFIX "/usr/local")
+endif()
+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
+
+# Set the install configuration name.
+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
+  if(BUILD_TYPE)
+    string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
+           CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
+  else()
+    set(CMAKE_INSTALL_CONFIG_NAME "")
+  endif()
+  message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
+endif()
+
+# Set the component getting installed.
+if(NOT CMAKE_INSTALL_COMPONENT)
+  if(COMPONENT)
+    message(STATUS "Install component: \"${COMPONENT}\"")
+    set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
+  else()
+    set(CMAKE_INSTALL_COMPONENT)
+  endif()
+endif()
+
+# Install shared libraries without execute permission?
+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
+  set(CMAKE_INSTALL_SO_NO_EXE "1")
+endif()
+
+# Is this installation the result of a crosscompile?
+if(NOT DEFINED CMAKE_CROSSCOMPILING)
+  set(CMAKE_CROSSCOMPILING "FALSE")
+endif()
+
+# Set default install directory permissions.
+if(NOT DEFINED CMAKE_OBJDUMP)
+  set(CMAKE_OBJDUMP "/usr/bin/objdump")
+endif()
+
+if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
+  file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/user/Dokumente/GitHub/muparserx/libmuparserx.a")
+endif()
+
+if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
+  file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig" TYPE FILE FILES "/home/user/Dokumente/GitHub/muparserx/muparserx.pc")
+endif()
+
+if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
+  file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/share/cmake/muparserx" TYPE FILE FILES
+    "/home/user/Dokumente/GitHub/muparserx/cmake/muparserxConfig.cmake"
+    "/home/user/Dokumente/GitHub/muparserx/muparserxConfigVersion.cmake"
+    )
+endif()
+
+if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT)
+  file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include/muparserx" TYPE FILE FILES
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpDefines.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpError.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpFuncCmplx.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpFuncCommon.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpFuncMatrix.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpFuncNonCmplx.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpFuncStr.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpFwdDecl.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpICallback.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIOprt.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIOprtBinShortcut.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIPackage.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIPrecedence.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIToken.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIValReader.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIValue.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpIfThenElse.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpMatrix.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpMatrixError.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtBinAssign.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtBinCommon.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtBinShortcut.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtCmplx.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtIndex.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtMatrix.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtNonCmplx.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpOprtPostfixCommon.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpPackageCmplx.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpPackageCommon.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpPackageMatrix.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpPackageNonCmplx.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpPackageStr.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpPackageUnit.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpParser.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpParserBase.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpParserMessageProvider.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpRPN.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpScriptTokens.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpStack.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpTest.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpTokenReader.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpTypes.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpValReader.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpValue.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpValueCache.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/mpVariable.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/suSortPred.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/suStringTokens.h"
+    "/home/user/Dokumente/GitHub/muparserx/parser/utGeneric.h"
+    )
+endif()
+
+if(CMAKE_INSTALL_COMPONENT)
+  set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
+else()
+  set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
+endif()
+
+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
+       "${CMAKE_INSTALL_MANIFEST_FILES}")
+file(WRITE "/home/user/Dokumente/GitHub/muparserx/${CMAKE_INSTALL_MANIFEST}"
+     "${CMAKE_INSTALL_MANIFEST_CONTENT}")
diff --git a/debian/changelog b/debian/changelog
index 14d1a58..cafb94c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+muparserx (4.0.12-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 09 Jun 2023 14:48:23 -0000
+
 muparserx (4.0.11-2) unstable; urgency=medium
 
   * Upload to unstable
diff --git a/muparserx.pc b/muparserx.pc
new file mode 100644
index 0000000..c58eb7b
--- /dev/null
+++ b/muparserx.pc
@@ -0,0 +1,15 @@
+prefix=/usr/local
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include/muparserx
+
+Name: muparserx
+Description: A mathematical expression parser library.
+URL: http://articles.beltoforion.de/article.php?a=muparserx
+Version: 4.0.12
+Requires:
+Requires.private:
+Conflicts:
+Cflags: -I${includedir}
+Libs: -L${libdir} -lmuparserx
+Libs.private:
diff --git a/muparserxConfigVersion.cmake b/muparserxConfigVersion.cmake
new file mode 100644
index 0000000..90ce1c4
--- /dev/null
+++ b/muparserxConfigVersion.cmake
@@ -0,0 +1,12 @@
+set(PACKAGE_FIND_NAME "muparserx")
+set(PACKAGE_VERSION "4.0.12")
+
+# Check whether the requested PACKAGE_FIND_VERSION is compatible
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  set(PACKAGE_VERSION_COMPATIBLE TRUE)
+  if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
+    set(PACKAGE_VERSION_EXACT TRUE)
+  endif()
+endif()
diff --git a/parser/mpCompat.h b/parser/mpCompat.h
deleted file mode 100644
index 4767005..0000000
--- a/parser/mpCompat.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-               __________                                 ____  ___
-    _____  __ _\______   \_____ _______  ______ __________\   \/  /
-   /     \|  |  \     ___/\__  \\_  __ \/  ___// __ \_  __ \     / 
-  |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \ 
-  |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
-        \/                     \/           \/     \/           \_/
-                                       Copyright (C) 2016 Ingo Berg
-                                       All rights reserved.
-
-  Redistribution and use in source and binary forms, with or without 
-  modification, are permitted provided that the following conditions are met:
-
-   * Redistributions of source code must retain the above copyright notice, 
-     this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above copyright notice, 
-     this list of conditions and the following disclaimer in the documentation 
-     and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
-  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
-  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
-  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-  POSSIBILITY OF SUCH DAMAGE.
-*/
-#ifndef MUP_COMPAT_H
-#define MUP_COMPAT_H
-
-// This file contains code to maintain backwards compatibility with older compilers.
-// Note:    This does not work on windows since the lazy bums at microsoft are unable to assign a macro value properly and
-//          don't give a shit in general:
-//
-//          https ://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l
-//
-//          I'll hereby officially announce that i also stopped giving a shit whether this library runs on anything older then VS2013. This
-//          is not a bug, please refrein from reporting it. Seriousely, report it to Microsoft.
-#if !defined(_MSC_VER) && __cplusplus <= 199711L
-  // Warning: If you activate this in a project on windows all hell will break loose and Satan himself will come out of hell to eat 
-  //          your soul whilst reciting verses from the Microsoft MFC programming manual.
-  #define override
-  #define unique_ptr auto_ptr
-  #define nullptr NULL
-#endif
-
-#endif
-
diff --git a/parser/mpDefines.h b/parser/mpDefines.h
index 77bbf77..42e2fb5 100644
--- a/parser/mpDefines.h
+++ b/parser/mpDefines.h
@@ -11,7 +11,7 @@
   |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \ 
   |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
         \/                     \/           \/     \/           \_/
-  Copyright (C) 2021 Ingo Berg, et. al.
+  Copyright (C) 2023 Ingo Berg, et. al.
   All rights reserved.
 
   Redistribution and use in source and binary forms, with or without 
@@ -37,7 +37,7 @@
 */
 #include <cassert>
 
-#if defined(_UNICODE)
+#if defined(MUP_USE_WIDE_STRING)
   #if !defined(_T)
     #define _T(x) L##x
   #endif // not defined _T
@@ -56,7 +56,7 @@
 #endif
 
 /** \brief A macro containing the version of muParserX. */
-#define MUP_PARSER_VERSION _T("4.0.11 (2021-11-23)")
+#define MUP_PARSER_VERSION _T("4.0.12 (2023-03-04)")
 
 /** \brief A macro for setting the parser namespace. */
 #define MUP_NAMESPACE_START namespace mup {
diff --git a/parser/mpFuncMatrix.cpp b/parser/mpFuncMatrix.cpp
index 995e680..2bd7caf 100644
--- a/parser/mpFuncMatrix.cpp
+++ b/parser/mpFuncMatrix.cpp
@@ -84,7 +84,7 @@ void FunMatrixOnes::Eval(ptr_val_type &ret, const ptr_val_type *a_pArg, int argc
     }
     else
     {
-        *ret = matrix_type(m, n, 1.0);
+        *ret = matrix_type((int)m, (int)n, 1.0);
     }
 }
 
@@ -135,7 +135,7 @@ void FunMatrixZeros::Eval(ptr_val_type &ret, const ptr_val_type *a_pArg, int arg
     }
     else
     {
-        *ret = matrix_type(m, n, 0.0);
+        *ret = matrix_type((int)m, (int)n, 0.0);
     }
 }
 
@@ -177,10 +177,10 @@ void FunMatrixEye::Eval(ptr_val_type &ret, const ptr_val_type *a_pArg, int argc)
         throw ParserError(err);
     }
 
-    int_type m = a_pArg[0]->GetInteger(),
-        n = (argc == 1) ? m : a_pArg[1]->GetInteger();
+    int_type m = a_pArg[0]->GetInteger();
+    int_type n = (argc == 1) ? m : a_pArg[1]->GetInteger();
 
-    matrix_type eye(m, n, 0.0);
+    matrix_type eye((int)m, (int)n, 0.0);
 
     for (int i = 0; i < std::min(m, n); ++i)
     {
diff --git a/parser/mpFuncStr.cpp b/parser/mpFuncStr.cpp
index 093d016..443c84a 100644
--- a/parser/mpFuncStr.cpp
+++ b/parser/mpFuncStr.cpp
@@ -5,7 +5,7 @@
   |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \ 
   |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
         \/                     \/           \/     \/           \_/
-                                       Copyright (C) 2016, Ingo Berg
+                                       Copyright (C) 2022, Ingo Berg
                                        All rights reserved.
 
   Redistribution and use in source and binary forms, with or without 
@@ -39,6 +39,13 @@
 #include "mpValue.h"
 #include "mpError.h"
 
+#ifdef _MSC_VER
+#  define SSCANF sscanf_s
+#  define SWSCANF swscan_s
+#else
+#  define SSCANF sscanf
+#  define SWSCANF swscanf
+#endif
 
 MUP_NAMESPACE_START
 
@@ -157,10 +164,10 @@ MUP_NAMESPACE_START
 
     in = a_pArg[0]->GetString();
     
-#ifndef _UNICODE    
-    sscanf(in.c_str(), "%lf", &out);
+#ifndef MUP_USE_WIDE_STRING    
+    SSCANF(in.c_str(), "%lf", &out);
 #else
-    swscanf(in.c_str(), _T("%lf"), &out);
+    SWSCANF(in.c_str(), _T("%lf"), &out);
 #endif
 
     *ret = (float_type)out;
diff --git a/parser/mpICallback.h b/parser/mpICallback.h
index 62267fc..112b7c6 100644
--- a/parser/mpICallback.h
+++ b/parser/mpICallback.h
@@ -58,14 +58,14 @@ MUP_NAMESPACE_START
       ICallback(ECmdCode a_iCode, 
                 const char_type *a_szName, 
                 int a_nArgNum = 1);
-      virtual ~ICallback();
+      virtual ~ICallback() override;
 
-      virtual ICallback* AsICallback();
-      virtual IValue* AsIValue();
+      virtual ICallback* AsICallback() override;
+      virtual IValue* AsIValue() override;
 
       virtual void Eval(ptr_val_type& ret, const ptr_val_type *arg, int argc) = 0;
       virtual const char_type* GetDesc() const = 0;
-      virtual string_type AsciiDump() const;
+      virtual string_type AsciiDump() const override;
         
       int GetArgc() const;
       int GetArgsPresent() const;
diff --git a/parser/mpIToken.cpp b/parser/mpIToken.cpp
index 4f26181..6db1cf8 100644
--- a/parser/mpIToken.cpp
+++ b/parser/mpIToken.cpp
@@ -47,7 +47,7 @@ MUP_NAMESPACE_START
   std::list<IToken*> IToken::s_Tokens;
 #endif
 
-#ifndef _UNICODE
+#ifndef MUP_USE_WIDE_STRING
 
   //---------------------------------------------------------------------------
   /** \brief Overloaded streaming operator for outputting the value type 
@@ -55,7 +55,7 @@ MUP_NAMESPACE_START
       \param a_Stream The stream object
       \param a_Val The value object to be streamed
 
-    This function is only present if _UNICODE is not defined.
+    This function is only present if MUP_USE_WIDE_STRING is not defined.
   */
   std::ostream& operator<<(std::ostream &a_Stream, const IToken &tok)
   {
@@ -70,7 +70,7 @@ MUP_NAMESPACE_START
       \param a_Stream The stream object
       \param a_Val The value object to be streamed
 
-    This function is only present if _UNICODE is defined.
+    This function is only present if MUP_USE_WIDE_STRING is defined.
   */
   std::wostream& operator<<(std::wostream &a_Stream, const IToken &tok)
   {
diff --git a/parser/mpIToken.h b/parser/mpIToken.h
index 60f53fd..9263e68 100644
--- a/parser/mpIToken.h
+++ b/parser/mpIToken.h
@@ -141,9 +141,9 @@ MUP_NAMESPACE_START
       GenericToken(ECmdCode a_iCode, string_type a_sIdent);
       explicit GenericToken(ECmdCode a_iCode);
       GenericToken(const GenericToken &a_Tok);      
-      virtual ~GenericToken();
-      virtual IToken* Clone() const;
-      virtual string_type AsciiDump() const;
+      virtual ~GenericToken() override;
+      virtual IToken* Clone() const override;
+      virtual string_type AsciiDump() const override;
   };
 
   //------------------------------------------------------------------------------
diff --git a/parser/mpIValReader.cpp b/parser/mpIValReader.cpp
index ab6c629..b95d9d5 100644
--- a/parser/mpIValReader.cpp
+++ b/parser/mpIValReader.cpp
@@ -5,11 +5,11 @@
   |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \ 
   |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
         \/                     \/           \/     \/           \_/
-                                       Copyright (C) 2016 Ingo Berg
+                                       Copyright (C) 2023 Ingo Berg
                                        All rights reserved.
 
   muParserX - A C++ math parser library with array and string support
-  Copyright (c) 2016, Ingo Berg
+  Copyright (c) 2023, Ingo Berg
   All rights reserved.
 
   Redistribution and use in source and binary forms, with or without 
diff --git a/parser/mpIValue.cpp b/parser/mpIValue.cpp
index 878b3d0..5e7ebc0 100644
--- a/parser/mpIValue.cpp
+++ b/parser/mpIValue.cpp
@@ -52,7 +52,7 @@
 
 MUP_NAMESPACE_START
 
-#ifndef _UNICODE
+#ifndef MUP_USE_WIDE_STRING
 
 //---------------------------------------------------------------------------
 /** \brief Overloaded streaming operator for outputting the value type 
@@ -60,7 +60,7 @@ MUP_NAMESPACE_START
            \param a_Stream The stream object
            \param a_Val The value object to be streamed
 
-           This function is only present if _UNICODE is not defined.
+           This function is only present if MUP_USE_WIDE_STRING is not defined.
            */
            std::ostream& operator<<(std::ostream &a_Stream, const IValue &a_Val)
 {
@@ -75,7 +75,7 @@ MUP_NAMESPACE_START
            \param a_Stream The stream object
            \param a_Val The value object to be streamed
 
-           This function is only present if _UNICODE is defined.
+           This function is only present if MUP_USE_WIDE_STRING is defined.
            */
            std::wostream& operator<<(std::wostream &a_Stream, const IValue &a_Val)
 {
@@ -195,7 +195,7 @@ bool IValue::operator==(const IValue &a_Val) const
     char_type type1 = GetType(),
         type2 = a_Val.GetType();
 
-    if (type1 == type2 || (IsScalar() && a_Val.IsScalar()))
+    if (type1 == type2 || (IsScalarOrBool() && a_Val.IsScalarOrBool()))
     {
         switch (GetType())
         {
diff --git a/parser/mpIValue.h b/parser/mpIValue.h
index 4adb801..4a2d369 100644
--- a/parser/mpIValue.h
+++ b/parser/mpIValue.h
@@ -2,36 +2,36 @@
 #define MUP_IVALUE_H
 
 /** \file
-    \brief Definition of the virtual base class used for all parser values.
+	\brief Definition of the virtual base class used for all parser values.
 
 <pre>
-               __________                                 ____  ___
-    _____  __ _\______   \_____ _______  ______ __________\   \/  /
-   /     \|  |  \     ___/\__  \\_  __ \/  ___// __ \_  __ \     / 
-  |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \ 
+			   __________                                 ____  ___
+	_____  __ _\______   \_____ _______  ______ __________\   \/  /
+   /     \|  |  \     ___/\__  \\_  __ \/  ___// __ \_  __ \     /
+  |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
   |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
-        \/                     \/           \/     \/           \_/
-  Copyright (C) 2021 Ingo Berg, et al.
+		\/                     \/           \/     \/           \_/
+  Copyright (C) 2022 Ingo Berg, et al.
   All rights reserved.
 
-  Redistribution and use in source and binary forms, with or without 
+  Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:
 
-   * Redistributions of source code must retain the above copyright notice, 
-     this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above copyright notice, 
-     this list of conditions and the following disclaimer in the documentation 
-     and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
-  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
-  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
-  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+   * Redistributions of source code must retain the above copyright notice,
+	 this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright notice,
+	 this list of conditions and the following disclaimer in the documentation
+	 and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGE.
 </pre>
 */
@@ -40,142 +40,149 @@
 
 MUP_NAMESPACE_START
 
-  //------------------------------------------------------------------------------
-  /** \brief Interface to be implemented by all classes representing values. 
-  
-    IValue is the common base class of both the Value and Variable classes.
-  */
-  class IValue : public IToken
-  {
-  friend std::ostream& operator<<(std::ostream &a_Stream, const IValue &a_Val);
-  friend std::wostream& operator<<(std::wostream &a_Stream, const IValue &a_Val);
-
-  public:
-
-    explicit IValue(ECmdCode a_iCode);
-    IValue(ECmdCode a_iCode, const string_type &a_sIdent);
-    
-    bool operator==(const IValue &a_Val) const;
-    bool operator!=(const IValue &a_Val) const;
-    bool operator< (const IValue &a_Val) const;
-    bool operator> (const IValue &a_Val) const;
-    bool operator<=(const IValue &a_Val) const;
-    bool operator>=(const IValue &a_Val) const;
-
-    virtual ICallback* AsICallback();
-    virtual IValue* AsIValue();
-    virtual Value* AsValue() = 0;
-
-    virtual IValue& operator=(int_type val) = 0;
-    virtual IValue& operator=(float_type val) = 0;
-    virtual IValue& operator=(string_type val) = 0;
-    virtual IValue& operator=(bool_type val) = 0;
-    virtual IValue& operator=(const cmplx_type &val) = 0;
-    virtual IValue& operator=(const matrix_type &val) = 0;
-            IValue& operator=(const IValue &ref);
-
-    virtual IValue& operator+=(const IValue &ref) = 0;
-    virtual IValue& operator-=(const IValue &ref) = 0;
-    virtual IValue& operator*=(const IValue &ref) = 0;
-
-    virtual IValue& At(int nRow, int nCol = 0) = 0;
-    virtual IValue& At(const IValue &nRows, const IValue &nCols) = 0;
-
-    virtual int_type GetInteger() const = 0;
-    virtual float_type GetFloat() const = 0;
-    virtual float_type GetImag() const = 0;
-    virtual bool GetBool() const = 0;
-    virtual const cmplx_type& GetComplex() const = 0;
-    virtual const string_type&  GetString() const = 0;
-    virtual const matrix_type& GetArray() const = 0;
-    virtual char_type GetType() const = 0;
-    virtual int GetRows() const = 0;
-    virtual int GetCols() const = 0;
-
-    virtual string_type ToString() const;
-  
-    //---------------------------------------------------------------------------
-    /** \brief Returns the dimension of the value represented by a value object.
-        
-        The value represents the dimension of the object. Possible value are:
-        <ul>
-          <li>0 - scalar</li>
-          <li>1 - vector</li>
-          <li>2 - matrix</li>
-        </ul>
-    */
-    inline int GetDim() const
-    {
-      return (IsMatrix()) ? GetArray().GetDim() : 0;
-    }
-
-    //---------------------------------------------------------------------------
-    virtual bool  IsVariable() const = 0;
-
-    //---------------------------------------------------------------------------
-    /** \brief Returns true if the type is either floating point or interger. 
-        \throw nothrow
-    */
-    inline bool IsNonComplexScalar() const
-    {
-      char_type t = GetType();
-      return t=='f' || t=='i';
-    }
-
-    //---------------------------------------------------------------------------
-    /** \brief Returns true if the type is not a vector and not a string.
-        \throw nothrow
-    */
-    inline bool IsScalar() const
-    {
-      char_type t = GetType();
-      return t=='f' || t=='i' || t=='c';
-    }
-
-    //---------------------------------------------------------------------------
-    /** \brief Returns true if this value is a noncomplex integer. 
-        \throw nothrow
-    */
-    inline bool IsInteger() const
-    {
-      // checking the type is is insufficient. The integer could be disguised
-      // as a float or a complex value
-      return IsScalar() && GetImag()==0 && GetFloat()==(int_type)GetFloat();
-    }
-
-    //---------------------------------------------------------------------------
-    /** \brief Returns true if this value is an array. 
-        \throw nothrow
-    */  
-    inline bool IsMatrix() const 
-    {
-      return GetType() == 'm';  
-    }
-
-    //---------------------------------------------------------------------------
-    /** \brief Returns true if this value is a complex value. 
-        \throw nothrow
-    */
-    inline bool IsComplex() const
-    {
-      return GetType() == 'c' && GetImag()!=0;
-    }
-
-    //---------------------------------------------------------------------------
-    /** \brief Returns true if this value is a string value. 
-        \throw nothrow
-    */
-    inline bool IsString() const 
-    {
-      return GetType() == 's';  
-    }
-
-  protected:
-    virtual ~IValue();
-  }; // class IValue
-
-  //---------------------------------------------------------------------------------------------
-  Value operator*(const IValue& lhs, const IValue& rhs);
+/** \brief Interface to be implemented by all classes representing values.
+
+  IValue is the common base class of both the Value and Variable classes.
+*/
+class IValue : public IToken
+{
+	friend std::ostream& operator<<(std::ostream& a_Stream, const IValue& a_Val);
+	friend std::wostream& operator<<(std::wostream& a_Stream, const IValue& a_Val);
+
+public:
+
+	explicit IValue(ECmdCode a_iCode);
+	IValue(ECmdCode a_iCode, const string_type& a_sIdent);
+
+	bool operator==(const IValue& a_Val) const;
+	bool operator!=(const IValue& a_Val) const;
+	bool operator< (const IValue& a_Val) const;
+	bool operator> (const IValue& a_Val) const;
+	bool operator<=(const IValue& a_Val) const;
+	bool operator>=(const IValue& a_Val) const;
+
+	virtual ICallback* AsICallback() override;
+	virtual IValue* AsIValue() override;
+	virtual Value* AsValue() = 0;
+
+	virtual IValue& operator=(int_type val) = 0;
+	virtual IValue& operator=(float_type val) = 0;
+	virtual IValue& operator=(string_type val) = 0;
+	virtual IValue& operator=(bool_type val) = 0;
+	virtual IValue& operator=(const cmplx_type& val) = 0;
+	virtual IValue& operator=(const matrix_type& val) = 0;
+	IValue& operator=(const IValue& ref);
+
+	virtual IValue& operator+=(const IValue& ref) = 0;
+	virtual IValue& operator-=(const IValue& ref) = 0;
+	virtual IValue& operator*=(const IValue& ref) = 0;
+
+	virtual IValue& At(int nRow, int nCol = 0) = 0;
+	virtual IValue& At(const IValue& nRows, const IValue& nCols) = 0;
+
+	virtual int_type GetInteger() const = 0;
+	virtual float_type GetFloat() const = 0;
+	virtual float_type GetImag() const = 0;
+	virtual bool GetBool() const = 0;
+	virtual const cmplx_type& GetComplex() const = 0;
+	virtual const string_type& GetString() const = 0;
+	virtual const matrix_type& GetArray() const = 0;
+	virtual char_type GetType() const = 0;
+	virtual int GetRows() const = 0;
+	virtual int GetCols() const = 0;
+
+	virtual string_type ToString() const override;
+
+	/** \brief Returns the dimension of the value represented by a value object.
+
+		The value represents the dimension of the object. Possible value are:
+		<ul>
+		  <li>0 - scalar</li>
+		  <li>1 - vector</li>
+		  <li>2 - matrix</li>
+		</ul>
+	*/
+	inline int GetDim() const
+	{
+		return (IsMatrix()) ? GetArray().GetDim() : 0;
+	}
+
+
+	virtual bool  IsVariable() const = 0;
+
+
+	/** \brief Returns true if the type is either floating point or interger.
+		\throw nothrow
+	*/
+	inline bool IsNonComplexScalar() const
+	{
+		char_type t = GetType();
+		return t == 'f' || t == 'i';
+	}
+
+	/** \brief Returns true if the type is not a vector and not a string.
+		\throw nothrow
+	*/
+	inline bool IsScalar() const
+	{
+		char_type t = GetType();
+		return t == 'f' || t == 'i' || t == 'c';
+	}
+
+	/** \brief Returns true if this value represents a scalar value or a boolean value. 
+	
+		Added to fix #117
+	*/
+	inline bool IsScalarOrBool() const
+	{
+		char_type t = GetType();
+		return IsScalar() || t == 'b';
+	}
+
+	/** \brief Returns true if this value is a noncomplex integer.
+		\throw nothrow
+	*/
+	inline bool IsInteger() const
+	{
+		// checking the type is is insufficient. The integer could be disguised
+		// as a float or a complex value
+		return IsScalar() && GetImag() == 0 && GetFloat() == static_cast<int_type>(GetFloat());
+	}
+
+
+	/** \brief Returns true if this value is an array.
+		\throw nothrow
+	*/
+	inline bool IsMatrix() const
+	{
+		return GetType() == 'm';
+	}
+
+
+	/** \brief Returns true if this value is a complex value.
+		\throw nothrow
+	*/
+	inline bool IsComplex() const
+	{
+		return GetType() == 'c' && GetImag() != 0;
+	}
+
+
+	/** \brief Returns true if this value is a string value.
+		\throw nothrow
+	*/
+	inline bool IsString() const
+	{
+		return GetType() == 's';
+	}
+
+protected:
+	virtual ~IValue() override;
+}; // class IValue
+
+
+Value operator*(const IValue& lhs, const IValue& rhs);
+
 }  // namespace mu
 
 #endif
diff --git a/parser/mpOprtBinCommon.h b/parser/mpOprtBinCommon.h
index 110123a..35dc625 100644
--- a/parser/mpOprtBinCommon.h
+++ b/parser/mpOprtBinCommon.h
@@ -5,7 +5,7 @@
     |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
     |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
           \/                     \/           \/     \/           \_/
-    Copyright (C) 2021 Ingo Berg, et al.
+    Copyright (C) 2022 Ingo Berg, et al.
     All rights reserved.
 
     Redistribution and use in source and binary forms, with or without
@@ -48,7 +48,7 @@
 
 MUP_NAMESPACE_START
 
-//-----------------------------------------------------------------------------------------------
+
 class OprtStrAdd : public IOprtBin
 {
 public:
@@ -58,7 +58,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//-----------------------------------------------------------------------------------------------
+
 /** \brief Callback object for testing if two values are equal.
     \ingroup binop
     */
@@ -72,7 +72,6 @@ public:
 };
 
 
-//------------------------------------------------------------------------------
 /** \brief Callback object for testing if two values are not equal.
     \ingroup binop
     */
@@ -85,7 +84,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback object class for the "Less than" operator.
     \ingroup binop
     */
@@ -98,7 +97,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback object class for the "Greater than" operator.
     \ingroup binop
     */
@@ -111,7 +110,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback object class for the "Less or equal" operator.
     \ingroup binop
     */
@@ -124,7 +123,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback object class for the "Greater or or equal" operator.
     \ingroup binop
     */
@@ -137,7 +136,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback class for a logic and operator.
     \ingroup binop
     */
@@ -150,7 +149,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback class for a logic or operator.
     \ingroup binop
     */
@@ -163,7 +162,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback class for a logical or operator.
     \ingroup binop
 */
@@ -176,7 +175,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback class for a logical and operator.
     \ingroup binop
 */
@@ -189,7 +188,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback class for the shift left operator.
     \ingroup binop
     */
@@ -202,7 +201,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//------------------------------------------------------------------------------
+
 /** \brief Callback class for the shift right operator.
     \ingroup binop
     */
@@ -215,7 +214,7 @@ public:
     virtual IToken* Clone() const override;
 };
 
-//---------------------------------------------------------------------------
+
 /** \brief Callback for an operator allowing to cast values to floating
            point values.
            \ingroup infix
@@ -229,10 +228,10 @@ public:
     virtual IToken* Clone() const override;
 }; // class OprtCastToFloat
 
-////---------------------------------------------------------------------------
-///** \brief Callback for an operator allowing to cast values to integer values.
-//    \ingroup infix
-//*/
+
+/** \brief Callback for an operator allowing to cast values to integer values.
+    \ingroup infix
+*/
 class OprtCastToInt : public IOprtInfix
 {
 public:
diff --git a/parser/mpOprtPostfixCommon.cpp b/parser/mpOprtPostfixCommon.cpp
index f8ba01e..b9c0ed1 100755
--- a/parser/mpOprtPostfixCommon.cpp
+++ b/parser/mpOprtPostfixCommon.cpp
@@ -40,15 +40,8 @@ MUP_NAMESPACE_START
       //                 If the compiler does not support IEEE 754, chances are 
       //                 you are running on a pretty fucked up system.
       //
-      #ifdef _MSC_VER
-      #pragma warning(push)
-      #pragma warning(disable:4127)
-      #endif /* _MSC_VER */
       if ( !std::numeric_limits<float_type>::is_iec559 && 
            (result>std::numeric_limits<float_type>::max() || result < 1.0) )
-      #ifdef _MSC_VER
-      #pragma warning(pop)
-      #endif /* _MSC_VER */
       {
         throw ParserError(ErrorContext(ecOVERFLOW, GetExprPos(), GetIdent()));
       }
diff --git a/parser/mpParserMessageProvider.cpp b/parser/mpParserMessageProvider.cpp
index dbd4427..b3ef300 100644
--- a/parser/mpParserMessageProvider.cpp
+++ b/parser/mpParserMessageProvider.cpp
@@ -67,7 +67,7 @@ MUP_NAMESPACE_START
     m_vErrMsg[ecUNEXPECTED_VAR]           = _T("Unexpected variable \"$IDENT$\" found at position $POS$.");
     m_vErrMsg[ecUNEXPECTED_STR]           = _T("Unexpected string token found at position $POS$.");
     m_vErrMsg[ecUNEXPECTED_CONDITIONAL]   = _T("The \"$IDENT$\" operator must be preceded by a closing bracket.");
-    m_vErrMsg[ecUNEXPECTED_NEWLINE]       = _T("Unexprected newline.");
+    m_vErrMsg[ecUNEXPECTED_NEWLINE]       = _T("Unexpected newline.");
     m_vErrMsg[ecMISSING_PARENS]           = _T("Missing parenthesis.");
     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$.");
@@ -106,7 +106,7 @@ MUP_NAMESPACE_START
     m_vErrMsg[ecFUNOPRT_DEFINED]              = _T("Function/operator \"$IDENT$\" is already defined.");
   }
 
-#if defined(_UNICODE)
+#if defined(MUP_USE_WIDE_STRING)
 
   //-------------------------------------------------------------------------------------------------
   //
@@ -176,6 +176,6 @@ MUP_NAMESPACE_START
     m_vErrMsg[ecCONSTANT_DEFINED]             = _T("Die Konstante \"$IDENT$\" is bereits definiert.");
     m_vErrMsg[ecFUNOPRT_DEFINED]              = _T("Ein Element mit der Bezeichnung \"$IDENT$\" ist bereits definiert.");
   }
-#endif // _UNICODE
+#endif // MUP_USE_WIDE_STRING
 
 MUP_NAMESPACE_END
diff --git a/parser/mpRPN.cpp b/parser/mpRPN.cpp
index 5b4afe3..3a87c10 100644
--- a/parser/mpRPN.cpp
+++ b/parser/mpRPN.cpp
@@ -5,7 +5,7 @@
   |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
   |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
 		\/                     \/           \/     \/           \_/
-									   Copyright (C) 2016, Ingo Berg
+									   Copyright (C) 2022, Ingo Berg
 									   All rights reserved.
 
   Redistribution and use in source and binary forms, with or without
diff --git a/parser/mpStringConversionHelper.h b/parser/mpStringConversionHelper.h
new file mode 100644
index 0000000..1d36f27
--- /dev/null
+++ b/parser/mpStringConversionHelper.h
@@ -0,0 +1,90 @@
+/*
+               __________                                 ____  ___
+    _____  __ _\______   \_____ _______  ______ __________\   \/  /
+   /     \|  |  \     ___/\__  \\_  __ \/  ___// __ \_  __ \     / 
+  |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \ 
+  |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
+        \/                     \/           \/     \/           \_/
+                                       Copyright (C) 2023, Ingo Berg
+                                       All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright notice, 
+     this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright notice, 
+     this list of conditions and the following disclaimer in the documentation 
+     and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
+  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
+  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
+  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+  POSSIBILITY OF SUCH DAMAGE.
+*/
+#ifndef MP_STRING_CONVERSION_HELPER_H
+#define MP_STRING_CONVERSION_HELPER_H
+
+#include <cstdlib>   // for strtod
+#include <cwchar>    // for wcstof
+#include <cstring>   // for strlen
+#include <type_traits>  // for enable_if, is_floating_point
+
+MUP_NAMESPACE_START
+
+template <typename TChar>
+class StringConversionHelper 
+{
+    public:
+        static size_t StrLen(const TChar* str) 
+        {
+            static_assert(std::is_same<TChar, char>::value || std::is_same<TChar, wchar_t>::value, "TChar must be either char or wchar_t");
+            return StrLenImpl(str, std::integral_constant<bool, std::is_same<TChar, char>::value>());
+        }
+
+        static double ParseDouble(const TChar* str, int &parsedLen, bool& success) 
+        {
+            static_assert(std::is_same<TChar, char>::value || std::is_same<TChar, wchar_t>::value, "TChar must be either char or wchar_t");
+            return ParseDoubleImpl(str, parsedLen, success, std::integral_constant<bool, std::is_same<TChar, char>::value>());
+        }
+
+    private:
+        static size_t StrLenImpl(const char* str, std::true_type) 
+        {
+            return std::strlen(str);
+        }
+
+        static size_t StrLenImpl(const wchar_t* str, std::false_type) 
+        {
+            return std::wcslen(str);
+        }
+
+        static double ParseDoubleImpl(const char* str, int &parsedLen, bool& success, std::true_type) 
+        {
+            char* endptr;
+            double value = std::strtod(str, &endptr);
+            success = (endptr != str);
+            parsedLen = endptr - str;
+            return value;
+        }
+
+        static double ParseDoubleImpl(const wchar_t* str, int &parsedLen, bool& success, std::false_type) 
+        {
+            wchar_t* endptr;
+            double value = std::wcstod(str, &endptr);
+            success = (endptr != str);
+            parsedLen = endptr - str;
+            return value;
+        }
+};
+
+
+MUP_NAMESPACE_END
+
+#endif
\ No newline at end of file
diff --git a/parser/mpTest.cpp b/parser/mpTest.cpp
index c4b08c6..f7d7db1 100644
--- a/parser/mpTest.cpp
+++ b/parser/mpTest.cpp
@@ -8,11 +8,7 @@
 	|  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
 	|__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
 		  \/                     \/           \/     \/           \_/
-	Copyright (C) 2016 Ingo Berg
-	All rights reserved.
-
-	muParserX - A C++ math parser library with array and string support
-	Copyright (c) 2016, Ingo Berg
+	Copyright (C) 2023 Ingo Berg
 	All rights reserved.
 
 	Redistribution and use in source and binary forms, with or without
@@ -67,7 +63,7 @@ public:
 		:IOprtBin(_T("++"), (int)prADD_SUB, oaLEFT)
 	{}
 
-	//-----------------------------------------------------------------------------------------------
+
 	void Eval(ptr_val_type& ret, const ptr_val_type *arg, int argc)
 	{
 		assert(argc == 2);
@@ -76,20 +72,20 @@ public:
 		*ret = a + b;
 	}
 
-	//-----------------------------------------------------------------------------------------------
+
 	const char_type* GetDesc() const
 	{
 		return _T("internally used operator without special meaning for unit testing");
 	}
 
-	//-----------------------------------------------------------------------------------------------
+
 	IToken* Clone() const
 	{
 		return new DbgSillyAdd(*this);
 	}
 };
 
-//------------------------------------------------------------------------------
+
 class FunTest0 : public ICallback
 {
 public:
@@ -112,10 +108,35 @@ public:
 	}
 }; // class FunTest0
 
-//---------------------------------------------------------------------------
+
+class FunReturnFalse : public ICallback
+{
+public:
+	FunReturnFalse() : ICallback(cmFUNC, _T("returnFalse"), 0)
+	{}
+
+	virtual void Eval(ptr_val_type& ret, const ptr_val_type* /*a_pArg*/, int /*a_iArgc*/)
+	{
+		*ret = false;
+	}
+
+	virtual const char_type* GetDesc() const
+	{
+		return _T("");
+	}
+
+	virtual IToken* Clone() const
+	{
+		return new FunReturnFalse(*this);
+	}
+}; // class FunTest0
+
+
+
 int ParserTester::c_iCount = 0;
 
-//---------------------------------------------------------------------------
+
+
 ParserTester::ParserTester()
 	:m_vTestFun()
 	, m_stream(&console())
@@ -179,6 +200,9 @@ int ParserTester::TestIssueReports()
 	// Github Issue 63
 	iNumErr += ThrowTest(_T("0<0-0--eye()"), ecINVALID_NUMBER_OF_PARAMETERS);
 
+	// Github Issue 115
+	iNumErr += EqnTest(_T("organisation==\"ACME\""), true, true);
+
 	Assessment(iNumErr);
 	return iNumErr;
 }
@@ -776,6 +800,9 @@ int ParserTester::TestErrorCodes()
 	iNumErr += ThrowTest(_T("]1"), ecUNEXPECTED_SQR_BRACKET);
 	iNumErr += ThrowTest(_T("va[[3]]"), ecUNEXPECTED_SQR_BRACKET);
 
+	// test for #117
+	iNumErr += ThrowTest(_T("returnFalse()==0"), ecEVAL);
+
 	Assessment(iNumErr);
 	return iNumErr;
 }
@@ -1136,8 +1163,8 @@ int ParserTester::TestIfElse()
 	// with variations
 	iNumErr += ThrowTest(_T(R"(false ? 4 : "", ? 4 : "", ? 4 : "")"), ecUNEXPECTED_COMMA);
 	iNumErr += EqnTest(_T(R"(false ? "four" : 4)"), (int_type)4, true);
-	iNumErr += EqnTest(_T(R"(true ? "four" : 4)"), "four", true);
-	iNumErr += EqnTest(_T(R"(true ? "foo" : "bar")"), "foo", true);
+	iNumErr += EqnTest(_T(R"(true ? "four" : 4)"), _T("four"), true);
+	iNumErr += EqnTest(_T(R"(true ? "foo" : "bar")"), _T("foo"), true);
 
 	// test case and variations copied from muparser https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=22938
 	iNumErr += ThrowTest(_T("sum(false?1,0,0:3)"), ecUNEXPECTED_COMMA);
@@ -1280,8 +1307,11 @@ int ParserTester::TestEqn()
 	// test case copied from muparser: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=23330#c1
 	iNumErr += ThrowTest(_T("6, +, +, +, +, +, +, +, +, +, +, +, +, +, +, 1, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +, +"), ecUNEXPECTED_COMMA);
 
-	iNumErr += ThrowTest(_T("1e1234"), ecUNASSIGNABLE_TOKEN);
-	iNumErr += ThrowTest(_T("-1e1234"), ecUNASSIGNABLE_TOKEN);
+//	iNumErr += ThrowTest(_T("1e1234"), ecUNASSIGNABLE_TOKEN);
+//	iNumErr += ThrowTest(_T("-1e1234"), ecUNASSIGNABLE_TOKEN);
+;
+	iNumErr += EqnTest(_T("1e1234"), std::numeric_limits<float_type>::infinity(), true);
+	iNumErr += EqnTest(_T("-1e1234"), -std::numeric_limits<float_type>::infinity(), true);
 
 	iNumErr += EqnTest(_T("-2--8"), (float_type)6.0, true);
 	iNumErr += EqnTest(_T("2*(a=9)*3"), 54., true);
@@ -1486,6 +1516,9 @@ int ParserTester::ThrowTest(const string_type &a_sExpr, int a_nErrc, int a_nPos,
 		p.DefineVar(_T("c"), Variable(&vVarVal[2]));
 		p.DefineVar(_T("d"), Variable(&vVarVal[3]));
 
+		// Add functions
+		p.DefineFun(new FunReturnFalse);
+
 		// array variables
 		Value aVal1(3, 0);
 		aVal1.At(0) = (float_type)1.0;
@@ -1599,6 +1632,7 @@ int ParserTester::EqnTest(const string_type &a_str, Value a_val, bool a_fPass, i
 
 		p1->DefineOprt(new DbgSillyAdd);
 		p1->DefineFun(new FunTest0);
+		p1->DefineFun(new FunReturnFalse);
 
 		p1->DefineVar(_T("a"), Variable(&vVarVal[0]));
 		p1->DefineVar(_T("b"), Variable(&vVarVal[1]));
@@ -1612,6 +1646,7 @@ int ParserTester::EqnTest(const string_type &a_str, Value a_val, bool a_fPass, i
 		p1->DefineConst(_T("const"), 1.);
 		p1->DefineConst(_T("const1"), 2.);
 		p1->DefineConst(_T("const2"), 3.);
+		p1->DefineConst(_T("organisation"), _T("ACME")); // #115
 
 		// some vector variables
 		Value aVal1(3, 0);
diff --git a/parser/mpTest.h b/parser/mpTest.h
index ac76259..93ff802 100644
--- a/parser/mpTest.h
+++ b/parser/mpTest.h
@@ -85,7 +85,7 @@ MUP_NAMESPACE_START
     private:
         std::vector<testfun_type> m_vTestFun;
 
-#if defined(_UNICODE)
+#if defined(MUP_USE_WIDE_STRING)
         std::wostream *m_stream;
 #else
         std::ostream *m_stream;
diff --git a/parser/mpTokenReader.cpp b/parser/mpTokenReader.cpp
index 19b9a6e..1e758c5 100644
--- a/parser/mpTokenReader.cpp
+++ b/parser/mpTokenReader.cpp
@@ -329,7 +329,7 @@ ptr_tok_type TokenReader::ReadNextToken()
 	if (IsNewline(pTok))
 		return Store(pTok, token_pos);
 
-	if (IsScOprt(pTok))
+	if (!(m_nSynFlags & noOPT) && IsShortCutOprt(pTok))
 		return Store(pTok, token_pos);
 
 	if (!(m_nSynFlags & noOPT) && IsOprt(pTok))
@@ -873,8 +873,8 @@ bool TokenReader::IsOprt(ptr_tok_type &a_Tok)
 
 
 //---------------------------------------------------------------------------
-/** \brief Check if a string position contains a binary operator. */
-bool TokenReader::IsScOprt(ptr_tok_type &a_Tok)
+/** \brief Check if a string position contains a binary operator with short cut evaluation. */
+bool TokenReader::IsShortCutOprt(ptr_tok_type &a_Tok)
 {
 	string_type sTok;
 	int iEnd = ExtractToken(m_pParser->ValidOprtChars(), sTok, m_nPos);
diff --git a/parser/mpTokenReader.h b/parser/mpTokenReader.h
index 84b4063..1eec004 100644
--- a/parser/mpTokenReader.h
+++ b/parser/mpTokenReader.h
@@ -76,12 +76,11 @@ MUP_NAMESPACE_START
     bool IsBuiltIn(ptr_tok_type &t);
     bool IsEOF(ptr_tok_type &t);
     bool IsNewline(ptr_tok_type &a_Tok);
-    bool IsNewLine(ptr_tok_type &t);
     bool IsInfixOpTok(ptr_tok_type &t);
     bool IsFunTok(ptr_tok_type &t);
     bool IsPostOpTok(ptr_tok_type &t);
     bool IsOprt(ptr_tok_type &t);
-    bool IsScOprt(ptr_tok_type &a_Tok);
+    bool IsShortCutOprt(ptr_tok_type &a_Tok);
     bool IsValTok(ptr_tok_type &t);
     bool IsVarOrConstTok(ptr_tok_type &t);
     bool IsUndefVarTok(ptr_tok_type &t);
diff --git a/parser/mpTypes.h b/parser/mpTypes.h
index 9beb737..73e0aad 100644
--- a/parser/mpTypes.h
+++ b/parser/mpTypes.h
@@ -47,7 +47,6 @@
 #include "suSortPred.h"  // We need the string utils sorting predicates
 #include "mpDefines.h"
 #include "mpMatrix.h"
-#include "mpCompat.h"
 
 
 MUP_NAMESPACE_START
@@ -131,7 +130,7 @@ typedef std::map<string_type, ptr_tok_type> val_maptype;
 	     to operator identifiers. */
 typedef std::map<string_type, ptr_tok_type> fun_maptype;
 
-/** \breief Type of a container that short circuit operator object pointer*/
+/** \brief Type of a container that short circuit operator object pointer*/
 typedef std::map<string_type, ptr_tok_type> oprt_bin_shortcut_maptype;
 
 /** \brief Type of a container that binds Callback object pointer
@@ -369,7 +368,7 @@ enum EErrorCodes
     ecUNDEFINED                 = -1  ///< Undefined message, placeholder to detect unassigned error messages
 };
 
-#if defined(_UNICODE)
+#if defined(MUP_USE_WIDE_STRING)
 
 //------------------------------------------------------------------------------
 /** \brief Encapsulate wcout. */
@@ -405,7 +404,7 @@ inline std::istream& console_in()
     return std::cin;
 }
 
-#endif // _UNICODE
+#endif // MUP_USE_WIDE_STRING
 
 }  // namespace mu
 
diff --git a/parser/mpValReader.cpp b/parser/mpValReader.cpp
index 8add7b0..eed04b9 100644
--- a/parser/mpValReader.cpp
+++ b/parser/mpValReader.cpp
@@ -1,40 +1,40 @@
 /** \file
-    \brief Implementation of classes that interpret values in a string.
-
-    <pre>
-                 __________                                 ____  ___
-      _____  __ _\______   \_____ _______  ______ __________\   \/  /
-     /     \|  |  \     ___/\__  \\_  __ \/  ___// __ \_  __ \     /
-    |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
-    |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
-          \/                     \/           \/     \/           \_/
-    Copyright (C) 2016, Ingo Berg
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-    this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-    this list of conditions and the following disclaimer in the documentation
-    and/or other materials provided with the distribution.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-    IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-    POSSIBILITY OF SUCH DAMAGE.
-    </pre>
-    */
+	\brief Implementation of classes that interpret values in a string.
+
+	<pre>
+				 __________                                 ____  ___
+	  _____  __ _\______   \_____ _______  ______ __________\   \/  /
+	 /     \|  |  \     ___/\__  \\_  __ \/  ___// __ \_  __ \     /
+	|  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
+	|__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
+		  \/                     \/           \/     \/           \_/
+	Copyright (C) 2023, Ingo Berg
+	All rights reserved.
+
+	Redistribution and use in source and binary forms, with or without
+	modification, are permitted provided that the following conditions are met:
+
+	* Redistributions of source code must retain the above copyright notice,
+	this list of conditions and the following disclaimer.
+	* Redistributions in binary form must reproduce the above copyright notice,
+	this list of conditions and the following disclaimer in the documentation
+	and/or other materials provided with the distribution.
+
+	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+	ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+	WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+	IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+	INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+	PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+	WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+	POSSIBILITY OF SUCH DAMAGE.
+	</pre>
+	*/
 #include "mpValReader.h"
 #include "mpError.h"
-
+#include "mpStringConversionHelper.h"
 
 MUP_NAMESPACE_START
 
@@ -45,61 +45,48 @@ MUP_NAMESPACE_START
 //------------------------------------------------------------------------------
 
 DblValReader::DblValReader()
-:IValueReader()
+	:IValueReader()
 {}
 
-//------------------------------------------------------------------------------
+
 DblValReader::~DblValReader()
 {}
 
-//------------------------------------------------------------------------------
-bool DblValReader::IsValue(const char_type *a_szExpr, int &a_iPos, Value &a_Val)
+
+bool DblValReader::IsValue(const char_type* a_szExpr, int& a_iPos, Value& a_Val)
 {
-    stringstream_type stream(a_szExpr + a_iPos);
-    float_type fVal(0);
-    std::streamoff iEnd(0);
-
-    stream >> fVal;
-
-    if (stream.fail())
-        return false;
-
-    if (stream.eof())
-    {
-        // This part sucks but tellg will return -1 if eof is set,
-        // so i need a special treatment for the case that the number
-        // just read here is the last part of the string
-        for (; a_szExpr[a_iPos] != 0; ++a_iPos);
-    }
-    else
-    {
-        iEnd = stream.tellg();   // Position after reading
-        assert(iEnd > 0);
-        a_iPos += (int)iEnd;
-    }
-
-    // Finally i have to check if the next sign is the "i" for a imaginary unit
-    // if so this is an imaginary value
-    if (a_szExpr[a_iPos] == 'i')
-    {
-        a_Val = cmplx_type(0.0, fVal);
-        a_iPos++;
-    }
-    else
-    {
-        a_Val = cmplx_type(fVal, 0.0);
-    }
-
-    return true;
+	bool stat;
+	int parsedLen;
+	double val = StringConversionHelper<char_type>::ParseDouble(a_szExpr + a_iPos, parsedLen, stat);
+	float_type fVal = val;
+
+	if (!stat)
+		return false;
+
+	a_iPos += parsedLen;
+
+	// Finally i have to check if the next sign is the "i" for a imaginary unit
+	// if so this is an imaginary value
+	if (a_szExpr[a_iPos] == 'i')
+	{
+		a_Val = cmplx_type(0.0, fVal);
+		a_iPos++;
+	}
+	else
+	{
+		a_Val = cmplx_type(fVal, 0.0);
+	}
+
+	return true;
 }
 
-//------------------------------------------------------------------------------
-IValueReader* DblValReader::Clone(TokenReader *pTokenReader) const
+
+IValueReader* DblValReader::Clone(TokenReader* pTokenReader) const
 {
-    IValueReader *pReader = new DblValReader(*this);
-    pReader->SetParent(pTokenReader);
+	IValueReader* pReader = new DblValReader(*this);
+	pReader->SetParent(pTokenReader);
 
-    return pReader;
+	return pReader;
 }
 
 //------------------------------------------------------------------------------
@@ -109,41 +96,41 @@ IValueReader* DblValReader::Clone(TokenReader *pTokenReader) const
 //------------------------------------------------------------------------------
 
 BoolValReader::BoolValReader()
-    :IValueReader()
+	:IValueReader()
 {}
 
-//------------------------------------------------------------------------------
+
 BoolValReader::~BoolValReader()
 {}
 
-//------------------------------------------------------------------------------
-bool BoolValReader::IsValue(const char_type *a_szExpr, int &a_iPos, Value &a_Val)
+
+bool BoolValReader::IsValue(const char_type* a_szExpr, int& a_iPos, Value& a_Val)
 {
-    string_type sExpr(a_szExpr + a_iPos);
-
-    if (sExpr.find(_T("true")) == 0)
-    {
-        a_Val = true;
-        a_iPos += 4;
-        return true;
-    }
-    else if (sExpr.find(_T("false")) == 0)
-    {
-        a_Val = false;
-        a_iPos += 5;
-        return true;
-    }
-
-    return false;
+	string_type sExpr(a_szExpr + a_iPos);
+
+	if (sExpr.find(_T("true")) == 0)
+	{
+		a_Val = true;
+		a_iPos += 4;
+		return true;
+	}
+	else if (sExpr.find(_T("false")) == 0)
+	{
+		a_Val = false;
+		a_iPos += 5;
+		return true;
+	}
+
+	return false;
 }
 
-//------------------------------------------------------------------------------
-IValueReader* BoolValReader::Clone(TokenReader *pTokenReader) const
+
+IValueReader* BoolValReader::Clone(TokenReader* pTokenReader) const
 {
-    IValueReader *pReader = new BoolValReader(*this);
-    pReader->SetParent(pTokenReader);
+	IValueReader* pReader = new BoolValReader(*this);
+	pReader->SetParent(pTokenReader);
 
-    return pReader;
+	return pReader;
 }
 
 //------------------------------------------------------------------------------
@@ -153,56 +140,56 @@ IValueReader* BoolValReader::Clone(TokenReader *pTokenReader) const
 //------------------------------------------------------------------------------
 
 HexValReader::HexValReader()
-    :IValueReader()
+	:IValueReader()
 {}
 
-//------------------------------------------------------------------------------
+
 /** \brief Try to read a hex value from a given position in the expression.
-    \param a_szExpr The Expression
-    \param [in/out] a_iPos The current position in the expression
-    \param [out] a_val The value that was read
-
-    Hex values must start with a "0x" characters. The position a_iPos is advanded in case
-    a hex value was found.
-    */
-bool HexValReader::IsValue(const char_type *a_szExpr, int &a_iPos, Value &a_val)
+	\param a_szExpr The Expression
+	\param [in/out] a_iPos The current position in the expression
+	\param [out] a_val The value that was read
+
+	Hex values must start with a "0x" characters. The position a_iPos is advanded in case
+	a hex value was found.
+	*/
+bool HexValReader::IsValue(const char_type* a_szExpr, int& a_iPos, Value& a_val)
 {
-    std::size_t len = std::char_traits<char_type>::length(a_szExpr);
-    if (a_iPos >= (int)len || a_szExpr[a_iPos + 1] != 'x' || a_szExpr[a_iPos + 1] == 0 || a_szExpr[a_iPos] != '0')
-        return 0;
-
-    unsigned iVal(0);
-
-    stringstream_type::pos_type nPos(0);
-    stringstream_type ss(a_szExpr + a_iPos + 2);
-    ss >> std::hex >> iVal;
-
-    if (ss.fail())
-        return false;
-
-    if (ss.eof())
-    {
-        // This part sucks but tellg will return -1 if eof is set,
-        // so i need a special treatment for those cases.
-        for (; a_szExpr[a_iPos] != 0; ++a_iPos);
-    }
-    else
-    {
-        nPos = ss.tellg();
-        assert(nPos > 0);
-        a_iPos += (int)(2 + nPos);
-    }
-
-    a_val = (float_type)iVal;
-    return true;
+	std::size_t len = std::char_traits<char_type>::length(a_szExpr);
+	if (a_iPos >= (int)len || a_szExpr[a_iPos + 1] != 'x' || a_szExpr[a_iPos + 1] == 0 || a_szExpr[a_iPos] != '0')
+		return 0;
+
+	unsigned iVal(0);
+
+	stringstream_type::pos_type nPos(0);
+	stringstream_type ss(a_szExpr + a_iPos + 2);
+	ss >> std::hex >> iVal;
+
+	if (ss.fail())
+		return false;
+
+	if (ss.eof())
+	{
+		// This part sucks but tellg will return -1 if eof is set,
+		// so i need a special treatment for those cases.
+		for (; a_szExpr[a_iPos] != 0; ++a_iPos);
+	}
+	else
+	{
+		nPos = ss.tellg();
+		assert(nPos > 0);
+		a_iPos += (int)(2 + nPos);
+	}
+
+	a_val = (float_type)iVal;
+	return true;
 }
 
-//------------------------------------------------------------------------------
-IValueReader* HexValReader::Clone(TokenReader *pTokenReader) const
+
+IValueReader* HexValReader::Clone(TokenReader* pTokenReader) const
 {
-    IValueReader *pReader = new HexValReader(*this);
-    pReader->SetParent(pTokenReader);
-    return pReader;
+	IValueReader* pReader = new HexValReader(*this);
+	pReader->SetParent(pTokenReader);
+	return pReader;
 }
 
 //------------------------------------------------------------------------------
@@ -212,51 +199,51 @@ IValueReader* HexValReader::Clone(TokenReader *pTokenReader) const
 //------------------------------------------------------------------------------
 
 BinValReader::BinValReader()
-    :IValueReader()
+	:IValueReader()
 {}
 
-//------------------------------------------------------------------------------
+
 BinValReader::~BinValReader()
 {}
 
-//------------------------------------------------------------------------------
-bool BinValReader::IsValue(const char_type *a_szExpr, int &a_iPos, Value &a_Val)
+
+bool BinValReader::IsValue(const char_type* a_szExpr, int& a_iPos, Value& a_Val)
 {
-    const char_type *szExpr = a_szExpr + a_iPos;
+	const char_type* szExpr = a_szExpr + a_iPos;
 
-    if (szExpr[0] != '0' || (szExpr[1] != 'b' && szExpr[1] != 'B'))
-        return false;
+	if (szExpr[0] != '0' || (szExpr[1] != 'b' && szExpr[1] != 'B'))
+		return false;
 
-    // <ibg 2014-05-26/> Number of bits hardcoded to 32, i can't 
-    //                   store 64 bit integers in double values without 
-    //                   loss. There is no point in accepting them.
-    unsigned iVal = 0, iBits = 32 /*sizeof(iVal)*8*/, i;
-    for (i = 0; (szExpr[i + 2] == '0' || szExpr[i + 2] == '1') && i <= iBits; ++i)
-    {
-        iVal |= (unsigned)(szExpr[i + 2] == '1') << ((iBits - 1) - i);
-    }
+	// <ibg 2014-05-26/> Number of bits hardcoded to 32, i can't 
+	//                   store 64 bit integers in double values without 
+	//                   loss. There is no point in accepting them.
+	unsigned iVal = 0, iBits = 32 /*sizeof(iVal)*8*/, i;
+	for (i = 0; (szExpr[i + 2] == '0' || szExpr[i + 2] == '1') && i <= iBits; ++i)
+	{
+		iVal |= (unsigned)(szExpr[i + 2] == '1') << ((iBits - 1) - i);
+	}
 
-    if (i == 0)
-        return false;
+	if (i == 0)
+		return false;
 
-    if (i > iBits)
-    {
-        throw ParserError(_T("Binary to integer conversion error (overflow)."));
-    }
+	if (i > iBits)
+	{
+		throw ParserError(_T("Binary to integer conversion error (overflow)."));
+	}
 
-    a_Val = (float_type)((int)(iVal >> (iBits - i)));
-    a_iPos += i + 2;
+	a_Val = (float_type)((int)(iVal >> (iBits - i)));
+	a_iPos += i + 2;
 
-    return true;
+	return true;
 }
 
-//------------------------------------------------------------------------------
-IValueReader* BinValReader::Clone(TokenReader *pTokenReader) const
+
+IValueReader* BinValReader::Clone(TokenReader* pTokenReader) const
 {
-    IValueReader *pReader = new BinValReader(*this);
-    pReader->SetParent(pTokenReader);
+	IValueReader* pReader = new BinValReader(*this);
+	pReader->SetParent(pTokenReader);
 
-    return pReader;
+	return pReader;
 }
 
 //------------------------------------------------------------------------------
@@ -266,82 +253,83 @@ IValueReader* BinValReader::Clone(TokenReader *pTokenReader) const
 //------------------------------------------------------------------------------
 
 StrValReader::StrValReader()
-    :IValueReader()
+	:IValueReader()
 {}
 
-//------------------------------------------------------------------------------
+
 StrValReader::~StrValReader()
 {}
 
-//------------------------------------------------------------------------------
-string_type StrValReader::Unescape(const char_type *szExpr, int &nPos)
+
+string_type StrValReader::Unescape(const char_type* szExpr, int& nPos)
 {
-    string_type out;
-    bool bEscape = false;
-
-    for (char_type c = szExpr[nPos]; c != 0; c = szExpr[++nPos])
-    {
-        switch (c)
-        {
-        case '\\':
-            if (!bEscape)
-            {
-                bEscape = true;
-                break;
-            }
-	    [[gnu::fallthrough]];
-
-        case '"':
-            if (!bEscape)
-            {
-                ++nPos;
-                return out;
-            }
-	    [[gnu::fallthrough]];
-
-        default:
-            if (bEscape)
-            {
-                switch (c)
-                {
-                case 'n':  out += '\n'; break;
-                case 'r':  out += '\r'; break;
-                case 't':  out += '\t'; break;
-                case '"':  out += '\"'; break;
-                case '\\': out += '\\'; break;
-                default:
-                    throw ParserError(ErrorContext(ecUNKNOWN_ESCAPE_SEQUENCE, nPos));
-                }
-
-                bEscape = false;
-            }
-            else
-            {
-                out += c;
-            }
-        }
-    }
-
-    throw ParserError(ErrorContext(ecUNTERMINATED_STRING, nPos));
+	string_type out;
+	bool bEscape = false;
+
+	for (char_type c = szExpr[nPos]; c != 0; c = szExpr[++nPos])
+	{
+		switch (c)
+		{
+		case '\\':
+			if (!bEscape)
+			{
+				bEscape = true;
+				break;
+			}
+			[[fallthrough]];
+
+		case '"':
+			if (!bEscape)
+			{
+				++nPos;
+				return out;
+			}
+			[[fallthrough]];
+
+		default:
+			if (bEscape)
+			{
+				switch (c)
+				{
+				case 'n':  out += '\n'; break;
+				case 'r':  out += '\r'; break;
+				case 't':  out += '\t'; break;
+				case '"':  out += '\"'; break;
+				case '\\': out += '\\'; break;
+				default:
+					throw ParserError(ErrorContext(ecUNKNOWN_ESCAPE_SEQUENCE, nPos));
+				}
+
+				bEscape = false;
+			}
+			else
+			{
+				out += c;
+			}
+		}
+	}
+
+	throw ParserError(ErrorContext(ecUNTERMINATED_STRING, nPos));
 }
 
-//------------------------------------------------------------------------------
-bool StrValReader::IsValue(const char_type *a_pszExpr, int &a_iPos, Value &a_Val)
+
+bool StrValReader::IsValue(const char_type* a_pszExpr, int& a_iPos, Value& a_Val)
 {
-    const char_type *szExpr = a_pszExpr + a_iPos;
-    if (szExpr[0] != '"')
-        return false;
+	const char_type* szExpr = a_pszExpr + a_iPos;
+	if (szExpr[0] != '"')
+		return false;
 
-    a_Val = Unescape(a_pszExpr, ++a_iPos);
-    return true;
+	a_Val = Unescape(a_pszExpr, ++a_iPos);
+	return true;
 }
 
-//------------------------------------------------------------------------------
-IValueReader* StrValReader::Clone(TokenReader *pTokenReader) const
+
+IValueReader* StrValReader::Clone(TokenReader* pTokenReader) const
 {
-    IValueReader *pReader = new StrValReader(*this);
-    pReader->SetParent(pTokenReader);
+	IValueReader* pReader = new StrValReader(*this);
+	pReader->SetParent(pTokenReader);
 
-    return pReader;
+	return pReader;
 }
+
 } // namespace mu
diff --git a/parser/mpValue.cpp b/parser/mpValue.cpp
index 60b36bb..bbc612a 100644
--- a/parser/mpValue.cpp
+++ b/parser/mpValue.cpp
@@ -96,7 +96,7 @@ Value::Value(int_type array_size, float_type v)
 	:IValue(cmVAL)
 	, m_val()
 	, m_psVal(nullptr)
-	, m_pvVal(new matrix_type(array_size, Value(v)))
+	, m_pvVal(new matrix_type((int)array_size, Value(v)))
 	, m_cType('m')
 	, m_iFlags(flNONE)
 	, m_pCache(nullptr)
@@ -109,7 +109,7 @@ Value::Value(int_type m, int_type n, float_type v)
 	:IValue(cmVAL)
 	, m_val()
 	, m_psVal(nullptr)
-	, m_pvVal(new matrix_type(m, n, Value(v)))
+	, m_pvVal(new matrix_type((int)m, (int)n, Value(v)))
 	, m_cType('m')
 	, m_iFlags(flNONE)
 	, m_pCache(nullptr)
@@ -235,9 +235,9 @@ IValue& Value::At(const IValue& row, const IValue& col)
 		throw ParserError(errc);
 	}
 
-	int_type nRow = row.GetInteger(),
-		nCol = col.GetInteger();
-	return At(nRow, nCol);
+	int_type nRow = row.GetInteger();
+	int_type nCol = col.GetInteger();
+	return At((int)nRow, (int)nCol);
 }
 
 //---------------------------------------------------------------------------
@@ -359,7 +359,7 @@ IValue& Value::operator=(bool val)
 //---------------------------------------------------------------------------
 IValue& Value::operator=(int_type a_iVal)
 {
-	m_val = cmplx_type(a_iVal, 0);
+	m_val = cmplx_type((float_type)a_iVal, (float_type)0.0);
 
 	delete m_psVal;
 	m_psVal = nullptr;
diff --git a/sample/example.cpp b/sample/example.cpp
index ae8acfd..3ee3cd0 100644
--- a/sample/example.cpp
+++ b/sample/example.cpp
@@ -8,7 +8,7 @@
   |  Y Y  \  |  /    |     / __ \|  | \/\___ \\  ___/|  | \/     \
   |__|_|  /____/|____|    (____  /__|  /____  >\___  >__| /___/\  \
 		\/                     \/           \/     \/           \_/
-  Copyright (C) 2021 Ingo Berg, et al.
+  Copyright (C) 2022 Ingo Berg, et al.
   All rights reserved.
 
   Redistribution and use in source and binary forms, with or without
@@ -44,24 +44,6 @@
 /** \brief This macro will enable mathematical constants like M_PI. */
 #define _USE_MATH_DEFINES 
 
-/** \brief Needed to ensure successfull compilation on Unicode systems with MinGW. */
-#undef __STRICT_ANSI__
-
-//--- Standard include ------------------------------------------------------
-#if defined(_WIN32) 
-  // Memory leak dumping
-#if defined(_DEBUG)
-#define _CRTDBG_MAP_ALLOC
-#include <stdlib.h>
-#include <crtdbg.h>
-#define CREATE_LEAKAGE_REPORT
-#endif
-
-// Needed for windows console UTF-8 support
-#include <fcntl.h>
-#include <io.h>
-#endif
-
 #include <cstdlib>
 #include <cstring>
 #include <ctime>
@@ -83,23 +65,9 @@
 using namespace std;
 using namespace mup;
 
-#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
-
 const string_type sPrompt = _T("muparserx> ");
 
+
 //-------------------------------------------------------------------------------------------------
 // The following classes will be used to list muParserX variables, constants
 // from this console application
@@ -255,11 +223,22 @@ public:
 	{
 		char outstr[200];
 		time_t t = time(nullptr);
+		struct tm newtime;
+
+#ifdef _MSC_VER
+		errno_t err = localtime_s(&newtime, &t);
+		if (err != 0)
+			return;
+#else
+		auto* r = localtime_r(&t, &newtime);
+		if (!r)
+			return;
+#endif
 
 #ifdef _DEBUG
-		strftime(outstr, sizeof(outstr), "Result_%Y%m%d_%H%M%S_dbg.txt", localtime(&t));
+		strftime(outstr, sizeof(outstr), "Result_%Y%m%d_%H%M%S_dbg.txt", &newtime);
 #else
-		strftime(outstr, sizeof(outstr), "Result_%Y%m%d_%H%M%S_release.txt", localtime(&t));
+		strftime(outstr, sizeof(outstr), "Result_%Y%m%d_%H%M%S_release.txt", &newtime);
 #endif
 
 		const char_type* sExpr[] = {
@@ -315,7 +294,17 @@ public:
 		parser.DefineConst(_T("pi"), (float_type)M_PI);
 		parser.DefineConst(_T("e"), (float_type)M_E);
 
-		FILE* pFile = fopen(outstr, "w");
+		FILE* pFile;
+#ifdef _MSC_VER
+		err = fopen_s(&pFile, outstr, "w");
+		if (err != 0)
+			return;
+#else
+		pFile = fopen(outstr, "w");
+		if (!pFile)
+			return;
+#endif
+
 		int iCount = 400000;
 
 #ifdef _DEBUG
@@ -324,11 +313,19 @@ public:
 		string_type sMode = _T("# release mode\n");
 #endif
 
+#if !defined MUP_USE_WIDE_STRING
 		fprintf(pFile, "%s; muParserX V%s\n", sMode.c_str(), ParserXBase::GetVersion().c_str());
 		fprintf(pFile, "\"Eqn no.\", \"number\", \"result\", \"time in ms\", \"eval per second\", \"expr\"\n");
 
 		printf("%s", sMode.c_str());
 		printf("\"Eqn no.\", \"number\", \"result\", \"time in ms\", \"eval per second\", \"expr\"\n");
+#else
+		fwprintf(pFile, _T("%s; muParserX V%s\n"), sMode.c_str(), ParserXBase::GetVersion().c_str());
+		fwprintf(pFile, _T("\"Eqn no.\", \"number\", \"result\", \"time in ms\", \"eval per second\", \"expr\"\n"));
+
+		wprintf(_T("%s"), sMode.c_str());
+		wprintf(_T("\"Eqn no.\", \"number\", \"result\", \"time in ms\", \"eval per second\", \"expr\"\n"));
+#endif
 
 		double avg_eval_per_sec = 0;
 		int ct = 0;
@@ -352,7 +349,7 @@ public:
 			double eval_per_sec = (double)iCount * 1000.0 / diff;
 			avg_eval_per_sec += eval_per_sec;
 
-#if !defined _UNICODE
+#if !defined MUP_USE_WIDE_STRING
 			fprintf(pFile, "Eqn_%d, %d, %lf, %lf, %lf, %s\n", i, iCount, (double)val.GetFloat(), diff, eval_per_sec, sExpr[i]);
 			printf("Eqn_%d, %d, %lf, %lf, %lf, %s\n", i, iCount, (double)val.GetFloat(), diff, eval_per_sec, sExpr[i]);
 #else
@@ -518,7 +515,7 @@ public:
 	}
 }; // class FunEnableDebugDump
 
-#if defined(_UNICODE)
+#if defined(MUP_USE_WIDE_STRING)
 //-------------------------------------------------------------------------------------------------
 class FunLang : public ICallback
 {
@@ -555,97 +552,7 @@ public:
 		return new FunLang(*this);
 	}
 }; // class FunLang
-#endif // #if defined(_UNICODE)
-
-/*
-//-------------------------------------------------------------------------------------------------
-class FunGeneric : public ICallback
-{
-public:
-
-  FunGeneric(string_type sIdent, string_type sFunction)
-	:ICallback(cmFUNC, sIdent.c_str())
-	,m_parser()
-	,m_vars()
-	,m_val()
-  {
-	m_parser.SetExpr(sFunction);
-	m_vars = m_parser.GetExprVar();
-	SetArgc(m_vars.size());
-
-	// Create values for the undefined variables and bind them
-	// to the variables
-	var_maptype::iterator item = m_vars.begin();
-	for (; item!=m_vars.end(); ++item)
-	{
-	  ptr_val_type val(new Value());
-	  m_val.push_back(val);
-
-	  // assign a parser variable
-	  m_parser.DefineVar(item->second->GetIdent(), Variable(val.Get()));
-	}
-  }
-
-  virtual ~FunGeneric()
-  {}
-
-  virtual void Eval(ptr_val_type &ret, const ptr_val_type *a_pArg, int a_iArgc)
-  {
-	// Set the variables
-	for (std::size_t i=0; i<(std::size_t)a_iArgc; ++i)
-	{
-	  *m_val[i] = *a_pArg[i];
-	}
-
-	*ret = m_parser.Eval();
-  }
-
-  virtual const char_type* GetDesc() const
-  {
-	return _T("xxx(...) - Dynamically defined function");
-  }
-
-  virtual IToken* Clone() const
-  {
-	return new FunGeneric(*this);
-  }
-
-private:
-
-  ParserX m_parser;
-  mup::var_maptype m_vars;
-  val_vec_type m_val;
-}; // class FunGeneric
-
-//---------------------------------------------------------------------------
-class FunDefine : public ICallback
-{
-public:
-  FunDefine() : ICallback(cmFUNC, _T("define"), 2)
-  {}
-
-  virtual void Eval(ptr_val_type &ret, const ptr_val_type *a_pArg, int a_iArgc)
-  {
-	string_type sFun = a_pArg[0]->GetString();
-	string_type sDef = a_pArg[1]->GetString();
-
-	ParserXBase &parser = *GetParent();
-	parser.DefineFun(new FunGeneric(sFun, sDef));
-
-	*ret = 0;
-  }
-
-  virtual const char_type* GetDesc() const
-  {
-	return _T("define(Function, Definition) - Define a new parser function.");
-  }
-
-  virtual IToken* Clone() const
-  {
-	return new FunDefine(*this);
-  }
-}; // class FunDefine
-*/
+#endif // #if defined(MUP_USE_WIDE_STRING)
 
 //---------------------------------------------------------------------------
 void Splash()
@@ -658,7 +565,7 @@ void Splash()
 	console() << _T("  |__|_|  /____/|____|    (____  /__|  /____  >\\___  >__| /___/\\  \\\n");
 	console() << _T("        \\/                     \\/           \\/     \\/           \\_/\n");
 	console() << _T("  Version ") << ParserXBase::GetVersion() << _T("\n");
-	console() << _T("  Copyright (C) 2021 Ingo Berg, et al.");
+	console() << _T("  Copyright (C) 2022 Ingo Berg");
 	console() << _T("\n\n");
 	console() << _T("-------------------------------------------------------------------------\n\n");
 	console() << _T("Build configuration:\n\n");
@@ -669,13 +576,15 @@ void Splash()
 	console() << _T("- RELEASE build\n");
 #endif
 
-#if defined(_UNICODE)
-	console() << _T("- UNICODE build\n");
+#if defined(MUP_USE_WIDE_STRING)
+	console() << _T("- wide string build\n");
 #else  
-	console() << _T("- ASCII build\n");
+	console() << _T("- ascii build\n");
 #endif
 
-#if defined (__GNUC__)
+#if defined (__clang__)
+	console() << _T("- compiled with clang Version ") << __clang_version__ << _T("\n");
+#elif defined (__GNUC__)
 	console() << _T("- compiled with GCC Version ") << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__ << _T("\n");
 #elif defined(_MSC_VER)
 	console() << _T("- compiled with MSC Version ") << _MSC_VER << _T("\n");
@@ -848,6 +757,8 @@ void Calc()
 	parser.DefineVar(_T("sa"), Variable(&sVal[0]));
 	parser.DefineVar(_T("sb"), Variable(&sVal[1]));
 
+	parser.DefineConst(_T("organisation"), _T("whatever"));
+
 	// Add functions for inspecting the parser properties
 	parser.DefineFun(new FunListVar);
 	parser.DefineFun(new FunListFunctions);
@@ -859,7 +770,7 @@ void Calc()
 	parser.DefineFun(new FunTest0);
 	parser.DefineFun(new FunPrint);
 
-#if defined(_UNICODE)
+#if defined(MUP_USE_WIDE_STRING)
 	parser.DefineFun(new FunLang);
 #endif
 
@@ -945,17 +856,9 @@ int main(int /*argc*/, char** /*argv*/)
 	Splash();
 	SelfTest();
 
-#if defined(_UNICODE)
-
-#if _MSC_VER
-	// Set console to utf-8 mode, if this is not done language specific
-	// characters will be rendered incorrectly
-	if (_setmode(_fileno(stdout), _O_U8TEXT) == -1)
-		throw std::runtime_error("Can't set \"stdout\" to UTF-8");
-#endif
-
-	//// Internationalization requires UNICODE as translations do contain non ASCII 
-	//// Characters.
+#if defined(MUP_USE_WIDE_STRING)
+	// Internationalization requires UNICODE as translations do contain non ASCII 
+	// Characters.
 	//ParserX::ResetErrorMessageProvider(new mup::ParserMessageProviderGerman);
 #endif
 

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/include/muparserx/mpStringConversionHelper.h
-rw-r--r--  root/root   /usr/lib/debug/.build-id/0b/add6cac54ed5bad89aaf4fac937d9299605c59.debug
-rw-r--r--  root/root   /usr/lib/x86_64-linux-gnu/libmuparserx.so.4.0.12
lrwxrwxrwx  root/root   /usr/lib/x86_64-linux-gnu/libmuparserx.so -> libmuparserx.so.4.0.12

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/include/muparserx/mpCompat.h
-rw-r--r--  root/root   /usr/lib/debug/.build-id/86/0effbefc14571390ce0dcfbdcf2429db9f428a.debug
-rw-r--r--  root/root   /usr/lib/x86_64-linux-gnu/libmuparserx.so.4.0.11
lrwxrwxrwx  root/root   /usr/lib/x86_64-linux-gnu/libmuparserx.so -> libmuparserx.so.4.0.11

No differences were encountered between the control files of package libmuparserx-dev

No differences were encountered between the control files of package libmuparserx4.0.11

Control files of package libmuparserx4.0.11-dbgsym: lines which differ (wdiff format)

  • Build-Ids: 860effbefc14571390ce0dcfbdcf2429db9f428a 0badd6cac54ed5bad89aaf4fac937d9299605c59

More details

Full run details