diff options
author | sbrandt <sbrandt@17b73243-c579-4c4c-a9d2-2d5706c11dac> | 2013-03-05 14:27:42 +0000 |
---|---|---|
committer | sbrandt <sbrandt@17b73243-c579-4c4c-a9d2-2d5706c11dac> | 2013-03-05 14:27:42 +0000 |
commit | 4c4e8cd402efafafcdcff354b8a6b277efca71f6 (patch) | |
tree | f42074851fc2014f4f06c5c2a8be359e6273fdbe | |
parent | 0a9e882d8b2a1e46e982b5d43038f01c113463ca (diff) |
Make support for inf more explicit, and add support
for nan.
git-svn-id: http://svn.cactuscode.org/flesh/trunk@4977 17b73243-c579-4c4c-a9d2-2d5706c11dac
-rw-r--r-- | src/piraha/Call.cc | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/piraha/Call.cc b/src/piraha/Call.cc index ef981fd6..f5082487 100644 --- a/src/piraha/Call.cc +++ b/src/piraha/Call.cc @@ -9,6 +9,7 @@ #include <map> #include <math.h> #include <algorithm> +#include <limits> namespace piraha { @@ -272,12 +273,21 @@ smart_ptr<Value> meval(smart_ptr<Group> gr) { smart_ptr<Value> ret = new Value(gr); if(pn == "num") { std::string s = gr->substring(); - ret->ddata = atof(s.c_str()); - ret->idata = ret->ddata; - if(ret->idata == ret->ddata && (s.find('.') == std::string::npos)) - ret->type = PIR_INT; - else + s = mklower(s); + if(s == "nan") { + ret->ddata = NAN; + ret->type = PIR_REAL; + } else if(s == "inf") { + ret->ddata = INFINITY; ret->type = PIR_REAL; + } else { + ret->ddata = atof(s.c_str()); + ret->idata = ret->ddata; + if(ret->idata == ret->ddata && (s.find('.') == std::string::npos)) + ret->type = PIR_INT; + else + ret->type = PIR_REAL; + } } else if(pn == "paren" || pn == "parindex") { return meval(gr->group(0)); } else if(pn == "func") { @@ -690,7 +700,7 @@ extern "C" int cctk_PirahaParser(const char *buffer,unsigned long buffersize,int "inquot = ({var}|\\\\.|[^\\\\\"])*\n" "fname = \\.?/[-\\./0-9a-zA-Z_]+\n" "quot = \"{inquot}\"|{fname}\n" - "num = (inf|([0-9]+(\\.[0-9]*|)|\\.[0-9]+)(e[+-]?[0-9]+|))\n" + "num = (inf|nan|([0-9]+(\\.[0-9]*|)|\\.[0-9]+)(e[+-]?[0-9]+|))\n" "env = ENV\\{{name}\\}\n" "var = \\$({env}|{name}|\\{{name}\\})\n" |