From 3209f74e7f218c3ff4ef7305dd75df59b0fd5cb5 Mon Sep 17 00:00:00 2001
From: Arash Partow <partow@gmail.com>
Date: Tue, 18 Oct 2016 13:17:34 +1100
Subject: [PATCH] C++ Mathematical Expression Library (ExprTk) 
 http://www.partow.net/programming/exprtk/index.html

---
 exprtk.hpp                   | 30 +++++++++++++++++++++++-------
 exprtk_simple_example_08.cpp |  1 +
 readme.txt                   |  2 ++
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/exprtk.hpp b/exprtk.hpp
index 905694b..1c06b1f 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -2436,9 +2436,10 @@ namespace exprtk
                   /*
                      Permit symbols that contain a 'dot'
                      Allowed   : abc.xyz, a123.xyz, abc.123, abc_.xyz a123_.xyz abc._123
-                     Disallowed: abc.<white-space>, abc.<eof>, abc.<operator +,-,*,/...>
+                     Disallowed: .abc, abc.<white-space>, abc.<eof>, abc.<operator +,-,*,/...>
                   */
                   if (
+                       (s_itr_ != initial_itr)                  &&
                        !is_end(s_itr_ + 1)                      &&
                        details::is_letter_or_digit(*s_itr_ + 1) &&
                        ('_' != (*s_itr_ + 1))
@@ -17071,12 +17072,14 @@ namespace exprtk
             for (std::size_t i = 1; i < symbol.size(); ++i)
             {
                if (
-                    (!details::is_letter(symbol[i])) &&
-                    (!details:: is_digit(symbol[i])) &&
+                    !details::is_letter_or_digit(symbol[i]) &&
                     ('_' != symbol[i])
                   )
                {
-                  return false;
+                  if (('.' == symbol[i]) && (i < (symbol.size() - 1)))
+                     continue;
+                  else
+                     return false;
                }
             }
          }
@@ -17095,12 +17098,14 @@ namespace exprtk
             for (std::size_t i = 1; i < symbol.size(); ++i)
             {
                if (
-                    (!details::is_letter(symbol[i])) &&
-                    (!details:: is_digit(symbol[i])) &&
+                    !details::is_letter_or_digit(symbol[i]) &&
                     ('_' != symbol[i])
                   )
                {
-                  return false;
+                  if (('.' == symbol[i]) && (i < (symbol.size() - 1)))
+                     continue;
+                  else
+                     return false;
                }
             }
          }
@@ -17518,8 +17523,19 @@ namespace exprtk
       {
          return details::is_function(expr.control_block_->expr);
       }
+
+      static inline bool is_null(const expression<T>& expr)
+      {
+         return details::is_null_node(expr.control_block_->expr);
+      }
    };
 
+   template <typename T>
+   inline bool is_valid(const expression<T>& expr)
+   {
+      return !expression_helper<T>::is_null(expr);
+   }
+
    namespace parser_error
    {
       enum error_mode
diff --git a/exprtk_simple_example_08.cpp b/exprtk_simple_example_08.cpp
index dd7dc23..5f48808 100644
--- a/exprtk_simple_example_08.cpp
+++ b/exprtk_simple_example_08.cpp
@@ -65,6 +65,7 @@ void composite()
       for (std::size_t i = 0; i < parser.error_count(); ++i)
       {
          error_t error = parser.get_error(i);
+
          printf("Error: %02d  Position: %02d Type: [%14s] Msg: %s\tExpression: %s\n",
                 static_cast<unsigned int>(i),
                 static_cast<unsigned int>(error.token.position),
diff --git a/readme.txt b/readme.txt
index f527a2b..28cad05 100644
--- a/readme.txt
+++ b/readme.txt
@@ -291,6 +291,8 @@ of C++ compilers:
 +----------+---------------------------------------------------------+
 | nequal   | Not-equal test between x and y using normalized epsilon |
 +----------+---------------------------------------------------------+
+| pow      | x to the power of y.  (eg: pow(x,y) == x ^ y)           |
++----------+---------------------------------------------------------+
 | root     | Nth-Root of x. where n is a positive integer.           |
 |          | (eg: root(x,3) == x^(1/3))                              |
 +----------+---------------------------------------------------------+